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.
This commit is contained in:
José Matos 2018-04-28 15:10:09 +01:00
parent 91ded82b52
commit ea8b0df0e4
2 changed files with 82 additions and 16 deletions

View File

@ -74,10 +74,18 @@ convert_info_insets(document, type, func):
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
@ -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

View File

@ -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):