|
@@ -4291,107 +4291,95 @@ original string.
|
|
|
|
|
|
Return the new string."
|
|
|
(if (equal s "") ""
|
|
|
- (let ((quotes-alist (cdr (assoc (plist-get info :language)
|
|
|
- org-export-smart-quotes-alist))))
|
|
|
- ;; 1. Replace quote character at the beginning of S.
|
|
|
- (let* ((prev (org-export-get-previous-element (or original s) info))
|
|
|
- (pre-blank (and prev (org-element-property :post-blank prev))))
|
|
|
+ (let* ((prev (org-export-get-previous-element (or original s) info))
|
|
|
+ (pre-blank (and prev (org-element-property :post-blank prev)))
|
|
|
+ (next (org-export-get-next-element (or original s) info))
|
|
|
+ (get-smart-quote
|
|
|
+ (lambda (q type)
|
|
|
+ ;; Return smart quote associated to a give quote Q, as
|
|
|
+ ;; a string. TYPE is a symbol among `open', `close' and
|
|
|
+ ;; `apostrophe'.
|
|
|
+ (let ((key (case type
|
|
|
+ (apostrophe 'apostrophe)
|
|
|
+ (open (if (equal "'" q) 'opening-single-quote
|
|
|
+ 'opening-double-quote))
|
|
|
+ (otherwise (if (equal "'" q) 'closing-single-quote
|
|
|
+ 'closing-double-quote)))))
|
|
|
+ (or (plist-get
|
|
|
+ (cdr (assq key
|
|
|
+ (cdr (assoc (plist-get info :language)
|
|
|
+ org-export-smart-quotes-alist))))
|
|
|
+ encoding)
|
|
|
+ q)))))
|
|
|
+ (if (or (equal "\"" s) (equal "'" s))
|
|
|
+ ;; Only a quote: no regexp can match. We have to check both
|
|
|
+ ;; sides and decide what to do.
|
|
|
+ (cond ((and (not prev) (not next)) s)
|
|
|
+ ((not prev) (funcall get-smart-quote s 'open))
|
|
|
+ ((and (not next) (zerop pre-blank))
|
|
|
+ (funcall get-smart-quote s 'close))
|
|
|
+ ((not next) s)
|
|
|
+ ((zerop pre-blank) (funcall get-smart-quote s 'apostrophe))
|
|
|
+ (t (funcall get-smart-quote 'open)))
|
|
|
+ ;; 1. Replace quote character at the beginning of S.
|
|
|
(cond
|
|
|
;; Apostrophe?
|
|
|
((and prev (zerop pre-blank)
|
|
|
(string-match (nth 2 org-export-smart-quotes-regexps) s))
|
|
|
- (let ((smart-quote
|
|
|
- (plist-get (cdr (assq 'apostrophe quotes-alist)) encoding)))
|
|
|
- (when smart-quote
|
|
|
- (setq s (replace-match smart-quote nil t s 1)))))
|
|
|
+ (setq s (replace-match
|
|
|
+ (funcall get-smart-quote (match-string 1 s) 'apostrophe)
|
|
|
+ nil t s 1)))
|
|
|
;; Closing quote?
|
|
|
((and prev (zerop pre-blank)
|
|
|
(string-match (nth 1 org-export-smart-quotes-regexps) s))
|
|
|
- (let ((smart-quote
|
|
|
- (plist-get (cdr (assq (if (equal (match-string 1 s) "'")
|
|
|
- 'closing-single-quote
|
|
|
- 'closing-double-quote)
|
|
|
- quotes-alist))
|
|
|
- encoding)))
|
|
|
- (when smart-quote
|
|
|
- (setq s (replace-match smart-quote nil t s 1)))))
|
|
|
+ (setq s (replace-match
|
|
|
+ (funcall get-smart-quote (match-string 1 s) 'close)
|
|
|
+ nil t s 1)))
|
|
|
;; Opening quote?
|
|
|
((and (or (not prev) (> pre-blank 0))
|
|
|
(string-match (nth 0 org-export-smart-quotes-regexps) s))
|
|
|
- (let ((smart-quote
|
|
|
- (plist-get (cdr (assq (if (equal (match-string 1 s) "'")
|
|
|
- 'opening-single-quote
|
|
|
- 'opening-double-quote)
|
|
|
- quotes-alist))
|
|
|
- encoding)))
|
|
|
- (when smart-quote
|
|
|
- (setq s (replace-match smart-quote nil t s 1)))))))
|
|
|
- ;; 2. Replace quotes in the middle of the string.
|
|
|
- (setq s
|
|
|
- ;; Opening quotes.
|
|
|
- (replace-regexp-in-string
|
|
|
- (nth 3 org-export-smart-quotes-regexps)
|
|
|
- (lambda (text)
|
|
|
- (or (plist-get
|
|
|
- (cdr (assq (if (equal (match-string 1 text) "'")
|
|
|
- 'opening-single-quote
|
|
|
- 'opening-double-quote)
|
|
|
- quotes-alist))
|
|
|
- encoding)
|
|
|
- (match-string 1 text)))
|
|
|
- s nil t 1))
|
|
|
- (setq s
|
|
|
- (replace-regexp-in-string
|
|
|
- ;; Closing quotes.
|
|
|
- (nth 4 org-export-smart-quotes-regexps)
|
|
|
- (lambda (text)
|
|
|
- (or (plist-get
|
|
|
- (cdr (assq (if (equal (match-string 1 text) "'")
|
|
|
- 'closing-single-quote
|
|
|
- 'closing-double-quote)
|
|
|
- quotes-alist))
|
|
|
- encoding)
|
|
|
- (match-string 1 text)))
|
|
|
- s nil t 1))
|
|
|
- (setq s
|
|
|
- (replace-regexp-in-string
|
|
|
- ;; Apostrophes.
|
|
|
- (nth 5 org-export-smart-quotes-regexps)
|
|
|
- (lambda (text)
|
|
|
- (or (plist-get (cdr (assq 'apostrophe quotes-alist)) encoding)
|
|
|
- (match-string 1 text)))
|
|
|
- s nil t 1))
|
|
|
- ;; 3. Replace quote character at the end of S.
|
|
|
- (let ((next (org-export-get-next-element (or original s) info)))
|
|
|
+ (setq s (replace-match
|
|
|
+ (funcall get-smart-quote (match-string 1 s) 'open)
|
|
|
+ nil t s 1))))
|
|
|
+ ;; 2. Replace quotes in the middle of the string.
|
|
|
+ (setq s (replace-regexp-in-string
|
|
|
+ ;; Opening quotes.
|
|
|
+ (nth 3 org-export-smart-quotes-regexps)
|
|
|
+ (lambda (text)
|
|
|
+ (funcall get-smart-quote (match-string 1 text) 'open))
|
|
|
+ s nil t 1))
|
|
|
+ (setq s (replace-regexp-in-string
|
|
|
+ ;; Closing quotes.
|
|
|
+ (nth 4 org-export-smart-quotes-regexps)
|
|
|
+ (lambda (text)
|
|
|
+ (funcall get-smart-quote (match-string 1 text) 'close))
|
|
|
+ s nil t 1))
|
|
|
+ (setq s (replace-regexp-in-string
|
|
|
+ ;; Apostrophes.
|
|
|
+ (nth 5 org-export-smart-quotes-regexps)
|
|
|
+ (lambda (text)
|
|
|
+ (funcall get-smart-quote (match-string 1 text) 'apostrophe))
|
|
|
+ s nil t 1))
|
|
|
+ ;; 3. Replace quote character at the end of S.
|
|
|
(cond
|
|
|
;; Apostrophe?
|
|
|
((and next (string-match (nth 8 org-export-smart-quotes-regexps) s))
|
|
|
- (let ((smart-quote
|
|
|
- (plist-get (cdr (assq 'apostrophe quotes-alist)) encoding)))
|
|
|
- (when smart-quote (setq s (replace-match smart-quote nil t s 1)))))
|
|
|
+ (setq s (replace-match
|
|
|
+ (funcall get-smart-quote (match-string 1 s) 'apostrophe)
|
|
|
+ nil t s 1)))
|
|
|
;; Closing quote?
|
|
|
((and (not next)
|
|
|
(string-match (nth 7 org-export-smart-quotes-regexps) s))
|
|
|
- (let ((smart-quote
|
|
|
- (plist-get (cdr (assq (if (equal (match-string 1 s) "'")
|
|
|
- 'closing-single-quote
|
|
|
- 'closing-double-quote)
|
|
|
- quotes-alist))
|
|
|
- encoding)))
|
|
|
- (when smart-quote (setq s (replace-match smart-quote nil t s 1)))))
|
|
|
+ (setq s (replace-match
|
|
|
+ (funcall get-smart-quote (match-string 1 s) 'close)
|
|
|
+ nil t s 1)))
|
|
|
;; Opening quote?
|
|
|
((and next (string-match (nth 6 org-export-smart-quotes-regexps) s))
|
|
|
- (let ((smart-quote
|
|
|
- (plist-get (cdr (assq (if (equal (match-string 1 s) "'")
|
|
|
- 'opening-single-quote
|
|
|
- 'opening-double-quote)
|
|
|
- quotes-alist))
|
|
|
- encoding)))
|
|
|
- (when smart-quote
|
|
|
- (setq s (replace-match smart-quote nil t s 1)))))))
|
|
|
- ;; Return string with smart quotes.
|
|
|
- s)))
|
|
|
-
|
|
|
+ (setq s (replace-match
|
|
|
+ (funcall get-smart-quote (match-string 1 s) 'open)
|
|
|
+ nil t s 1))))
|
|
|
+ ;; Return string with smart quotes.
|
|
|
+ s))))
|
|
|
|
|
|
;;;; Topology
|
|
|
;;
|