mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-27 03:36:39 +00:00
8a947f63da
Design goal: Allow the use of layout "modules", which are to LaTeX packages as layout files are to LaTeX document classes. Thus, one could have a module that defined certain character styles, environments, commands, or what have you, and include it in various documents, each of which uses a different document class, without having to modify the layout files themselves. For example, a theorems.module could be used with article.layout to provide support for theorem-type environments, without having to modify article.layout itself, and the same module could be used with book.layout, etc. This patch adds the backend. The ModuleList class holds a list of the available modules, which are retrieved from lyxmodules.lst, itself generated by configure.py. There are two LFUNs available: modules-clear and module-add, which do the obvious thing; you can test by typing these into the minibuffer, along with the name of one of the available modules: URL (a CharStyle), Endnote (a Custom Inset), and---with the spaces---End To Foot (View>LaTeX and look at the user preamble), which are themselves in lib/layouts. There are some others, too, that allow theorems to be added to classes like article and book. The GUI will come next. Issues: (i) The configure.py script could be improved. It'd be nice, for example, if it tested for the presence of the LaTeX packages a particular module needs. But this would mean re-working the LaTeX script, and I don't know how to do that. Note that at present, the packages are ignored. This will change shortly. (ii) I've used std::string in LyXModule, following what seemed to be a precedent in TextClass. If some of these should be docstrings, please let me know, and I'll change them. (iii) There is at present no distinction between LaTeX and DocBook modules. Should there be? That is: Should there be modules that are available when the document class is a LaTeX class and others that are available only when it is DocBook? Or should there just be one set of modules? Each module can of course indicate for what it is suitable in its description. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19893 a592a061-630c-0410-9148-cb99ea01b6c8
183 lines
5.5 KiB
Python
183 lines
5.5 KiB
Python
# This file is part of lyx2lyx
|
|
# -*- coding: utf-8 -*-
|
|
# Copyright (C) 2007 José Matos <jamatos@lyx.org>
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
""" Convert files to the file format generated by lyx 1.6"""
|
|
|
|
import re
|
|
import unicodedata
|
|
import sys, os
|
|
|
|
from parser_tools import find_token, find_end_of, find_tokens
|
|
|
|
####################################################################
|
|
# Private helper functions
|
|
|
|
def find_end_of_inset(lines, i):
|
|
" Find end of inset, where lines[i] is included."
|
|
return find_end_of(lines, i, "\\begin_inset", "\\end_inset")
|
|
|
|
|
|
####################################################################
|
|
|
|
def fix_wrong_tables(document):
|
|
i = 0
|
|
while True:
|
|
i = find_token(document.body, "\\begin_inset Tabular", i)
|
|
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 tabular.")
|
|
continue
|
|
|
|
m = i + 1
|
|
nrows = int(document.body[i+1].split('"')[3])
|
|
ncols = int(document.body[i+1].split('"')[5])
|
|
|
|
for l in range(nrows):
|
|
prev_multicolumn = 0
|
|
for k in range(ncols):
|
|
m = find_token(document.body, '<cell', m)
|
|
|
|
if document.body[m].find('multicolumn') != -1:
|
|
multicol_cont = int(document.body[m].split('"')[1])
|
|
|
|
if multicol_cont == 2 and (k == 0 or prev_multicolumn == 0):
|
|
document.body[m] = document.body[m][:5] + document.body[m][21:]
|
|
prev_multicolumn = 0
|
|
else:
|
|
prev_multicolumn = multicol_cont
|
|
else:
|
|
prev_multicolumn = 0
|
|
|
|
i = j + 1
|
|
|
|
|
|
def close_begin_deeper(document):
|
|
i = 0
|
|
depth = 0
|
|
while True:
|
|
i = find_tokens(document.body, ["\\begin_deeper", "\\end_deeper"], i)
|
|
|
|
if i == -1:
|
|
break
|
|
|
|
if document.body[i][:13] == "\\begin_deeper":
|
|
depth += 1
|
|
else:
|
|
depth -= 1
|
|
|
|
i += 1
|
|
|
|
document.body[-2:-2] = ['\\end_deeper' for i in range(depth)]
|
|
|
|
|
|
def long_charstyle_names(document):
|
|
i = 0
|
|
while True:
|
|
i = find_token(document.body, "\\begin_inset CharStyle", i)
|
|
if i == -1:
|
|
return
|
|
document.body[i] = document.body[i].replace("CharStyle ", "CharStyle CharStyle:")
|
|
i += 1
|
|
|
|
def revert_long_charstyle_names(document):
|
|
i = 0
|
|
while True:
|
|
i = find_token(document.body, "\\begin_inset CharStyle", i)
|
|
if i == -1:
|
|
return
|
|
document.body[i] = document.body[i].replace("CharStyle CharStyle:", "CharStyle")
|
|
i += 1
|
|
|
|
|
|
def axe_show_label(document):
|
|
i = 0
|
|
while True:
|
|
i = find_token(document.body, "\\begin_inset CharStyle", i)
|
|
if i == -1:
|
|
return
|
|
if document.body[i + 1].find("show_label") != -1:
|
|
if document.body[i + 1].find("true") != -1:
|
|
document.body[i + 1] = "status open"
|
|
del document.body[ i + 2]
|
|
else:
|
|
if document.body[i + 1].find("false") != -1:
|
|
document.body[i + 1] = "status collapsed"
|
|
del document.body[ i + 2]
|
|
else:
|
|
document.warning("Malformed LyX document: show_label neither false nor true.")
|
|
else:
|
|
document.warning("Malformed LyX document: show_label missing in CharStyle.")
|
|
|
|
i += 1
|
|
|
|
|
|
def revert_show_label(document):
|
|
i = 0
|
|
while True:
|
|
i = find_token(document.body, "\\begin_inset CharStyle", i)
|
|
if i == -1:
|
|
return
|
|
if document.body[i + 1].find("status open") != -1:
|
|
document.body.insert(i + 1, "show_label true")
|
|
else:
|
|
if document.body[i + 1].find("status collapsed") != -1:
|
|
document.body.insert(i + 1, "show_label false")
|
|
else:
|
|
document.warning("Malformed LyX document: no legal status line in CharStyle.")
|
|
i += 1
|
|
|
|
def revert_begin_modules(document):
|
|
i = 0
|
|
while True:
|
|
i = find_token(document.header, "\\begin_modules", i)
|
|
if i == -1:
|
|
return
|
|
j = find_end_of(document.header, i, "\\begin_modules", "\\end_modules")
|
|
if j == -1:
|
|
# this should not happen
|
|
break
|
|
document.header[i : j + 1] = []
|
|
|
|
|
|
##
|
|
# Conversion hub
|
|
#
|
|
|
|
supported_versions = ["1.6.0","1.6"]
|
|
convert = [
|
|
[277, [fix_wrong_tables]],
|
|
[278, [close_begin_deeper]],
|
|
[279, [long_charstyle_names]],
|
|
[280, [axe_show_label]],
|
|
[281, []]
|
|
]
|
|
|
|
revert = [
|
|
[280, [revert_begin_modules]],
|
|
[279, [revert_show_label]],
|
|
[278, [revert_long_charstyle_names]],
|
|
[277, []],
|
|
[276, []]
|
|
]
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pass
|