auctex-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[AUCTeX-diffs] [elpa] externals/auctex 2ccd88a 3/4: Update style/xparse.


From: Tassilo Horn
Subject: [AUCTeX-diffs] [elpa] externals/auctex 2ccd88a 3/4: Update style/xparse.el to package dated 2020-03-06
Date: Mon, 29 Jun 2020 15:17:24 -0400 (EDT)

branch: externals/auctex
commit 2ccd88ac3e5f00fa3a1f7b98ad4b6da23021336e
Author: Arash Esbati <arash@gnu.org>
Commit: Arash Esbati <arash@gnu.org>

    Update style/xparse.el to package dated 2020-03-06
    
    * style/xparse.el: Update style to package version 2020-03-06
    incl. auto-parsing capabilities.  Fix fontification of provided
    macros.
---
 style/xparse.el | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 216 insertions(+), 24 deletions(-)

diff --git a/style/xparse.el b/style/xparse.el
index 271ec61..79ab604 100644
--- a/style/xparse.el
+++ b/style/xparse.el
@@ -1,9 +1,9 @@
-;;; xparse.el --- AUCTeX style for `xparse.sty' version 4467.
+;;; xparse.el --- AUCTeX style for `xparse.sty' version 2020-03-06
 
-;; Copyright (C) 2013, 2018 Free Software Foundation, Inc.
+;; Copyright (C) 2013, 2020 Free Software Foundation, Inc.
 
 ;; Maintainer: auctex-devel@gnu.org
-;; Author: Mosè Giordano <giordano.mose@libero.it>
+;; Author: Mosè Giordano <mose@gnu.org>
 ;; Keywords: tex
 
 ;; This file is part of AUCTeX.
@@ -25,8 +25,13 @@
 
 ;;; Commentary:
 
-;; This file adds basic support for `xparse.sty' version 4467.  It
-;; doesn't parse argument specification of macros and environments.
+;; This file adds basic support for `xparse.sty' version 2020-03-06.
+;; It parses argument specification of macros and environments.
+
+;; Currently, this style doesn't parse the embellishments specifiers
+;; `e' and `E'.  The "yet not more supported" specifiers `l', `u', `g'
+;; and `G' are ignored completely and may lead to wrong parsing
+;; results.
 
 ;;; Code:
 
@@ -35,33 +40,206 @@
                  "font-latex"
                  (keywords class))
 
+;; Needed for auto-parsing.
+(require 'tex)
+
+(TeX-auto-add-type "xparse-macro" "LaTeX")
+
 (defvar LaTeX-xparse-macro-regexp
-  (concat "\\\\\\(?:Declare\\|New\\|Renew\\|Provide\\|DeclareExpandable\\)"
-         "DocumentCommand[ \t\n\r]*{?[ \t\n\r]*\\\\\\([A-Za-z]+\\)[ \t\n\r]*}?"
-         ;; The following is the opening brace of argument specification and is
-         ;; needed to skip internal macros containing `:' or `_'.
-         "[ \t\n\r]*{")
+  `(,(concat
+      (regexp-quote TeX-esc)
+      "\\(?:New\\|Renew\\|Provide\\|Declare\\)"
+      "\\(?:Expandable\\)?"
+      "DocumentCommand"
+      "[ \t\n\r]*"
+      "{?"
+      "[ \t\n\r]*"
+      (regexp-quote TeX-esc)
+      "\\([A-Za-z]+\\)"
+      "[ \t\n\r]*"
+      "}?"
+      "[ \t\n\r]*"
+      
"{\\([^}{]*\\({[^}{]*\\({[^}{]*\\({[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}")
+    (1 2) LaTeX-auto-xparse-macro)
   "Matches macros by xparse package.")
 
+(TeX-auto-add-type "xparse-environment" "LaTeX")
+
 (defvar LaTeX-xparse-environment-regexp
-  (concat "\\\\\\(?:Declare\\|New\\|Renew\\|Provide\\)DocumentEnvironment"
-         "[ \t\n\r]*{[ \t\n\r]*\\([A-Za-z]+\\)[ \t\n\r]*}")
+  `(,(concat
+      (regexp-quote TeX-esc)
+      "\\(?:New\\|Renew\\|Provide\\|Declare\\)"
+      "DocumentEnvironment"
+      "[ \t\n\r]*"
+      "{"
+      "[ \t\n\r]*"
+      "\\([A-Za-z]+\\)"
+      "[ \t\n\r]*"
+      "}"
+      "[ \t\n\r]*"
+      
"{\\([^}{]*\\({[^}{]*\\({[^}{]*\\({[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}")
+    (1 2) LaTeX-auto-xparse-environment)
   "Matches environments by xparse package.")
 
