aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam David Mayo ("Dave") <pobocks@gmail.com>2016-09-06 22:19:54 -0400
committerGitHub <noreply@github.com>2016-09-06 22:19:54 -0400
commit607a23d208405838325ca5203a1900682dad00ac (patch)
tree0d8089fa5ef36d6bada8f4928d9f6d7cd1663293
parent3c2d5c3e86c317601cbf8d976c5611b8c73ac178 (diff)
parent039526bd8e41ced107892cf13c89ca7b43749260 (diff)
downloademmet-mode-607a23d208405838325ca5203a1900682dad00ac.tar.lz
emmet-mode-607a23d208405838325ca5203a1900682dad00ac.tar.xz
emmet-mode-607a23d208405838325ca5203a1900682dad00ac.zip
Merge pull request #82 from pobocks/issue_81
Added multi-line * wrap functionality as per #81 With a multi-line region, expanding something like `div>ul>li*` will wrap each line in the terminating *'d expression.
-rw-r--r--emmet-mode.el49
-rw-r--r--src/mode-def.el49
-rw-r--r--src/test.el5
3 files changed, 69 insertions, 34 deletions
diff --git a/emmet-mode.el b/emmet-mode.el
index 5c2bdee..5f0a204 100644
--- a/emmet-mode.el
+++ b/emmet-mode.el
@@ -172,7 +172,7 @@ and leaving the point in place."
"Find the left bound of an emmet expr"
(save-excursion (save-match-data
(let ((char (char-before))
- (in-style-attr (looking-back "style=[\"'][^\"']*"))
+ (in-style-attr (looking-back "style=[\"'][^\"']*" nil))
(syn-tab (make-syntax-table)))
(modify-syntax-entry ?\\ "\\")
(while char
@@ -627,21 +627,37 @@ accept it or skip it."
(defun emmet-wrap-with-markup (wrap-with)
"Wrap region with markup."
(interactive "sExpression to wrap with: ")
- (let* ((to-wrap (buffer-substring-no-properties (region-beginning) (region-end)))
- (expr (concat wrap-with ">{!EMMET-TO-WRAP-REPLACEMENT!}"))
- (markup (replace-regexp-in-string
- "!EMMET-TO-WRAP-REPLACEMENT!" to-wrap
- (emmet-transform expr)
- t t)))
- (when markup
- (delete-region (region-beginning) (region-end))
- (insert markup)
- (indent-region (region-beginning) (region-end))
- (let ((end (region-end)))
- (goto-char (region-beginning))
- (unless (ignore-errors (progn (emmet-next-edit-point 1) t))
- (goto-char end)))
- )))
+ (let* ((multi (string-match "\\*$" wrap-with))
+ (txt (buffer-substring-no-properties (region-beginning) (region-end)))
+ (to-wrap (if multi
+ (split-string txt "\n")
+ (list txt)))
+ (initial-elements (replace-regexp-in-string "\\(.*\\(\\+\\|>\\)\\)?[^>*]+\\*?[[:digit:]]*$" "\\1" wrap-with t))
+ (terminal-element (replace-regexp-in-string "\\(.*>\\)?\\([^>*]+\\)\\(\\*[[:digit:]]+$\\)?\\*?$" "\\2" wrap-with t))
+ (multiplier-expr (replace-regexp-in-string "\\(.*>\\)?\\([^>*]+\\)\\(\\*[[:digit:]]+$\\)?\\*?$" "\\3" wrap-with t))
+ (expr (concat
+ initial-elements
+ (mapconcat (lambda (el) (concat terminal-element "{!!!" (secure-hash 'sha1 el) "!!!}" multiplier-expr))
+ to-wrap
+ "+")))
+ (markup
+ (reduce
+ (lambda (result text)
+ (replace-regexp-in-string
+ (concat "!!!" (secure-hash 'sha1 text) "!!!")
+ text
+ result t t))
+ to-wrap
+ :initial-value (emmet-transform expr))))
+ (when markup
+ (delete-region (region-beginning) (region-end))
+ (insert markup)
+ (indent-region (region-beginning) (region-end))
+ (let ((end (region-end)))
+ (goto-char (region-beginning))
+ (unless (ignore-errors (progn (emmet-next-edit-point 1) t))
+ (goto-char end)))
+ )))
;;;###autoload
(defun emmet-next-edit-point (count)
@@ -656,7 +672,6 @@ accept it or skip it."
(error "First edit point reached.")))
(provide 'emmet-mode)
-
;; src/snippets.el
;; This file is generated from conf/snippets.json
;; Don't edit.
diff --git a/src/mode-def.el b/src/mode-def.el
index 104ace2..c0e3e2c 100644
--- a/src/mode-def.el
+++ b/src/mode-def.el
@@ -19,7 +19,7 @@
"Find the left bound of an emmet expr"
(save-excursion (save-match-data
(let ((char (char-before))
- (in-style-attr (looking-back "style=[\"'][^\"']*"))
+ (in-style-attr (looking-back "style=[\"'][^\"']*" nil))
(syn-tab (make-syntax-table)))
(modify-syntax-entry ?\\ "\\")
(while char
@@ -474,21 +474,37 @@ accept it or skip it."
(defun emmet-wrap-with-markup (wrap-with)
"Wrap region with markup."
(interactive "sExpression to wrap with: ")
- (let* ((to-wrap (buffer-substring-no-properties (region-beginning) (region-end)))
- (expr (concat wrap-with ">{!EMMET-TO-WRAP-REPLACEMENT!}"))
- (markup (replace-regexp-in-string
- "!EMMET-TO-WRAP-REPLACEMENT!" to-wrap
- (emmet-transform expr)
- t t)))
- (when markup
- (delete-region (region-beginning) (region-end))
- (insert markup)
- (indent-region (region-beginning) (region-end))
- (let ((end (region-end)))
- (goto-char (region-beginning))
- (unless (ignore-errors (progn (emmet-next-edit-point 1) t))
- (goto-char end)))
- )))
+ (let* ((multi (string-match "\\*$" wrap-with))
+ (txt (buffer-substring-no-properties (region-beginning) (region-end)))
+ (to-wrap (if multi
+ (split-string txt "\n")
+ (list txt)))
+ (initial-elements (replace-regexp-in-string "\\(.*\\(\\+\\|>\\)\\)?[^>*]+\\*?[[:digit:]]*$" "\\1" wrap-with t))
+ (terminal-element (replace-regexp-in-string "\\(.*>\\)?\\([^>*]+\\)\\(\\*[[:digit:]]+$\\)?\\*?$" "\\2" wrap-with t))
+ (multiplier-expr (replace-regexp-in-string "\\(.*>\\)?\\([^>*]+\\)\\(\\*[[:digit:]]+$\\)?\\*?$" "\\3" wrap-with t))
+ (expr (concat
+ initial-elements
+ (mapconcat (lambda (el) (concat terminal-element "{!!!" (secure-hash 'sha1 el) "!!!}" multiplier-expr))
+ to-wrap
+ "+")))
+ (markup
+ (reduce
+ (lambda (result text)
+ (replace-regexp-in-string
+ (concat "!!!" (secure-hash 'sha1 text) "!!!")
+ text
+ result t t))
+ to-wrap
+ :initial-value (emmet-transform expr))))
+ (when markup
+ (delete-region (region-beginning) (region-end))
+ (insert markup)
+ (indent-region (region-beginning) (region-end))
+ (let ((end (region-end)))
+ (goto-char (region-beginning))
+ (unless (ignore-errors (progn (emmet-next-edit-point 1) t))
+ (goto-char end)))
+ )))
;;;###autoload
(defun emmet-next-edit-point (count)
@@ -503,4 +519,3 @@ accept it or skip it."
(error "First edit point reached.")))
(provide 'emmet-mode)
-
diff --git a/src/test.el b/src/test.el
index 05f7a24..913daca 100644
--- a/src/test.el
+++ b/src/test.el
@@ -655,6 +655,11 @@
#'emmet-wrap-with-markup-test
'((("div>ul>li" "I am some\nmultiline\n text") . "<div>\n <ul>\n <li>I am some\n multiline\n text</li>\n </ul>\n</div>")))
+(emmet-run-test-case "Wrap with per-line markup (trailing *)"
+ #'emmet-wrap-with-markup-test
+ '((("div>ul>li*" "I am some\nmultiline\n text") .
+ "<div>\n <ul>\n <li>I am some</li>\n <li>multiline</li>\n <li> text</li>\n </ul>\n</div>")))
+
;; Regression test for #54 (broken emmet-find-left-bound behavior
;; after tag with attributes)
(defun emmet-regression-54-test (lis)