Hide keyboard shortcuts

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 

12 

13 

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 

23 

24 

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("&lt;", "<").replace("&gt;", ">") 

30 exp = exp.replace("&amp;", "%26").replace("%", "%25") 

31 exp = urllib.parse.quote_plus(exp) 

32 exp = exp.replace("+", "%20").replace("AZERTY", "+") 

33 url += exp 

34 return url 

35 

36 

37def get_svg_or_gif(url): 

38 u = urllib.request.urlopen(url) 

39 text = u.read() 

40 u.close() 

41 return text 

42 

43 

44def get_latex_contraction(formula): 

45 exp = re.compile("([^a-zA-Z0-9])") 

46 res = exp.sub("", formula) 

47 return res 

48 

49 

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 

68 

69 

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) 

91 

92 return len(res), text, images 

93 

94 

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 

103 

104 

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) 

117 

118 return text 

119 

120 

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 

138 

139 

140def print_function(*s): 

141 fLOG("i,", *s) 

142 return s