diff options
author | William David Mayo ("Dave") <pobocks@gmail.com> | 2016-09-06 22:19:54 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-06 22:19:54 -0400 |
commit | 607a23d208405838325ca5203a1900682dad00ac (patch) | |
tree | 0d8089fa5ef36d6bada8f4928d9f6d7cd1663293 | |
parent | 3c2d5c3e86c317601cbf8d976c5611b8c73ac178 (diff) | |
parent | 039526bd8e41ced107892cf13c89ca7b43749260 (diff) | |
download | emmet-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.el | 49 | ||||
-rw-r--r-- | src/mode-def.el | 49 | ||||
-rw-r--r-- | src/test.el | 5 |
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) |