From 76eae4572e802d32a89afb4a3a89781b58a79108 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Tue, 26 Jan 2021 08:42:39 +0100 Subject: [PATCH] Introduce InputGlobal (#12087) This is a variant of Input for layout files that only searches build and system directories and thus allows "InputGlobal name.inc" in a user file name.inc that attempts to modify its global counterpart. --- lib/doc/Customization.lyx | 113 ++++++++++++++++++++++++++++++++++- lib/doc/de/Customization.lyx | 91 +++++++++++++++++++++++++++- lib/scripts/layout2layout.py | 7 ++- src/TextClass.cpp | 16 ++++- src/support/filetools.cpp | 14 +++-- src/support/filetools.h | 6 +- 6 files changed, 231 insertions(+), 16 deletions(-) diff --git a/lib/doc/Customization.lyx b/lib/doc/Customization.lyx index f1df44169a..fcfc513f0c 100644 --- a/lib/doc/Customization.lyx +++ b/lib/doc/Customization.lyx @@ -1,5 +1,5 @@ #LyX 2.4 created this file. For more info see https://www.lyx.org/ -\lyxformat 601 +\lyxformat 605 \begin_document \begin_header \save_transient_properties true @@ -109,7 +109,7 @@ logicalmkup \branch OutDated \selected 0 \filename_suffix 0 -\color #f5fae7 +\color #f5fae7 #0a0518 \end_branch \index Index \shortcut idx @@ -10375,6 +10375,115 @@ stdclass.inc \end_inset , which contains most of the basic layouts. +\change_inserted -712698321 1611646803 + +\end_layout + +\begin_layout Description + +\change_inserted -712698321 1611646804 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1611646837 +InputGlobal +\end_layout + +\end_inset + + [ +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1611646804 + +\end_layout + +\end_inset + +] is a variant of the +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1611646804 +Input +\end_layout + +\end_inset + + command which does not look for files in the user directory. + This allows to create a file +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1611646804 +name.layout +\end_layout + +\end_inset + + or +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1611646804 +name.inc +\end_layout + +\end_inset + + in the user directory which includes a global file with the same name via + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1611646853 +InputGlobal name +\end_layout + +\end_inset + + or +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1611646855 +InputGlobal name.inc +\end_layout + +\end_inset + +, respectively (with +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1611646804 +Input +\end_layout + +\end_inset + +, the file would recursively include itself). + This way, you can modify global files without having to completely copy + them. +\change_unchanged + \end_layout \begin_layout Description diff --git a/lib/doc/de/Customization.lyx b/lib/doc/de/Customization.lyx index 49ef3efa20..38e337801f 100644 --- a/lib/doc/de/Customization.lyx +++ b/lib/doc/de/Customization.lyx @@ -1,5 +1,5 @@ #LyX 2.4 created this file. For more info see https://www.lyx.org/ -\lyxformat 600 +\lyxformat 605 \begin_document \begin_header \save_transient_properties true @@ -117,7 +117,7 @@ logicalmkup \branch OutDated \selected 0 \filename_suffix 0 -\color #faf0e6 +\color background background \end_branch \index Stichwortverzeichnis \shortcut idx @@ -8266,6 +8266,93 @@ stdclass.inc \begin_inset Flex Code status collapsed +\begin_layout Plain Layout +InputGlobal +\end_layout + +\end_inset + + [ +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\end_layout + +\end_inset + +] ist eine Variante des Befehls +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + +, die nicht nach Dateien im Benutzerverzeichnis sucht. + Das erlaubt es Ihnen, im Benutzerverzeichnis eine Datei +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +name.layout +\end_layout + +\end_inset + + oder +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +name.inc +\end_layout + +\end_inset + + anzulegen, die mit +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +InputGlobal name +\end_layout + +\end_inset + + bzw. + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +InputGlobal name.inc +\end_layout + +\end_inset + + eine globale Datei desselben Namens einbindet (mit +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + würde die Datei sich selbst einbinden). + Damit können Sie globale Dateien modifizieren, ohne sie komplett kopieren + zu müssen. +\end_layout + +\begin_layout Description +\begin_inset Flex Code +status collapsed + \begin_layout Plain Layout InsetLayout \end_layout diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py index cc20a35b0a..c38721a7fe 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 = 90 +currentFormat = 91 # Incremented to format 4, 6 April 2007, lasgouttes @@ -307,6 +307,9 @@ currentFormat = 90 # Incremented to format 90, 11 December 2020 by spitz # Use semantic label colors +# Incremented to format 91, 25 January 2021 by spitz +# InputGlobal tag + # Do not forget to document format change in Customization # Manual (section "Declaring a new text class"). @@ -557,7 +560,7 @@ def convert(lines, end_format): i += 1 continue - if 87 <= format <= 90: + if 87 <= format <= 91: # nothing to do. i += 1 continue diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 785c7a9080..80cb6f8e2a 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -59,7 +59,7 @@ namespace lyx { // You should also run the development/tools/updatelayouts.py script, // to update the format of all of our layout files. // -int const LAYOUT_FORMAT = 90; // spitz: semantic label colors +int const LAYOUT_FORMAT = 91; // spitz: InputGlobal method // Layout format for the current lyx file format. Controls which format is @@ -165,6 +165,7 @@ enum TextClassTags { TC_OUTPUTTYPE = 1, TC_OUTPUTFORMAT, TC_INPUT, + TC_INPUT_GLOBAL, TC_STYLE, TC_MODIFYSTYLE, TC_PROVIDESTYLE, @@ -249,6 +250,7 @@ LexerKeyword textClassTags[] = { { "htmltocsection", TC_HTMLTOCSECTION }, { "ifcounter", TC_IFCOUNTER }, { "input", TC_INPUT }, + { "inputglobal", TC_INPUT_GLOBAL }, { "insetlayout", TC_INSETLAYOUT }, { "leftmargin", TC_LEFTMARGIN }, { "maxcitenames", TC_MAXCITENAMES }, @@ -432,6 +434,7 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) bool modifystyle = false; bool providestyle = false; bool ifcounter = false; + bool only_global = false; switch (static_cast(le)) { @@ -459,6 +462,9 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) } break; + case TC_INPUT_GLOBAL: + only_global = true; + // fall through case TC_INPUT: // Include file if (lexrc.next()) { FileName tmp; @@ -466,9 +472,13 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) if (!path().empty() && (prefixIs(inc, "./") || prefixIs(inc, "../"))) tmp = fileSearch(path(), inc, "layout"); - else + else { + // InputGlobal only searches in the system and + // build directories. This allows to reuse and + // modify files in the user directory. tmp = libFileSearch("layouts", inc, - "layout"); + "layout", must_exist, only_global); + } if (tmp.empty()) { lexrc.printError("Could not find input file: " + inc); diff --git a/src/support/filetools.cpp b/src/support/filetools.cpp index 16e6da425a..cbbc2ddca0 100644 --- a/src/support/filetools.cpp +++ b/src/support/filetools.cpp @@ -335,12 +335,16 @@ FileName const fileSearch(string const & path, string const & name, // 2) build_lyxdir (if not empty) // 3) system_lyxdir FileName const libFileSearch(string const & dir, string const & name, - string const & ext, search_mode mode) + string const & ext, search_mode mode, + bool const only_global) { - FileName fullname = fileSearch(addPath(package().user_support().absFileName(), dir), - name, ext, mode); - if (!fullname.empty()) - return fullname; + FileName fullname; + if (!only_global) { + fullname = fileSearch(addPath(package().user_support().absFileName(), dir), + name, ext, mode); + if (!fullname.empty()) + return fullname; + } if (!package().build_support().empty()) fullname = fileSearch(addPath(package().build_support().absFileName(), dir), diff --git a/src/support/filetools.h b/src/support/filetools.h index 6cb3019c29..dd47ba183e 100644 --- a/src/support/filetools.h +++ b/src/support/filetools.h @@ -118,12 +118,14 @@ bool isBinaryFile(FileName const & filename); -# user_lyxdir -# build_lyxdir (if not empty) -# system_lyxdir - The third parameter `ext' is optional. + \p onlyglobal determines whether user_lyxdir should be included. + ext, search_mode and onlyglobal are optional. */ FileName const libFileSearch(std::string const & dir, std::string const & name, std::string const & ext = std::string(), - search_mode mode = must_exist); + search_mode mode = must_exist, + bool const onlyglobal = false); /** Same as libFileSearch(), but tries first to find an internationalized version of the file by prepending $LANG_ to the