+(defun LaTeX-arg-xparse-query (optional op-brace cl-brace &optional prompt)
+  "Special query function for parsed elements from xparse package.
+If OPTIONAL is non-nil, indicate it in minibuffer.  OP-BRACE sets
+the opening brace, CL-BRACE sets the closing one.  PROMPT
+replaces the standard one."
+  (let ((TeX-arg-opening-brace op-brace)
+       (TeX-arg-closing-brace cl-brace))
+    (TeX-argument-insert
+     (TeX-read-string (TeX-argument-prompt optional prompt "Text"))
+     optional)))
+
+(defun LaTeX-xparse-macro-parse (type)
+  "Process parsed macro and environment definitions.
+TYPE is one of the symobols mac or env."
+  (dolist (xcmd (if (eq type 'mac)
+                   (LaTeX-xparse-macro-list)
+                 (LaTeX-xparse-environment-list)))
+    (let ((name (car xcmd))
+         (spec (cadr xcmd))
+         args opt-star opt-token)
+      (with-temp-buffer
+       (set-syntax-table LaTeX-mode-syntax-table)
+       ;; This one is probably not really needed?
+       (goto-char (point-min))
+       (insert (replace-regexp-in-string "[ \t\r\n%]" "" spec))
+       (goto-char (point-min))
+       (while (looking-at-p "[+!>bmrRvodODsteE]")
+         (cond (;; + or !: Long argument or space aware: Move over
+                ;; them.  b is special; only available for
+                ;; enviroments
+                (looking-at-p "[+!b]")
+                (forward-char 1))
+               ((looking-at-p ">")
+                ;; Argument processors: Move over > and a balanced
+                ;; {}
+                (forward-char 1)
+                (forward-sexp))
+               ;; Mandatory arguments:
+               ;; m: Ask for input with "Text" as prompt
+               ((looking-at-p "m")
+                (forward-char 1)
+                (push "Text" args))
+               ;; r<token1><token2>
+               ((looking-at-p "r")
+                (re-search-forward "r\\(?:\\(.\\)\\(.\\)\\)" (+ (point) 3) t)
+                (push `(LaTeX-arg-xparse-query
+                        ,(match-string-no-properties 1)
+                        ,(match-string-no-properties 2))
+                      args))
+               ;; R<token1><token2>{default}
+               ((looking-at-p "R")
+                (re-search-forward "R\\(?:\\(.\\)\\(.\\)\\)" (+ (point) 3) t)
+                (forward-sexp)
+                (push `(LaTeX-arg-xparse-query
+                        ,(match-string-no-properties 1)
+                        ,(match-string-no-properties 2))
+                      args))
+               ;; v: Use `TeX-arg-verb-delim-or-brace'
+               ((looking-at-p "v")
+                (forward-char 1)
+                (push 'TeX-arg-verb-delim-or-brace args))
+               ;; Optional arguments:
+               ;; o standard LaTeX optional in square brackets
+               ((looking-at-p "o")
+                (forward-char 1)
+                (push (vector "Text") args))
+               ;; d<token1><token2>
+               ((looking-at-p "d")
+                (re-search-forward "d\\(?:\\(.\\)\\(.\\)\\)" (+ (point) 3) t)
+                (push (vector 'LaTeX-arg-xparse-query
+                              (match-string-no-properties 1)
+                              (match-string-no-properties 2))
+                      args))
+               ;; O{default}
+               ((looking-at-p "O")
+                (forward-char 1)
+                (forward-sexp)
+                (push (vector "Text") args))
+               ;; D<token1><token2>{default}
+               ((looking-at-p "D")
+                (re-search-forward "D\\(?:\\(.\\)\\(.\\)\\)" (+ (point) 3) t)
+                (forward-sexp)
+                (push (vector 'LaTeX-arg-xparse-query
+                              (match-string-no-properties 1)
+                              (match-string-no-properties 2))
+                      args))
+               ;; s: optional star
+               ((looking-at-p "s")
+                (forward-char 1)
+                (setq opt-star t))
+               ;; t: optional <token>
+               ((looking-at-p "t")
+                (re-search-forward "t\\(.\\)" (+ (point) 2) t)
+                (setq opt-token (match-string-no-properties 1)))
+               ;; e & E are currently ignored.  e: If looking at a
+               ;; {, move one balanced expression, otherwise only
+               ;; one character.
+               ((looking-at-p "e")
+                (forward-char)
+                (if (looking-at-p TeX-grop)
+                    (forward-sexp)
+                  (forward-char)))
+               ;; E
+               ((looking-at-p "E")
+                (forward-char)
+                (if (looking-at-p TeX-grop)
+                    (forward-sexp)
+                  (forward-char))
+                (if (looking-at-p TeX-grop)
+                    (forward-sexp)
+                  (forward-char)))
+               ;; Finished:
+               (t nil))))
+      (if (eq type 'env)
+         (LaTeX-add-environments `(,name
+                                   LaTeX-env-args
+                                   ,@(reverse (copy-sequence args))))
+       (TeX-add-symbols (cons name
+                              (reverse (copy-sequence args))))
+       (when opt-star
+         (TeX-add-symbols (cons (concat name "*")
+                                (reverse (copy-sequence args)))))
+       (when opt-token
+         (TeX-add-symbols (cons (concat name opt-token)
+                                (reverse (copy-sequence args)))))))))
+
+(defun LaTeX-xparse-auto-prepare ()
+  "Clear various `LaTeX-auto-xparse-*' variables before parsing."
+  (setq LaTeX-auto-xparse-macro nil
+       LaTeX-auto-xparse-environment nil))
+
+(defun LaTeX-xparse-auto-cleanup ()
+  "Process parsed elements for xparse package."
+  (LaTeX-xparse-macro-parse 'mac)
+  (LaTeX-xparse-macro-parse 'env))
+
+(add-hook 'TeX-auto-prepare-hook #'LaTeX-xparse-auto-prepare t)
+(add-hook 'TeX-auto-cleanup-hook #'LaTeX-xparse-auto-cleanup t)
+(add-hook 'TeX-update-style-hook #'TeX-auto-parse t)
+
 (TeX-add-style-hook
  "xparse"
  (lambda ()
-   (TeX-auto-add-regexp `(,LaTeX-xparse-macro-regexp 1 TeX-auto-symbol))
-   (TeX-auto-add-regexp
-    `(,LaTeX-xparse-environment-regexp 1 LaTeX-auto-environment))
+   (TeX-auto-add-regexp LaTeX-xparse-macro-regexp)
+   (TeX-auto-add-regexp LaTeX-xparse-environment-regexp)
    (TeX-run-style-hooks
     "expl3")
    (TeX-add-symbols
+    ;; Declaring commands
+    '("DeclareDocumentCommand"
+      TeX-arg-define-macro "Argument specification" t)
+    '("NewDocumentCommand"
+      TeX-arg-define-macro "Argument specification" t)
+    '("RenewDocumentCommand"
+      TeX-arg-macro "Argument specification" t)
+    '("ProvideDocumentCommand"
+      TeX-arg-define-macro "Argument specification" t)
+
     ;; Declaring commands and environments
-    '("DeclareDocumentCommand" TeX-arg-define-macro "Argument specification" t)
-    '("NewDocumentCommand" TeX-arg-define-macro "Argument specification" t)
-    '("RenewDocumentCommand" TeX-arg-macro "Argument specification" t)
-    '("ProvideDocumentCommand" TeX-arg-define-macro "Argument specification" t)
     '("DeclareDocumentEnvironment" TeX-arg-define-environment
       "Argument specification" t t)
     '("NewDocumentEnvironment" TeX-arg-define-environment
@@ -70,9 +248,17 @@
       "Argument specification" t t)
     '("ProvideDocumentEnvironment" TeX-arg-define-environment
       "Argument specification" t t)
+
     ;; Fully-expandable document commands
     '("DeclareExpandableDocumentCommand"
       TeX-arg-define-macro "Argument specification" t)
