]> git.lyx.org Git - lyx.git/blobdiff - development/tools/gen_lfuns.py
Fixup commit ff42fe
[lyx.git] / development / tools / gen_lfuns.py
index c855b46cc438ba78313bb7953a5052389c99bac5..f4dfb43b8061b1e9b145122618269d2c4f5962a0 100755 (executable)
@@ -12,8 +12,7 @@
 # Usage:
 # gen_lfuns.py <path/to/LyXAction.cpp> <where/to/save/LFUNs.lyx>
 
-import sys
-import os.path
+import sys,re,os.path
 from datetime import date
 
 def error(message):
@@ -24,7 +23,7 @@ def usage(prog_name):
     return "Usage: %s <path/to/LyXAction.cpp> [<where/to/save/LFUNs.lyx>]" % prog_name
 
 DOXYGEN_START = "/*!"
-DOXYGEN_END = "*/"
+DOXYGEN_END = "},"
 
 LYX_NEWLINE = "\n\\begin_inset Newline newline\n\\end_inset\n\n"
 LYX_BACKSLASH = "\n\\backslash\n"
@@ -60,6 +59,12 @@ LFUNS_HEADER = """# gen_lfuns.py generated this file. For more info see http://w
 \\end_preamble
 \\use_default_options false
 \\maintain_unincluded_children false
+\\begin_local_layout
+Style Description
+LabelIndent           MM
+LeftMargin            MMMMMxx
+End
+\\end_local_layout
 \\language english
 \\language_package default
 \\inputencoding auto
@@ -139,26 +144,59 @@ The LyX Team
 \\begin_layout Date""" + "\n" + str(date.today()) + """
 \\end_layout
 
-\\begin_layout Standard
-\\begin_inset ERT
-status collapsed
+"""
 
-\\begin_layout Plain Layout
+LFUNS_INTRO ="""\\begin_layout Section*
+About this manual
+\\end_layout
 
+\\begin_layout Standard
+This manual documents the 
+\\begin_inset Quotes eld
+\\end_inset
 
-\\backslash
-thispagestyle{empty}
+LyX Functions
+\\begin_inset Quotes erd
+\\end_inset
+
+ (abbreviated LFUNs).
+ These are commands that are used to make LyX perform specific actions.
+ LyX itself uses these functions internally, and every internal action is
+ bound to an LFUN.
 \\end_layout
 
+\\begin_layout Standard
+LFUNs are also used in the files that define keyboard shortcuts, menu or
+ toolbar items.
+ So if you want to change\\SpecialChar \\slash{}
+customize the user interface, you need to deal
+ with LFUNs.
+ Furthermore, external programs can use LFUNs to communicate with and 
+\\begin_inset Quotes eld
 \\end_inset
 
+remote-control
+\\begin_inset Quotes erd
+\\end_inset
 
-\\begin_inset VSpace 1cm
+ LyX.
+ Finally, you can also issue LFUNs directly via the so called mini-buffer
+ which can be opened via 
+\\begin_inset Info
+type  "shortcuts"
+arg   "command-execute"
 \\end_inset
 
+.
+\\end_layout
 
+\\begin_layout Standard
+In the following, all LFUNs are listed, categorized by function.
 \\end_layout
+
 """
+
+
 LFUNS_FOOTER = """\\end_body
 \\end_document
 """
