X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fscripts%2Flayout2layout.py;h=cb6023c96fcb4e0b88a694c1861a942e3201a3ca;hb=729ab602ca7081b034ff346dc80f0ecb4a55efe8;hp=f7fe8376f14b981d43bb9292720587c583bc5bef;hpb=3eb3608138143249fe32edf9a55a766347ac87b0;p=lyx.git diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py index f7fe8376f1..cb6023c96f 100644 --- a/lib/scripts/layout2layout.py +++ b/lib/scripts/layout2layout.py @@ -11,7 +11,7 @@ # This script will update a .layout file to current format # The latest layout format is also defined in src/TextClass.cpp -currentFormat = 96 +currentFormat = 102 # Incremented to format 4, 6 April 2007, lasgouttes @@ -325,6 +325,25 @@ currentFormat = 96 # Incremented to format 96, 4 December 2022 by rikiheck # Add HTMLInToc +# Incremented to format 97, 4 December 2022 by rikiheck +# Add HTMLClass + +# Incremented to format 98, 5 December 2022 by rikiheck +# Add HTMLClass for InsetLayout + +# Incremented to format 99, 22 December 2022 by tcuvelier +# Add DocBookGenerateTitle for Layout + +# Incremented to format 100, 9 May 2023 by forenr +# Add inset label color + +# Incremented to format 101, 22 July 2023 by lasgouttes +# add InsetLayout tag InheritFont + +# Incremented to format 102, 25 July 2023 by spitz +# add InsetLayout tags AllowedInInsets, EndAllowedInInsets, +# AllowedInLayouts, EndAllowedInLayouts, AllowedOccurrences + # Do not forget to document format change in Customization # Manual (section "Declaring a new text class"). @@ -445,7 +464,6 @@ def convert(lines, end_format): re_CopyStyle2 = re.compile(b'(\\s*CopyStyle\\s+)"?([^"]+)"?\\s*$') re_Separator = re.compile(b'^(?:(-*)|(\\s*))(Separator|EndOfSlide)(?:(-*)|(\\s*))$', re.IGNORECASE) # for categories - re_Declaration = re.compile(b'^#\\s*\\Declare\\w+Class.*$') re_ExtractCategory = re.compile(b'^(#\\s*\\Declare\\w+Class(?:\\[[^]]*?\\])?){([^(]+?)\\s+\\(([^)]+?)\\)\\s*}\\s*$') ConvDict = {b"article": b"Articles", b"book": b"Books", b"letter": b"Letters", b"report": b"Reports", b"presentation": b"Presentations", b"curriculum vitae": b"Curricula Vitae", b"handout": b"Handouts"} @@ -464,8 +482,9 @@ def convert(lines, end_format): re_trimLabelStringAppendix = re.compile(b'^(\\s*LabelStringAppendix\\s+)"\\s*(.*?)\\s*"\\s*$') re_trimEndLabelString = re.compile(b'^(\\s*EndLabelString\\s+)"\\s*(.*?)\\s*"\\s*$') re_trimLabelCounter = re.compile(b'^(\\s*LabelCounter\\s+)"\\s*(.*?)\\s*"\\s*$') - - + # for format 100 + re_InsetLayout100 = re.compile(b'^\\s*InsetLayout\\s+\\"?(Box|Float|Foot|Marginal|Listings|Note:Comment|Note:Greyedout|Tabular)(:\\S*)?\\"?\\s*$', re.IGNORECASE) + re_InheritFont = re.compile(b'^(\\s*)InheritFont(\\s+)(\\S+)$', re.IGNORECASE) # counters for sectioning styles (hardcoded in 1.3) counters = {b"part" : b"\\Roman{part}", b"chapter" : b"\\arabic{chapter}", @@ -498,7 +517,6 @@ def convert(lines, end_format): toclevel = b"" label = b"" labelstring = b"" - labelstringappendix = b"" space1 = b"" labelstring_line = -1 labelstringappendix_line = -1 @@ -514,30 +532,28 @@ def convert(lines, end_format): opts = 0 reqs = 0 inchapter = False - isflexlayout = False # only used for 48 -> 49 # Whether a style is inherited (works only for CopyStyle currently, # not for true inherited styles, see bug 8920 inherited = False # only used for 48 -> 49 - resetsfont_found = False # only used for 48 -> 49 while i < len(lines): # Skip comments and empty lines if (re_Comment.match(lines[i]) or re_Empty.match(lines[i])): - # We need to deal with this conversion here, because it happens - # inside the initial comment block. - if only_comment and format == 39: - match = re_ExtractCategory.match(lines[i]) - if match: - lpre = match.group(1) - lcat = match.group(2) - lnam = match.group(3) - if lcat in ConvDict: - lcat = ConvDict[lcat] - lines[i] = lpre + b"{" + lnam + b"}" - lines.insert(i+1, b"# \\DeclareCategory{" + lcat + b"}") - i += 1 - i += 1 - continue + # We need to deal with this conversion here, because it happens + # inside the initial comment block. + if only_comment and format == 39: + match = re_ExtractCategory.match(lines[i]) + if match: + lpre = match.group(1) + lcat = match.group(2) + lnam = match.group(3) + if lcat in ConvDict: + lcat = ConvDict[lcat] + lines[i] = lpre + b"{" + lnam + b"}" + lines.insert(i+1, b"# \\DeclareCategory{" + lcat + b"}") + i += 1 + i += 1 + continue # insert file format if not already there if only_comment: @@ -575,7 +591,41 @@ def convert(lines, end_format): i += 1 continue - if 87 <= format <= 95: + if format == 101: + # nothing to do. + i += 1 + continue + + if format == 100: + # InheritFont has been introduced and defaults to true. Some insets had + # an hardcoded inheritFont') method returning true. We removed them, so + # we want to introduce the correct tag if it is not already there. + match = re_InsetLayout100.match(lines[i]) + if not match: + i += 1 + continue + + inheritfont_found = False + inherited = False + while i < len(lines): + match = re_InheritFont.match(lines[i]) + if match: + inheritfont_found = True + else: + match = re_CopyStyle.match(lines[i]) + if match: + inherited = True + else: + match = re_End.match(lines[i]) + if match: + break + i += 1 + if not inheritfont_found and not inherited: + lines.insert(i, b"\tInheritFont false") + + continue + + if 87 <= format <= 99: # nothing to do. i += 1 continue @@ -729,8 +779,8 @@ def convert(lines, end_format): if format == 48: # The default of ResetsFont in LyX changed from true to false, # because it is now used for all InsetLayouts, not only flex ones. - # Therefore we need to set it to true for all flex insets which do - # do not already have a ResetsFont. + # Therefore, we need to set it to true for all flex insets which do + # not already have a ResetsFont. match = re_InsetLayout2.match(lines[i]) if not match: i += 1 @@ -743,22 +793,21 @@ def convert(lines, end_format): resetsfont_found = False inherited = False - notdone = True while i < len(lines): - match = re_ResetsFont.match(lines[i]) - if match: - resetsfont_found = True - else: - match = re_CopyStyle.match(lines[i]) + match = re_ResetsFont.match(lines[i]) if match: - inherited = True + resetsfont_found = True else: - match = re_End.match(lines[i]) - if match: - break - i += 1 + match = re_CopyStyle.match(lines[i]) + if match: + inherited = True + else: + match = re_End.match(lines[i]) + if match: + break + i += 1 if not resetsfont_found and not inherited: - lines.insert(i, b"\tResetsFont true") + lines.insert(i, b"\tResetsFont true") continue @@ -768,38 +817,38 @@ def convert(lines, end_format): continue if format == 43: - match = re_LabelTypeIsCounter.match(lines[i]) - if match: - if inchapter: - lines[i] = match.group(1) + b"LabelType" + match.group(2) + b"Above" - else: - lines[i] = match.group(1) + b"LabelType" + match.group(2) + b"Static" - - match = re_TopEnvironment.match(lines[i]) - if match: - lines[i] = match.group(1) + b"LabelType" + match.group(2) + b"Above" - - match = re_CenteredEnvironment.match(lines[i]) - if match: - lines[i] = match.group(1) + b"LabelType" + match.group(2) + b"Centered" + match = re_LabelTypeIsCounter.match(lines[i]) + if match: + if inchapter: + lines[i] = match.group(1) + b"LabelType" + match.group(2) + b"Above" + else: + lines[i] = match.group(1) + b"LabelType" + match.group(2) + b"Static" - if inchapter: - match = re_Style.match(lines[i]) + match = re_TopEnvironment.match(lines[i]) if match: - inchapter = False - else: - match = re_ChapterStyle.match(lines[i]) + lines[i] = match.group(1) + b"LabelType" + match.group(2) + b"Above" + + match = re_CenteredEnvironment.match(lines[i]) if match: - inchapter = True + lines[i] = match.group(1) + b"LabelType" + match.group(2) + b"Centered" - i += 1 - continue + if inchapter: + match = re_Style.match(lines[i]) + if match: + inchapter = False + else: + match = re_ChapterStyle.match(lines[i]) + if match: + inchapter = True + + i += 1 + continue if format == 42: - if lines[i] == b"InsetLayout Caption": - lines[i] = b"InsetLayout Caption:Standard" - i += 1 - continue + if lines[i] == b"InsetLayout Caption": + lines[i] = b"InsetLayout Caption:Standard" + i += 1 + continue if format == 41: # nothing to do. @@ -853,7 +902,7 @@ def convert(lines, end_format): # Now the mandatories if reqs > 0: actopt = opts + 1 - while actopt < (opts + reqs + 1): + while actopt < opts + reqs + 1: newarg += [ b'%sArgument %d' % (space1, actopt), b'%s\tLabelString\t"Required Layout Argument %d"' % (space1, actopt - opts), b'%s\tMandatory\t1' % (space1), @@ -888,141 +937,141 @@ def convert(lines, end_format): continue if format == 35: - i += 1 - continue + i += 1 + continue if format == 34: - match = re_QInsetLayout2.match(lines[i]) - if not match: - match = re_InsetLayout2.match(lines[i]) - if not match: - match = re_CopyStyle2.match(lines[i]) + match = re_QInsetLayout2.match(lines[i]) if not match: - i += 1 - continue - style = match.group(2) + match = re_InsetLayout2.match(lines[i]) + if not match: + match = re_CopyStyle2.match(lines[i]) + if not match: + i += 1 + continue + style = match.group(2) - if flexstyles.count(style): - lines[i] = match.group(1) + b"\"Flex:" + style + b"\"" - i += 1 - continue + if flexstyles.count(style): + lines[i] = match.group(1) + b"\"Flex:" + style + b"\"" + i += 1 + continue - name = match.group(1) - names = name.split(b":", 1) - if len(names) > 1 and names[0] == b"Flex": - i += 1 - continue + name = match.group(1) + names = name.split(b":", 1) + if len(names) > 1 and names[0] == b"Flex": + i += 1 + continue - isflex = False - for j in range(i + 1, len(lines)): - if re_IsFlex.match(lines[j]): - isflex = True - break - if re_End.match(lines[j]): - break + isflex = False + for j in range(i + 1, len(lines)): + if re_IsFlex.match(lines[j]): + isflex = True + break + if re_End.match(lines[j]): + break - if isflex: - flexstyles.append(name) - lines[i] = b"InsetLayout \"Flex:" + name + b"\"" + if isflex: + flexstyles.append(name) + lines[i] = b"InsetLayout \"Flex:" + name + b"\"" - i += 1 - continue + i += 1 + continue if format == 33: - m = re_Fill.match(lines[i]) - if m: - lines[i] = b"" - i += 1 - continue + m = re_Fill.match(lines[i]) + if m: + lines[i] = b"" + i += 1 + continue if format == 32: - match = re_NeedsFloatPkg.match(lines[i]) - if match: - space = match.group(1) - val = match.group(2) - lines[i] = space + b"UsesFloatPkg " + val - newval = b'true' - if val == b'1' or val.lower() == b'true': - newval = b'false' - lines.insert(i, space + b"IsPredefined " + newval) + match = re_NeedsFloatPkg.match(lines[i]) + if match: + space = match.group(1) + val = match.group(2) + lines[i] = space + b"UsesFloatPkg " + val + newval = b'true' + if val == b'1' or val.lower() == b'true': + newval = b'false' + lines.insert(i, space + b"IsPredefined " + newval) + i += 1 i += 1 - i += 1 - continue + continue # Only new features if 29 <= format <= 31: - i += 1 - continue + i += 1 + continue if format == 28: - match = re_InsetLayout.match(lines[i]) - if match: - lines[i] = b"InsetLayout Flex:" + match.group(1) - else: - match = re_QInsetLayout.match(lines[i]) + match = re_InsetLayout.match(lines[i]) if match: - lines[i] = b"InsetLayout \"Flex:" + match.group(1) + b"\"" + lines[i] = b"InsetLayout Flex:" + match.group(1) else: - match = re_InsetLayout_CopyStyle.match(lines[i]) - if match: - lines[i] = b"\tCopyStyle Flex:" + match.group(1) - else: - match = re_QInsetLayout_CopyStyle.match(lines[i]) + match = re_QInsetLayout.match(lines[i]) if match: - lines[i] = b"\tCopyStyle \"Flex:" + match.group(1) + b"\"" - i += 1 - continue + lines[i] = b"InsetLayout \"Flex:" + match.group(1) + b"\"" + else: + match = re_InsetLayout_CopyStyle.match(lines[i]) + if match: + lines[i] = b"\tCopyStyle Flex:" + match.group(1) + else: + match = re_QInsetLayout_CopyStyle.match(lines[i]) + if match: + lines[i] = b"\tCopyStyle \"Flex:" + match.group(1) + b"\"" + i += 1 + continue # Only new features if 24 <= format <= 27: - i += 1 - continue + i += 1 + continue if format == 23: - match = re_Float.match(lines[i]) - i += 1 - if not match: - continue - # we need to do two things: - # (i) Convert Builtin to NeedsFloatPkg - # (ii) Write ListCommand lines for the builtin floats table and figure - builtin = False - cmd = b"" - while True and i < len(lines): - m1 = re_End.match(lines[i]) - if m1: - if builtin and cmd: - line = b" ListCommand " + cmd - lines.insert(i, line) - i += 1 - break - m2 = re_Builtin.match(lines[i]) - if m2: - builtin = True - ws1 = m2.group(1) - arg = m2.group(2) - newarg = b"" - if re_True.match(arg): - newarg = b"false" - else: - newarg = b"true" - lines[i] = ws1 + b"NeedsFloatPkg " + newarg - m3 = re_Type.match(lines[i]) - if m3: - fltype = m3.group(1) - fltype = fltype.lower() - if fltype == b"table": - cmd = b"listoftables" - elif fltype == b"figure": - cmd = b"listoffigures" - # else unknown, which is why we're doing this + match = re_Float.match(lines[i]) i += 1 - continue + if not match: + continue + # we need to do two things: + # (i) Convert Builtin to NeedsFloatPkg + # (ii) Write ListCommand lines for the builtin floats table and figure + builtin = False + cmd = b"" + while True and i < len(lines): + m1 = re_End.match(lines[i]) + if m1: + if builtin and cmd: + line = b" ListCommand " + cmd + lines.insert(i, line) + i += 1 + break + m2 = re_Builtin.match(lines[i]) + if m2: + builtin = True + ws1 = m2.group(1) + arg = m2.group(2) + newarg = b"" + if re_True.match(arg): + newarg = b"false" + else: + newarg = b"true" + lines[i] = ws1 + b"NeedsFloatPkg " + newarg + m3 = re_Type.match(lines[i]) + if m3: + fltype = m3.group(1) + fltype = fltype.lower() + if fltype == b"table": + cmd = b"listoftables" + elif fltype == b"figure": + cmd = b"listoffigures" + # else unknown, which is why we're doing this + i += 1 + continue # This just involved new features, not any changes to old ones if 14 <= format <= 22: - i += 1 - continue + i += 1 + continue # Rename I18NPreamble to BabelPreamble if format == 13: @@ -1040,8 +1089,8 @@ def convert(lines, end_format): # These just involved new features, not any changes to old ones if format == 11 or format == 12: - i += 1 - continue + i += 1 + continue if format == 10: match = re_UseMod.match(lines[i]) @@ -1237,7 +1286,6 @@ def convert(lines, end_format): # Remember the LabelStringAppendix line match = re_LabelStringAppendix.match(lines[i]) if match: - labelstringappendix = match.group(4) labelstringappendix_line = i # Remember the LatexType line @@ -1260,7 +1308,6 @@ def convert(lines, end_format): label = b"" space1 = b"" labelstring = b"" - labelstringappendix = b"" labelstring_line = -1 labelstringappendix_line = -1 labeltype_line = -1 @@ -1342,9 +1389,7 @@ def convert(lines, end_format): def main(argv): - args = {} - args["description"] = "Convert layout file to a newer format." - + args = {"description": "Convert layout file to a newer format."} parser = argparse.ArgumentParser(**args) parser.add_argument("-t", "--to", type=int, dest="format", default= currentFormat, @@ -1372,12 +1417,12 @@ def main(argv): output = sys.stdout.buffer if options.format > currentFormat: - error("Format %i does not exist" % options.format); + error("Format %i does not exist" % options.format) # Do the real work lines = read(source) format = 1 - while (format < options.format): + while format < options.format: format = convert(lines, options.format) write(output, lines)