diff --git a/src/calibre/ebooks/pdf/main.cpp b/src/calibre/ebooks/pdf/main.cpp index d3efb5f1f9..44257b50f5 100644 --- a/src/calibre/ebooks/pdf/main.cpp +++ b/src/calibre/ebooks/pdf/main.cpp @@ -85,6 +85,32 @@ extern "C" { return ans; } + static PyObject * + pdfreflow_get_numpages(PyObject *self, PyObject *args) { + char *pdfdata; + int num = 0; + Py_ssize_t size; + map info; + + if (!PyArg_ParseTuple(args, "s#", &pdfdata, &size)) + return NULL; + + Reflow *reflow = NULL; + try { + reflow = new Reflow(pdfdata, size); + num = reflow->numpages(); + } catch (std::exception &e) { + PyErr_SetString(PyExc_RuntimeError, e.what()); delete reflow; return NULL; + } catch (...) { + PyErr_SetString(PyExc_RuntimeError, + "Unknown exception raised while getting metadata from PDF"); delete reflow; return NULL; + } + + delete reflow; reflow = NULL; + return Py_BuildValue("i", num); + } + + static PyObject * pdfreflow_set_metadata(PyObject *self, PyObject *args) { char *pdfdata; @@ -144,6 +170,10 @@ extern "C" { "get_metadata(info_dict)\n\n" "Set metadata in the specified PDF. Currently broken." }, + {"get_numpages", pdfreflow_get_numpages, METH_VARARGS, + "get_numpages(pdf_data)\n\n" + "Get number of pages in the PDF." + }, {NULL, NULL, 0, NULL} }; diff --git a/src/odf/odf2xhtml.py b/src/odf/odf2xhtml.py index 912e79cf3c..ea0ecef025 100644 --- a/src/odf/odf2xhtml.py +++ b/src/odf/odf2xhtml.py @@ -1041,34 +1041,34 @@ class ODF2XHTML(handler.ContentHandler): of elements on the tagstack. """ name = attrs.get( (TEXTNS,'style-name') ) + level = self.tagstack.count_tags(tag) + 1 if name: name = name.replace(".","_") - level = 1 else: # FIXME: If a list is contained in a table cell or text box, # the list level must return to 1, even though the table or # textbox itself may be nested within another list. - level = self.tagstack.count_tags(tag) + 1 name = self.tagstack.rfindattr( (TEXTNS,'style-name') ) + list_class = "%s_%d" % (name, level) if self.generate_css: - self.opentag('%s' % self.listtypes.get(name), {'class':"%s_%d" % (name, level) }) + self.opentag('%s' % self.listtypes.get(list_class,'UL'), {'class': list_class }) else: - self.opentag('%s' % self.listtypes.get(name)) + self.opentag('%s' % self.listtypes.get(list_class,'UL')) self.purgedata() def e_text_list(self, tag, attrs): self.writedata() name = attrs.get( (TEXTNS,'style-name') ) + level = self.tagstack.count_tags(tag) + 1 if name: name = name.replace(".","_") - level = 1 else: # FIXME: If a list is contained in a table cell or text box, # the list level must return to 1, even though the table or # textbox itself may be nested within another list. - level = self.tagstack.count_tags(tag) + 1 name = self.tagstack.rfindattr( (TEXTNS,'style-name') ) - self.closetag(self.listtypes.get(name)) + list_class = "%s_%d" % (name, level) + self.closetag(self.listtypes.get(list_class,'UL')) self.purgedata() def s_text_list_item(self, tag, attrs): @@ -1086,9 +1086,10 @@ class ODF2XHTML(handler.ContentHandler): the available glyphs """ name = self.tagstack.rfindattr( (STYLENS,'name') ) - self.listtypes[name] = 'ul' level = attrs[(TEXTNS,'level')] self.prevstyle = self.currentstyle + list_class = "%s_%s" % (name, level) + self.listtypes[list_class] = 'ul' self.currentstyle = ".%s_%s" % ( name.replace(".","_"), level) self.stylestack.append(self.currentstyle) self.styledict[self.currentstyle] = {} @@ -1103,11 +1104,12 @@ class ODF2XHTML(handler.ContentHandler): def s_text_list_level_style_number(self, tag, attrs): name = self.tagstack.stackparent()[(STYLENS,'name')] - self.listtypes[name] = 'ol' level = attrs[(TEXTNS,'level')] num_format = attrs.get( (STYLENS,'name'),"1") + list_class = "%s_%s" % (name, level) self.prevstyle = self.currentstyle self.currentstyle = ".%s_%s" % ( name.replace(".","_"), level) + self.listtypes[list_class] = 'ol' self.stylestack.append(self.currentstyle) self.styledict[self.currentstyle] = {} if num_format == "1": listtype = "decimal"