commit 0e62745995763c4493ac1f5053b1076e29124634
Author: Juergen Spitzmueller <sp...@lyx.org>
Date:   Wed Sep 2 14:29:06 2015 +0200

    Fix parsing of class and category declaration line in layout files
    
    * Omit commented-out lines
    * Properly escape backslash
    * Do not allow non-space chars after delaration
    * Allow blanks before # comment character
    
    Fixes: #9746

diff --git a/lib/configure.py b/lib/configure.py
index 91f5593..db947b8 100644
--- a/lib/configure.py
+++ b/lib/configure.py
@@ -1163,8 +1163,8 @@ def processLayoutFile(file, bool_docbook):
             return x.strip()
     classname = file.split(os.sep)[-1].split('.')[0]
     # return ('LaTeX', '[a,b]', 'a', ',b,c', 'article') for 
\DeclareLaTeXClass[a,b,c]{article}
-    p = 
re.compile(r'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}')
-    q = re.compile(r'\DeclareCategory{(.*)}')
+    p = 
re.compile(r'^\s*#\s*\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$')
+    q = re.compile(r'^\s*#\s*\\DeclareCategory{(.*)}\s*$')
     classdeclaration = ""
     categorydeclaration = '""'
     for line in open(file).readlines():
@@ -1259,8 +1259,8 @@ def checkLatexConfig(check_config, bool_docbook):
     # Construct the list of classes to test for.
     # build the list of available layout files and convert it to commands
     # for chkconfig.ltx
-    declare = 
re.compile(r'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}')
-    category = re.compile(r'\DeclareCategory{(.*)}')
+    declare = 
re.compile(r'^\s*#\s*\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$')
+    category = re.compile(r'^\s*#\s*\\DeclareCategory{(.*)}\s*$')
     empty = re.compile(r'^\s*$')
     testclasses = list()
     for file in glob.glob( os.path.join('layouts', '*.layout') ) + \
diff --git a/src/LayoutFile.cpp b/src/LayoutFile.cpp
index d0fc248..8cca663 100644
--- a/src/LayoutFile.cpp
+++ b/src/LayoutFile.cpp
@@ -301,9 +301,9 @@ LayoutFileIndex  LayoutFileList::addLocalLayout(
        // which uses the following regex
        //     \Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}
        ifstream ifs(layout_file.toFilesystemEncoding().c_str());
-       static regex const reg("^#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*"
+       static regex const reg("^\\s*#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*"
                "(?:\\[([^,]*)(?:,.*)*\\])*\\s*\\{(.*)\\}\\s*");
-       static regex const catreg("^#\\s*\\\\DeclareCategory\\{(.*)\\}");
+       static regex const 
catreg("^\\s*#\\s*\\\\DeclareCategory\\{(.*)\\}\\s*");
        string line;
        string class_name;
        string class_prereq;

Reply via email to