X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Flyx2lyx%2Flyx_2_4.py;h=8436d9a84c1e57e3d5de5814b4c4a94f68101405;hb=69ed8cb89abd291b19ca2a3423d1f368a0d67f71;hp=dd7e31ca55721eae098b33766ca29957fb46479c;hpb=6e88579c564129f2e9dd07fb7ac3cb66cbb1cf56;p=lyx.git diff --git a/lib/lyx2lyx/lyx_2_4.py b/lib/lyx2lyx/lyx_2_4.py index dd7e31ca55..8436d9a84c 100644 --- a/lib/lyx2lyx/lyx_2_4.py +++ b/lib/lyx2lyx/lyx_2_4.py @@ -72,7 +72,8 @@ class fontinfo: self.package = None self.options = [] self.pkgkey = None # key into pkg2fontmap - self.osfopt = None # None, string + self.osfopt = None # None, string + self.osfdef = "false" # "false" or "true" def addkey(self): self.pkgkey = createkey(self.package, self.options) @@ -83,7 +84,7 @@ class fontmapping: self.pkg2fontmap = dict() self.pkginmap = dict() # defines, if a map for package exists - def expandFontMapping(self, font_list, font_type, scale_type, pkg, scaleopt = None, osfopt = None): + def expandFontMapping(self, font_list, font_type, scale_type, pkg, scaleopt = None, osfopt = None, osfdef = "false"): " Expand fontinfo mapping" # # fontlist: list of fontnames, each element @@ -95,6 +96,7 @@ class fontmapping: # scaleopt: one of None, 'scale', 'scaled', or some other string # to be used in scale option (e.g. scaled=0.7) # osfopt: None or some other string to be used in osf option + # osfdef: "true" if osf is default for fl in font_list: fe = fontinfo() fe.fonttype = font_type @@ -105,6 +107,7 @@ class fontmapping: fe.options = flt[1:] fe.scaleopt = scaleopt fe.osfopt = osfopt + fe.osfdef = osfdef if pkg == None: fe.package = font_name else: @@ -176,6 +179,21 @@ def createFontMapping(fontlist): elif font == 'Cantarell': fm.expandFontMapping(['cantarell,defaultsans'], "sans", "sf", "cantarell", "scaled", "oldstyle") + elif font == 'Chivo': + fm.expandFontMapping(['ChivoThin,thin', 'ChivoLight,light', + 'Chivo,regular', 'ChivoMedium,medium'], + "sans", "sf", "Chivo", "scale", "oldstyle") + elif font == 'CrimsonPro': + fm.expandFontMapping(['CrimsonPro', 'CrimsonProExtraLight,extralight', 'CrimsonProLight,light', + 'CrimsonProMedium,medium'], + "roman", None, "CrimsonPro", None, "lf", "true") + elif font == 'Fira': + fm.expandFontMapping(['FiraSans', 'FiraSansBook,book', + 'FiraSansThin,thin', 'FiraSansLight,light', + 'FiraSansExtralight,extralight', + 'FiraSansUltralight,ultralight'], + "sans", "sf", "FiraSans", "scaled", "lf", "true") + fm.expandFontMapping(['FiraMono'], "typewriter", "tt", "FiraMono", "scaled", "lf", "true") return fm def convert_fonts(document, fm, osfoption = "osf"): @@ -184,6 +202,9 @@ def convert_fonts(document, fm, osfoption = "osf"): rpkg = re.compile(r'^\\usepackage(\[([^\]]*)\])?\{([^\}]+)\}') rscaleopt = re.compile(r'^scaled?=(.*)') + # Check whether we go beyond font option feature introduction + haveFontOpts = document.end_format > 580 + i = 0 while i < len(document.preamble): i = find_re(document.preamble, rpkg, i+1) @@ -214,7 +235,23 @@ def convert_fonts(document, fm, osfoption = "osf"): if not pkg in fm.pkginmap: continue # determine fontname - fn = fm.getfontname(pkg, options) + fn = None + if haveFontOpts: + # Try with name-option combination first + # (only one default option supported currently) + o = 0 + while o < len(options): + opt = options[o] + fn = fm.getfontname(pkg, [opt]) + if fn != None: + del options[o] + break + o += 1 + continue + if fn == None: + fn = fm.getfontname(pkg, []) + else: + fn = fm.getfontname(pkg, options) if fn == None: continue del document.preamble[i] @@ -224,7 +261,7 @@ def convert_fonts(document, fm, osfoption = "osf"): else: fontscale = "\\font_" + fontinfo.scaletype + "_scale" fontinfo.scaleval = oscale - if has_osf: + if (has_osf and fontinfo.osfdef == "false") or (not has_osf and fontinfo.osfdef == "true"): if fontinfo.osfopt == None: options.extend(osfoption) continue @@ -255,6 +292,20 @@ def convert_fonts(document, fm, osfoption = "osf"): words = val.split() # ! splits also values like '"DejaVu Sans"' words[0] = '"' + fn + '"' document.header[j] = ft + ' ' + ' '.join(words) + if haveFontOpts and fontinfo.fonttype != "math": + fotag = "\\font_" + fontinfo.fonttype + "_opts" + fo = find_token(document.header, fotag) + if fo != -1: + document.header[fo] = fotag + " \"" + ",".join(options) + "\"" + else: + # Sensible place to insert tag + fo = find_token(document.header, "\\font_sf_scale") + if fo == -1: + document.warning("Malformed LyX document! Missing \\font_sf_scale") + else: + document.header.insert(fo, fotag + " \"" + ",".join(options) + "\"") + + def revert_fonts(document, fm, fontmap, OnlyWithXOpts = False, WithXOpts = False): " Revert native font definition to LaTeX " @@ -314,14 +365,17 @@ def revert_fonts(document, fm, fontmap, OnlyWithXOpts = False, WithXOpts = False # set correct scale option fontmap[val].extend([fontinfo.scaleopt + "=" + format(float(xval1) / 100, '.2f')]) if fontinfo.osfopt != None: - osf = find_token(document.header, "\\font_osf true") + oldval = "true" + if fontinfo.osfdef == "true": + oldval = "false" + osf = find_token(document.header, "\\font_osf " + oldval) if osf == -1 and ft != "\\font_math": # Try with newer format - osftag = "\\font_roman_osf true" + osftag = "\\font_roman_osf " + oldval if ft == "\\font_sans": - osftag = "\\font_sans_osf true" + osftag = "\\font_sans_osf " + oldval elif ft == "\\font_typewriter": - osftag = "\\font_typewriter_osf true" + osftag = "\\font_typewriter_osf " + oldval osf = find_token(document.header, osftag) if osf != -1: fontmap[val].extend([fontinfo.osfopt]) @@ -588,7 +642,7 @@ def revert_lscape(document): while True: i = find_token(document.body, "\\begin_inset Flex Landscape", i+1) if i == -1: - return + break j = find_end_of_inset(document.body, i) if j == -1: document.warning("Malformed LyX document: Can't find end of Landscape inset") @@ -603,6 +657,7 @@ def revert_lscape(document): document.body[i : i + 4] = put_cmd_in_ert("\\begin{landscape}") add_to_preamble(document, ["\\usepackage{pdflscape}"]) + document.del_module("landscape") def convert_fontenc(document): @@ -1002,6 +1057,26 @@ def revert_vcsinfo(document): document.body[tp] = "type \"buffer\"" document.body[arg] = "arg \"vcs-" + argv + "\"" +def revert_vcsinfo_rev_abbrev(document): + " Convert abbreviated revisions to regular revisions. " + + i = 0 + while True: + i = find_token(document.body, "\\begin_inset Info", i+1) + if i == -1: + return + j = find_end_of_inset(document.body, i+1) + if j == -1: + document.warning("Malformed LyX document: Could not find end of Info inset.") + continue + tp = find_token(document.body, 'type', i, j) + tpv = get_quoted_value(document.body, "type", tp) + if tpv != "vcs": + continue + arg = find_token(document.body, 'arg', i, j) + argv = get_quoted_value(document.body, "arg", arg) + if( argv == "revision-abbrev" ): + document.body[arg] = "arg \"revision\"" def revert_dateinfo(document): " Revert date info insets to static text. " @@ -1947,7 +2022,7 @@ def revert_linggloss(document): beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i) endInset = find_end_of_inset(document.body, i) - endPlain = find_token_backwards(document.body, "\\end_layout", endInset) + endPlain = find_end_of_layout(document.body, beginPlain) precontent = put_cmd_in_ert(cmd) if len(optargcontent) > 0: precontent += put_cmd_in_ert("[") + optargcontent + put_cmd_in_ert("]") @@ -2872,6 +2947,639 @@ def revert_CantarellFont(document): if revert_fonts(document, fm, fontmap, False, True): add_preamble_fonts(document, fontmap) +def convert_ChivoFont(document): + " Handle Chivo font definition to LaTeX " + + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + fm = createFontMapping(['Chivo']) + convert_fonts(document, fm, "oldstyle") + +def revert_ChivoFont(document): + " Revert native Chivo font definition to LaTeX " + + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + fontmap = dict() + fm = createFontMapping(['Chivo']) + if revert_fonts(document, fm, fontmap, False, True): + add_preamble_fonts(document, fontmap) + + +def convert_FiraFont(document): + " Handle Fira font definition to LaTeX " + + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + fm = createFontMapping(['Fira']) + convert_fonts(document, fm, "lf") + +def revert_FiraFont(document): + " Revert native Fira font definition to LaTeX " + + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + fontmap = dict() + fm = createFontMapping(['Fira']) + if revert_fonts(document, fm, fontmap, False, True): + add_preamble_fonts(document, fontmap) + + +def convert_Semibolds(document): + " Move semibold options to extraopts " + + NonTeXFonts = False + i = find_token(document.header, '\\use_non_tex_fonts', 0) + if i == -1: + document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.") + else: + NonTeXFonts = str2bool(get_value(document.header, "\\use_non_tex_fonts", i)) + + i = find_token(document.header, "\\font_roman", 0) + if i == -1: + document.warning("Malformed LyX document: Missing \\font_roman.") + else: + # We need to use this regex since split() does not handle quote protection + romanfont = re.findall(r'[^"\s]\S*|".+?"', document.header[i]) + roman = romanfont[1].strip('"') + if roman == "IBMPlexSerifSemibold": + romanfont[1] = '"IBMPlexSerif"' + document.header[i] = " ".join(romanfont) + + if NonTeXFonts == False: + regexp = re.compile(r'(\\font_roman_opts)') + x = find_re(document.header, regexp, 0) + if x == -1: + # Sensible place to insert tag + fo = find_token(document.header, "\\font_sf_scale") + if fo == -1: + document.warning("Malformed LyX document! Missing \\font_sf_scale") + else: + document.header.insert(fo, "\\font_roman_opts \"semibold\"") + else: + # We need to use this regex since split() does not handle quote protection + romanopts = re.findall(r'[^"\s]\S*|".+?"', document.header[x]) + document.header[x] = "\\font_roman_opts \"semibold, " + romanopts[1].strip('"') + "\"" + + i = find_token(document.header, "\\font_sans", 0) + if i == -1: + document.warning("Malformed LyX document: Missing \\font_sans.") + else: + # We need to use this regex since split() does not handle quote protection + sffont = re.findall(r'[^"\s]\S*|".+?"', document.header[i]) + sf = sffont[1].strip('"') + if sf == "IBMPlexSansSemibold": + sffont[1] = '"IBMPlexSans"' + document.header[i] = " ".join(sffont) + + if NonTeXFonts == False: + regexp = re.compile(r'(\\font_sans_opts)') + x = find_re(document.header, regexp, 0) + if x == -1: + # Sensible place to insert tag + fo = find_token(document.header, "\\font_sf_scale") + if fo == -1: + document.warning("Malformed LyX document! Missing \\font_sf_scale") + else: + document.header.insert(fo, "\\font_sans_opts \"semibold\"") + else: + # We need to use this regex since split() does not handle quote protection + sfopts = re.findall(r'[^"\s]\S*|".+?"', document.header[x]) + document.header[x] = "\\font_sans_opts \"semibold, " + sfopts[1].strip('"') + "\"" + + i = find_token(document.header, "\\font_typewriter", 0) + if i == -1: + document.warning("Malformed LyX document: Missing \\font_typewriter.") + else: + # We need to use this regex since split() does not handle quote protection + ttfont = re.findall(r'[^"\s]\S*|".+?"', document.header[i]) + tt = ttfont[1].strip('"') + if tt == "IBMPlexMonoSemibold": + ttfont[1] = '"IBMPlexMono"' + document.header[i] = " ".join(ttfont) + + if NonTeXFonts == False: + regexp = re.compile(r'(\\font_typewriter_opts)') + x = find_re(document.header, regexp, 0) + if x == -1: + # Sensible place to insert tag + fo = find_token(document.header, "\\font_tt_scale") + if fo == -1: + document.warning("Malformed LyX document! Missing \\font_tt_scale") + else: + document.header.insert(fo, "\\font_typewriter_opts \"semibold\"") + else: + # We need to use this regex since split() does not handle quote protection + ttopts = re.findall(r'[^"\s]\S*|".+?"', document.header[x]) + document.header[x] = "\\font_typewriter_opts \"semibold, " + sfopts[1].strip('"') + "\"" + + +def convert_NotoRegulars(document): + " Merge diverse noto reagular fonts " + + i = find_token(document.header, "\\font_roman", 0) + if i == -1: + document.warning("Malformed LyX document: Missing \\font_roman.") + else: + # We need to use this regex since split() does not handle quote protection + romanfont = re.findall(r'[^"\s]\S*|".+?"', document.header[i]) + roman = romanfont[1].strip('"') + if roman == "NotoSerif-TLF": + romanfont[1] = '"NotoSerifRegular"' + document.header[i] = " ".join(romanfont) + + i = find_token(document.header, "\\font_sans", 0) + if i == -1: + document.warning("Malformed LyX document: Missing \\font_sans.") + else: + # We need to use this regex since split() does not handle quote protection + sffont = re.findall(r'[^"\s]\S*|".+?"', document.header[i]) + sf = sffont[1].strip('"') + if sf == "NotoSans-TLF": + sffont[1] = '"NotoSansRegular"' + document.header[i] = " ".join(sffont) + + i = find_token(document.header, "\\font_typewriter", 0) + if i == -1: + document.warning("Malformed LyX document: Missing \\font_typewriter.") + else: + # We need to use this regex since split() does not handle quote protection + ttfont = re.findall(r'[^"\s]\S*|".+?"', document.header[i]) + tt = ttfont[1].strip('"') + if tt == "NotoMono-TLF": + ttfont[1] = '"NotoMonoRegular"' + document.header[i] = " ".join(ttfont) + + +def convert_CrimsonProFont(document): + " Handle CrimsonPro font definition to LaTeX " + + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + fm = createFontMapping(['CrimsonPro']) + convert_fonts(document, fm, "lf") + +def revert_CrimsonProFont(document): + " Revert native CrimsonPro font definition to LaTeX " + + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + fontmap = dict() + fm = createFontMapping(['CrimsonPro']) + if revert_fonts(document, fm, fontmap, False, True): + add_preamble_fonts(document, fontmap) + + +def revert_pagesizes(document): + " Revert new page sizes in memoir and KOMA to options " + + if document.textclass != "memoir" and document.textclass[:2] != "scr": + return + + i = find_token(document.header, "\\use_geometry true", 0) + if i != -1: + return + + defsizes = ["default", "custom", "letterpaper", "legalpaper", "executivepaper", "a4paper", "a5paper", "b5paper"] + + i = find_token(document.header, "\\papersize", 0) + if i == -1: + document.warning("Malformed LyX document! Missing \\papersize header.") + return + val = get_value(document.header, "\\papersize", i) + if val in defsizes: + # nothing to do + return + + document.header[i] = "\\papersize default" + + i = find_token(document.header, "\\options", 0) + if i == -1: + i = find_token(document.header, "\\textclass", 0) + if i == -1: + document.warning("Malformed LyX document! Missing \\textclass header.") + return + document.header.insert(i, "\\options " + val) + return + document.header[i] = document.header[i] + "," + val + + +def convert_pagesizes(document): + " Convert to new page sizes in memoir and KOMA to options " + + if document.textclass != "memoir" and document.textclass[:3] != "scr": + return + + i = find_token(document.header, "\\use_geometry true", 0) + if i != -1: + return + + defsizes = ["default", "custom", "letterpaper", "legalpaper", "executivepaper", "a4paper", "a5paper", "b5paper"] + + i = find_token(document.header, "\\papersize", 0) + if i == -1: + document.warning("Malformed LyX document! Missing \\papersize header.") + return + val = get_value(document.header, "\\papersize", i) + if val in defsizes: + # nothing to do + return + + i = find_token(document.header, "\\use_geometry false", 0) + if i != -1: + # Maintain use of geometry + document.header[1] = "\\use_geometry true" + +def revert_komafontsizes(document): + " Revert new font sizes in KOMA to options " + + if document.textclass[:3] != "scr": + return + + i = find_token(document.header, "\\paperfontsize", 0) + if i == -1: + document.warning("Malformed LyX document! Missing \\paperfontsize header.") + return + + defsizes = ["default", "10", "11", "12"] + + val = get_value(document.header, "\\paperfontsize", i) + if val in defsizes: + # nothing to do + return + + document.header[i] = "\\paperfontsize default" + + fsize = "fontsize=" + val + + i = find_token(document.header, "\\options", 0) + if i == -1: + i = find_token(document.header, "\\textclass", 0) + if i == -1: + document.warning("Malformed LyX document! Missing \\textclass header.") + return + document.header.insert(i, "\\options " + fsize) + return + document.header[i] = document.header[i] + "," + fsize + + +def revert_dupqualicites(document): + " Revert qualified citation list commands with duplicate keys to ERT " + + # LyX 2.3 only supports qualified citation lists with unique keys. Thus, + # we need to revert those with multiple uses of the same key. + + # Get cite engine + engine = "basic" + i = find_token(document.header, "\\cite_engine", 0) + if i == -1: + document.warning("Malformed document! Missing \\cite_engine") + else: + engine = get_value(document.header, "\\cite_engine", i) + + if not engine in ["biblatex", "biblatex-natbib"]: + return + + # Citation insets that support qualified lists, with their LaTeX code + ql_citations = { + "cite" : "cites", + "Cite" : "Cites", + "citet" : "textcites", + "Citet" : "Textcites", + "citep" : "parencites", + "Citep" : "Parencites", + "Footcite" : "Smartcites", + "footcite" : "smartcites", + "Autocite" : "Autocites", + "autocite" : "autocites", + } + + i = 0 + while (True): + i = find_token(document.body, "\\begin_inset CommandInset citation", i) + if i == -1: + break + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning("Can't find end of citation inset at line %d!!" %(i)) + i += 1 + continue + + k = find_token(document.body, "LatexCommand", i, j) + if k == -1: + document.warning("Can't find LatexCommand for citation inset at line %d!" %(i)) + i = j + 1 + continue + + cmd = get_value(document.body, "LatexCommand", k) + if not cmd in list(ql_citations.keys()): + i = j + 1 + continue + + pres = find_token(document.body, "pretextlist", i, j) + posts = find_token(document.body, "posttextlist", i, j) + if pres == -1 and posts == -1: + # nothing to do. + i = j + 1 + continue + + key = get_quoted_value(document.body, "key", i, j) + if not key: + document.warning("Citation inset at line %d does not have a key!" %(i)) + i = j + 1 + continue + + keys = key.split(",") + ukeys = list(set(keys)) + if len(keys) == len(ukeys): + # no duplicates. + i = j + 1 + continue + + pretexts = get_quoted_value(document.body, "pretextlist", pres) + posttexts = get_quoted_value(document.body, "posttextlist", posts) + + pre = get_quoted_value(document.body, "before", i, j) + post = get_quoted_value(document.body, "after", i, j) + prelist = pretexts.split("\t") + premap = dict() + for pp in prelist: + ppp = pp.split(" ", 1) + val = "" + if len(ppp) > 1: + val = ppp[1] + else: + val = "" + if ppp[0] in premap: + premap[ppp[0]] = premap[ppp[0]] + "\t" + val + else: + premap[ppp[0]] = val + postlist = posttexts.split("\t") + postmap = dict() + num = 1 + for pp in postlist: + ppp = pp.split(" ", 1) + val = "" + if len(ppp) > 1: + val = ppp[1] + else: + val = "" + if ppp[0] in postmap: + postmap[ppp[0]] = postmap[ppp[0]] + "\t" + val + else: + postmap[ppp[0]] = val + # Replace known new commands with ERT + if "(" in pre or ")" in pre: + pre = "{" + pre + "}" + if "(" in post or ")" in post: + post = "{" + post + "}" + res = "\\" + ql_citations[cmd] + if pre: + res += "(" + pre + ")" + if post: + res += "(" + post + ")" + elif pre: + res += "()" + for kk in keys: + if premap.get(kk, "") != "": + akeys = premap[kk].split("\t", 1) + akey = akeys[0] + if akey != "": + res += "[" + akey + "]" + if len(akeys) > 1: + premap[kk] = "\t".join(akeys[1:]) + else: + premap[kk] = "" + if postmap.get(kk, "") != "": + akeys = postmap[kk].split("\t", 1) + akey = akeys[0] + if akey != "": + res += "[" + akey + "]" + if len(akeys) > 1: + postmap[kk] = "\t".join(akeys[1:]) + else: + postmap[kk] = "" + elif premap.get(kk, "") != "": + res += "[]" + res += "{" + kk + "}" + document.body[i:j+1] = put_cmd_in_ert([res]) + + +def convert_pagesizenames(document): + " Convert LyX page sizes names " + + i = find_token(document.header, "\\papersize", 0) + if i == -1: + document.warning("Malformed LyX document! Missing \\papersize header.") + return + oldnames = ["letterpaper", "legalpaper", "executivepaper", \ + "a0paper", "a1paper", "a2paper", "a3paper", "a4paper", "a5paper", "a6paper", \ + "b0paper", "b1paper", "b2paper", "b3paper", "b4paper", "b5paper", "b6paper", \ + "c0paper", "c1paper", "c2paper", "c3paper", "c4paper", "c5paper", "c6paper"] + val = get_value(document.header, "\\papersize", i) + if val in oldnames: + newval = val.replace("paper", "") + document.header[i] = "\\papersize " + newval + +def revert_pagesizenames(document): + " Convert LyX page sizes names " + + i = find_token(document.header, "\\papersize", 0) + if i == -1: + document.warning("Malformed LyX document! Missing \\papersize header.") + return + newnames = ["letter", "legal", "executive", \ + "a0", "a1", "a2", "a3", "a4", "a5", "a6", \ + "b0", "b1", "b2", "b3", "b4", "b5", "b6", \ + "c0", "c1", "c2", "c3", "c4", "c5", "c6"] + val = get_value(document.header, "\\papersize", i) + if val in newnames: + newval = val + "paper" + document.header[i] = "\\papersize " + newval + + +def revert_theendnotes(document): + " Reverts native support of \\theendnotes to TeX-code " + + if not "endnotes" in document.get_module_list() and not "foottoend" in document.get_module_list(): + return + + i = 0 + while True: + i = find_token(document.body, "\\begin_inset FloatList endnote", i + 1) + if i == -1: + return + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning("Malformed LyX document: Can't find end of FloatList inset") + continue + + document.body[i : j + 1] = put_cmd_in_ert("\\theendnotes") + + +def revert_enotez(document): + " Reverts native support of enotez package to TeX-code " + + if not "enotez" in document.get_module_list() and not "foottoenotez" in document.get_module_list(): + return + + use = False + if find_token(document.body, "\\begin_inset Flex Endnote", 0) != -1: + use = True + + revert_flex_inset(document.body, "Endnote", "\\endnote") + + i = 0 + while True: + i = find_token(document.body, "\\begin_inset FloatList endnote", i + 1) + if i == -1: + break + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning("Malformed LyX document: Can't find end of FloatList inset") + continue + + use = True + document.body[i : j + 1] = put_cmd_in_ert("\\printendnotes") + + if use: + add_to_preamble(document, ["\\usepackage{enotez}"]) + document.del_module("enotez") + document.del_module("foottoenotez") + + +def revert_memoir_endnotes(document): + " Reverts native support of memoir endnotes to TeX-code " + + if document.textclass != "memoir": + return + + encommand = "\\pagenote" + modules = document.get_module_list() + if "enotez" in modules or "foottoenotez" in modules or "endnotes" in modules or "foottoend" in modules: + encommand = "\\endnote" + + revert_flex_inset(document.body, "Endnote", encommand) + + i = 0 + while True: + i = find_token(document.body, "\\begin_inset FloatList pagenote", i + 1) + if i == -1: + break + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning("Malformed LyX document: Can't find end of FloatList inset") + continue + + if document.body[i] == "\\begin_inset FloatList pagenote*": + document.body[i : j + 1] = put_cmd_in_ert("\\printpagenotes*") + else: + document.body[i : j + 1] = put_cmd_in_ert("\\printpagenotes") + add_to_preamble(document, ["\\makepagenote"]) + + +def revert_totalheight(document): + " Reverts graphics height parameter from totalheight to height " + + i = 0 + while (True): + i = find_token(document.body, "\\begin_inset Graphics", i) + if i == -1: + break + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning("Can't find end of graphics inset at line %d!!" %(i)) + i += 1 + continue + + rx = re.compile(r'\s*special\s*(\S+)$') + k = find_re(document.body, rx, i, j) + special = "" + oldheight = "" + if k != -1: + m = rx.match(document.body[k]) + if m: + special = m.group(1) + mspecial = special.split(',') + for spc in mspecial: + if spc[:7] == "height=": + oldheight = spc.split('=')[1] + mspecial.remove(spc) + break + if len(mspecial) > 0: + special = ",".join(mspecial) + else: + special = "" + + rx = re.compile(r'(\s*height\s*)(\S+)$') + kk = find_re(document.body, rx, i, j) + if kk != -1: + m = rx.match(document.body[kk]) + val = "" + if m: + val = m.group(2) + if k != -1: + if special != "": + val = val + "," + special + document.body[k] = "\tspecial " + "totalheight=" + val + else: + document.body.insert(kk, "\tspecial totalheight=" + val) + if oldheight != "": + document.body[kk] = m.group(1) + oldheight + else: + del document.body[kk] + elif oldheight != "": + document.body.insert(k, "\theight " + oldheight) + i = j + 1 + + +def convert_totalheight(document): + " Converts graphics height parameter from totalheight to height " + + i = 0 + while (True): + i = find_token(document.body, "\\begin_inset Graphics", i) + if i == -1: + break + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning("Can't find end of graphics inset at line %d!!" %(i)) + i += 1 + continue + + rx = re.compile(r'\s*special\s*(\S+)$') + k = find_re(document.body, rx, i, j) + special = "" + newheight = "" + if k != -1: + m = rx.match(document.body[k]) + if m: + special = m.group(1) + mspecial = special.split(',') + for spc in mspecial: + if spc[:12] == "totalheight=": + newheight = spc.split('=')[1] + mspecial.remove(spc) + break + if len(mspecial) > 0: + special = ",".join(mspecial) + else: + special = "" + + rx = re.compile(r'(\s*height\s*)(\S+)$') + kk = find_re(document.body, rx, i, j) + if kk != -1: + m = rx.match(document.body[kk]) + val = "" + if m: + val = m.group(2) + if k != -1: + if special != "": + val = val + "," + special + document.body[k] = "\tspecial " + "height=" + val + else: + document.body.insert(kk + 1, "\tspecial height=" + val) + if newheight != "": + document.body[kk] = m.group(1) + newheight + else: + del document.body[kk] + elif newheight != "": + document.body.insert(k, "\theight " + newheight) + i = j + 1 ## # Conversion hub @@ -2916,10 +3624,24 @@ convert = [ [579, []], [580, []], [581, [convert_osf]], - [582, [convert_CantarellFont]], + [582, [convert_AdobeFonts,convert_latexFonts,convert_notoFonts,convert_CantarellFont,convert_FiraFont]],# old font re-converterted due to extra options + [583, [convert_ChivoFont,convert_Semibolds,convert_NotoRegulars,convert_CrimsonProFont]], + [584, []], + [585, [convert_pagesizes]], + [586, []], + [587, [convert_pagesizenames]], + [588, []], + [589, [convert_totalheight]] ] -revert = [[581, [revert_CantarellFont]], +revert = [[588, [revert_totalheight]], + [587, [revert_memoir_endnotes,revert_enotez,revert_theendnotes]], + [586, [revert_pagesizenames]], + [585, [revert_dupqualicites]], + [584, [revert_pagesizes,revert_komafontsizes]], + [583, [revert_vcsinfo_rev_abbrev]], + [582, [revert_ChivoFont,revert_CrimsonProFont]], + [581, [revert_CantarellFont,revert_FiraFont]], [580, [revert_texfontopts,revert_osf]], [579, [revert_minionpro, revert_plainNotoFonts_xopts, revert_notoFonts_xopts, revert_IBMFonts_xopts, revert_AdobeFonts_xopts, revert_font_opts]], # keep revert_font_opts last! [578, [revert_babelfont]],