Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Allow converter to follow local conventions

Fix :
- Les titres sont désormais toujours reconnus
- Les blocs de code utilisent la syntaxe Pandoc
- Les blocs de code sont parfois reconnus et labellisés plus
précisément (http, php, xml, html, etc.)
- Certaines illustrations n'apparaissaient pas quand elles étaient
suivies par un élément XML contenant uniquement des espaces blancs
- Si use illustration set associée à un paragraphe complet et pas une
légende, elle suit désormais le paragraphe au lieu de s'y attacher
- Les codes ne contiennent plus de mise en forme (qui est alors perdue)
- Les notes en bas de page sont inscrite directement sous le paragraphe
et pas en fin de document
- Les listes numérotées qui ont une numérotation continue entre deux
listes successives gardent leur numérotation au lieu de recommencer à
zéro (peut ne pas être complet)
- Les citations sont reconnues
- Un message d'erreur (et une marque dans le code résultant) est
affichée en cas d'une image qui n'a pu être extraite (ou pour les
objets non image)
- Les apostrophes typographiques sont remplacées par des apostrophes
simples

Problèmes persistants :
- certains blocs de code de style "HTTP" ne sont pas reconnus comme code
- les détails de style de code ne sont pas importés (mais certains sont
reconnus à l'aide de la première ligne du code)
- les listes ont un espace blanc en trop en bas du dernier item
- certaines rares images ne peuvent être importées

Le résultat est probablement de qualité suffisante pour lancer la
génération
  • Loading branch information...
commit acb4bdf40bfd1c8f8976913cd135c7f6bbd35697 1 parent 46df45b
@edas authored
Showing with 80 additions and 32 deletions.
  1. +80 −32 util/odt2txt_py.py
View
112 util/odt2txt_py.py
@@ -13,6 +13,8 @@
Writteby by [Yuri Takhteyev](http://www.freewisdom.org).
+*Modified* for this project
+
Project website: http://www.freewisdom.org/projects/python-markdown/odt2txt
Contact: yuri [at] freewisdom.org
@@ -22,7 +24,7 @@
"""
-import sys, os, zipfile, xml.dom.minidom, shutil
+import sys, os, zipfile, xml.dom.minidom, shutil, re
IGNORED_TAGS = ["office:annotation"]
@@ -67,6 +69,9 @@ def __init__ (self):
self.hasImg = False
self.indented = 0
+ def setBlockquote(self, value) :
+ self.blockquote = value
+
def setIndented (self, value) :
self.indented = value
@@ -111,6 +116,7 @@ def __init__ (self, filepath, img_prefix) :
self.hasTitle = 0
self.img_prefix = img_prefix
self.imgs_num = 0
+ self.previous_list_item = 0
self.load(filepath)
@@ -157,6 +163,9 @@ def extractParagraphProperties (self, style, parent=None) :
paraProps = ParagraphProps()
name = style.getAttribute("style:name")
+
+ if name == "Quotations":
+ paraProps.setBlockquote(True)
if name.startswith("Heading_20_") :
level = name[11:]
@@ -273,14 +282,15 @@ def listToString (self, listElement) :
styleName = listElement.getAttribute("text:style-name")
props = self.listStyles.get(styleName, ListProperties())
+
+ if listElement.getAttribute("text:continue-numbering") != "true" :
+ self.previous_list_item = 0
-
- i = 0
for item in listElement.childNodes :
- i += 1
+ self.previous_list_item += 1
if props.ordered :
- number = str(i)
+ number = str(self.previous_list_item)
number = number + "." + " "*(2-len(number))
buffer += number + self.paragraphToString(item.childNodes[0],
indent=3)
@@ -310,12 +320,10 @@ def toString (self) :
text = self.paragraphToString(paragraph)
if text :
buffer += text + "\n\n"
-
- if self.footnotes :
-
- buffer += "--------\n\n"
- for cite, body in self.footnotes :
- buffer += "[^%s]: %s\n\n" % (cite, body)
+ if self.footnotes :
+ for cite, body in self.footnotes :
+ buffer += " [^%s]: %s\n\n" % (cite, body)
+ self.footnotes = []
return self.compressCodeBlocks(buffer)
@@ -334,7 +342,7 @@ def slugify(self, value):
value = unicode(re.sub(' ', '-', value))
return value
- def textToString(self, element, props = None) :
+ def textToString(self, element, props = None, format = True) :
buffer = u""
img_in_buffer = None
@@ -352,16 +360,16 @@ def textToString(self, element, props = None) :
text = self.textToString(node)
if not text.strip() :
- return "" # don't apply styles to white space
+ continue # don't apply styles to white space
styleName = node.getAttribute("text:style-name")
style = self.textStyles.get(styleName, None)
- if style.fixed :
+ if format and style.fixed :
buffer += "`" + text + "`"
continue
- if style :
+ if format and style :
if style.italic and style.bold :
mark = "***"
elif style.italic :
@@ -371,7 +379,8 @@ def textToString(self, element, props = None) :
else :
mark = ""
else :
- mark = "<" + styleName + ">"
+ mark = ""
+ #mark = "<" + styleName + ">"
buffer += "%s%s%s" % (mark, text, mark)
@@ -403,8 +412,11 @@ def textToString(self, element, props = None) :
elif tag == "text:a" :
text = self.textToString(node)
- link = node.getAttribute("xlink:href")
- buffer += "[%s](%s)" % (text, link)
+ if format :
+ link = node.getAttribute("xlink:href")
+ buffer += "[%s](%s)" % (text, link)
+ else :
+ buffer += text
elif tag == "text:bookmark" or tag == "text:bookmark-end":
# YOAV - need to add an # link here
@@ -422,15 +434,30 @@ def textToString(self, element, props = None) :
else :
buffer += " {" + tag + "} "
- if img_in_buffer:
+ if format and img_in_buffer:
self.imgs_num += 1
extension = img_in_buffer.split('.')[-1]
- imgname = "img/" + self.img_prefix + "-" + str(self.imgs_num) + "-" + self.slugify(buffer) + "." + extension
- os.rename(img_in_buffer, imgname)
- buffer += "\n![" + buffer + "](../../../raw/master/content/" + imgname + ")"
+ legend = ""
+ prefix = ""
+ imgname = ""
+ if len(buffer) > 200 :
+ legend = ""
+ imgname = "img/" + self.img_prefix + self.slugify(buffer)[:50] + "." + extension
+ prefix = buffer + "\n\n"
+ else :
+ legend = buffer
+ imgname = "img/" + self.img_prefix + self.slugify(buffer) + "." + extension
+ prefix = ""
+ buffer = prefix + "![" + legend + "](" + imgname + ")"
+ if os.path.exists(img_in_buffer) and (img_in_buffer[:9] != "./Object ") :
+ # print >> sys.stderr, "Try : " + img_in_buffer + " -> " + imgname + "\n"
+ os.rename(img_in_buffer, imgname)
+ else :
+ buffer += "\n/!\\ MISSING IMAGE /!\\ "
+ print >> sys.stderr, "Warning: Missing image "+imgname+" ("+img_in_buffer+")\n"
- if(props):
+ if format and props:
props.setHasImg(img_in_buffer != None)
return buffer
@@ -440,6 +467,11 @@ def paragraphToString(self, paragraph, indent = 0) :
style_name = paragraph.getAttribute("text:style-name")
paraProps = self.paragraphStyles.get(style_name) #, None)
+ heading_level = paragraph.getAttribute("text:outline-level")
+ if len(heading_level) > 0:
+ heading_level = int(heading_level)
+ if heading_level > 0:
+ paraProps.setHeading(heading_level)
text = self.textToString(paragraph, paraProps)
#print >>sys.stderr, "TEXT:", text
@@ -466,21 +498,36 @@ def paragraphToString(self, paragraph, indent = 0) :
return "#" * level + " " + text
elif paraProps.code:
- lines = [" %s" % line for line in text.split("\n")]
+ #lines = [" %s" % line for line in text.split("\n")]
#print >>sys.stderr, "CODE"
- return "\n".join(lines)
+ text = self.textToString(paragraph, paraProps, False).strip()
+ classnames = [ ]
+ if text[:7] == "HTTP/1." :
+ classnames.append( ".http .response" )
+ elif re.match("^(GET|POST|DELETE|PUT|HEAD) /", text) :
+ classnames.append( ".http .request")
+ elif text[:5] == "<?php" :
+ classnames.append( ".php" )
+ elif text[:15] == "<!DOCTYPE HTML>" or text[:15] == "<!DOCTYPE html>" :
+ classnames.append( ".html")
+ elif text[:6] == "<?xml " :
+ classnames.append( ".xml")
+ if text.find("\n") == -1 :
+ classnames.append( ".oneline" )
+ prefix = ""
+ if len(classnames) :
+ prefix = " {" + " ".join(classnames) + "}"
+ return "~~~~~~~" + prefix + "\n" + text + "\n~~~~~~~"
elif paraProps.hasImg:
#print >>sys.stderr, "HAS_IMG"
return text
-
- """
- if paraProps.indented :
+
+ if paraProps.blockquote :
return self.wrapParagraph(text, indent = indent, blockquote = True)
else :
- """
- #print >>sys.stderr, "WRAP"
- return self.wrapParagraph(text, indent = indent)
+ #print >>sys.stderr, "WRAP"
+ return self.wrapParagraph(text, indent = indent)
def wrapParagraph(self, text, indent = 0, blockquote=False) :
@@ -516,8 +563,9 @@ def wrapParagraph(self, text, indent = 0, blockquote=False) :
filename = sys.argv[1]
- odt = OpenDocumentTextFile(filename, img_prefix)
+ odt = OpenDocumentTextFile(filename, img_prefix )
unicode = odt.toString()
+ unicode = unicode.replace(u'\u2019', "'")
out_utf8 = unicode.encode("utf-8")
sys.stdout.write(out_utf8)
shutil.rmtree("Pictures")
Please sign in to comment.
Something went wrong with that request. Please try again.