+    '("NewExpandableDocumentCommand"
+      TeX-arg-define-macro "Argument specification" t)
+    '("RenewExpandableDocumentCommand"
+      TeX-arg-macro "Argument specification" t)
+    '("ProvideExpandableDocumentCommand"
+      TeX-arg-define-macro "Argument specification" t)
+
     ;; Testing special values
     '("IfBooleanTF" 3)
     '("IfBooleanT" 3)
@@ -97,18 +283,24 @@
     '("GetDocumentEnvironmmentArgSpec" TeX-arg-environment)
     '("ShowDocumentCommandArgSpec" TeX-arg-macro)
     '("ShowDocumentEnvironmentArgSpec" TeX-arg-environment))
+
    ;; Fontification
    (when (and (featurep 'font-latex)
              (eq TeX-install-font-lock 'font-latex-setup))
      (font-latex-add-keywords '(("DeclareDocumentCommand" "|{\\{{")
-                               ("NewDocumentCommand" "|{\\{{")
-                               ("RenewDocumentCommand" "|{\\{{")
+                               ("NewDocumentCommand"     "|{\\{{")
                                ("ProvideDocumentCommand" "|{\\{{")
+                               ("RenewDocumentCommand"   "|{\\{{")
+                               ;;
                                ("DeclareExpandableDocumentCommand" "|{\\{{")
+                               ("NewExpandableDocumentCommand"     "|{\\{{")
+                               ("ProvideExpandableDocumentCommand" "|{\\{{")
+                               ("RenewExpandableDocumentCommand"   "|{\\{{")
+                               ;;
                                ("DeclareDocumentEnvironment" "{{{{")
-                               ("NewDocumentEnvironment" "{{{{")
-                               ("RenewDocumentEnvironment" "{{{{")
-                               ("ProvideDocumentEnvironment" "{{{{"))
+                               ("NewDocumentEnvironment"     "{{{{")
+                               ("ProvideDocumentEnvironment" "{{{{")
+                               ("RenewDocumentEnvironment"   "{{{{"))
                              'function)))
  LaTeX-dialect)
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]