
| Current Path : /home/ift/51_iftlib/md/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : //home/ift/51_iftlib/md/gx.old |
import os
import sys
import re
import random
import hashlib
import base64
import codecs
class Gx (object):
def __init__ (self):
pass
#*************************************************************
# Copies all linked svg-files into the main file being aware of renaming id's
def freeze (self,pars):
os.system("git
text = codecs.open(pars[0],encoding="utf-8").read()
defs = {}
while (0 == 0):
m = re.search(r"^(.*?)\<image ([^\<\>]*)(xlink\:href=)[\"\']([A-Za-z0-9\_\-\.\\\/]+\.)(svg|SVG)[\"\']([^\<\>]*)\/\>(.*)$",
text,re.DOTALL)
if not m:
break
imgtext = m.group(2) + m.group(6)
x1 = "0mm"
y1 = "0mm"
w1 = ""
h1 = ""
w2 = ""
h2 = ""
w3 = 0
h3 = 0
# print imgtext
m1 = re.search(r"^(.*)x=[\"\'](.*?)[\"\'](.*)$",imgtext,re.DOTALL)
if m1:
x1 = m1.group(2)
imgtext = m1.group(1) + m1.group(3)
m1 = re.search(r"^(.*)y=[\"\'](.*?)[\"\'](.*)$",imgtext,re.DOTALL)
if m1:
y1 = m1.group(2)
imgtext = m1.group(1) + m1.group(3)
m1 = re.search(r"^(.*)width=[\"\'](.*?)[\"\'](.*)$",imgtext,re.DOTALL)
if m1:
w1 = m1.group(2)
imgtext = m1.group(1) + m1.group(3)
m1 = re.search(r"^(.*)height=[\"\'](.*?)[\"\'](.*)$",imgtext,re.DOTALL)
if m1:
h1 = m1.group(2)
imgtext = m1.group(1) + m1.group(3)
textsvg = codecs.open(m.group(4)+m.group(5),encoding="utf-8").read()
textsvg = re.sub(r"^(.*?)<svg\n*(.*?)\n*\<\/svg\>.*$","\\2",textsvg,flags=re.DOTALL)
textsvg = "<g\n" + textsvg + "\n</g>\n"
wh = re.search(r"viewBox=\"(\d+) +(\d+)+ ([\d+\.]+) +([\d+\.]+)",textsvg,re.DOTALL)
if wh:
w2 = wh.group(3)
h2 = wh.group(4)
else:
m1 = re.search(r"width.*?(\d+[a-z]*)",textsvg);
if m1:
w2 = m1.group(1)
m1 = re.search(r"height.*?(\d+[a-z]*)",textsvg);
if m1:
h2 = m1.group(1)
try:
w_fac = self._imgfactor(w1)/self._imgfactor(w2)
except:
w_fac = 0
try:
h_fac = self._imgfactor(h1)/self._imgfactor(h2)
except:
h_fac = 0
if w_fac == 0:
w_fac = h_fac
if h_fac == 0:
h_fac = w_fac
m1 = re.search(r"^(\d+\.?\d*)([a-z]*)",x1)
x1 = str(float(m1.group(1))/w_fac) + m1.group(2)
m1 = re.search(r"^(\d+\.?\d*)([a-z]*)",y1)
y1 = str(float(m1.group(1))/h_fac) + m1.group(2)
label = re.sub(r"[\.\\\/]","_",m.group(4)+m.group(5),9999) # Change of id-labels
textsvg = re.sub(r"(id\=\")(.*?)(\")","\\1\\3",textsvg,1)
textsvg = re.sub(r"(id\=\")([^\"]+?)(\")",'\\1-x-x-x-' +label+"_\\2\\3",textsvg,99999999)
textsvg = re.sub(r"(id\=\")(\")","\\1-x-x-x-"+label+"\\2",textsvg,1)
textsvg = re.sub(r"(href\=\"\#)(.*?)(\")","\\1-x-x-x-"+label+"_\\2\\3",textsvg,99999999)
textsvg = re.sub(r"-x-x-x-","",textsvg,99999999)
imgtext = ( '<use x="'+x1+'" y="'+y1+'" transform="scale('+str(w_fac)+","+str(h_fac)+')" ' +
imgtext + 'xlink:href="#' + label + '"/>' )
text = m.group(1) + re.sub(r" +"," ",imgtext,9999) + m.group(7)
defs[label] = textsvg
text1 = ""
for o in defs.keys():
text1 = text1 + defs[o]
if not text1 == "":
text1 = "<defs>\n" + text1 + "</defs>\n</svg>"
text = re.sub(r"</svg>",text1,text)
try:
text = codecs.open(pars[1],"w",encoding="utf-8").write(text)
except:
print text
return(text)
#***************************************************************************
def _imgfactor (self,x):
m = re.search(r"^(.*?)([a-z]*)$",x)
o = float(m.group(1))*({"":1.0,"pt":1.25,"mm":3.54,"cm":35.4,"pc":15,"in":90}[m.group(2)])
return(o)
#***************************************************************************
def md2svg (self,pars):
m = re.search(r"^(.*)\.(.*)$",pars[0])
if m:
file = m.group(1)
else:
exit()
# 1. Cleaning up
zaehler = 0
while (0 == 0):
zaehler = "%03u" % (int(zaehler) + 1)
try:
os.remove(file+"_"+zaehler+".pdf")
except:
pass
try:
os.remove("_"+file+"_"+zaehler+".svg")
except:
pass
try:
os.remove(file+"_"+zaehler+".svg")
except:
break
# 2. Auslesen der Metadaten fuer wkhtmltopdf
text = codecs.open(file+".md",encoding="utf-8").read()
text1 = text
cmd = ""
pdfdpi = ""
while (0 == 0):
m = re.search("^(.*?)\n(page|margin|pdf)(height|width|left|right|top|bottom|footer|dpi)\: +(\d+)(mm|pt|cm|dpi)(.*)$",text,re.DOTALL)
if m:
if m.group(2) + m.group(3) == "pdfdpi":
pdfdpi = m.group(4)
elif m.group(2) + m.group(3) == "pagefooter":
footer = m.group(4) # Footer Mass
else:
cmd = cmd + " --"+m.group(2)+"-"+m.group(3)+" "+m.group(4)+m.group(5) + " "
text = m.group(1) + m.group(6)
else:
break
# 3. Alle jpg/svg/gif/png-Eintraege werden aufgenommen
images = []
files_to_delete = []
text = ""
svg_paths = {}
while (0 == 0):
m = re.search("^(.*?[\"\'])([a-zA-Z0-9\.\\\/][a-zA-Z0-9\.\-\_\\\/]*)\.(jpg|svg|gif|png)(.*)$",text1,flags=re.DOTALL)
if not m:
text = text + text1
break
imgfile = m.group(2)
text1 = m.group(4)
ending = m.group(3)
images.append(imgfile+"."+ending)
if m.group(3) == "svg": # Bei svg-Files wird erst ein jpg-Platzhalterfile erstellt (im aktuellen Verzeichnis)
ending = "png" # das dann nachher durch das richtige svg ersetzt wird
imgfile0 = imgfile
imgfile = re.sub(r"^(.*)([\\\/])","",imgfile0) + "___P_L_A_C_E_H_O_L_D_E_R"
svg_paths[imgfile] = imgfile0
text3 = codecs.open(imgfile0+".svg",encoding="utf-8").read()
wh = re.search(r"^(.*?)\<svg[^\>]+viewBox=\"(\d+) +(\d+)+ ([\d+\.]+) +([\d+\.]+)",text3,re.DOTALL)
if wh:
im = Image.new('RGB',(int(float(wh.group(4))),int(float(wh.group(5)))),'black')
else:
w = re.search(r"^(.*?)\<svg[^\>]+width=\"([\d\.]*)",text3,re.DOTALL)
h = re.search(r"^(.*?)\<svg[^\>]+height=\"([\d\.]*)",text3,re.DOTALL)
im = Image.new('RGB',(int(float(w.group(2))),int(float(h.group(2)))),'black')
im.save(imgfile+".png")
files_to_delete.append(imgfile+".png")
contains_svg = True
else:
contains_png = True
text = text + m.group(1) + imgfile + "." + ending
# 4. Processing des abgeaenderten md-Files
print images
codecs.open(file+"___P_L_A_C_E_H_O_L_D_E_R.md","w",encoding="utf-8").write(text)
files_to_delete.append(file+"___P_L_A_C_E_H_O_L_D_E_R.md")
os.system("pandoc -s -o "+file+".html "+file+"___P_L_A_C_E_H_O_L_D_E_R.md")
if "win" in sys.platform:
os.system("wkhtmltopdf " +cmd+file+".html "+file+".pdf")
else:
os.system("xvfb-run -a -s \"-screen 0 640x480x16\" wkhtmltopdf " +cmd+file+".html "+file+".pdf")
text = codecs.open(file+".html",encoding="utf-8").read()
while (0 == 0):
m = re.search(r"^(.*?)([a-zA-Z0-9\-\_\.]+___P_L_A_C_E_H_O_L_D_E_R).png(.*)$",text,re.DOTALL)
if not m:
break
text = m.group(1) + svg_paths[m.group(2)] + ".svg" + m.group(3)
# try:
# text = re.sub("</body>","</body><p><img src=\""+footer+" width=\"100%\"/></p>",text) # add footer file
# except:
# pass
codecs.open(file+".html","w",encoding="utf-8").write(self.svg2inline(text)) # make all svg's inline
# 5. Fertiges PDF, das ist Grundlage fuer die weiteren Schritte
pdf = pyPdf.PdfFileReader( open(file+".pdf","rb") )
zaehlernr = 0
footer1 = ""
footer2 = ""
nr = 0
# 6. jede Seite des erzeugten PDF's wird einzeln genommen und in SVG umgewandelt
while (0 == 0):
# if zaehlernr == pdf.numPages:
# nr = zaehlernr
# break
footer1 = ""
footer2 = ""
pdfpage = pyPdf.PdfFileWriter()
try:
pdfpage.addPage( pdf.getPage(zaehlernr) ) # zaehlernr-te Seite
except:
break
file1 = file+"_"+("%03u" % (zaehlernr+1))
pdfpage.write( open(file1+".pdf","wb") )
os.system("pdf2svg " + file1+".pdf " + file1+".svg")
text2 = codecs.open(file1+".svg",encoding="utf-8").read()
text3 = ""
while (0 == 0):
m = re.search(r"^(.*?\")(data:image\/jpeg;base64,)(.*?)(\".*)$",text2,flags=re.DOTALL)
if not m:
text3 = text3 + text2
break
img = images.pop(0) # in der Reihenfolge der Vorkommnisse der Images werden diese untersucht
text2 = m.group(4)
if re.search("\.svg$",img):
# if os.path.isfile(img+".svg"): # wenn es ein svg-File gibt gleichen Namens, dieses nehmen
text3 = text3 + m.group(1) + img # + ".svg"
else:
text3 = text3 + m.group(1) + m.group(2) + m.group(3)
m = re.search(r"^(.*)\n(\<use +xlink:href=\"\#)([^\"]*?)(\"[^\n\>]+?\>)(\s*\</g\>\s*\</svg\>\s*)$",text3,re.DOTALL)
if m: # Footer-Extraktion
text3 = m.group(1) + m.group(5)
footer1 = m.group(2) + "footer" + m.group(4)
m1 = re.search(r"(\<image +id=\")"+m.group(3)+"\"(.*)",text3)
if m1:
footer2 = m1.group(1) + "footer\" y=\"" + footer + "\"" + m1.group(2)
footer1 = re.sub(r",([\d\.]+)\)",",0.0)",footer1)
os.remove(file1+".svg")
os.remove(file1+".pdf")
break
zaehlernr = zaehlernr + 1
text3 = re.sub(r"fill-opacity: *1","fill-opacity:0",text3,1) # der erste fill-opacity-Eintrag scheint
# die Opacity der ganzen Seite zu sein. Fuer
# Importe dieser Seiten wird die Opacity
# deswegen hier auf Null gesetzt.
codecs.open(file1+".svg","w",encoding="utf8").write(text3)
nr = zaehlernr
for delfile in files_to_delete:
os.remove(delfile)
if len(images) > 0:
print "Warning: Not all images are recognized in SVG-Files... Exit."
return()
## 6. jede Seite des erzeugten PDF's wird einzeln genommen und in SVG umgewandelt
#
# while (0 == 0):
# footer1 = ""
# footer2 = ""
# pdfpage = pyPdf.PdfFileWriter()
# try:
# pdfpage.addPage( pdf.getPage(nr) ) # nr-te Seite
# except:
# break
# file1 = file+"_"+("%03u" % (nr+1))
# nr = nr + 1
# pdfpage.write( open(file1+".pdf","w") )
# os.system("pdf2svg " + file1+".pdf " + file1+".svg")
# text2 = codecs.open(file1+".svg",encoding="utf-8").read()
# text3 = ""
# while (0 == 0):
# m = re.search(r"^(.*?\")(data:image\/jpeg;base64,)(.*?)(\".*)$",text2,flags=re.DOTALL)
# if not m:
# text3 = text3 + text2
# break
# img = images.pop(0) # in der Reihenfolge der Vorkommnisse der Images werden diese untersucht
# text2 = m.group(4)
# if re.search("\.svg$",img):
## if os.path.isfile(img+".svg"): # wenn es ein svg-File gibt gleichen Namens, dieses nehmen
# text3 = text3 + m.group(1) + img # + ".svg"
# else:
# text3 = text3 + m.group(1) + m.group(2) + m.group(3)
#
# m = re.search(r"^(.*)\n(\<use +xlink:href=\"\#)([^\"]*?)(\"[^\n\>]+?\>)(\s*\</g\>\s*\</svg\>\s*)$",text3,re.DOTALL)
# if m: # Footer-Extraktion
# print "footer"
# text3 = m.group(1) + m.group(5)
# footer1 = m.group(2) + "footer" + m.group(4)
# m1 = re.search(r"(\<image +id=\")"+m.group(3)+"\"(.*)",text3)
# if m1:
# footer2 = m1.group(1) + "footer\" y=\"" + footer + "\"" + m1.group(2)
# footer1 = re.sub(r",([\d\.]+)\)",",0.0)",footer1)
## break
# codecs.open(file1+".svg","w",encoding="utf8").write(text3)
#
#
#
# for delfile in files_to_delete:
# os.remove(delfile)
#
# if len(images) > 0:
# print "Warning: Not all images are recognized in SVG-Files... Exit."
# return()
#
# 7. in den svg's die footer anbringen
if not footer1 == "":
zaehler = 0
while (0 == 0):
zaehler = "%03u" % (int(zaehler) + 1)
if not os.path.isfile(file+"_"+zaehler+".svg"):
break
textsvg = codecs.open(file+"_"+zaehler+".svg","r",encoding="utf8").read()
textsvg = re.sub(r"\</defs\>",footer2+"\n</defs>",textsvg)
textsvg = re.sub(r"\</g\>\s*\</svg\>",footer1 + "</g>\n</svg>",textsvg)
codecs.open(file+"_"+zaehler+".svg","w",encoding="utf8").write(textsvg)
try:
pars[1]
except:
return()
# 8. neues PDF erzeugen
print "inkscape ... svg to pdf ... " + file + ".pdf"
zaehler = 0
while (0 == 0):
zaehler = "%03u" % (int(zaehler) + 1)
print zaehler
if not os.path.isfile(file+"_"+zaehler+".svg"):
break
self.svg2svg([file+"_"+zaehler+".svg","_"+file+"_"+zaehler+".svg"])
textsvg = codecs.open("_"+file+"_"+zaehler+".svg","r",encoding="utf8").read()
textsvg = re.sub(r"<!--0/0->",str(int(zaehler))+"/"+str(nr),textsvg)
textsvg = re.sub(r"0/0", str(int(zaehler))+"/"+str(nr),textsvg)
codecs.open("_"+file+"_"+zaehler+".svg","w",encoding="utf8").write(textsvg)
os.system("inkscape --without-gui --export-dpi="+pdfdpi+" -A "+
file+"_"+zaehler+".pdf _"+file+"_"+zaehler+".svg")
# os.remove("_"+file+"_"+zaehler+".svg")
os.system("pdftk " + file + "_???.pdf output " + file + ".pdf")
# 9. Cleaning up
zaehler = 0
while (0 == 0):
zaehler = "%03u" % (int(zaehler) + 1)
try:
os.remove(file+"_"+zaehler+".pdf")
except:
pass
# try:
# os.remove(file+"_"+zaehler+".svg")
# except:
# pass
try:
os.remove("_"+file+"_"+zaehler+".svg")
except:
break
#***************************************************************************
def svg2inline (self,text): # inlines an SVG into an html
# return(text)
while (0 == 0):
m = re.search(r"^(.*?)(\<[^\<\>]+?)([a-zA-Z\_0-9\-]+)\.(svg|SVG)([^\<\>]+\>)(.*)$",text,re.DOTALL)
if not m:
return(text)
svgfile = m.group(3) + "." + m.group(4)
textsvg = codecs.open(svgfile,"r",encoding="utf8").read()
textsvg = re.sub(r"(\<svg[^\<\>]+) +width\S+", r"\1",textsvg)
textsvg = re.sub(r"(\<svg[^\<\>]+) +height\S+",r"\1",textsvg)
# print m.group(5)
m1 = re.search(r"width\=[\'\"](.*?)[\'\"]",m.group(5))
size = ""
if m1:
print m1.group(1)
size = size + "width=\"" + m1.group(1) + "\" "
m1 = re.search(r"height\=[\'\"](.*?)[\'\"]",m.group(5))
if m1:
print m1.group(1)
size = size + "height=\"" + m1.group(1) + "\" "
textsvg = re.sub(r"\<svg","<svg "+size,textsvg)
text = m.group(1) + textsvg + m.group(6)
return(text)
#***************************************************************************
if __name__ == "__main__":
Gx.__dict__[sys.argv[1]](Gx(),sys.argv[2:])