@@ -166,7 +204,7 @@ LFUNS_FOOTER = """\\end_body
 def parse_lfun(str):
     """Takes a comment block (str) and parses it for fields describing the LFUN. Returns a dict containing the fields."""
     
-    lfun = dict(name="", action="", notion="", syntax="", params="", sample="", origin="")
+    lfun = dict(action="", notion="", syntax="", params="", sample="", origin="")
     field = ""
     lines = str.splitlines()
     # strip leading whitespace and * from the lines of the comment to get 
@@ -181,11 +219,7 @@ def parse_lfun(str):
         #     nothing as an existing field is being added to
         # if a field id is found, then its the first line of the field so set the pre_space to ""
         #     so that the first line isn't prespaced
-        if lines[i].startswith(LFUN_NAME_ID):
-            field = "name"
-            pre_space = ""
-            skip = len(ID_DICT[field])
-        elif lines[i].startswith(LFUN_ACTION_ID):
+        if lines[i].startswith(LFUN_ACTION_ID):
             field = "action"
             pre_space = ""
             skip = len(ID_DICT[field])
@@ -320,17 +354,37 @@ def write_fields(file, lfun):
         file.write("Origin " + lfun["origin"] + "\n")
         file.write("\\end_layout\n")
         #file.write("\n")
-    file.write("\n")        
+    file.write("\n")
+
+def write_sections(file,lfuns):
+    """Write sections of LFUNs"""
+    sections = ["Layout", "Edit", "Math", "Buffer", "System", "Hidden"]
+    section_headings = {
+        "Layout":  "Layout Functions (Font, Layout and Textclass related)",
+        "Edit":  "Editing Functions (Cursor and Mouse Movement, Copy/Paste etc.)",
+        "Math":  "Math Editor Functions",
+        "Buffer":  "Buffer Fuctions (File and Window related)",
+        "System":  "System Functions (Preferences, LyX Server etc.)",
+        "Hidden":  "Hidden Functions (not listed for configuration)"
+        }
+        # write the lfuns to the file
+    for val in sections:
+        file.write("\\begin_layout Section\n")
+        file.write(section_headings[val] + "\n")
+        file.write("\\end_layout\n")
+        for lf in lfuns:
+            if lf["type"] == val:
+                write_fields(file, lf)
     
 def main(argv):
-    # parse command line arguments   
+    # parse command line arguments
     script_path, script_name = os.path.split(argv[0])
     if len(argv) < 2:
         error(usage(script_name))
     # input file
     lyxaction_path = argv[1]
-    if not os.path.exists(lyxaction_path):
-        error(script_name + ": %s is not a valid path" % lyxaction_path, usage(argv[0]))
+    if not os.path.isfile(lyxaction_path):
+        error(script_name + ": %s is not a valid path" % lyxaction_path)
 
     # output file
     if len(argv) == 3:
@@ -346,12 +400,15 @@ def main(argv):
     sys.stderr.write(script_name + ": Start processing " + argv[1] + '\n')
     # Read the input file and write the output file
     lyxaction_file = open(lyxaction_path, 'rb')
-       
+
     lyxaction_text = lyxaction_file.read()
-       
+
     lfuns_file.write(LFUNS_HEADER)
-       
-       # seek to the important bit of LyXAction.cpp
+    
+    # An introductory section
+    lfuns_file.write(LFUNS_INTRO)
+
+    # seek to the important bit of LyXAction.cpp
     try:
         start = lyxaction_text.index("ev_item const items[] = {")
     except ValueError:
@@ -367,12 +424,23 @@ def main(argv):
         # look for a doxygen comment
         start = lyxaction_text.find(DOXYGEN_START, start)
         end = lyxaction_text.find(DOXYGEN_END, start) + len(DOXYGEN_END)
+        name = ""
+        atype = ""
+        snippet = lyxaction_text[start:end]
+        defline = snippet.replace("\n", "")
+        match = re.match(r'.*\s*\{\s*(.+),\s*"(.*)",\s*([\w\|\s]+),\s*(\w+)\s*\},.*$', defline)
+        if match:
+            name = match.group(2)
+            atype = match.group(4)
         # parse the lfun if it is found
         if start > 0:
-            count = count + 1
-            lfun = parse_lfun(lyxaction_text[start:end])
-            # save the lfun (we sort it before writing)
-            lfun_list_unsorted.append(lfun)
+            if name:
+                count = count + 1
+                lfun = parse_lfun(snippet)
+                lfun["name"] = name
+                lfun["type"] = atype
+                # save the lfun (we sort it before writing)
+                lfun_list_unsorted.append(lfun)
             # get the next one
             start = end
         else:
@@ -382,8 +450,7 @@ def main(argv):
     lfun_list = sorted(lfun_list_unsorted, key=lambda k: k['name'])
     
     # write the lfuns to the file
-    for lf in lfun_list:
-        write_fields(lfuns_file, lf)
+    write_sections(lfuns_file, lfun_list)
 
     sys.stderr.write(script_name + ": Created documentation for " + str(count) + " LFUNs\n")