org-element: Small optimizations

* lisp/org-element.el (org-element-latex-fragment-parser): Avoid
  matching twice regexps in some cases.
(org-element--object-lex): Avoid making a funcall if a line break
isn't possible.

This patch also removes the limit on the number of lines a latex
fragment with a single dollar can span over.
This commit is contained in:
Nicolas Goaziou 2014-07-06 23:15:44 +02:00
parent 0ce82e53a1
commit 4235718d79
1 changed files with 26 additions and 25 deletions

View File

@ -2911,27 +2911,26 @@ Assume point is at the beginning of the LaTeX fragment."
(catch 'no-object
(save-excursion
(let* ((begin (point))
(substring-match
(or (catch 'exit
(dolist (e (cdr org-latex-regexps))
(let ((latex-regexp (nth 1 e)))
(when (or (looking-at latex-regexp)
(and (not (bobp))
(save-excursion
(backward-char)
(looking-at latex-regexp))))
(throw 'exit (nth 2 e))))))
;; Macro.
(and (looking-at "\\\\[a-zA-Z]+\\*?\\(\\(\\[[^][\n{}]*\\]\\)\\|\\({[^{}\n]*}\\)\\)*")
0)
;; No fragment found.
(throw 'no-object nil)))
(value (org-match-string-no-properties substring-match))
(post-blank (progn (goto-char (match-end substring-match))
(skip-chars-forward " \t")))
(after-fragment
(if (eq (char-after) ?$)
(if (eq (char-after (1+ (point))) ?$)
(search-forward "$$" nil t 2)
(and (not (eq (char-before) ?$))
(looking-at "\\$[^ \t\n,;.$]\\(?:[^$]*?[^ \t\n,.$]\\)?\\$\\([- \t.,?;:'\")]\\|$\\)")
(match-beginning 1)))
(case (char-after (1+ (point)))
(?\( (search-forward "\\)" nil t))
(?\[ (search-forward "\\]" nil t))
(otherwise
;; Macro.
(and (looking-at "\\\\[a-zA-Z]+\\*?\\(\\(\\[[^][\n{}]*\\]\\)\\|\\({[^{}\n]*}\\)\\)*")
(match-end 0))))))
(post-blank (if (not after-fragment) (throw 'no-object nil)
(goto-char after-fragment)
(skip-chars-forward " \t")))
(end (point)))
(list 'latex-fragment
(list :value value
(list :value (buffer-substring-no-properties begin after-fragment)
:begin begin
:end end
:post-blank post-blank))))))
@ -4277,12 +4276,14 @@ to an appropriate container (e.g., a paragraph)."
(org-element-timestamp-parser))
(and (memq 'link restriction)
(org-element-link-parser)))))
(?\\ (or (and (memq 'line-break restriction)
(org-element-line-break-parser))
(and (memq 'entity restriction)
(org-element-entity-parser))
(and (memq 'latex-fragment restriction)
(org-element-latex-fragment-parser))))
(?\\
(if (eq (aref result 1) ?\\)
(and (memq 'line-break restriction)
(org-element-line-break-parser))
(or (and (memq 'entity restriction)
(org-element-entity-parser))
(and (memq 'latex-fragment restriction)
(org-element-latex-fragment-parser)))))
(?\[
(if (eq (aref result 1) ?\[)
(and (memq 'link restriction)