Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1"""
2@file
3@brief Svg, Latex
4"""
5import os
6import re
7import urllib
8import urllib.parse
9import urllib.request
10from pyquickhelper.loghelper import fLOG
11from .latex2html import convert_short_latex_into_png
14def load_file(filename):
15 try:
16 f = open(filename, "r", encoding="utf8")
17 text = f.read()
18 f.close()
19 return text
20 except Exception as e:
21 fLOG("e,", __name__, ": issue with ", filename)
22 raise e
25def get_url_latex(exp, gif):
26 exp = exp.replace("\n", " ").strip("\n ").replace("\r", "")
27 url = "http://latex.codecogs.com/gif.latex?" if gif else \
28 "http://latex.codecogs.com/svg.latex?"
29 exp = exp.replace("+", "AZERTY").replace("<", "<").replace(">", ">")
30 exp = exp.replace("&", "%26").replace("%", "%25")
31 exp = urllib.parse.quote_plus(exp)
32 exp = exp.replace("+", "%20").replace("AZERTY", "+")
33 url += exp
34 return url
37def get_svg_or_gif(url):
38 u = urllib.request.urlopen(url)
39 text = u.read()
40 u.close()
41 return text
44def get_latex_contraction(formula):
45 exp = re.compile("([^a-zA-Z0-9])")
46 res = exp.sub("", formula)
47 return res
50def text_replace_div_gif(text, htmltext, alt, gif, prefix, inline, size):
51 filename = os.path.split(gif)[-1]
52 filename = prefix + "/" + filename
53 if not inline:
54 rep = "<!--\n%s\n-->\n" % htmltext.replace('"latex"', '"latex_help"')
55 alt = alt.replace("\n", " ")
56 px = "%dpx" % (size[0] / 2)
57 rep += '<p class="latexcenter">\n<img src="%s" alt="%s" title="%s" width="%s" />\n</p>\n' % (
58 filename, alt, alt, px)
59 else:
60 rep = "<!--\n%s\n-->\n" % htmltext.replace(
61 '"latex_inline"', '"latex_help_inline"')
62 alt = alt.replace("\n", " ")
63 px = "%dpx" % (size[0] / 2)
64 rep += ' <img src="%s" alt="%s" title="%s" width="%s" /> ' % (
65 filename, alt, alt, px)
66 text = text.replace(htmltext, rep)
67 return text
70def extract_div(prefix, prefiximage, text, logfunction, temp_folder):
71 exp = re.compile("(<div +lang=\\\"latex(_inline)?\\\">((.|\\n)+?)</div>)")
72 res = exp.findall(text)
73 images = []
74 for a, inline, b, _ in res:
75 logfunction(" ------------ converting (div), prefix ", prefix)
76 logfunction(" latex: " + b.strip("\n ").replace("\n", " "))
77 cont = get_latex_contraction(b)
78 image = prefix + cont + ".gif"
79 if not os.path.exists(image):
80 # using a local installation of miktex
81 image, size = convert_short_latex_into_png(
82 b, temp_folder=temp_folder, fLOG=logfunction, final_name=image)
83 images.append(image)
84 else:
85 from PIL import Image
86 im = Image.open(image)
87 size = im.size
88 logfunction(" replacing: " + image)
89 text = text_replace_div_gif(
90 text, a, b, image, prefiximage, len(inline) > 0, size)
92 return len(res), text, images
95def text_replace_span_gif(text, htmltext, alt, gif, prefix):
96 filename = os.path.split(gif)[-1]
97 filename = prefix + "/" + filename
98 rep = "<!-- %s -->" % htmltext.replace('"latex"', '"latex_help"')
99 alt = alt.replace("\n", " ")
100 rep += '<img src="%s" alt="%s" title="%s" />' % (filename, alt, alt)
101 text = text.replace(htmltext, rep)
102 return text
105def extract_span(prefix, prefiximage, text, logfunction):
106 exp = re.compile("(<span +lang=\\\"latex\\\">((.|\\n)+?)</span>)")
107 res = exp.findall(text)
108 for a, b, _ in res:
109 logfunction(" ------------ converting (span) ")
110 logfunction(" latex: " + b.strip("\n ").replace("\n", " "))
111 cont = get_latex_contraction(b)
112 image = prefix + cont + ".gif"
113 if not os.path.exists(image):
114 raise FileNotFoundError(image)
115 logfunction(" replacing: " + image)
116 text = text_replace_span_gif(text, a, b, image, prefiximage)
118 return text
121def replace_file(file, outfile, prefix, giflatex, logfunction, temp_folder):
122 logfunction(" replacing formulas in html for file ", file)
123 text = load_file(file)
124 keep_text = text
125 prefix += file.replace("/", "_").replace("\\",
126 "_").replace(":", "_") + "__"
127 _, text, images = extract_div(
128 prefix, giflatex, text, logfunction, temp_folder)
129 text = extract_span(prefix, giflatex, text, logfunction)
130 if text != keep_text:
131 logfunction("found formulas in ", file, " nb images ", len(images))
132 f = open(outfile, "w", encoding="utf8")
133 f.write(text)
134 f.close()
135 else:
136 fLOG("i, no detected changes for ", file)
137 return outfile, images
140def print_function(*s):
141 fLOG("i,", *s)
142 return s