commit ea8b0df0e4d1d6f8d08be2ac2a87f1d43959a53d
Author: José Matos <[email protected]>
Date: Sat Apr 28 15:10:09 2018 +0100
Add new semantic functions to add an remove document options.
The objective is to identify common operations and place them
in functions in order to improve the readability and correctness of the
code.
is_document_option(document, option):
Find if _option_ is a document option (\\options in the header).
insert_document_option(document, option):
Insert _option_ as a document option.
remove_document_option(document, option):
Remove _option_ as a document option.
---
lib/lyx2lyx/lyx2lyx_tools.py | 89 +++++++++++++++++++++++++++++++++++++----
lib/lyx2lyx/lyx_1_5.py | 9 +---
2 files changed, 82 insertions(+), 16 deletions(-)
diff --git a/lib/lyx2lyx/lyx2lyx_tools.py b/lib/lyx2lyx/lyx2lyx_tools.py
index 7aac890..cb1996e 100644
--- a/lib/lyx2lyx/lyx2lyx_tools.py
+++ b/lib/lyx2lyx/lyx2lyx_tools.py
@@ -65,19 +65,27 @@ lyx2verbatim(document, lines):
can and return a string containing the translated material.
latex_length(slen):
- Convert lengths (in LyX form) to their LaTeX representation. Returns
- (bool, length), where the bool tells us if it was a percentage, and
- the length is the LaTeX representation.
+ Convert lengths (in LyX form) to their LaTeX representation. Returns
+ (bool, length), where the bool tells us if it was a percentage, and
+ the length is the LaTeX representation.
convert_info_insets(document, type, func):
- Applies func to the argument of all info insets matching certain types
- type : the type to match. This can be a regular expression.
- func : function from string to string to apply to the "arg" field of
- the info insets.
+ Applies func to the argument of all info insets matching certain types
+ type : the type to match. This can be a regular expression.
+ func : function from string to string to apply to the "arg" field of
+ the info insets.
+
+is_document_option(document, option):
+ Find if _option_ is a document option (\\options in the header).
+
+insert_document_option(document, option):
+ Insert _option_ as a document option.
+
+remove_document_option(document, option):
+ Remove _option_ as a document option.
'''
import re
-import string
from parser_tools import find_token, find_end_of_inset
from unicode_symbols import unicode_reps
@@ -318,7 +326,7 @@ def latex_length(slen):
# Convert relative lengths to LaTeX units
units = {"col%": "\\columnwidth",
"text%": "\\textwidth",
- "page%": "\\paperwidth",
+ "page%": "\\paperwidth",
"line%": "\\linewidth",
"theight%": "\\textheight",
"pheight%": "\\paperheight",
@@ -533,3 +541,66 @@ def convert_info_insets(document, type, func):
new_arg = func(arg.group(1))
document.body[i + 2] = 'arg "%s"' % new_arg
i += 3
+
+
+def insert_document_option(document, option):
+ "Insert _option_ as a document option."
+
+ # Find \options in the header
+ options_line = find_token(document.header, "\\options", 0)
+
+ # if the options does not exists add it after the textclass
+ if options_line == -1:
+ textclass_line = find_token(document.header, "\\textclass", 0)
+ document.header.insert(textclass_line +1,
+ r"\options %s" % option)
+ return
+
+ # add it to the end of the options
+ document.header[options_line] += " ,%s" % option
+
+
+def remove_document_option(document, option):
+ """ Remove _option_ as a document option.
+
+ It is assumed that option belongs to the \options.
+ That can be done running is_document_option(document, option)."""
+
+ options_line = find_token(document.header, "\\options", 0)
+ option_pos = document.header[options_line].find(option)
+
+ # Remove option from \options
+ comma_before_pos = document.header[options_line].rfind(',', 0, option_pos)
+ comma_after_pos = document.header[options_line].find(',', option_pos)
+
+ # if there are no commas then it is the single option
+ # and the options line should be removed since it will be empty
+ if comma_before_pos == comma_after_pos == -1:
+ del document.header[options_line]
+ return
+
+ # last option
+ options = document.header[options_line]
+ if comma_after_pos == -1:
+ document.header[options_line] = options[:comma_before_pos].rsplit()
+ return
+
+ document.header[options_line] = options[comma_before_pos: comma_after_pos]
+
+
+def is_document_option(document, option):
+ "Find if _option_ is a document option"
+
+ # Find \options in the header
+ options_line = find_token(document.header, "\\options", 0)
+
+ # \options is not present in the header
+ if options_line == -1:
+ return False
+
+ option_pos = document.header[options_line].find(option)
+ # option is not present in the \options
+ if option_pos == -1:
+ return False
+
+ return True
diff --git a/lib/lyx2lyx/lyx_1_5.py b/lib/lyx2lyx/lyx_1_5.py
index c1d1521..76d23b6 100644
--- a/lib/lyx2lyx/lyx_1_5.py
+++ b/lib/lyx2lyx/lyx_1_5.py
@@ -24,6 +24,7 @@ import unicodedata
import sys, os
from parser_tools import find_re, find_token, find_token_backwards,
find_token_exact, find_tokens, find_end_of, get_value, find_beginning_of,
find_nonempty_line
+from lyx2lyx_tools import insert_document_option
from LyX import get_encoding
# Provide support for both python 2 and 3
@@ -1907,13 +1908,7 @@ def revert_ext_font_sizes(document):
i = find_token(document.header, '\\paperfontsize', 0)
document.header[i] = '\\paperfontsize default'
-
- i = find_token(document.header, '\\options', 0)
- if i == -1:
- i = find_token(document.header, '\\textclass', 0) + 1
- document.header[i:i] = ['\\options %s' % fontsize]
- else:
- document.header[i] += ',%s' % fontsize
+ insert_document_option(document, fontsize)
def convert_ext_font_sizes(document):