# This script will update a .layout file to current format
# The latest layout format is also defined in src/TextClass.cpp
-currentFormat = 63
+currentFormat = 95
# Incremented to format 4, 6 April 2007, lasgouttes
# Rename I18NPreamble to BabelPreamble and add LangPreamble
# Incremented to format 15, 28 May 2009 by lasgouttes
-# Add new tag OutputFormat; modules can be conditioned on feature
+# Add new tag OutputFormat; modules can be conditioned on feature
# "from->to".
# Incremented to format 16, 5 June 2009 by rgh
# - New textclass tags CiteFramework, MaxCiteNames (for cite engines)
# - Extended InsetCite syntax.
+# Incremented to format 64, 30 August 2017 by rgh
+# Strip leading and trailing spaces from LabelString,
+# LabelStringAppendix, and EndLabelString, and LabelCounter,
+# to conform to what we used to do.
+
+# Incremented to format 65, 16 October 2017 by spitz
+# Color collapsable -> collapsible
+
+# Incremented to format 66, 28 December 2017 by spitz
+# New Layout tags "AutoNests ... EndAutoNests" and
+# "IsAutoNestedBy ... EndIsAutoNestedBy"
+
+# Incremented to format 67, 14 April 2018 by spitz
+# New Layout tag "NeedsCProtect"
+
+# Incremented to format 68, 21 May 2018 by spitz
+# New Layout tag "AddToCiteEngine"
+
+# Incremented to format 69, 16 August 2018 by spitz
+# New argument type "listpreamble"
+
+# Incremented to format 70, 5 June 2018 by rkh
+# New InsetLayout tag EditExternal
+
+# Incremented to format 71, 12 March 2019 by spitz
+# New [Inset]Layout tag NeedMBoxProtect
+
+# Incremented to format 72, 26 March 2019 by spitz
+# New TextClass tag TableStyle
+
+# Incremented to format 73, 18 April 2019 by spitz
+# New InsetLayout tag MenuString
+
+# Incremented to format 74, 18 April 2019 by spitz
+# New InsetLayout and Argument tag NewlineCmd
+
+# Incremented to format 75, 2 June 2019 by spitz
+# New Argument tags FreeSpacing, InsertOnNewline
+# New InsetLayout tag ParbreakIgnored
+
+# Incremented to format 76, 8 July 2019 by spitz
+# New textclass tag BibInToc
+
+# Incremented to format 77, 6 August 2019 by spitz
+# New textclass tag PageSize (= default page size)
+# and textclass option PageSize (= list of available page sizes)
+
+# Incremented to format 78, 6 August 2019 by spitz
+# New textclass tag FontsizeFormat
+
+# Incremented to format 79, 7 August 2019 by spitz
+# New textclass tag PagesizeFormat
+
+# Incremented to format 80, 12 August 2019 by spitz
+# New float option Requires
+
+# Incremented to format 81, 12 August 2019 by rikiheck
+# New tag GuiName for counters
+
+# Incremented to format 82, 4 June 2017 by tcuvelier
+# - Add new tags for Layout:
+# DocBookTag, DocBookAttr, DocBookInInfo,
+# DocBookWrapperTag, DocBookWrapperAttr,
+# DocBookItemWrapperTag, DocBookItemWrapperAttr,
+# DocBookItemTag, DocBookItemAttr,
+# DocBookLabelTag, DocBookLabelAttr
+# - Removed tag Header from ClassOptionsClassOptions
+# - Removed tag Element for flex insets
+
+# Incremented to format 83, 2 August 2020 by tcuvelier
+# New tags DocBookWrapperMergeWithPrevious and DocBookAbstract
+
+# Incremented to format 84, 17 August 2020 by tcuvelier
+# New tags DocBookTagType, DocBookWrapperTagTagType,
+# DocBookItemWrapperTagTagType, DocBookItemTagTagType,
+# DocBookLabelTag
+
+# Incremented to format 85, 7 October 2020 by tcuvelier
+# New tags DocBookInnerTag, DocBookInnerAttr,
+# DocBookInnerTagType
+
+# Incremented to format 86, 20 October 2020 by tcuvelier
+# New tag DocBookSection.
+
+# Incremented to format 87, 2 November 2020 by rkh
+
+# Incremented to format 88, 28 November 2020 by tcuvelier
+# New tag DocBookNotInPara.
+
+# Incremented to format 89, 5 December 2020 by rkh
+# New tag LaTeXName for counters
+
+# Incremented to format 90, 11 December 2020 by spitz
+# Use semantic label colors
+
+# Incremented to format 91, 25 January 2021 by spitz
+# InputGlobal tag
+
+# Incremented to format 92, 30 January 2021 by spitz
+# Add ProvideInsetLayout and ModifyInsetLayout
+
+# Incremented to format 93, 13 February 2021 by spitz
+# Add DocBookNoFontInside
+
+# Incremented to format 94, 19 September 2021 by tcuvelier
+# Add DocBookFloatType, DocBookCaption
+
+# Incremented to format 95, 27 September 2021 by tcuvelier
+# Add DocBookRenderAsImage
+
# Do not forget to document format change in Customization
# Manual (section "Declaring a new text class").
def trim_bom(line):
" Remove byte order mark."
- if line[0:3] == "\357\273\277":
+ if line[0:3] == b"\357\273\277":
return line[3:]
else:
return line
else:
return b'"' + old + new + b'"'
+
# appends a string to a list unless it's already there
def addstring(s, l):
if l.count(s) > 0:
# for categories
re_Declaration = re.compile(b'^#\\s*\\Declare\\w+Class.*$')
re_ExtractCategory = re.compile(b'^(#\\s*\\Declare\\w+Class(?:\\[[^]]*?\\])?){([^(]+?)\\s+\\(([^)]+?)\\)\\s*}\\s*$')
- ConvDict = {"article": "Articles", "book" : "Books", "letter" : "Letters", "report": "Reports", \
- "presentation" : "Presentations", "curriculum vitae" : "Curricula Vitae", "handout" : "Handouts"}
+ 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"}
# Arguments
re_OptArgs = re.compile(b'^(\\s*)OptionalArgs(\\s+)(\\d+)\\D*$', re.IGNORECASE)
re_ReqArgs = re.compile(b'^(\\s*)RequiredArgs(\\s+)(\\d+)\\D*$', re.IGNORECASE)
-
+
# various changes associated with changing how chapters are handled
re_LabelTypeIsCounter = re.compile(b'^(\\s*)LabelType(\\s*)Counter\\s*$', re.IGNORECASE)
re_TopEnvironment = re.compile(b'^(\\s*)LabelType(\\s+)Top_Environment\\s*$', re.IGNORECASE)
re_CenteredEnvironment = re.compile(b'^(\\s*)LabelType(\\s+)Centered_Top_Environment\\s*$', re.IGNORECASE)
re_ChapterStyle = re.compile(b'^\\s*Style\\s+Chapter\\s*$', re.IGNORECASE)
re_InsetLayout_CaptionLTNN = re.compile(b'^(\\s*InsetLayout\\s+)(Caption:LongTableNonumber)', re.IGNORECASE)
+ # for format 64
+ re_trimLabelString = re.compile(b'^(\\s*LabelString\s+)"\\s*(.*?)\\s*"\\s*$')
+ 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*$')
# counters for sectioning styles (hardcoded in 1.3)
lcat = ConvDict[lcat]
lines[i] = lpre + b"{" + lnam + b"}"
lines.insert(i+1, b"# \\DeclareCategory{" + lcat + b"}")
- i += 1
+ i += 1
i += 1
continue
# insert file format if not already there
- if (only_comment):
+ if only_comment:
match = re_Format.match(lines[i])
if match:
formatline = i
format = int(match.group(4))
- if format > 1 and format < end_format:
+ if 1 < format < end_format:
lines[i] = b"Format %d" % (format + 1)
only_comment = 0
elif format == end_format:
i += 1
continue
- if format >= 60 and format <= 62:
+ if 87 <= format <= 95:
+ # nothing to do.
+ i += 1
+ continue
+
+ if format == 86:
+ if lines[i].lstrip().lower().startswith(b"stepmastercounter"):
+ pattern = re.compile(b"stepmastercounter", re.IGNORECASE)
+ lines[i] = pattern.sub(b"StepParentCounter", lines[i])
+ i += 1
+ continue
+
+ if 82 <= format <= 85:
+ # nothing to do.
+ i += 1
+ continue
+
+ if format == 81:
+ match = re.compile(b'^(\\s*Header\\s+)("?\\w+"?)', re.IGNORECASE).match(lines[i])
+ if match:
+ del lines[i]
+ continue
+
+ match = re.compile(b'(\\s*LyXType\\s+)(\\w+)(\\s*Element\\s+)', re.IGNORECASE).match(lines[i])
+ if match:
+ del lines[i]
+ continue
+
+ i += 1
+ continue
+
+ if 65 <= format <= 80:
+ # nothing to do.
+ i += 1
+ continue
+
+ if format == 64:
+ match = re.compile(b'(\\s*Color\\s+)(\\w+)', re.IGNORECASE).match(lines[i])
+ if not match:
+ i += 1
+ continue
+ col = match.group(2)
+ if col == "collapsable":
+ lines[i] = match.group(1) + b"collapsible"
+ i += 1
+ continue
+
+ if format == 63:
+ for r in (re_trimLabelString, re_trimLabelStringAppendix,\
+ re_trimEndLabelString, re_trimLabelCounter):
+ m = r.match(lines[i])
+ if m:
+ lines[i] = m.group(1) + b'"' + m.group(2) + b'"'
+ i += 1
+ continue
+
+ if 60 <= format <= 62:
# nothing to do.
i += 1
continue
i += 1
continue
- if format >= 50 and format <= 56:
+ if 50 <= format <= 56:
# nothing to do.
i += 1
continue
continue
- if format >= 44 and format <= 47:
+ if 44 <= format <= 47:
# nothing to do.
i += 1
continue
lines[i] = b"InsetLayout Caption:Standard"
i += 1
continue
-
+
if format == 41:
# nothing to do.
i += 1
# Insert the required number of arguments at the end of the style definition
match = re_End.match(lines[i])
if match:
- newarg = ['']
+ newarg = [b'']
# First the optionals (this is the required order pre 2.1)
if opts > 0:
if opts == 1:
reqs = 0
i += 1
continue
-
+
if format == 39:
# There is a conversion with format 40, but it is done within the
# initial comment block and so is above.
continue
if format == 36:
- match = re_CiteFormat.match(lines[i]);
+ match = re_CiteFormat.match(lines[i])
if match and match.group(4) == b"":
lines[i] = match.group(0) + b" default"
i += 1
i += 1
continue
style = match.group(2)
-
+
if flexstyles.count(style):
lines[i] = match.group(1) + b"\"Flex:" + style + b"\""
i += 1
continue
# Only new features
- if format >= 29 and format <= 31:
+ if 29 <= format <= 31:
i += 1
continue
lines[i] = b"\tCopyStyle \"Flex:" + match.group(1) + b"\""
i += 1
continue
-
+
# Only new features
- if format >= 24 and format <= 27:
+ if 24 <= format <= 27:
i += 1
continue
cmd = b"listoffigures"
# else unknown, which is why we're doing this
i += 1
- continue
-
+ continue
+
# This just involved new features, not any changes to old ones
- if format >= 14 and format <= 22:
+ if 14 <= format <= 22:
i += 1
continue
continue
# These just involved new features, not any changes to old ones
- if format >= 5 and format <= 7:
+ if 5 <= format <= 7:
i += 1
continue
if latextype == b"item_environment" and label.lower() == b"counter_enumi":
lines[labeltype_line] = re_LabelType.sub(b'\\1\\2\\3Enumerate', lines[labeltype_line])
# Don't add the LabelCounter line later
- counter = ""
+ counter = b""
# Replace
#
parser = argparse.ArgumentParser(**args)
- parser.add_argument("-t", "--to", type=int, dest="format",
+ parser.add_argument("-t", "--to", type=int, dest="format", default= currentFormat,
help=("destination layout format, default %i (latest)") % currentFormat)
parser.add_argument("input_file", nargs='?', type=cmd_arg, default=None,
help="input file (default stdin)")
parser.add_argument("output_file", nargs='?', type=cmd_arg, default=None,
help="output file (default stdout)")
- options = parser.parse_args()
+ options = parser.parse_args(argv[1:])
# Open files
if options.input_file:
source = open(options.input_file, 'rb')
- else:
+ elif PY2:
source = sys.stdin
+ else:
+ source = sys.stdin.buffer
if options.output_file:
output = open(options.output_file, 'wb')
- else:
+ elif PY2:
output = sys.stdout
-
- if options.format:
- end_format = options.format
else:
- end_format = currentFormat
+ output = sys.stdout.buffer
- if end_format > currentFormat:
- error("Format %i does not exist" % end_format);
+ if options.format > currentFormat:
+ error("Format %i does not exist" % options.format);
# Do the real work
lines = read(source)
format = 1
- while (format < end_format):
- format = convert(lines, end_format)
+ while (format < options.format):
+ format = convert(lines, options.format)
write(output, lines)
# Close files