From bbb8dab229591e0c435d58478d0cd10b1fc1bfa5 Mon Sep 17 00:00:00 2001 From: smihica Date: Sun, 23 Jun 2013 22:40:45 +0900 Subject: [PATCH] Renamed zencoding -> emmet. --- .gitignore | 3 +- Makefile | 17 +- README.md | 24 +- zencoding-mode.el => emmet-mode.el | 923 ++++++++++++++--------------- src/comments.el | 37 +- src/css-abbrev.el | 162 ++--- src/html-abbrev.el | 416 ++++++------- src/init.el | 35 +- src/mode-def.el | 268 ++++----- src/preferences.el | 2 +- src/snippets.el | 2 +- src/test.el | 100 ++-- tools/json2hash | 2 +- 13 files changed, 996 insertions(+), 995 deletions(-) rename zencoding-mode.el => emmet-mode.el (81%) diff --git a/.gitignore b/.gitignore index f5711cb..d41a2cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -memo* \ No newline at end of file +memo* +*.elc \ No newline at end of file diff --git a/Makefile b/Makefile index 28ef0b4..fca7bb8 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ -DST=zencoding-mode.el +DST=emmet-mode.el -all: zencoding-mode.el +all: emmet-mode.el emmet-mode.elc -zencoding-mode.el: src/snippets.el src/preferences.el src/* +emmet-mode.el: src/snippets.el src/preferences.el src/* rm -f $(DST) touch $(DST) cat src/comments.el >> $(DST) @@ -13,14 +13,17 @@ zencoding-mode.el: src/snippets.el src/preferences.el src/* cat src/css-abbrev.el >> $(DST) cat src/mode-def.el >> $(DST) +emmet-mode.elc: emmet-mode.el + /usr/bin/env emacs --batch --eval '(byte-compile-file "emmet-mode.el")' + src/snippets.el: conf/snippets.json - tools/json2hash conf/snippets.json -o src/snippets.el --defvar 'zencoding-snippets' + tools/json2hash conf/snippets.json -o src/snippets.el --defvar 'emmet-snippets' src/preferences.el: conf/preferences.json - tools/json2hash conf/preferences.json -o src/preferences.el --defvar 'zencoding-preferences' + tools/json2hash conf/preferences.json -o src/preferences.el --defvar 'emmet-preferences' clean: - rm -f zencoding-mode.el src/snippets.el src/preferences.el + rm -f emmet-mode.elc emmet-mode.el src/snippets.el src/preferences.el test: /usr/bin/env emacs --script src/test.el @@ -28,4 +31,4 @@ test: docs: echo docs -.PHONY: all test docs clean \ No newline at end of file +.PHONY: all test docs clean diff --git a/README.md b/README.md index 0298172..55925a3 100644 --- a/README.md +++ b/README.md @@ -10,34 +10,34 @@ Zen Coding has been renamed to [Emmet](http://emmet.io/) and includes an expande ## Abbreviation Examples -- [HTML abbreviations](https://github.com/smihica/zencoding#html-abbreviations) -- [CSS abbreviations](https://github.com/smihica/zencoding#css-abbreviations) +- [HTML abbreviations](https://github.com/smihica/emmet#html-abbreviations) +- [CSS abbreviations](https://github.com/smihica/emmet#css-abbreviations) ## Installation -Just make sure zencoding-mode.el is in your `load-path`, if you -extracted zencoding-mode to a directory: +Just make sure emmet-mode.el is in your `load-path`, if you +extracted emmet-mode to a directory: - (add-to-list 'load-path "~/emacs.d/zencoding-mode") + (add-to-list 'load-path "~/emacs.d/emmet-mode") And then just require as normal: - (require 'zencoding-mode) + (require 'emmet-mode) ## Usage -Enable it by running `M-x zencoding-mode`. You probably want to add it +Enable it by running `M-x emmet-mode`. You probably want to add it to auto-load on your sgml modes: - (add-hook 'sgml-mode-hook 'zencoding-mode) ;; Auto-start on any markup modes - (add-hook 'css-mode-hook 'zencoding-mode) ;; enable Emmet's css abbreviation. + (add-hook 'sgml-mode-hook 'emmet-mode) ;; Auto-start on any markup modes + (add-hook 'css-mode-hook 'emmet-mode) ;; enable Emmet's css abbreviation. And you can set default indent depth of HTML abbreviation. - (add-hook 'zencoding-mode-hook (lambda () (setq zencoding-indentation 2))) ;indent 2 spaces. + (add-hook 'emmet-mode-hook (lambda () (setq emmet-indentation 2))) ;indent 2 spaces. -Good to go: place point in a zencoding snippet and press C-j to expand it (or -alternatively, alias your preferred keystroke to M-x zencoding-expand-line) and +Good to go: place point in a emmet snippet and press C-j to expand it (or +alternatively, alias your preferred keystroke to M-x emmet-expand-line) and you'll transform your snippet into the appropriate tag structure. ## HTML abbreviations diff --git a/zencoding-mode.el b/emmet-mode.el similarity index 81% rename from zencoding-mode.el rename to emmet-mode.el index 1f7b54f..c16a534 100644 --- a/zencoding-mode.el +++ b/emmet-mode.el @@ -1,11 +1,12 @@ -;;; zencoding-mode.el --- Unfold CSS-selector-like expressions to markup +;;; emmet-mode.el --- Unofficial Emmet's support for emacs. +;; Copyright (C) 2013, Shin Aoyama ;; Copyright (C) 2009, Chris Done -;; Version: 0.5.1 -;; Author: Chris Done -;; URL: https://github.com/rooney/zencoding -;; Last-Updated: 2011-12-31 Sat +;; Version: 0.1.0 +;; Author: Shin Aoyama +;; URL: https://github.com/smihica/emmet +;; Last-Updated: 2013-06-23 Sun ;; Keywords: convenience ;; This file is free software; you can redistribute it and/or modify @@ -30,25 +31,25 @@ ;; Unfold CSS-selector-like expressions to markup. Intended to be used ;; with sgml-like languages; xml, html, xhtml, xsl, etc. ;; -;; See `zencoding-mode' for more information. +;; See `emmet-mode' for more information. ;; -;; Copy zencoding-mode.el to your load-path and add to your .emacs: +;; Copy emmet-mode.el to your load-path and add to your .emacs: ;; -;; (require 'zencoding-mode) +;; (require 'emmet-mode) ;; ;; Example setup: ;; -;; (add-to-list 'load-path "~/Emacs/zencoding/") -;; (require 'zencoding-mode) -;; (add-hook 'sgml-mode-hook 'zencoding-mode) ;; Auto-start on any markup modes -;; (add-hook 'html-mode-hook 'zencoding-mode) -;; (add-hook 'css-mode-hook 'zencoding-mode) +;; (add-to-list 'load-path "~/Emacs/emmet/") +;; (require 'emmet-mode) +;; (add-hook 'sgml-mode-hook 'emmet-mode) ;; Auto-start on any markup modes +;; (add-hook 'html-mode-hook 'emmet-mode) +;; (add-hook 'css-mode-hook 'emmet-mode) ;; -;; Enable the minor mode with M-x zencoding-mode. +;; Enable the minor mode with M-x emmet-mode. ;; ;; See ``Test cases'' section for a complete set of expression types. ;; -;; If you are hacking on this project, eval (zencoding-test-cases) to +;; If you are hacking on this project, eval (emmet-test-cases) to ;; ensure that your changes have not broken anything. Feel free to add ;; new test cases if you add new features. ;; @@ -56,35 +57,32 @@ ;; ;;; History: ;; -;; Modified by Lennart Borgman. -;; -;; +;; This is a fork of zencoding-mode to support Emmet's feature. +;; zencoding-mode (https://github.com/rooney/zencoding) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Code: -(defconst zencoding-mode:version "0.5.1") +(defconst emmet-mode:version "0.1.0") -;; Include the trie data structure for caching -;(require 'zencoding-trie) +(eval-when-compile (require 'cl)) -(require 'cl) - -(defmacro zencoding-defparameter (symbol &optional initvalue docstring) +(defmacro emmet-defparameter (symbol &optional initvalue docstring) `(progn (defvar ,symbol nil ,docstring) (setq ,symbol ,initvalue))) -(defun zencoding-join-string (lis joiner) +(defun emmet-join-string (lis joiner) (mapconcat 'identity lis joiner)) -(defun zencoding-get-keys-of-hash (hash) +(defun emmet-get-keys-of-hash (hash) (let ((ks nil)) (maphash #'(lambda (k v) (setq ks (cons k ks))) hash) ks)) -(defun zencoding-get-vals-of-hash (hash) +(defun emmet-get-vals-of-hash (hash) (let ((vs nil)) (maphash #'(lambda (k v) (setq vs (cons v vs))) hash) vs)) @@ -92,45 +90,45 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Generic parsing macros and utilities -(defmacro zencoding-aif (test-form then-form &rest else-forms) +(defmacro emmet-aif (test-form then-form &rest else-forms) "Anaphoric if. Temporary variable `it' is the result of test-form." `(let ((it ,test-form)) (if it ,then-form ,@(or else-forms '(it))))) -(defmacro zencoding-pif (test-form then-form &rest else-forms) +(defmacro emmet-pif (test-form then-form &rest else-forms) "Parser anaphoric if. Temporary variable `it' is the result of test-form." `(let ((it ,test-form)) (if (not (eq 'error (car it))) ,then-form ,@(or else-forms '(it))))) -(defmacro zencoding-parse (regex nums label &rest body) +(defmacro emmet-parse (regex nums label &rest body) "Parse according to a regex and update the `input' variable." - `(zencoding-aif (zencoding-regex ,regex input ',(number-sequence 0 nums)) + `(emmet-aif (emmet-regex ,regex input ',(number-sequence 0 nums)) (let ((input (elt it ,nums))) ,@body) `,`(error ,(concat "expected " ,label)))) -(defmacro zencoding-run (parser then-form &rest else-forms) +(defmacro emmet-run (parser then-form &rest else-forms) "Run a parser and update the input properly, extract the parsed expression." - `(zencoding-pif (,parser input) + `(emmet-pif (,parser input) (let ((input (cdr it)) (expr (car it))) ,then-form) ,@(or else-forms '(it)))) -(defmacro zencoding-por (parser1 parser2 then-form &rest else-forms) +(defmacro emmet-por (parser1 parser2 then-form &rest else-forms) "OR two parsers. Try one parser, if it fails try the next." - `(zencoding-pif (,parser1 input) + `(emmet-pif (,parser1 input) (let ((input (cdr it)) (expr (car it))) ,then-form) - (zencoding-pif (,parser2 input) + (emmet-pif (,parser2 input) (let ((input (cdr it)) (expr (car it))) ,then-form) ,@else-forms))) -(defun zencoding-regex (regexp string refs) +(defun emmet-regex (regexp string refs) "Return a list of (`ref') matches for a `regex' on a `string' or nil." (if (string-match (concat "^" regexp "\\([^\n]*\\)$") string) (mapcar (lambda (ref) (match-string ref string)) @@ -139,7 +137,7 @@ ;; src/snippets.el ;; This file is generated from conf/snippets.json ;; Don't edit. -(zencoding-defparameter zencoding-snippets +(emmet-defparameter emmet-snippets (let ((tbl (make-hash-table :test 'equal))) (puthash "html" (let ((tbl (make-hash-table :test 'equal))) (puthash "snippets" (let ((tbl (make-hash-table :test 'equal))) @@ -837,7 +835,7 @@ tbl)) ;; src/preferences.el ;; This file is generated from conf/preferences.json ;; Don't edit. -(zencoding-defparameter zencoding-preferences +(emmet-defparameter emmet-preferences (let ((tbl (make-hash-table :test 'equal))) (puthash "html" (let ((tbl (make-hash-table :test 'equal))) (puthash "tags" (let ((tbl (make-hash-table :test 'equal))) @@ -2385,57 +2383,57 @@ tbl)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; XML abbrev -(zencoding-defparameter - zencoding-tag-aliases-table - (gethash "aliases" (gethash "html" zencoding-snippets))) +(emmet-defparameter + emmet-tag-aliases-table + (gethash "aliases" (gethash "html" emmet-snippets))) -(defun zencoding-expr (input) +(defun emmet-expr (input) "Parse a zen coding expression with optional filters." - (zencoding-pif (zencoding-parse "\\(.*?\\)|" 2 "expr|filter" it) + (emmet-pif (emmet-parse "\\(.*?\\)|" 2 "expr|filter" it) (let ((input (elt it 1)) (filters (elt it 2))) - (zencoding-pif (zencoding-extract-filters filters) - (zencoding-filter input it) + (emmet-pif (emmet-extract-filters filters) + (emmet-filter input it) it)) - (zencoding-filter input (zencoding-default-filter)))) + (emmet-filter input (emmet-default-filter)))) -(defun zencoding-subexpr (input) +(defun emmet-subexpr (input) "Parse a zen coding expression with no filter. This pretty much defines precedence." - (zencoding-run zencoding-siblings + (emmet-run emmet-siblings it - (zencoding-run zencoding-parent-child + (emmet-run emmet-parent-child it - (zencoding-run zencoding-multiplier + (emmet-run emmet-multiplier it - (zencoding-run zencoding-pexpr + (emmet-run emmet-pexpr it - (zencoding-run zencoding-text + (emmet-run emmet-text it - (zencoding-run zencoding-tag + (emmet-run emmet-tag it '(error "no match, expecting ( or a-zA-Z0-9")))))))) -(defun zencoding-extract-filters (input) +(defun emmet-extract-filters (input) "Extract filters from expression." - (zencoding-pif (zencoding-parse "\\([^\\|]+?\\)|" 2 "" it) + (emmet-pif (emmet-parse "\\([^\\|]+?\\)|" 2 "" it) (let ((filter-name (elt it 1)) (more-filters (elt it 2))) - (zencoding-pif (zencoding-extract-filters more-filters) + (emmet-pif (emmet-extract-filters more-filters) (cons filter-name it) it)) - (zencoding-parse "\\([^\\|]+\\)" 1 "filter name" `(,(elt it 1))))) + (emmet-parse "\\([^\\|]+\\)" 1 "filter name" `(,(elt it 1))))) -(defun zencoding-filter (input filters) +(defun emmet-filter (input filters) "Construct AST with specified filters." - (zencoding-pif (zencoding-subexpr input) + (emmet-pif (emmet-subexpr input) (let ((result (car it)) (rest (cdr it))) `((filter ,filters ,result) . ,rest)) it)) -(defun zencoding-default-filter () +(defun emmet-default-filter () "Default filter(s) to be used if none is specified." - (let* ((file-ext (car (zencoding-regex ".*\\(\\..*\\)" (or (buffer-file-name) "") 1))) + (let* ((file-ext (car (emmet-regex ".*\\(\\..*\\)" (or (buffer-file-name) "") 1))) (defaults '(".html" ("html") ".htm" ("html") ".haml" ("haml") @@ -2446,11 +2444,11 @@ tbl)) (cadr selected-default) default-else))) -(defun zencoding-numbering (input) - (zencoding-parse +(defun emmet-numbering (input) + (emmet-parse "\\(\\$+\\)" 2 "numbering, $" (let ((doller (elt it 1))) - (zencoding-pif (zencoding-parse + (emmet-pif (emmet-parse "@\\([0-9-][0-9]*\\)" 2 "numbering args" (let* ((args (read (elt it 1))) (direction (not (or (eq '- args) (minusp args)))) @@ -2459,17 +2457,17 @@ tbl)) it `((n ,(length doller) t 1) . ,input))))) -(defun zencoding-split-numbering-expressions (input) +(defun emmet-split-numbering-expressions (input) (labels ((iter (input) - (zencoding-aif (zencoding-regex "\\([^$]*\\)\\(\\$.*\\)" input '(1 2)) + (emmet-aif (emmet-regex "\\([^$]*\\)\\(\\$.*\\)" input '(1 2)) (let ((prefix (car it)) (input (cadr it))) (if (and (< 0 (length prefix)) ; check if ..\\$... or ...$... (string-equal (substring prefix -1) "\\")) `(,(store-substring prefix (- (length prefix) 1) ?$) ,@(iter (substring input 1))) - (let ((res (zencoding-numbering input))) + (let ((res (emmet-numbering input))) `(,prefix ,(car res) ,@(iter (cdr res)))))) (list input)))) (let ((res (iter input))) @@ -2477,7 +2475,7 @@ tbl)) (apply #'concat res) `(numberings ,@res))))) -(defun zencoding-instantiate-numbering-expression (i lim exp) +(defun emmet-instantiate-numbering-expression (i lim exp) (labels ((instantiate (i lim exps) (apply #'concat @@ -2504,70 +2502,70 @@ tbl)) exp))) (search i lim exp))) -(defun zencoding-multiply-expression (multiplicand exp) +(defun emmet-multiply-expression (multiplicand exp) (loop for i to (- multiplicand 1) collect - (zencoding-instantiate-numbering-expression i multiplicand exp))) + (emmet-instantiate-numbering-expression i multiplicand exp))) -(defun zencoding-multiplier (input) - (zencoding-pif (zencoding-run zencoding-pexpr +(defun emmet-multiplier (input) + (emmet-pif (emmet-run emmet-pexpr it - (zencoding-run zencoding-tag + (emmet-run emmet-tag it - (zencoding-run zencoding-text + (emmet-run emmet-text it '(error "expected *n multiplier")))) (let* ((expr (car it)) (input (cdr it)) (multiplier expr)) - (zencoding-parse "\\*\\([0-9]+\\)" 2 "*n where n is a number" + (emmet-parse "\\*\\([0-9]+\\)" 2 "*n where n is a number" (let ((multiplicand (read (elt it 1)))) - `((list ,(zencoding-multiply-expression + `((list ,(emmet-multiply-expression multiplicand multiplier)) . ,input)))))) -(defun zencoding-tag (input) +(defun emmet-tag (input) "Parse a tag." - (zencoding-run - zencoding-tagname + (emmet-run + emmet-tagname (let ((tagname (cadr expr)) (has-body? (cddr expr))) - (zencoding-pif - (zencoding-run zencoding-identifier - (zencoding-tag-classes + (emmet-pif + (emmet-run emmet-identifier + (emmet-tag-classes `(tag (,tagname ,has-body? ,(cddr expr))) input) - (zencoding-tag-classes + (emmet-tag-classes `(tag (,tagname ,has-body? nil)) input)) (let ((tag-data (cadar it)) (input (cdr it))) - (zencoding-pif (zencoding-run - zencoding-props + (emmet-pif (emmet-run + emmet-props (let ((props (cdr expr))) `((tag ,(append tag-data (list props))) . ,input)) `((tag ,(append tag-data '(nil))) . ,input)) (let ((expr (car it)) (input (cdr it))) (destructuring-bind (expr . input) - (zencoding-tag-text expr input) - (zencoding-expand-tag-alias expr input))))))) - (zencoding-default-tag input))) + (emmet-tag-text expr input) + (emmet-expand-tag-alias expr input))))))) + (emmet-default-tag input))) -(defun zencoding-get-first-tag (expr) +(defun emmet-get-first-tag (expr) (if (listp expr) (if (listp (car expr)) - (zencoding-get-first-tag (car expr)) + (emmet-get-first-tag (car expr)) (if (eql (car expr) 'tag) expr - (zencoding-get-first-tag (cdr expr)))) + (emmet-get-first-tag (cdr expr)))) nil)) -(defun zencoding-expand-tag-alias (tag input) +(defun emmet-expand-tag-alias (tag input) (let ((tag-data (cadr tag))) (let ((tag-name (car tag-data))) - (zencoding-aif - (gethash tag-name zencoding-tag-aliases-table) + (emmet-aif + (gethash tag-name emmet-tag-aliases-table) (let ((expr (if (stringp it) - (zencoding-subexpr it) + (emmet-subexpr it) it))) (prog1 (let ((rt (copy-tree expr))) - (let ((first-tag-data (cadr (zencoding-get-first-tag rt)))) + (let ((first-tag-data (cadr (emmet-get-first-tag rt)))) (setf (second first-tag-data) (second tag-data)) (setf (third first-tag-data) (third tag-data)) (setf (fourth first-tag-data) @@ -2583,90 +2581,90 @@ tbl)) (setf (sixth first-tag-data) (sixth tag-data)) (setf (cdr rt) (concat (cdr rt) input)) rt)) - (puthash tag-name expr zencoding-tag-aliases-table))) + (puthash tag-name expr emmet-tag-aliases-table))) `(,tag . ,input))))) -(defun zencoding-default-tag (input) +(defun emmet-default-tag (input) "Parse a #id or .class" - (zencoding-parse "\\([#|\\.]\\)" 1 "tagname" - (zencoding-tag (concat "div" (elt it 0))))) + (emmet-parse "\\([#|\\.]\\)" 1 "tagname" + (emmet-tag (concat "div" (elt it 0))))) -(defun zencoding-tag-text (tag input) +(defun emmet-tag-text (tag input) (let ((tag-data (cadr tag))) - (zencoding-run zencoding-text + (emmet-run emmet-text (let ((txt (cadr expr))) `((tag ,(append tag-data (list txt))) . ,input)) `((tag ,(append tag-data '(nil))) . ,input)))) -(defun zencoding-tag-props (tag input) +(defun emmet-tag-props (tag input) (let ((tag-data (cadr tag))) - (zencoding-run zencoding-props + (emmet-run emmet-props (let ((props (cdr expr))) `((tag ,(append tag-data (list props))) . ,input)) `((tag ,(append tag-data '(nil))) . ,input)))) -(defun zencoding-props (input) +(defun emmet-props (input) "Parse many props." - (zencoding-run zencoding-prop - (zencoding-pif (zencoding-props input) + (emmet-run emmet-prop + (emmet-pif (emmet-props input) `((props . ,(cons expr (cdar it))) . ,(cdr it)) `((props . ,(list expr)) . ,input)))) -(defun zencoding-prop (input) - (zencoding-parse +(defun emmet-prop (input) + (emmet-parse " " 1 "space" - (zencoding-run - zencoding-name + (emmet-run + emmet-name (let ((name (cdr expr))) - (zencoding-pif (zencoding-prop-value name input) + (emmet-pif (emmet-prop-value name input) it `((,(read name) "") . ,input)))))) -(defun zencoding-prop-value (name input) - (zencoding-pif (zencoding-parse "=\"\\(.*?\\)\"" 2 +(defun emmet-prop-value (name input) + (emmet-pif (emmet-parse "=\"\\(.*?\\)\"" 2 "=\"property value\"" (let ((value (elt it 1)) (input (elt it 2))) `((,(read name) ,value) . ,input))) it - (zencoding-parse "=\\([^\\,\\+\\>\\{\\}\\ )]*\\)" 2 + (emmet-parse "=\\([^\\,\\+\\>\\{\\}\\ )]*\\)" 2 "=property value" (let ((value (elt it 1)) (input (elt it 2))) `((,(read name) ,value) . ,input))))) -(defun zencoding-tag-classes (tag input) +(defun emmet-tag-classes (tag input) (let ((tag-data (cadr tag))) - (zencoding-run zencoding-classes + (emmet-run emmet-classes (let ((classes (mapcar (lambda (cls) (cdadr cls)) (cdr expr)))) `((tag ,(append tag-data (list classes))) . ,input)) `((tag ,(append tag-data '(nil))) . ,input)))) -(defun zencoding-tagname (input) +(defun emmet-tagname (input) "Parse a tagname a-zA-Z0-9 tagname (e.g. html/head/xsl:if/br)." - (zencoding-parse "\\([a-zA-Z!][a-zA-Z0-9:!$@-]*\/?\\)" 2 "tagname, a-zA-Z0-9" + (emmet-parse "\\([a-zA-Z!][a-zA-Z0-9:!$@-]*\/?\\)" 2 "tagname, a-zA-Z0-9" (let* ((tag-spec (elt it 1)) - (empty-tag (zencoding-regex "\\([^\/]*\\)\/" tag-spec 1)) - (tag (zencoding-split-numbering-expressions + (empty-tag (emmet-regex "\\([^\/]*\\)\/" tag-spec 1)) + (tag (emmet-split-numbering-expressions (if empty-tag (car empty-tag) tag-spec)))) `((tagname . (,tag . ,(not empty-tag))) . ,input)))) -(defun zencoding-text (input) +(defun emmet-text (input) "A zen coding expression innertext." - (zencoding-parse "{\\(.*?\\)}" 2 "inner text" - (let ((txt (zencoding-split-numbering-expressions (elt it 1)))) + (emmet-parse "{\\(.*?\\)}" 2 "inner text" + (let ((txt (emmet-split-numbering-expressions (elt it 1)))) `((text ,txt) . ,input)))) -(defun zencoding-pexpr (input) +(defun emmet-pexpr (input) "A zen coding expression with parentheses around it." - (zencoding-parse "(" 1 "(" - (zencoding-run zencoding-subexpr - (zencoding-aif (zencoding-regex ")" input '(0 1)) + (emmet-parse "(" 1 "(" + (emmet-run emmet-subexpr + (emmet-aif (emmet-regex ")" input '(0 1)) `(,expr . ,(elt it 1)) '(error "expecting `)'"))))) -(defun zencoding-parent-child (input) +(defun emmet-parent-child (input) "Parse an tag>e expression, where `n' is an tag and `e' is any expression." (defun listing (parents child input) @@ -2674,100 +2672,100 @@ tbl)) `((list ,(map 'list (lambda (parent i) `(parent-child ,parent - ,(zencoding-instantiate-numbering-expression i len child))) + ,(emmet-instantiate-numbering-expression i len child))) parents (loop for i to (- len 1) collect i))) . ,input))) - (zencoding-run zencoding-multiplier + (emmet-run emmet-multiplier (let* ((items (cadr expr)) - (rest (zencoding-child-sans expr input))) + (rest (emmet-child-sans expr input))) (if (not (eq (car rest) 'error)) (let ((child (car rest)) (input (cdr rest))) - (zencoding-aif (zencoding-regex "^" input '(0 1)) + (emmet-aif (emmet-regex "^" input '(0 1)) (let ((input (elt it 1))) - (zencoding-run zencoding-subexpr + (emmet-run emmet-subexpr `((sibling ,(car (listing items child "")) ,expr) . ,input) (listing items child input))) (listing items child input))) '(error "expected child"))) - (zencoding-run zencoding-tag - (zencoding-child expr input) + (emmet-run emmet-tag + (emmet-child expr input) '(error "expected parent")))) -(defun zencoding-child-sans (parent input) - (zencoding-parse ">" 1 ">" - (zencoding-run zencoding-subexpr +(defun emmet-child-sans (parent input) + (emmet-parse ">" 1 ">" + (emmet-run emmet-subexpr it '(error "expected child")))) -(defun zencoding-child (parent input) - (zencoding-parse ">" 1 ">" - (zencoding-run zencoding-subexpr +(defun emmet-child (parent input) + (emmet-parse ">" 1 ">" + (emmet-run emmet-subexpr (let ((child expr)) - (zencoding-aif (zencoding-regex "^" input '(0 1)) + (emmet-aif (emmet-regex "^" input '(0 1)) (let ((input (elt it 1))) - (zencoding-run zencoding-subexpr + (emmet-run emmet-subexpr `((sibling (parent-child ,parent ,child) ,expr) . ,input) `((parent-child ,parent ,child) . ,input))) `((parent-child ,parent ,child) . ,input))) '(error "expected child")))) -(defun zencoding-sibling (input) - (zencoding-por zencoding-pexpr zencoding-multiplier +(defun emmet-sibling (input) + (emmet-por emmet-pexpr emmet-multiplier it - (zencoding-run zencoding-tag + (emmet-run emmet-tag it - (zencoding-run zencoding-text + (emmet-run emmet-text it '(error "expected sibling"))))) -(defun zencoding-siblings (input) +(defun emmet-siblings (input) "Parse an e+e expression, where e is an tag or a pexpr." - (zencoding-run zencoding-sibling + (emmet-run emmet-sibling (let ((parent expr)) - (zencoding-parse + (emmet-parse "\\+" 1 "+" - (zencoding-run - zencoding-subexpr + (emmet-run + emmet-subexpr (let ((child expr)) `((sibling ,parent ,child) . ,input)) - (zencoding-expand parent input)))) + (emmet-expand parent input)))) '(error "expected first sibling"))) -(defun zencoding-expand (parent input) +(defun emmet-expand (parent input) "Parse an e+ expression, where e is an expandable tag" (let* ((parent-tag (car (cadr parent)))) (setf (caadr parent) (concat parent-tag "+")) (destructuring-bind (parent . input) - (zencoding-expand-tag-alias parent input) - (zencoding-pif (zencoding-parse "+\\(.*\\)" 1 "+expr" - (zencoding-subexpr (elt it 1))) + (emmet-expand-tag-alias parent input) + (emmet-pif (emmet-parse "+\\(.*\\)" 1 "+expr" + (emmet-subexpr (elt it 1))) `((sibling ,parent ,@it)) `(,parent . ,input))))) -(defun zencoding-name (input) +(defun emmet-name (input) "Parse a class or identifier name, e.g. news, footer, mainimage" - (zencoding-parse "\\([a-zA-Z$@][a-zA-Z0-9$@_:-]*\\)" 2 "class or identifer name" - `((name . ,(zencoding-split-numbering-expressions + (emmet-parse "\\([a-zA-Z$@][a-zA-Z0-9$@_:-]*\\)" 2 "class or identifer name" + `((name . ,(emmet-split-numbering-expressions (elt it 1))) . ,input))) -(defun zencoding-class (input) +(defun emmet-class (input) "Parse a classname expression, e.g. .foo" - (zencoding-parse "\\." 1 "." - (zencoding-run zencoding-name + (emmet-parse "\\." 1 "." + (emmet-run emmet-name `((class ,expr) . ,input) '(error "expected class name")))) -(defun zencoding-identifier (input) +(defun emmet-identifier (input) "Parse an identifier expression, e.g. #foo" - (zencoding-parse "#" 1 "#" - (zencoding-run zencoding-name + (emmet-parse "#" 1 "#" + (emmet-run emmet-name `((identifier . ,expr) . ,input)))) -(defun zencoding-classes (input) +(defun emmet-classes (input) "Parse many classes." - (zencoding-run zencoding-class - (zencoding-pif (zencoding-classes input) + (emmet-run emmet-class + (emmet-pif (emmet-classes input) `((classes . ,(cons expr (cdar it))) . ,(cdr it)) `((classes . ,(list expr)) . ,input)) '(error "expected class"))) @@ -2775,46 +2773,46 @@ tbl)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Zen coding transformer from AST to string -(defvar zencoding-leaf-function nil +(defvar emmet-leaf-function nil "Function to execute when expanding a leaf node in the - Zencoding AST.") + Emmet AST.") -(zencoding-defparameter - zencoding-tag-settings-table - (gethash "tags" (gethash "html" zencoding-preferences))) +(emmet-defparameter + emmet-tag-settings-table + (gethash "tags" (gethash "html" emmet-preferences))) -(zencoding-defparameter - zencoding-tag-snippets-table - (gethash "snippets" (gethash "html" zencoding-snippets))) +(emmet-defparameter + emmet-tag-snippets-table + (gethash "snippets" (gethash "html" emmet-snippets))) -(defvar zencoding-filters - '("html" (zencoding-primary-filter zencoding-make-html-tag) - "c" (zencoding-primary-filter zencoding-make-commented-html-tag) - "haml" (zencoding-primary-filter zencoding-make-haml-tag) - "hic" (zencoding-primary-filter zencoding-make-hiccup-tag) - "e" (zencoding-escape-xml))) +(defvar emmet-filters + '("html" (emmet-primary-filter emmet-make-html-tag) + "c" (emmet-primary-filter emmet-make-commented-html-tag) + "haml" (emmet-primary-filter emmet-make-haml-tag) + "hic" (emmet-primary-filter emmet-make-hiccup-tag) + "e" (emmet-escape-xml))) -(defun zencoding-primary-filter (input proc) +(defun emmet-primary-filter (input proc) "Process filter that needs to be executed first, ie. not given output from other filter." (if (listp input) (let ((tag-maker (cadr proc))) - (zencoding-transform-ast input tag-maker)) + (emmet-transform-ast input tag-maker)) nil)) -(defun zencoding-process-filter (filters input) +(defun emmet-process-filter (filters input) "Process filters, chain one filter output as the input of the next filter." - (let ((filter-data (member (car filters) zencoding-filters)) + (let ((filter-data (member (car filters) emmet-filters)) (more-filters (cdr filters))) (if filter-data (let* ((proc (cadr filter-data)) (fun (car proc)) (filter-output (funcall fun input proc))) (if more-filters - (zencoding-process-filter more-filters filter-output) + (emmet-process-filter more-filters filter-output) filter-output)) nil))) -(defun zencoding-make-tag (tag-maker tag-info &optional content) +(defun emmet-make-tag (tag-maker tag-info &optional content) "Extract tag info and pass them to tag-maker." (let* ((name (pop tag-info)) (has-body? (pop tag-info)) @@ -2822,25 +2820,25 @@ tbl)) (classes (pop tag-info)) (props (pop tag-info)) (txt (pop tag-info)) - (settings (gethash name zencoding-tag-settings-table))) + (settings (gethash name emmet-tag-settings-table))) (funcall tag-maker name has-body? id classes props txt settings (if content content - (if zencoding-leaf-function (funcall zencoding-leaf-function)))))) + (if emmet-leaf-function (funcall emmet-leaf-function)))))) -(defun zencoding-hash-to-list (hash &optional proc) +(defun emmet-hash-to-list (hash &optional proc) (unless proc (setq proc #'cons)) (loop for key being the hash-keys of hash using (hash-values val) collect (funcall proc key val))) -(defun zencoding-merge-tag-props (default-table tag-props) +(defun emmet-merge-tag-props (default-table tag-props) (if default-table (let ((tbl (copy-hash-table default-table))) (loop for prop in tag-props do (puthash (symbol-name (car prop)) (cadr prop) tbl)) - (zencoding-hash-to-list tbl 'list)) + (emmet-hash-to-list tbl 'list)) tag-props)) -(defun zencoding-html-snippets-instantiate-lambda (src) +(defun emmet-html-snippets-instantiate-lambda (src) (let ((lines (mapcar #'(lambda (src) (if (string-match "^\\(.*\\)${child}\\(.*\\)$" src) @@ -2864,36 +2862,36 @@ tbl)) (if b `(lambda (contents) (concat - ,(zencoding-join-string (reverse a) "\n") + ,(emmet-join-string (reverse a) "\n") contents - ,(zencoding-join-string (reverse b) "\n"))) + ,(emmet-join-string (reverse b) "\n"))) `(lambda (contents) (concat - ,(zencoding-join-string (reverse a) "\n") + ,(emmet-join-string (reverse a) "\n") contents)))))) (eval (iter lines 'a nil nil))))) -(defun zencoding-make-html-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) +(defun emmet-make-html-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) "Create HTML markup string" - (zencoding-aif - (gethash tag-name zencoding-tag-snippets-table) + (emmet-aif + (gethash tag-name emmet-tag-snippets-table) (let ((fn (if (stringp it) - (zencoding-html-snippets-instantiate-lambda it) + (emmet-html-snippets-instantiate-lambda it) it))) (prog1 (funcall fn content) - (puthash tag-name fn zencoding-tag-snippets-table))) + (puthash tag-name fn emmet-tag-snippets-table))) - (let* ((id (zencoding-concat-or-empty " id=\"" tag-id "\"")) - (classes (zencoding-mapconcat-or-empty " class=\"" tag-classes " " "\"")) + (let* ((id (emmet-concat-or-empty " id=\"" tag-id "\"")) + (classes (emmet-mapconcat-or-empty " class=\"" tag-classes " " "\"")) (props (let* ((tag-props-default (and settings (gethash "defaultAttr" settings))) (merged-tag-props - (zencoding-merge-tag-props + (emmet-merge-tag-props tag-props-default tag-props))) - (zencoding-mapconcat-or-empty + (emmet-mapconcat-or-empty " " merged-tag-props " " nil (lambda (prop) (let ((key (car prop))) @@ -2910,49 +2908,49 @@ tbl)) (concat ">" (if tag-txt (if (or content-multiline? block-tag?) - (zencoding-indent tag-txt) + (emmet-indent tag-txt) tag-txt)) (if content (if (or content-multiline? block-tag?) - (zencoding-indent content) + (emmet-indent content) content)) lf "")))))) -(defun zencoding-make-commented-html-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) +(defun emmet-make-commented-html-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) "Create HTML markup string with extra comments for elements with #id or .classes" - (let ((body (zencoding-make-html-tag tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content))) + (let ((body (emmet-make-html-tag tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content))) (if (or tag-id tag-classes) - (let ((id (zencoding-concat-or-empty "#" tag-id)) - (classes (zencoding-mapconcat-or-empty "." tag-classes "."))) + (let ((id (emmet-concat-or-empty "#" tag-id)) + (classes (emmet-mapconcat-or-empty "." tag-classes "."))) (concat "\n" body "\n")) body))) -(defun zencoding-make-haml-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) +(defun emmet-make-haml-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) "Create HAML string" (let ((name (if (and (equal tag-name "div") (or tag-id tag-classes)) "" (concat "%" tag-name))) - (id (zencoding-concat-or-empty "#" tag-id)) - (classes (zencoding-mapconcat-or-empty "." tag-classes ".")) - (props (zencoding-mapconcat-or-empty + (id (emmet-concat-or-empty "#" tag-id)) + (classes (emmet-mapconcat-or-empty "." tag-classes ".")) + (props (emmet-mapconcat-or-empty "{" tag-props ", " "}" (lambda (prop) (concat ":" (symbol-name (car prop)) " => \"" (cadr prop) "\""))))) (concat name id classes props (if tag-txt - (zencoding-indent tag-txt)) + (emmet-indent tag-txt)) (if content - (zencoding-indent content))))) + (emmet-indent content))))) -(defun zencoding-make-hiccup-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) +(defun emmet-make-hiccup-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) "Create Hiccup string" - (let* ((id (zencoding-concat-or-empty "#" tag-id)) - (classes (zencoding-mapconcat-or-empty "." tag-classes ".")) - (props (zencoding-mapconcat-or-empty + (let* ((id (emmet-concat-or-empty "#" tag-id)) + (classes (emmet-mapconcat-or-empty "." tag-classes ".")) + (props (emmet-mapconcat-or-empty " {" tag-props ", " "}" (lambda (prop) (concat ":" (symbol-name (car prop)) " \"" (cadr prop) "\"")))) @@ -2962,27 +2960,27 @@ tbl)) (if tag-txt (let ((tag-txt-quoted (concat "\"" tag-txt "\""))) (if (or content-multiline? block-tag?) - (zencoding-indent tag-txt-quoted) + (emmet-indent tag-txt-quoted) (concat " " tag-txt-quoted)))) (if content (if (or content-multiline? block-tag?) - (zencoding-indent content) + (emmet-indent content) (concat " " content))) "]"))) -(defun zencoding-make-text (tag-maker text) +(defun emmet-make-text (tag-maker text) (cond - ((eq tag-maker 'zencoding-make-hiccup-tag) + ((eq tag-maker 'emmet-make-hiccup-tag) (concat "\"" text "\"")) (t text))) -(defun zencoding-concat-or-empty (prefix body &optional suffix) +(defun emmet-concat-or-empty (prefix body &optional suffix) "Return prefixed suffixed text or empty string." (if body (concat prefix body suffix) "")) -(defun zencoding-mapconcat-or-empty (prefix list-body delimiter &optional suffix map-fun) +(defun emmet-mapconcat-or-empty (prefix list-body delimiter &optional suffix map-fun) "Return prefixed suffixed mapconcated text or empty string." (if list-body (let* ((mapper (if map-fun map-fun 'identity)) @@ -2990,7 +2988,7 @@ tbl)) (concat prefix body suffix)) "")) -(defun zencoding-escape-xml (input proc) +(defun emmet-escape-xml (input proc) "Escapes XML-unsafe characters: <, > and &." (replace-regexp-in-string "<" "<" @@ -3000,43 +2998,43 @@ tbl)) "&" "&" (if (stringp input) input - (zencoding-process-filter (zencoding-default-filter) input)))))) + (emmet-process-filter (emmet-default-filter) input)))))) -(defun zencoding-html-transform (input) - (let ((ast (car (zencoding-expr input)))) +(defun emmet-html-transform (input) + (let ((ast (car (emmet-expr input)))) (when (not (eq ast 'error)) - (zencoding-transform-ast-with-filters ast)))) + (emmet-transform-ast-with-filters ast)))) -(defun zencoding-transform-ast-with-filters (ast-with-filters) +(defun emmet-transform-ast-with-filters (ast-with-filters) "Transform AST (containing filter data) into string." (let ((filters (cadr ast-with-filters)) (ast (caddr ast-with-filters))) - (zencoding-process-filter filters ast))) + (emmet-process-filter filters ast))) -(defun zencoding-transform-ast (ast tag-maker) +(defun emmet-transform-ast (ast tag-maker) "Transform AST (without filter data) into string." (let ((type (car ast))) (cond ((eq type 'list) (mapconcat (lexical-let ((make-tag-fun tag-maker)) #'(lambda (sub-ast) - (zencoding-transform-ast sub-ast make-tag-fun))) + (emmet-transform-ast sub-ast make-tag-fun))) (cadr ast) "\n")) ((eq type 'tag) - (zencoding-make-tag tag-maker (cadr ast))) + (emmet-make-tag tag-maker (cadr ast))) ((eq type 'text) - (zencoding-make-text tag-maker (cadr ast))) + (emmet-make-text tag-maker (cadr ast))) ((eq type 'parent-child) (let ((parent (cadadr ast)) - (children (zencoding-transform-ast (caddr ast) tag-maker))) - (zencoding-make-tag tag-maker parent children))) + (children (emmet-transform-ast (caddr ast) tag-maker))) + (emmet-make-tag tag-maker parent children))) ((eq type 'sibling) - (let ((sib1 (zencoding-transform-ast (cadr ast) tag-maker)) - (sib2 (zencoding-transform-ast (caddr ast) tag-maker))) + (let ((sib1 (emmet-transform-ast (cadr ast) tag-maker)) + (sib2 (emmet-transform-ast (caddr ast) tag-maker))) (concat sib1 "\n" sib2)))))) -(defun zencoding-indent (text) +(defun emmet-indent (text) "Indent the text" (if text (replace-regexp-in-string "\n" "\n " (concat "\n" text)) @@ -3046,33 +3044,33 @@ tbl)) ;; ;;; CSS abbrev: -(zencoding-defparameter - zencoding-css-unit-aliases - (gethash "unitAliases" (gethash "css" zencoding-preferences))) -(defun zencoding-css-arg-number (input) - (zencoding-parse +(emmet-defparameter + emmet-css-unit-aliases + (gethash "unitAliases" (gethash "css" emmet-preferences))) +(defun emmet-css-arg-number (input) + (emmet-parse " *\\(\\(?:-\\|\\)[0-9.]+\\)\\(-\\|[A-Za-z]*\\)" 3 "css number arguments" (cons (list (elt it 1) (let ((unit (elt it 2))) (if (= (length unit) 0) (if (find ?. (elt it 1)) "em" "px") - (gethash unit zencoding-css-unit-aliases unit)))) + (gethash unit emmet-css-unit-aliases unit)))) input))) -(zencoding-defparameter - zencoding-css-color-shorten-if-possible - (gethash "shortenIfPossible" (gethash "color" (gethash "css" zencoding-preferences)))) -(zencoding-defparameter - zencoding-css-color-case - (gethash "case" (gethash "color" (gethash "css" zencoding-preferences)))) -(zencoding-defparameter - zencoding-css-color-trailing-aliases - (gethash "trailingAliases" (gethash "color" (gethash "css" zencoding-preferences)))) -(defun zencoding-css-arg-color (input) - (zencoding-parse +(emmet-defparameter + emmet-css-color-shorten-if-possible + (gethash "shortenIfPossible" (gethash "color" (gethash "css" emmet-preferences)))) +(emmet-defparameter + emmet-css-color-case + (gethash "case" (gethash "color" (gethash "css" emmet-preferences)))) +(emmet-defparameter + emmet-css-color-trailing-aliases + (gethash "trailingAliases" (gethash "color" (gethash "css" emmet-preferences)))) +(defun emmet-css-arg-color (input) + (emmet-parse (concat " *#\\([0-9a-fA-F]\\{1,6\\}\\)\\(rgb\\|\\)\\([" - (zencoding-join-string - (zencoding-get-keys-of-hash zencoding-css-color-trailing-aliases) "") + (emmet-join-string + (emmet-get-keys-of-hash emmet-css-color-trailing-aliases) "") "]\\|\\)") 4 "css color argument" (let ((color @@ -3095,58 +3093,58 @@ tbl)) (string-to-int (substring color 4 6) 16)) (concat "#" - (let ((filter (cond ((string= zencoding-css-color-case "auto") #'identity) - ((string= zencoding-css-color-case "up") #'upcase) + (let ((filter (cond ((string= emmet-css-color-case "auto") #'identity) + ((string= emmet-css-color-case "up") #'upcase) (t #'downcase)))) (funcall filter - (if (and zencoding-css-color-shorten-if-possible + (if (and emmet-css-color-shorten-if-possible (eql (aref color 0) (aref color 1)) (eql (aref color 2) (aref color 3)) (eql (aref color 4) (aref color 5))) (concat (mapcar #'(lambda (i) (aref color i)) '(0 2 4))) color)))))) (if (< 0 (length (elt it 3))) - (cons (gethash (elt it 3) zencoding-css-color-trailing-aliases) input) + (cons (gethash (elt it 3) emmet-css-color-trailing-aliases) input) input))))) -(defun zencoding-css-arg-something (input) - (zencoding-parse +(defun emmet-css-arg-something (input) + (emmet-parse " *\\([^ ]+\\)" 2 "css argument" (cons (elt it 1) input))) -(defun zencoding-css-parse-arg (input) - (zencoding-run zencoding-css-arg-number it - (zencoding-run zencoding-css-arg-color it - (zencoding-run zencoding-css-arg-something it +(defun emmet-css-parse-arg (input) + (emmet-run emmet-css-arg-number it + (emmet-run emmet-css-arg-color it + (emmet-run emmet-css-arg-something it (if (equal input "") it (cons input "")))))) -(defun zencoding-css-important-p (input) +(defun emmet-css-important-p (input) (let ((len (length input))) (and (< 0 len) (char-equal (aref input (1- len)) ?!)))) -(defun zencoding-css-parse-args (args) +(defun emmet-css-parse-args (args) (when args (let ((rt nil)) (loop - (zencoding-pif - (zencoding-css-parse-arg args) + (emmet-pif + (emmet-css-parse-arg args) (loop for i on it do (push (car i) rt) while (consp (cdr i)) finally (setq args (cdr i))) (return (nreverse rt))))))) -(defun zencoding-css-split-args (exp) - (zencoding-aif +(defun emmet-css-split-args (exp) + (emmet-aif (string-match "\\(?:[ #0-9$]\\|-[0-9]\\)" exp) (list (substring exp 0 it) (substring exp it)) (list exp nil))) -(defun zencoding-css-split-vendor-prefixes (input) - (zencoding-parse +(defun emmet-css-split-vendor-prefixes (input) + (emmet-parse "\\(-[wmso]+-\\|-\\|\\)\\(.*\\)" 3 "css vendor prefixes" (list (elt it 2) (let ((vp (elt it 1))) @@ -3154,17 +3152,17 @@ tbl)) (if (string= vp "-") 'auto (string-to-list (subseq vp 1 -1)))))))) -(defun zencoding-css-subexpr (exp) - (let* ((importantp (zencoding-css-important-p exp))) +(defun emmet-css-subexpr (exp) + (let* ((importantp (emmet-css-important-p exp))) (destructuring-bind (exp vp) - (zencoding-css-split-vendor-prefixes exp) + (emmet-css-split-vendor-prefixes exp) (destructuring-bind (key args) - (zencoding-css-split-args (if importantp (subseq exp 0 -1) exp)) + (emmet-css-split-args (if importantp (subseq exp 0 -1) exp)) `(,key ,vp ,importantp - ,@(zencoding-css-parse-args args)))))) + ,@(emmet-css-parse-args args)))))) -(defun zencoding-css-toknize (str) +(defun emmet-css-toknize (str) (let* ((i (split-string str "+")) (rt nil)) (loop @@ -3181,36 +3179,36 @@ tbl)) (setf i (cdr i)))) (return (nreverse rt))))))) -(defun zencoding-css-expr (input) - (mapcar #'zencoding-css-subexpr - (zencoding-css-toknize input))) +(defun emmet-css-expr (input) + (mapcar #'emmet-css-subexpr + (emmet-css-toknize input))) -(zencoding-defparameter - zencoding-css-snippets - (gethash "snippets" (gethash "css" zencoding-snippets))) +(emmet-defparameter + emmet-css-snippets + (gethash "snippets" (gethash "css" emmet-snippets))) -(zencoding-defparameter - zencoding-css-unitless-properties - (gethash "unitlessProperties" (gethash "css" zencoding-preferences))) +(emmet-defparameter + emmet-css-unitless-properties + (gethash "unitlessProperties" (gethash "css" emmet-preferences))) -(zencoding-defparameter - zencoding-css-unitless-properties-regex - (concat "^\\(:?" (zencoding-join-string - zencoding-css-unitless-properties "\\|") +(emmet-defparameter + emmet-css-unitless-properties-regex + (concat "^\\(:?" (emmet-join-string + emmet-css-unitless-properties "\\|") "\\):.*$")) -(defun zencoding-css-instantiate-lambda (str) +(defun emmet-css-instantiate-lambda (str) (flet ((insert-space-between-name-and-body (str) (if (string-match "^\\([a-z-]+:\\)\\(.+\\)$" str) - (zencoding-join-string + (emmet-join-string (mapcar (lambda (ref) (match-string ref str)) '(1 2)) " ") str)) (split-string-to-body (str args-sym) (let ((rt '(concat)) (idx-max 0)) (loop for i from 0 to 255 do - (zencoding-aif + (emmet-aif (string-match "\\(?:|\\|${\\(?:\\([0-9]\\)\\|\\)\\(?::\\(.+?\\)\\|\\)}\\)" str) (destructuring-bind (mat idx def) (mapcar (lambda (ref) (match-string ref str)) '(0 1 2)) @@ -3233,52 +3231,52 @@ tbl)) (progn (when (nthcdr ,idx-max ,args) (setf (nthcdr ,idx-max ,args) - (list (zencoding-join-string + (list (emmet-join-string (nthcdr ,idx-max ,args) " ")))) ,body))))))) -(zencoding-defparameter - zencoding-vendor-prefixes-properties - (gethash "vendorPrefixesProperties" (gethash "css" zencoding-preferences))) -(zencoding-defparameter - zencoding-vendor-prefixes-default +(emmet-defparameter + emmet-vendor-prefixes-properties + (gethash "vendorPrefixesProperties" (gethash "css" emmet-preferences))) +(emmet-defparameter + emmet-vendor-prefixes-default (list "webkit" "moz" "ms" "o")) -(defun zencoding-css-transform-vendor-prefixes (line vp) +(defun emmet-css-transform-vendor-prefixes (line vp) (let ((key (subseq line 0 (or (position ?: line) (length line))))) (let ((vps (if (eql vp 'auto) (gethash key - zencoding-vendor-prefixes-properties - zencoding-vendor-prefixes-default) + emmet-vendor-prefixes-properties + emmet-vendor-prefixes-default) (mapcar (lambda (v) (cond ((= v ?w) "webkit") ((= v ?m) "moz") ((= v ?s) "ms") ((= v ?o) "o"))) vp)))) - (zencoding-join-string + (emmet-join-string (append (mapcar (lambda (v) (concat "-" v "-" line)) vps) (list line)) "\n")))) -(defun zencoding-css-transform-exprs (exprs) - (zencoding-join-string +(defun emmet-css-transform-exprs (exprs) + (emmet-join-string (mapcar #'(lambda (expr) (let ((basement - (zencoding-aif - (gethash (car expr) zencoding-css-snippets) + (emmet-aif + (gethash (car expr) emmet-css-snippets) (let ((set it) (fn nil) (unitlessp nil)) (if (stringp set) (progn ;; new pattern ;; creating print function - (setf fn (zencoding-css-instantiate-lambda set)) + (setf fn (emmet-css-instantiate-lambda set)) ;; get unitless or no (setf unitlessp (not (null (string-match - zencoding-css-unitless-properties-regex set)))) + emmet-css-unitless-properties-regex set)))) ;; caching - (puthash (car expr) (cons fn unitlessp) zencoding-css-snippets)) + (puthash (car expr) (cons fn unitlessp) emmet-css-snippets)) (progn ;; cache hit. (setf fn (car set)) @@ -3292,7 +3290,7 @@ tbl)) arg)) (cdddr expr)))) (concat (car expr) ": " - (zencoding-join-string + (emmet-join-string (mapcar #'(lambda (arg) (if (listp arg) (apply #'concat arg) arg)) (cdddr expr)) " ") @@ -3301,60 +3299,61 @@ tbl)) (if (caddr expr) (concat (subseq basement 0 -1) " !important;") basement))) - (zencoding-aif + (emmet-aif (cadr expr) - (zencoding-css-transform-vendor-prefixes line it) + (emmet-css-transform-vendor-prefixes line it) line)))) exprs) "\n")) -(defun zencoding-css-transform (input) - (zencoding-css-transform-exprs (zencoding-css-expr input)));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Zencoding minor mode +(defun emmet-css-transform (input) + (emmet-css-transform-exprs (emmet-css-expr input))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Emmet minor mode -(defgroup zencoding nil - "Customization group for zencoding-mode." +(defgroup emmet nil + "Customization group for emmet-mode." :group 'convenience) -(defun zencoding-expr-on-line () - "Extract a zencoding expression and the corresponding bounds +(defun emmet-expr-on-line () + "Extract a emmet expression and the corresponding bounds for the current line." (let* ((start (line-beginning-position)) (end (line-end-position)) (line (buffer-substring-no-properties start end)) - (expr (zencoding-regex "\\([ \t]*\\)\\([^\n]+\\)" line 2))) + (expr (emmet-regex "\\([ \t]*\\)\\([^\n]+\\)" line 2))) (if (first expr) (list (first expr) start end)))) -(defcustom zencoding-indentation 4 +(defcustom emmet-indentation 4 "Number of spaces used for indentation." :type '(number :tag "Spaces") - :group 'zencoding) + :group 'emmet) -(defun zencoding-prettify (markup indent) +(defun emmet-prettify (markup indent) (let ((first-col (format (format "%%%ds" indent) "")) - (tab (format (format "%%%ds" zencoding-indentation) ""))) + (tab (format (format "%%%ds" emmet-indentation) ""))) (concat first-col (replace-regexp-in-string "\n" (concat "\n" first-col) (replace-regexp-in-string " " tab markup))))) -(defun zencoding-transform (input) +(defun emmet-transform (input) (if (eql major-mode 'css-mode) - (zencoding-css-transform input) - (zencoding-html-transform input))) + (emmet-css-transform input) + (emmet-html-transform input))) ;;;###autoload -(defun zencoding-expand-line (arg) - "Replace the current line's zencode expression with the corresponding expansion. -If prefix ARG is given or region is visible call `zencoding-preview' to start an +(defun emmet-expand-line (arg) + "Replace the current line's emmet expression with the corresponding expansion. +If prefix ARG is given or region is visible call `emmet-preview' to start an interactive preview. Otherwise expand line directly. -For more information see `zencoding-mode'." +For more information see `emmet-mode'." (interactive "P") (let* ((here (point)) - (preview (if zencoding-preview-default (not arg) arg)) + (preview (if emmet-preview-default (not arg) arg)) (beg (if preview (progn (beginning-of-line) @@ -3370,30 +3369,30 @@ For more information see `zencoding-mode'." (if beg (progn (goto-char here) - (zencoding-preview beg end)) - (let ((expr (zencoding-expr-on-line))) + (emmet-preview beg end)) + (let ((expr (emmet-expr-on-line))) (if expr - (let ((markup (zencoding-transform (first expr)))) + (let ((markup (emmet-transform (first expr)))) (when markup - (let ((pretty (zencoding-prettify markup (current-indentation)))) + (let ((pretty (emmet-prettify markup (current-indentation)))) (save-excursion (delete-region (second expr) (third expr)) - (zencoding-insert-and-flash pretty)))))))))) + (emmet-insert-and-flash pretty)))))))))) -(defvar zencoding-mode-keymap nil - "Keymap for zencode minor mode.") +(defvar emmet-mode-keymap nil + "Keymap for emmet minor mode.") -(if zencoding-mode-keymap +(if emmet-mode-keymap nil (progn - (setq zencoding-mode-keymap (make-sparse-keymap)) - (define-key zencoding-mode-keymap (kbd "C-j") 'zencoding-expand-line) - (define-key zencoding-mode-keymap (kbd "") 'zencoding-expand-line))) + (setq emmet-mode-keymap (make-sparse-keymap)) + (define-key emmet-mode-keymap (kbd "C-j") 'emmet-expand-line) + (define-key emmet-mode-keymap (kbd "") 'emmet-expand-line))) ;;;###autoload -(define-minor-mode zencoding-mode +(define-minor-mode emmet-mode "Minor mode for writing HTML and CSS markup. -With zen coding for HTML and CSS you can write a line like +With emmet for HTML and CSS you can write a line like ul#name>li.item*2 @@ -3406,30 +3405,30 @@ and have it expanded to This minor mode defines keys for quick access: -\\{zencoding-mode-keymap} +\\{emmet-mode-keymap} -Home page URL `http://www.emacswiki.org/emacs/ZenCoding'. +Home page URL `http://www.emacswiki.org/emacs/Emmet'. -See also `zencoding-expand-line'." - :lighter " Zen" - :keymap zencoding-mode-keymap) +See also `emmet-expand-line'." + :lighter " Emmet" + :keymap emmet-mode-keymap) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Zencoding yasnippet integration +;; Emmet yasnippet integration -(defun zencoding-transform-yas (input) +(defun emmet-transform-yas (input) (let* ((leaf-count 0) - (zencoding-leaf-function + (emmet-leaf-function (lambda () (format "$%d" (incf leaf-count))))) - (zencoding-transform input))) + (emmet-transform input))) ;;;###autoload -(defun zencoding-expand-yas () +(defun emmet-expand-yas () (interactive) - (let ((expr (zencoding-expr-on-line))) + (let ((expr (emmet-expr-on-line))) (if expr - (let* ((markup (zencoding-transform-yas (first expr))) + (let* ((markup (emmet-transform-yas (first expr))) (filled (replace-regexp-in-string "><" ">\n<" markup))) (delete-region (second expr) (third expr)) (insert filled) @@ -3447,87 +3446,87 @@ See also `zencoding-expand-line'." ;;;;;;;;;; ;; Lennart's version -(defvar zencoding-preview-input nil) -(make-local-variable 'zencoding-preview-input) -(defvar zencoding-preview-output nil) -(make-local-variable 'zencoding-preview-output) -(defvar zencoding-old-show-paren nil) -(make-local-variable 'zencoding-old-show-paren) +(defvar emmet-preview-input nil) +(make-local-variable 'emmet-preview-input) +(defvar emmet-preview-output nil) +(make-local-variable 'emmet-preview-output) +(defvar emmet-old-show-paren nil) +(make-local-variable 'emmet-old-show-paren) -(defface zencoding-preview-input +(defface emmet-preview-input '((default :box t :inherit secondary-selection)) "Face for preview input field." - :group 'zencoding) + :group 'emmet) -(defface zencoding-preview-output +(defface emmet-preview-output '((default :inherit highlight)) "Face for preview output field." - :group 'zencoding) + :group 'emmet) -(defvar zencoding-preview-keymap +(defvar emmet-preview-keymap (let ((map (make-sparse-keymap))) - (define-key map (kbd "RET") 'zencoding-preview-accept) - (define-key map (kbd "") 'zencoding-preview-accept) - (define-key map [(control ?g)] 'zencoding-preview-abort) + (define-key map (kbd "RET") 'emmet-preview-accept) + (define-key map (kbd "") 'emmet-preview-accept) + (define-key map [(control ?g)] 'emmet-preview-abort) map)) -(defun zencoding-preview-accept () +(defun emmet-preview-accept () (interactive) - (let ((ovli zencoding-preview-input)) + (let ((ovli emmet-preview-input)) (if (not (and (overlayp ovli) (bufferp (overlay-buffer ovli)))) (message "Preview is not active") (let* ((indent (current-indentation)) - (markup (zencoding-preview-transformed indent))) + (markup (emmet-preview-transformed indent))) (when markup (delete-region (line-beginning-position) (overlay-end ovli)) - (zencoding-insert-and-flash markup))))) - (zencoding-preview-abort)) + (emmet-insert-and-flash markup))))) + (emmet-preview-abort)) -(defvar zencoding-flash-ovl nil) -(make-variable-buffer-local 'zencoding-flash-ovl) +(defvar emmet-flash-ovl nil) +(make-variable-buffer-local 'emmet-flash-ovl) -(defun zencoding-remove-flash-ovl (buf) +(defun emmet-remove-flash-ovl (buf) (with-current-buffer buf - (when (overlayp zencoding-flash-ovl) - (delete-overlay zencoding-flash-ovl)) - (setq zencoding-flash-ovl nil))) + (when (overlayp emmet-flash-ovl) + (delete-overlay emmet-flash-ovl)) + (setq emmet-flash-ovl nil))) -(defcustom zencoding-preview-default t +(defcustom emmet-preview-default t "If non-nil then preview is the default action. -This determines how `zencoding-expand-line' works by default." +This determines how `emmet-expand-line' works by default." :type 'boolean - :group 'zencoding) + :group 'emmet) -(defcustom zencoding-insert-flash-time 0.5 +(defcustom emmet-insert-flash-time 0.5 "Time to flash insertion. Set this to a negative number if you do not want flashing the expansion after insertion." :type '(number :tag "Seconds") - :group 'zencoding) + :group 'emmet) -(defun zencoding-insert-and-flash (markup) - (zencoding-remove-flash-ovl (current-buffer)) +(defun emmet-insert-and-flash (markup) + (emmet-remove-flash-ovl (current-buffer)) (let ((here (point))) (insert markup) - (setq zencoding-flash-ovl (make-overlay here (point))) - (overlay-put zencoding-flash-ovl 'face 'zencoding-preview-output) - (when (< 0 zencoding-insert-flash-time) - (run-with-idle-timer zencoding-insert-flash-time - nil 'zencoding-remove-flash-ovl (current-buffer))))) + (setq emmet-flash-ovl (make-overlay here (point))) + (overlay-put emmet-flash-ovl 'face 'emmet-preview-output) + (when (< 0 emmet-insert-flash-time) + (run-with-idle-timer emmet-insert-flash-time + nil 'emmet-remove-flash-ovl (current-buffer))))) ;;;###autoload -(defun zencoding-preview (beg end) - "Expand zencode between BEG and END interactively. -This will show a preview of the expanded zen code and you can +(defun emmet-preview (beg end) + "Expand emmet between BEG and END interactively. +This will show a preview of the expanded emmet code and you can accept it or skip it." (interactive (if mark-active (list (region-beginning) (region-end)) (list nil nil))) - (zencoding-preview-abort) + (emmet-preview-abort) (if (not beg) (message "Region not active") - (setq zencoding-old-show-paren show-paren-mode) + (setq emmet-old-show-paren show-paren-mode) (show-paren-mode -1) (let ((here (point))) (goto-char beg) @@ -3537,71 +3536,71 @@ accept it or skip it." (let* ((opos (point)) (ovli (make-overlay beg end nil nil t)) (ovlo (make-overlay opos opos)) - (info (propertize " Zen preview. Choose with RET. Cancel by stepping out. \n" + (info (propertize " Emmet preview. Choose with RET. Cancel by stepping out. \n" 'face 'tooltip))) - (overlay-put ovli 'face 'zencoding-preview-input) - (overlay-put ovli 'keymap zencoding-preview-keymap) - (overlay-put ovlo 'face 'zencoding-preview-output) + (overlay-put ovli 'face 'emmet-preview-input) + (overlay-put ovli 'keymap emmet-preview-keymap) + (overlay-put ovlo 'face 'emmet-preview-output) (overlay-put ovlo 'before-string info) - (setq zencoding-preview-input ovli) - (setq zencoding-preview-output ovlo) - (add-hook 'before-change-functions 'zencoding-preview-before-change t t) + (setq emmet-preview-input ovli) + (setq emmet-preview-output ovlo) + (add-hook 'before-change-functions 'emmet-preview-before-change t t) (goto-char here) - (add-hook 'post-command-hook 'zencoding-preview-post-command t t))))) + (add-hook 'post-command-hook 'emmet-preview-post-command t t))))) -(defvar zencoding-preview-pending-abort nil) -(make-variable-buffer-local 'zencoding-preview-pending-abort) +(defvar emmet-preview-pending-abort nil) +(make-variable-buffer-local 'emmet-preview-pending-abort) -(defun zencoding-preview-before-change (beg end) +(defun emmet-preview-before-change (beg end) (when - (or (> beg (overlay-end zencoding-preview-input)) - (< beg (overlay-start zencoding-preview-input)) - (> end (overlay-end zencoding-preview-input)) - (< end (overlay-start zencoding-preview-input))) - (setq zencoding-preview-pending-abort t))) - -(defun zencoding-preview-abort () - "Abort zen code preview." + (or (> beg (overlay-end emmet-preview-input)) + (< beg (overlay-start emmet-preview-input)) + (> end (overlay-end emmet-preview-input)) + (< end (overlay-start emmet-preview-input))) + (setq emmet-preview-pending-abort t))) + +(defun emmet-preview-abort () + "Abort emmet code preview." (interactive) - (setq zencoding-preview-pending-abort nil) - (remove-hook 'before-change-functions 'zencoding-preview-before-change t) - (when (overlayp zencoding-preview-input) - (delete-overlay zencoding-preview-input)) - (setq zencoding-preview-input nil) - (when (overlayp zencoding-preview-output) - (delete-overlay zencoding-preview-output)) - (setq zencoding-preview-output nil) - (remove-hook 'post-command-hook 'zencoding-preview-post-command t) - (when zencoding-old-show-paren (show-paren-mode 1))) - -(defun zencoding-preview-post-command () + (setq emmet-preview-pending-abort nil) + (remove-hook 'before-change-functions 'emmet-preview-before-change t) + (when (overlayp emmet-preview-input) + (delete-overlay emmet-preview-input)) + (setq emmet-preview-input nil) + (when (overlayp emmet-preview-output) + (delete-overlay emmet-preview-output)) + (setq emmet-preview-output nil) + (remove-hook 'post-command-hook 'emmet-preview-post-command t) + (when emmet-old-show-paren (show-paren-mode 1))) + +(defun emmet-preview-post-command () (condition-case err - (zencoding-preview-post-command-1) - (error (message "zencoding-preview-post: %s" err)))) + (emmet-preview-post-command-1) + (error (message "emmet-preview-post: %s" err)))) -(defun zencoding-preview-post-command-1 () - (if (and (not zencoding-preview-pending-abort) - (<= (point) (overlay-end zencoding-preview-input)) - (>= (point) (overlay-start zencoding-preview-input))) - (zencoding-update-preview (current-indentation)) - (zencoding-preview-abort))) +(defun emmet-preview-post-command-1 () + (if (and (not emmet-preview-pending-abort) + (<= (point) (overlay-end emmet-preview-input)) + (>= (point) (overlay-start emmet-preview-input))) + (emmet-update-preview (current-indentation)) + (emmet-preview-abort))) -(defun zencoding-preview-transformed (indent) +(defun emmet-preview-transformed (indent) (let* ((string (buffer-substring-no-properties - (overlay-start zencoding-preview-input) - (overlay-end zencoding-preview-input)))) - (let ((output (zencoding-transform string))) + (overlay-start emmet-preview-input) + (overlay-end emmet-preview-input)))) + (let ((output (emmet-transform string))) (when output - (zencoding-prettify output indent))))) + (emmet-prettify output indent))))) -(defun zencoding-update-preview (indent) - (let* ((pretty (zencoding-preview-transformed indent)) +(defun emmet-update-preview (indent) + (let* ((pretty (emmet-preview-transformed indent)) (show (when pretty (propertize pretty 'face 'highlight)))) (when show - (overlay-put zencoding-preview-output 'after-string + (overlay-put emmet-preview-output 'after-string (concat show "\n"))))) -(provide 'zencoding-mode) +(provide 'emmet-mode) -;;; zencoding-mode.el ends here +;;; emmet-mode.el ends here diff --git a/src/comments.el b/src/comments.el index de22368..885357c 100644 --- a/src/comments.el +++ b/src/comments.el @@ -1,11 +1,12 @@ -;;; zencoding-mode.el --- Unfold CSS-selector-like expressions to markup +;;; emmet-mode.el --- Unofficial Emmet's support for emacs. +;; Copyright (C) 2013, Shin Aoyama ;; Copyright (C) 2009, Chris Done -;; Version: 0.5.1 -;; Author: Chris Done -;; URL: https://github.com/rooney/zencoding -;; Last-Updated: 2011-12-31 Sat +;; Version: 0.1.0 +;; Author: Shin Aoyama +;; URL: https://github.com/smihica/emmet +;; Last-Updated: 2013-06-23 Sun ;; Keywords: convenience ;; This file is free software; you can redistribute it and/or modify @@ -30,25 +31,25 @@ ;; Unfold CSS-selector-like expressions to markup. Intended to be used ;; with sgml-like languages; xml, html, xhtml, xsl, etc. ;; -;; See `zencoding-mode' for more information. +;; See `emmet-mode' for more information. ;; -;; Copy zencoding-mode.el to your load-path and add to your .emacs: +;; Copy emmet-mode.el to your load-path and add to your .emacs: ;; -;; (require 'zencoding-mode) +;; (require 'emmet-mode) ;; ;; Example setup: ;; -;; (add-to-list 'load-path "~/Emacs/zencoding/") -;; (require 'zencoding-mode) -;; (add-hook 'sgml-mode-hook 'zencoding-mode) ;; Auto-start on any markup modes -;; (add-hook 'html-mode-hook 'zencoding-mode) -;; (add-hook 'css-mode-hook 'zencoding-mode) +;; (add-to-list 'load-path "~/Emacs/emmet/") +;; (require 'emmet-mode) +;; (add-hook 'sgml-mode-hook 'emmet-mode) ;; Auto-start on any markup modes +;; (add-hook 'html-mode-hook 'emmet-mode) +;; (add-hook 'css-mode-hook 'emmet-mode) ;; -;; Enable the minor mode with M-x zencoding-mode. +;; Enable the minor mode with M-x emmet-mode. ;; ;; See ``Test cases'' section for a complete set of expression types. ;; -;; If you are hacking on this project, eval (zencoding-test-cases) to +;; If you are hacking on this project, eval (emmet-test-cases) to ;; ensure that your changes have not broken anything. Feel free to add ;; new test cases if you add new features. ;; @@ -56,7 +57,7 @@ ;; ;;; History: ;; -;; Modified by Lennart Borgman. -;; -;; +;; This is a fork of zencoding-mode to support Emmet's feature. +;; zencoding-mode (https://github.com/rooney/zencoding) + diff --git a/src/css-abbrev.el b/src/css-abbrev.el index 4c357d6..7f2e909 100644 --- a/src/css-abbrev.el +++ b/src/css-abbrev.el @@ -2,33 +2,33 @@ ;; ;;; CSS abbrev: -(zencoding-defparameter - zencoding-css-unit-aliases - (gethash "unitAliases" (gethash "css" zencoding-preferences))) -(defun zencoding-css-arg-number (input) - (zencoding-parse +(emmet-defparameter + emmet-css-unit-aliases + (gethash "unitAliases" (gethash "css" emmet-preferences))) +(defun emmet-css-arg-number (input) + (emmet-parse " *\\(\\(?:-\\|\\)[0-9.]+\\)\\(-\\|[A-Za-z]*\\)" 3 "css number arguments" (cons (list (elt it 1) (let ((unit (elt it 2))) (if (= (length unit) 0) (if (find ?. (elt it 1)) "em" "px") - (gethash unit zencoding-css-unit-aliases unit)))) + (gethash unit emmet-css-unit-aliases unit)))) input))) -(zencoding-defparameter - zencoding-css-color-shorten-if-possible - (gethash "shortenIfPossible" (gethash "color" (gethash "css" zencoding-preferences)))) -(zencoding-defparameter - zencoding-css-color-case - (gethash "case" (gethash "color" (gethash "css" zencoding-preferences)))) -(zencoding-defparameter - zencoding-css-color-trailing-aliases - (gethash "trailingAliases" (gethash "color" (gethash "css" zencoding-preferences)))) -(defun zencoding-css-arg-color (input) - (zencoding-parse +(emmet-defparameter + emmet-css-color-shorten-if-possible + (gethash "shortenIfPossible" (gethash "color" (gethash "css" emmet-preferences)))) +(emmet-defparameter + emmet-css-color-case + (gethash "case" (gethash "color" (gethash "css" emmet-preferences)))) +(emmet-defparameter + emmet-css-color-trailing-aliases + (gethash "trailingAliases" (gethash "color" (gethash "css" emmet-preferences)))) +(defun emmet-css-arg-color (input) + (emmet-parse (concat " *#\\([0-9a-fA-F]\\{1,6\\}\\)\\(rgb\\|\\)\\([" - (zencoding-join-string - (zencoding-get-keys-of-hash zencoding-css-color-trailing-aliases) "") + (emmet-join-string + (emmet-get-keys-of-hash emmet-css-color-trailing-aliases) "") "]\\|\\)") 4 "css color argument" (let ((color @@ -51,58 +51,58 @@ (string-to-int (substring color 4 6) 16)) (concat "#" - (let ((filter (cond ((string= zencoding-css-color-case "auto") #'identity) - ((string= zencoding-css-color-case "up") #'upcase) + (let ((filter (cond ((string= emmet-css-color-case "auto") #'identity) + ((string= emmet-css-color-case "up") #'upcase) (t #'downcase)))) (funcall filter - (if (and zencoding-css-color-shorten-if-possible + (if (and emmet-css-color-shorten-if-possible (eql (aref color 0) (aref color 1)) (eql (aref color 2) (aref color 3)) (eql (aref color 4) (aref color 5))) (concat (mapcar #'(lambda (i) (aref color i)) '(0 2 4))) color)))))) (if (< 0 (length (elt it 3))) - (cons (gethash (elt it 3) zencoding-css-color-trailing-aliases) input) + (cons (gethash (elt it 3) emmet-css-color-trailing-aliases) input) input))))) -(defun zencoding-css-arg-something (input) - (zencoding-parse +(defun emmet-css-arg-something (input) + (emmet-parse " *\\([^ ]+\\)" 2 "css argument" (cons (elt it 1) input))) -(defun zencoding-css-parse-arg (input) - (zencoding-run zencoding-css-arg-number it - (zencoding-run zencoding-css-arg-color it - (zencoding-run zencoding-css-arg-something it +(defun emmet-css-parse-arg (input) + (emmet-run emmet-css-arg-number it + (emmet-run emmet-css-arg-color it + (emmet-run emmet-css-arg-something it (if (equal input "") it (cons input "")))))) -(defun zencoding-css-important-p (input) +(defun emmet-css-important-p (input) (let ((len (length input))) (and (< 0 len) (char-equal (aref input (1- len)) ?!)))) -(defun zencoding-css-parse-args (args) +(defun emmet-css-parse-args (args) (when args (let ((rt nil)) (loop - (zencoding-pif - (zencoding-css-parse-arg args) + (emmet-pif + (emmet-css-parse-arg args) (loop for i on it do (push (car i) rt) while (consp (cdr i)) finally (setq args (cdr i))) (return (nreverse rt))))))) -(defun zencoding-css-split-args (exp) - (zencoding-aif +(defun emmet-css-split-args (exp) + (emmet-aif (string-match "\\(?:[ #0-9$]\\|-[0-9]\\)" exp) (list (substring exp 0 it) (substring exp it)) (list exp nil))) -(defun zencoding-css-split-vendor-prefixes (input) - (zencoding-parse +(defun emmet-css-split-vendor-prefixes (input) + (emmet-parse "\\(-[wmso]+-\\|-\\|\\)\\(.*\\)" 3 "css vendor prefixes" (list (elt it 2) (let ((vp (elt it 1))) @@ -110,17 +110,17 @@ (if (string= vp "-") 'auto (string-to-list (subseq vp 1 -1)))))))) -(defun zencoding-css-subexpr (exp) - (let* ((importantp (zencoding-css-important-p exp))) +(defun emmet-css-subexpr (exp) + (let* ((importantp (emmet-css-important-p exp))) (destructuring-bind (exp vp) - (zencoding-css-split-vendor-prefixes exp) + (emmet-css-split-vendor-prefixes exp) (destructuring-bind (key args) - (zencoding-css-split-args (if importantp (subseq exp 0 -1) exp)) + (emmet-css-split-args (if importantp (subseq exp 0 -1) exp)) `(,key ,vp ,importantp - ,@(zencoding-css-parse-args args)))))) + ,@(emmet-css-parse-args args)))))) -(defun zencoding-css-toknize (str) +(defun emmet-css-toknize (str) (let* ((i (split-string str "+")) (rt nil)) (loop @@ -137,36 +137,36 @@ (setf i (cdr i)))) (return (nreverse rt))))))) -(defun zencoding-css-expr (input) - (mapcar #'zencoding-css-subexpr - (zencoding-css-toknize input))) +(defun emmet-css-expr (input) + (mapcar #'emmet-css-subexpr + (emmet-css-toknize input))) -(zencoding-defparameter - zencoding-css-snippets - (gethash "snippets" (gethash "css" zencoding-snippets))) +(emmet-defparameter + emmet-css-snippets + (gethash "snippets" (gethash "css" emmet-snippets))) -(zencoding-defparameter - zencoding-css-unitless-properties - (gethash "unitlessProperties" (gethash "css" zencoding-preferences))) +(emmet-defparameter + emmet-css-unitless-properties + (gethash "unitlessProperties" (gethash "css" emmet-preferences))) -(zencoding-defparameter - zencoding-css-unitless-properties-regex - (concat "^\\(:?" (zencoding-join-string - zencoding-css-unitless-properties "\\|") +(emmet-defparameter + emmet-css-unitless-properties-regex + (concat "^\\(:?" (emmet-join-string + emmet-css-unitless-properties "\\|") "\\):.*$")) -(defun zencoding-css-instantiate-lambda (str) +(defun emmet-css-instantiate-lambda (str) (flet ((insert-space-between-name-and-body (str) (if (string-match "^\\([a-z-]+:\\)\\(.+\\)$" str) - (zencoding-join-string + (emmet-join-string (mapcar (lambda (ref) (match-string ref str)) '(1 2)) " ") str)) (split-string-to-body (str args-sym) (let ((rt '(concat)) (idx-max 0)) (loop for i from 0 to 255 do - (zencoding-aif + (emmet-aif (string-match "\\(?:|\\|${\\(?:\\([0-9]\\)\\|\\)\\(?::\\(.+?\\)\\|\\)}\\)" str) (destructuring-bind (mat idx def) (mapcar (lambda (ref) (match-string ref str)) '(0 1 2)) @@ -189,52 +189,52 @@ (progn (when (nthcdr ,idx-max ,args) (setf (nthcdr ,idx-max ,args) - (list (zencoding-join-string + (list (emmet-join-string (nthcdr ,idx-max ,args) " ")))) ,body))))))) -(zencoding-defparameter - zencoding-vendor-prefixes-properties - (gethash "vendorPrefixesProperties" (gethash "css" zencoding-preferences))) -(zencoding-defparameter - zencoding-vendor-prefixes-default +(emmet-defparameter + emmet-vendor-prefixes-properties + (gethash "vendorPrefixesProperties" (gethash "css" emmet-preferences))) +(emmet-defparameter + emmet-vendor-prefixes-default (list "webkit" "moz" "ms" "o")) -(defun zencoding-css-transform-vendor-prefixes (line vp) +(defun emmet-css-transform-vendor-prefixes (line vp) (let ((key (subseq line 0 (or (position ?: line) (length line))))) (let ((vps (if (eql vp 'auto) (gethash key - zencoding-vendor-prefixes-properties - zencoding-vendor-prefixes-default) + emmet-vendor-prefixes-properties + emmet-vendor-prefixes-default) (mapcar (lambda (v) (cond ((= v ?w) "webkit") ((= v ?m) "moz") ((= v ?s) "ms") ((= v ?o) "o"))) vp)))) - (zencoding-join-string + (emmet-join-string (append (mapcar (lambda (v) (concat "-" v "-" line)) vps) (list line)) "\n")))) -(defun zencoding-css-transform-exprs (exprs) - (zencoding-join-string +(defun emmet-css-transform-exprs (exprs) + (emmet-join-string (mapcar #'(lambda (expr) (let ((basement - (zencoding-aif - (gethash (car expr) zencoding-css-snippets) + (emmet-aif + (gethash (car expr) emmet-css-snippets) (let ((set it) (fn nil) (unitlessp nil)) (if (stringp set) (progn ;; new pattern ;; creating print function - (setf fn (zencoding-css-instantiate-lambda set)) + (setf fn (emmet-css-instantiate-lambda set)) ;; get unitless or no (setf unitlessp (not (null (string-match - zencoding-css-unitless-properties-regex set)))) + emmet-css-unitless-properties-regex set)))) ;; caching - (puthash (car expr) (cons fn unitlessp) zencoding-css-snippets)) + (puthash (car expr) (cons fn unitlessp) emmet-css-snippets)) (progn ;; cache hit. (setf fn (car set)) @@ -248,7 +248,7 @@ arg)) (cdddr expr)))) (concat (car expr) ": " - (zencoding-join-string + (emmet-join-string (mapcar #'(lambda (arg) (if (listp arg) (apply #'concat arg) arg)) (cdddr expr)) " ") @@ -257,12 +257,12 @@ (if (caddr expr) (concat (subseq basement 0 -1) " !important;") basement))) - (zencoding-aif + (emmet-aif (cadr expr) - (zencoding-css-transform-vendor-prefixes line it) + (emmet-css-transform-vendor-prefixes line it) line)))) exprs) "\n")) -(defun zencoding-css-transform (input) - (zencoding-css-transform-exprs (zencoding-css-expr input))) \ No newline at end of file +(defun emmet-css-transform (input) + (emmet-css-transform-exprs (emmet-css-expr input))) diff --git a/src/html-abbrev.el b/src/html-abbrev.el index ed004a2..ea70100 100644 --- a/src/html-abbrev.el +++ b/src/html-abbrev.el @@ -1,57 +1,57 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; XML abbrev -(zencoding-defparameter - zencoding-tag-aliases-table - (gethash "aliases" (gethash "html" zencoding-snippets))) +(emmet-defparameter + emmet-tag-aliases-table + (gethash "aliases" (gethash "html" emmet-snippets))) -(defun zencoding-expr (input) +(defun emmet-expr (input) "Parse a zen coding expression with optional filters." - (zencoding-pif (zencoding-parse "\\(.*?\\)|" 2 "expr|filter" it) + (emmet-pif (emmet-parse "\\(.*?\\)|" 2 "expr|filter" it) (let ((input (elt it 1)) (filters (elt it 2))) - (zencoding-pif (zencoding-extract-filters filters) - (zencoding-filter input it) + (emmet-pif (emmet-extract-filters filters) + (emmet-filter input it) it)) - (zencoding-filter input (zencoding-default-filter)))) + (emmet-filter input (emmet-default-filter)))) -(defun zencoding-subexpr (input) +(defun emmet-subexpr (input) "Parse a zen coding expression with no filter. This pretty much defines precedence." - (zencoding-run zencoding-siblings + (emmet-run emmet-siblings it - (zencoding-run zencoding-parent-child + (emmet-run emmet-parent-child it - (zencoding-run zencoding-multiplier + (emmet-run emmet-multiplier it - (zencoding-run zencoding-pexpr + (emmet-run emmet-pexpr it - (zencoding-run zencoding-text + (emmet-run emmet-text it - (zencoding-run zencoding-tag + (emmet-run emmet-tag it '(error "no match, expecting ( or a-zA-Z0-9")))))))) -(defun zencoding-extract-filters (input) +(defun emmet-extract-filters (input) "Extract filters from expression." - (zencoding-pif (zencoding-parse "\\([^\\|]+?\\)|" 2 "" it) + (emmet-pif (emmet-parse "\\([^\\|]+?\\)|" 2 "" it) (let ((filter-name (elt it 1)) (more-filters (elt it 2))) - (zencoding-pif (zencoding-extract-filters more-filters) + (emmet-pif (emmet-extract-filters more-filters) (cons filter-name it) it)) - (zencoding-parse "\\([^\\|]+\\)" 1 "filter name" `(,(elt it 1))))) + (emmet-parse "\\([^\\|]+\\)" 1 "filter name" `(,(elt it 1))))) -(defun zencoding-filter (input filters) +(defun emmet-filter (input filters) "Construct AST with specified filters." - (zencoding-pif (zencoding-subexpr input) + (emmet-pif (emmet-subexpr input) (let ((result (car it)) (rest (cdr it))) `((filter ,filters ,result) . ,rest)) it)) -(defun zencoding-default-filter () +(defun emmet-default-filter () "Default filter(s) to be used if none is specified." - (let* ((file-ext (car (zencoding-regex ".*\\(\\..*\\)" (or (buffer-file-name) "") 1))) + (let* ((file-ext (car (emmet-regex ".*\\(\\..*\\)" (or (buffer-file-name) "") 1))) (defaults '(".html" ("html") ".htm" ("html") ".haml" ("haml") @@ -62,11 +62,11 @@ (cadr selected-default) default-else))) -(defun zencoding-numbering (input) - (zencoding-parse +(defun emmet-numbering (input) + (emmet-parse "\\(\\$+\\)" 2 "numbering, $" (let ((doller (elt it 1))) - (zencoding-pif (zencoding-parse + (emmet-pif (emmet-parse "@\\([0-9-][0-9]*\\)" 2 "numbering args" (let* ((args (read (elt it 1))) (direction (not (or (eq '- args) (minusp args)))) @@ -75,17 +75,17 @@ it `((n ,(length doller) t 1) . ,input))))) -(defun zencoding-split-numbering-expressions (input) +(defun emmet-split-numbering-expressions (input) (labels ((iter (input) - (zencoding-aif (zencoding-regex "\\([^$]*\\)\\(\\$.*\\)" input '(1 2)) + (emmet-aif (emmet-regex "\\([^$]*\\)\\(\\$.*\\)" input '(1 2)) (let ((prefix (car it)) (input (cadr it))) (if (and (< 0 (length prefix)) ; check if ..\\$... or ...$... (string-equal (substring prefix -1) "\\")) `(,(store-substring prefix (- (length prefix) 1) ?$) ,@(iter (substring input 1))) - (let ((res (zencoding-numbering input))) + (let ((res (emmet-numbering input))) `(,prefix ,(car res) ,@(iter (cdr res)))))) (list input)))) (let ((res (iter input))) @@ -93,7 +93,7 @@ (apply #'concat res) `(numberings ,@res))))) -(defun zencoding-instantiate-numbering-expression (i lim exp) +(defun emmet-instantiate-numbering-expression (i lim exp) (labels ((instantiate (i lim exps) (apply #'concat @@ -120,70 +120,70 @@ exp))) (search i lim exp))) -(defun zencoding-multiply-expression (multiplicand exp) +(defun emmet-multiply-expression (multiplicand exp) (loop for i to (- multiplicand 1) collect - (zencoding-instantiate-numbering-expression i multiplicand exp))) + (emmet-instantiate-numbering-expression i multiplicand exp))) -(defun zencoding-multiplier (input) - (zencoding-pif (zencoding-run zencoding-pexpr +(defun emmet-multiplier (input) + (emmet-pif (emmet-run emmet-pexpr it - (zencoding-run zencoding-tag + (emmet-run emmet-tag it - (zencoding-run zencoding-text + (emmet-run emmet-text it '(error "expected *n multiplier")))) (let* ((expr (car it)) (input (cdr it)) (multiplier expr)) - (zencoding-parse "\\*\\([0-9]+\\)" 2 "*n where n is a number" + (emmet-parse "\\*\\([0-9]+\\)" 2 "*n where n is a number" (let ((multiplicand (read (elt it 1)))) - `((list ,(zencoding-multiply-expression + `((list ,(emmet-multiply-expression multiplicand multiplier)) . ,input)))))) -(defun zencoding-tag (input) +(defun emmet-tag (input) "Parse a tag." - (zencoding-run - zencoding-tagname + (emmet-run + emmet-tagname (let ((tagname (cadr expr)) (has-body? (cddr expr))) - (zencoding-pif - (zencoding-run zencoding-identifier - (zencoding-tag-classes + (emmet-pif + (emmet-run emmet-identifier + (emmet-tag-classes `(tag (,tagname ,has-body? ,(cddr expr))) input) - (zencoding-tag-classes + (emmet-tag-classes `(tag (,tagname ,has-body? nil)) input)) (let ((tag-data (cadar it)) (input (cdr it))) - (zencoding-pif (zencoding-run - zencoding-props + (emmet-pif (emmet-run + emmet-props (let ((props (cdr expr))) `((tag ,(append tag-data (list props))) . ,input)) `((tag ,(append tag-data '(nil))) . ,input)) (let ((expr (car it)) (input (cdr it))) (destructuring-bind (expr . input) - (zencoding-tag-text expr input) - (zencoding-expand-tag-alias expr input))))))) - (zencoding-default-tag input))) + (emmet-tag-text expr input) + (emmet-expand-tag-alias expr input))))))) + (emmet-default-tag input))) -(defun zencoding-get-first-tag (expr) +(defun emmet-get-first-tag (expr) (if (listp expr) (if (listp (car expr)) - (zencoding-get-first-tag (car expr)) + (emmet-get-first-tag (car expr)) (if (eql (car expr) 'tag) expr - (zencoding-get-first-tag (cdr expr)))) + (emmet-get-first-tag (cdr expr)))) nil)) -(defun zencoding-expand-tag-alias (tag input) +(defun emmet-expand-tag-alias (tag input) (let ((tag-data (cadr tag))) (let ((tag-name (car tag-data))) - (zencoding-aif - (gethash tag-name zencoding-tag-aliases-table) + (emmet-aif + (gethash tag-name emmet-tag-aliases-table) (let ((expr (if (stringp it) - (zencoding-subexpr it) + (emmet-subexpr it) it))) (prog1 (let ((rt (copy-tree expr))) - (let ((first-tag-data (cadr (zencoding-get-first-tag rt)))) + (let ((first-tag-data (cadr (emmet-get-first-tag rt)))) (setf (second first-tag-data) (second tag-data)) (setf (third first-tag-data) (third tag-data)) (setf (fourth first-tag-data) @@ -199,90 +199,90 @@ (setf (sixth first-tag-data) (sixth tag-data)) (setf (cdr rt) (concat (cdr rt) input)) rt)) - (puthash tag-name expr zencoding-tag-aliases-table))) + (puthash tag-name expr emmet-tag-aliases-table))) `(,tag . ,input))))) -(defun zencoding-default-tag (input) +(defun emmet-default-tag (input) "Parse a #id or .class" - (zencoding-parse "\\([#|\\.]\\)" 1 "tagname" - (zencoding-tag (concat "div" (elt it 0))))) + (emmet-parse "\\([#|\\.]\\)" 1 "tagname" + (emmet-tag (concat "div" (elt it 0))))) -(defun zencoding-tag-text (tag input) +(defun emmet-tag-text (tag input) (let ((tag-data (cadr tag))) - (zencoding-run zencoding-text + (emmet-run emmet-text (let ((txt (cadr expr))) `((tag ,(append tag-data (list txt))) . ,input)) `((tag ,(append tag-data '(nil))) . ,input)))) -(defun zencoding-tag-props (tag input) +(defun emmet-tag-props (tag input) (let ((tag-data (cadr tag))) - (zencoding-run zencoding-props + (emmet-run emmet-props (let ((props (cdr expr))) `((tag ,(append tag-data (list props))) . ,input)) `((tag ,(append tag-data '(nil))) . ,input)))) -(defun zencoding-props (input) +(defun emmet-props (input) "Parse many props." - (zencoding-run zencoding-prop - (zencoding-pif (zencoding-props input) + (emmet-run emmet-prop + (emmet-pif (emmet-props input) `((props . ,(cons expr (cdar it))) . ,(cdr it)) `((props . ,(list expr)) . ,input)))) -(defun zencoding-prop (input) - (zencoding-parse +(defun emmet-prop (input) + (emmet-parse " " 1 "space" - (zencoding-run - zencoding-name + (emmet-run + emmet-name (let ((name (cdr expr))) - (zencoding-pif (zencoding-prop-value name input) + (emmet-pif (emmet-prop-value name input) it `((,(read name) "") . ,input)))))) -(defun zencoding-prop-value (name input) - (zencoding-pif (zencoding-parse "=\"\\(.*?\\)\"" 2 +(defun emmet-prop-value (name input) + (emmet-pif (emmet-parse "=\"\\(.*?\\)\"" 2 "=\"property value\"" (let ((value (elt it 1)) (input (elt it 2))) `((,(read name) ,value) . ,input))) it - (zencoding-parse "=\\([^\\,\\+\\>\\{\\}\\ )]*\\)" 2 + (emmet-parse "=\\([^\\,\\+\\>\\{\\}\\ )]*\\)" 2 "=property value" (let ((value (elt it 1)) (input (elt it 2))) `((,(read name) ,value) . ,input))))) -(defun zencoding-tag-classes (tag input) +(defun emmet-tag-classes (tag input) (let ((tag-data (cadr tag))) - (zencoding-run zencoding-classes + (emmet-run emmet-classes (let ((classes (mapcar (lambda (cls) (cdadr cls)) (cdr expr)))) `((tag ,(append tag-data (list classes))) . ,input)) `((tag ,(append tag-data '(nil))) . ,input)))) -(defun zencoding-tagname (input) +(defun emmet-tagname (input) "Parse a tagname a-zA-Z0-9 tagname (e.g. html/head/xsl:if/br)." - (zencoding-parse "\\([a-zA-Z!][a-zA-Z0-9:!$@-]*\/?\\)" 2 "tagname, a-zA-Z0-9" + (emmet-parse "\\([a-zA-Z!][a-zA-Z0-9:!$@-]*\/?\\)" 2 "tagname, a-zA-Z0-9" (let* ((tag-spec (elt it 1)) - (empty-tag (zencoding-regex "\\([^\/]*\\)\/" tag-spec 1)) - (tag (zencoding-split-numbering-expressions + (empty-tag (emmet-regex "\\([^\/]*\\)\/" tag-spec 1)) + (tag (emmet-split-numbering-expressions (if empty-tag (car empty-tag) tag-spec)))) `((tagname . (,tag . ,(not empty-tag))) . ,input)))) -(defun zencoding-text (input) +(defun emmet-text (input) "A zen coding expression innertext." - (zencoding-parse "{\\(.*?\\)}" 2 "inner text" - (let ((txt (zencoding-split-numbering-expressions (elt it 1)))) + (emmet-parse "{\\(.*?\\)}" 2 "inner text" + (let ((txt (emmet-split-numbering-expressions (elt it 1)))) `((text ,txt) . ,input)))) -(defun zencoding-pexpr (input) +(defun emmet-pexpr (input) "A zen coding expression with parentheses around it." - (zencoding-parse "(" 1 "(" - (zencoding-run zencoding-subexpr - (zencoding-aif (zencoding-regex ")" input '(0 1)) + (emmet-parse "(" 1 "(" + (emmet-run emmet-subexpr + (emmet-aif (emmet-regex ")" input '(0 1)) `(,expr . ,(elt it 1)) '(error "expecting `)'"))))) -(defun zencoding-parent-child (input) +(defun emmet-parent-child (input) "Parse an tag>e expression, where `n' is an tag and `e' is any expression." (defun listing (parents child input) @@ -290,100 +290,100 @@ `((list ,(map 'list (lambda (parent i) `(parent-child ,parent - ,(zencoding-instantiate-numbering-expression i len child))) + ,(emmet-instantiate-numbering-expression i len child))) parents (loop for i to (- len 1) collect i))) . ,input))) - (zencoding-run zencoding-multiplier + (emmet-run emmet-multiplier (let* ((items (cadr expr)) - (rest (zencoding-child-sans expr input))) + (rest (emmet-child-sans expr input))) (if (not (eq (car rest) 'error)) (let ((child (car rest)) (input (cdr rest))) - (zencoding-aif (zencoding-regex "^" input '(0 1)) + (emmet-aif (emmet-regex "^" input '(0 1)) (let ((input (elt it 1))) - (zencoding-run zencoding-subexpr + (emmet-run emmet-subexpr `((sibling ,(car (listing items child "")) ,expr) . ,input) (listing items child input))) (listing items child input))) '(error "expected child"))) - (zencoding-run zencoding-tag - (zencoding-child expr input) + (emmet-run emmet-tag + (emmet-child expr input) '(error "expected parent")))) -(defun zencoding-child-sans (parent input) - (zencoding-parse ">" 1 ">" - (zencoding-run zencoding-subexpr +(defun emmet-child-sans (parent input) + (emmet-parse ">" 1 ">" + (emmet-run emmet-subexpr it '(error "expected child")))) -(defun zencoding-child (parent input) - (zencoding-parse ">" 1 ">" - (zencoding-run zencoding-subexpr +(defun emmet-child (parent input) + (emmet-parse ">" 1 ">" + (emmet-run emmet-subexpr (let ((child expr)) - (zencoding-aif (zencoding-regex "^" input '(0 1)) + (emmet-aif (emmet-regex "^" input '(0 1)) (let ((input (elt it 1))) - (zencoding-run zencoding-subexpr + (emmet-run emmet-subexpr `((sibling (parent-child ,parent ,child) ,expr) . ,input) `((parent-child ,parent ,child) . ,input))) `((parent-child ,parent ,child) . ,input))) '(error "expected child")))) -(defun zencoding-sibling (input) - (zencoding-por zencoding-pexpr zencoding-multiplier +(defun emmet-sibling (input) + (emmet-por emmet-pexpr emmet-multiplier it - (zencoding-run zencoding-tag + (emmet-run emmet-tag it - (zencoding-run zencoding-text + (emmet-run emmet-text it '(error "expected sibling"))))) -(defun zencoding-siblings (input) +(defun emmet-siblings (input) "Parse an e+e expression, where e is an tag or a pexpr." - (zencoding-run zencoding-sibling + (emmet-run emmet-sibling (let ((parent expr)) - (zencoding-parse + (emmet-parse "\\+" 1 "+" - (zencoding-run - zencoding-subexpr + (emmet-run + emmet-subexpr (let ((child expr)) `((sibling ,parent ,child) . ,input)) - (zencoding-expand parent input)))) + (emmet-expand parent input)))) '(error "expected first sibling"))) -(defun zencoding-expand (parent input) +(defun emmet-expand (parent input) "Parse an e+ expression, where e is an expandable tag" (let* ((parent-tag (car (cadr parent)))) (setf (caadr parent) (concat parent-tag "+")) (destructuring-bind (parent . input) - (zencoding-expand-tag-alias parent input) - (zencoding-pif (zencoding-parse "+\\(.*\\)" 1 "+expr" - (zencoding-subexpr (elt it 1))) + (emmet-expand-tag-alias parent input) + (emmet-pif (emmet-parse "+\\(.*\\)" 1 "+expr" + (emmet-subexpr (elt it 1))) `((sibling ,parent ,@it)) `(,parent . ,input))))) -(defun zencoding-name (input) +(defun emmet-name (input) "Parse a class or identifier name, e.g. news, footer, mainimage" - (zencoding-parse "\\([a-zA-Z$@][a-zA-Z0-9$@_:-]*\\)" 2 "class or identifer name" - `((name . ,(zencoding-split-numbering-expressions + (emmet-parse "\\([a-zA-Z$@][a-zA-Z0-9$@_:-]*\\)" 2 "class or identifer name" + `((name . ,(emmet-split-numbering-expressions (elt it 1))) . ,input))) -(defun zencoding-class (input) +(defun emmet-class (input) "Parse a classname expression, e.g. .foo" - (zencoding-parse "\\." 1 "." - (zencoding-run zencoding-name + (emmet-parse "\\." 1 "." + (emmet-run emmet-name `((class ,expr) . ,input) '(error "expected class name")))) -(defun zencoding-identifier (input) +(defun emmet-identifier (input) "Parse an identifier expression, e.g. #foo" - (zencoding-parse "#" 1 "#" - (zencoding-run zencoding-name + (emmet-parse "#" 1 "#" + (emmet-run emmet-name `((identifier . ,expr) . ,input)))) -(defun zencoding-classes (input) +(defun emmet-classes (input) "Parse many classes." - (zencoding-run zencoding-class - (zencoding-pif (zencoding-classes input) + (emmet-run emmet-class + (emmet-pif (emmet-classes input) `((classes . ,(cons expr (cdar it))) . ,(cdr it)) `((classes . ,(list expr)) . ,input)) '(error "expected class"))) @@ -391,46 +391,46 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Zen coding transformer from AST to string -(defvar zencoding-leaf-function nil +(defvar emmet-leaf-function nil "Function to execute when expanding a leaf node in the - Zencoding AST.") + Emmet AST.") -(zencoding-defparameter - zencoding-tag-settings-table - (gethash "tags" (gethash "html" zencoding-preferences))) +(emmet-defparameter + emmet-tag-settings-table + (gethash "tags" (gethash "html" emmet-preferences))) -(zencoding-defparameter - zencoding-tag-snippets-table - (gethash "snippets" (gethash "html" zencoding-snippets))) +(emmet-defparameter + emmet-tag-snippets-table + (gethash "snippets" (gethash "html" emmet-snippets))) -(defvar zencoding-filters - '("html" (zencoding-primary-filter zencoding-make-html-tag) - "c" (zencoding-primary-filter zencoding-make-commented-html-tag) - "haml" (zencoding-primary-filter zencoding-make-haml-tag) - "hic" (zencoding-primary-filter zencoding-make-hiccup-tag) - "e" (zencoding-escape-xml))) +(defvar emmet-filters + '("html" (emmet-primary-filter emmet-make-html-tag) + "c" (emmet-primary-filter emmet-make-commented-html-tag) + "haml" (emmet-primary-filter emmet-make-haml-tag) + "hic" (emmet-primary-filter emmet-make-hiccup-tag) + "e" (emmet-escape-xml))) -(defun zencoding-primary-filter (input proc) +(defun emmet-primary-filter (input proc) "Process filter that needs to be executed first, ie. not given output from other filter." (if (listp input) (let ((tag-maker (cadr proc))) - (zencoding-transform-ast input tag-maker)) + (emmet-transform-ast input tag-maker)) nil)) -(defun zencoding-process-filter (filters input) +(defun emmet-process-filter (filters input) "Process filters, chain one filter output as the input of the next filter." - (let ((filter-data (member (car filters) zencoding-filters)) + (let ((filter-data (member (car filters) emmet-filters)) (more-filters (cdr filters))) (if filter-data (let* ((proc (cadr filter-data)) (fun (car proc)) (filter-output (funcall fun input proc))) (if more-filters - (zencoding-process-filter more-filters filter-output) + (emmet-process-filter more-filters filter-output) filter-output)) nil))) -(defun zencoding-make-tag (tag-maker tag-info &optional content) +(defun emmet-make-tag (tag-maker tag-info &optional content) "Extract tag info and pass them to tag-maker." (let* ((name (pop tag-info)) (has-body? (pop tag-info)) @@ -438,25 +438,25 @@ (classes (pop tag-info)) (props (pop tag-info)) (txt (pop tag-info)) - (settings (gethash name zencoding-tag-settings-table))) + (settings (gethash name emmet-tag-settings-table))) (funcall tag-maker name has-body? id classes props txt settings (if content content - (if zencoding-leaf-function (funcall zencoding-leaf-function)))))) + (if emmet-leaf-function (funcall emmet-leaf-function)))))) -(defun zencoding-hash-to-list (hash &optional proc) +(defun emmet-hash-to-list (hash &optional proc) (unless proc (setq proc #'cons)) (loop for key being the hash-keys of hash using (hash-values val) collect (funcall proc key val))) -(defun zencoding-merge-tag-props (default-table tag-props) +(defun emmet-merge-tag-props (default-table tag-props) (if default-table (let ((tbl (copy-hash-table default-table))) (loop for prop in tag-props do (puthash (symbol-name (car prop)) (cadr prop) tbl)) - (zencoding-hash-to-list tbl 'list)) + (emmet-hash-to-list tbl 'list)) tag-props)) -(defun zencoding-html-snippets-instantiate-lambda (src) +(defun emmet-html-snippets-instantiate-lambda (src) (let ((lines (mapcar #'(lambda (src) (if (string-match "^\\(.*\\)${child}\\(.*\\)$" src) @@ -480,36 +480,36 @@ (if b `(lambda (contents) (concat - ,(zencoding-join-string (reverse a) "\n") + ,(emmet-join-string (reverse a) "\n") contents - ,(zencoding-join-string (reverse b) "\n"))) + ,(emmet-join-string (reverse b) "\n"))) `(lambda (contents) (concat - ,(zencoding-join-string (reverse a) "\n") + ,(emmet-join-string (reverse a) "\n") contents)))))) (eval (iter lines 'a nil nil))))) -(defun zencoding-make-html-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) +(defun emmet-make-html-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) "Create HTML markup string" - (zencoding-aif - (gethash tag-name zencoding-tag-snippets-table) + (emmet-aif + (gethash tag-name emmet-tag-snippets-table) (let ((fn (if (stringp it) - (zencoding-html-snippets-instantiate-lambda it) + (emmet-html-snippets-instantiate-lambda it) it))) (prog1 (funcall fn content) - (puthash tag-name fn zencoding-tag-snippets-table))) + (puthash tag-name fn emmet-tag-snippets-table))) - (let* ((id (zencoding-concat-or-empty " id=\"" tag-id "\"")) - (classes (zencoding-mapconcat-or-empty " class=\"" tag-classes " " "\"")) + (let* ((id (emmet-concat-or-empty " id=\"" tag-id "\"")) + (classes (emmet-mapconcat-or-empty " class=\"" tag-classes " " "\"")) (props (let* ((tag-props-default (and settings (gethash "defaultAttr" settings))) (merged-tag-props - (zencoding-merge-tag-props + (emmet-merge-tag-props tag-props-default tag-props))) - (zencoding-mapconcat-or-empty + (emmet-mapconcat-or-empty " " merged-tag-props " " nil (lambda (prop) (let ((key (car prop))) @@ -526,49 +526,49 @@ (concat ">" (if tag-txt (if (or content-multiline? block-tag?) - (zencoding-indent tag-txt) + (emmet-indent tag-txt) tag-txt)) (if content (if (or content-multiline? block-tag?) - (zencoding-indent content) + (emmet-indent content) content)) lf "")))))) -(defun zencoding-make-commented-html-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) +(defun emmet-make-commented-html-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) "Create HTML markup string with extra comments for elements with #id or .classes" - (let ((body (zencoding-make-html-tag tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content))) + (let ((body (emmet-make-html-tag tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content))) (if (or tag-id tag-classes) - (let ((id (zencoding-concat-or-empty "#" tag-id)) - (classes (zencoding-mapconcat-or-empty "." tag-classes "."))) + (let ((id (emmet-concat-or-empty "#" tag-id)) + (classes (emmet-mapconcat-or-empty "." tag-classes "."))) (concat "\n" body "\n")) body))) -(defun zencoding-make-haml-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) +(defun emmet-make-haml-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) "Create HAML string" (let ((name (if (and (equal tag-name "div") (or tag-id tag-classes)) "" (concat "%" tag-name))) - (id (zencoding-concat-or-empty "#" tag-id)) - (classes (zencoding-mapconcat-or-empty "." tag-classes ".")) - (props (zencoding-mapconcat-or-empty + (id (emmet-concat-or-empty "#" tag-id)) + (classes (emmet-mapconcat-or-empty "." tag-classes ".")) + (props (emmet-mapconcat-or-empty "{" tag-props ", " "}" (lambda (prop) (concat ":" (symbol-name (car prop)) " => \"" (cadr prop) "\""))))) (concat name id classes props (if tag-txt - (zencoding-indent tag-txt)) + (emmet-indent tag-txt)) (if content - (zencoding-indent content))))) + (emmet-indent content))))) -(defun zencoding-make-hiccup-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) +(defun emmet-make-hiccup-tag (tag-name tag-has-body? tag-id tag-classes tag-props tag-txt settings content) "Create Hiccup string" - (let* ((id (zencoding-concat-or-empty "#" tag-id)) - (classes (zencoding-mapconcat-or-empty "." tag-classes ".")) - (props (zencoding-mapconcat-or-empty + (let* ((id (emmet-concat-or-empty "#" tag-id)) + (classes (emmet-mapconcat-or-empty "." tag-classes ".")) + (props (emmet-mapconcat-or-empty " {" tag-props ", " "}" (lambda (prop) (concat ":" (symbol-name (car prop)) " \"" (cadr prop) "\"")))) @@ -578,27 +578,27 @@ (if tag-txt (let ((tag-txt-quoted (concat "\"" tag-txt "\""))) (if (or content-multiline? block-tag?) - (zencoding-indent tag-txt-quoted) + (emmet-indent tag-txt-quoted) (concat " " tag-txt-quoted)))) (if content (if (or content-multiline? block-tag?) - (zencoding-indent content) + (emmet-indent content) (concat " " content))) "]"))) -(defun zencoding-make-text (tag-maker text) +(defun emmet-make-text (tag-maker text) (cond - ((eq tag-maker 'zencoding-make-hiccup-tag) + ((eq tag-maker 'emmet-make-hiccup-tag) (concat "\"" text "\"")) (t text))) -(defun zencoding-concat-or-empty (prefix body &optional suffix) +(defun emmet-concat-or-empty (prefix body &optional suffix) "Return prefixed suffixed text or empty string." (if body (concat prefix body suffix) "")) -(defun zencoding-mapconcat-or-empty (prefix list-body delimiter &optional suffix map-fun) +(defun emmet-mapconcat-or-empty (prefix list-body delimiter &optional suffix map-fun) "Return prefixed suffixed mapconcated text or empty string." (if list-body (let* ((mapper (if map-fun map-fun 'identity)) @@ -606,7 +606,7 @@ (concat prefix body suffix)) "")) -(defun zencoding-escape-xml (input proc) +(defun emmet-escape-xml (input proc) "Escapes XML-unsafe characters: <, > and &." (replace-regexp-in-string "<" "<" @@ -616,43 +616,43 @@ "&" "&" (if (stringp input) input - (zencoding-process-filter (zencoding-default-filter) input)))))) + (emmet-process-filter (emmet-default-filter) input)))))) -(defun zencoding-html-transform (input) - (let ((ast (car (zencoding-expr input)))) +(defun emmet-html-transform (input) + (let ((ast (car (emmet-expr input)))) (when (not (eq ast 'error)) - (zencoding-transform-ast-with-filters ast)))) + (emmet-transform-ast-with-filters ast)))) -(defun zencoding-transform-ast-with-filters (ast-with-filters) +(defun emmet-transform-ast-with-filters (ast-with-filters) "Transform AST (containing filter data) into string." (let ((filters (cadr ast-with-filters)) (ast (caddr ast-with-filters))) - (zencoding-process-filter filters ast))) + (emmet-process-filter filters ast))) -(defun zencoding-transform-ast (ast tag-maker) +(defun emmet-transform-ast (ast tag-maker) "Transform AST (without filter data) into string." (let ((type (car ast))) (cond ((eq type 'list) (mapconcat (lexical-let ((make-tag-fun tag-maker)) #'(lambda (sub-ast) - (zencoding-transform-ast sub-ast make-tag-fun))) + (emmet-transform-ast sub-ast make-tag-fun))) (cadr ast) "\n")) ((eq type 'tag) - (zencoding-make-tag tag-maker (cadr ast))) + (emmet-make-tag tag-maker (cadr ast))) ((eq type 'text) - (zencoding-make-text tag-maker (cadr ast))) + (emmet-make-text tag-maker (cadr ast))) ((eq type 'parent-child) (let ((parent (cadadr ast)) - (children (zencoding-transform-ast (caddr ast) tag-maker))) - (zencoding-make-tag tag-maker parent children))) + (children (emmet-transform-ast (caddr ast) tag-maker))) + (emmet-make-tag tag-maker parent children))) ((eq type 'sibling) - (let ((sib1 (zencoding-transform-ast (cadr ast) tag-maker)) - (sib2 (zencoding-transform-ast (caddr ast) tag-maker))) + (let ((sib1 (emmet-transform-ast (cadr ast) tag-maker)) + (sib2 (emmet-transform-ast (caddr ast) tag-maker))) (concat sib1 "\n" sib2)))))) -(defun zencoding-indent (text) +(defun emmet-indent (text) "Indent the text" (if text (replace-regexp-in-string "\n" "\n " (concat "\n" text)) diff --git a/src/init.el b/src/init.el index b2fd434..27d421d 100644 --- a/src/init.el +++ b/src/init.el @@ -2,27 +2,24 @@ ;; ;;; Code: -(defconst zencoding-mode:version "0.5.1") +(defconst emmet-mode:version "0.1.0") -;; Include the trie data structure for caching -;(require 'zencoding-trie) +(eval-when-compile (require 'cl)) -(require 'cl) - -(defmacro zencoding-defparameter (symbol &optional initvalue docstring) +(defmacro emmet-defparameter (symbol &optional initvalue docstring) `(progn (defvar ,symbol nil ,docstring) (setq ,symbol ,initvalue))) -(defun zencoding-join-string (lis joiner) +(defun emmet-join-string (lis joiner) (mapconcat 'identity lis joiner)) -(defun zencoding-get-keys-of-hash (hash) +(defun emmet-get-keys-of-hash (hash) (let ((ks nil)) (maphash #'(lambda (k v) (setq ks (cons k ks))) hash) ks)) -(defun zencoding-get-vals-of-hash (hash) +(defun emmet-get-vals-of-hash (hash) (let ((vs nil)) (maphash #'(lambda (k v) (setq vs (cons v vs))) hash) vs)) @@ -30,45 +27,45 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Generic parsing macros and utilities -(defmacro zencoding-aif (test-form then-form &rest else-forms) +(defmacro emmet-aif (test-form then-form &rest else-forms) "Anaphoric if. Temporary variable `it' is the result of test-form." `(let ((it ,test-form)) (if it ,then-form ,@(or else-forms '(it))))) -(defmacro zencoding-pif (test-form then-form &rest else-forms) +(defmacro emmet-pif (test-form then-form &rest else-forms) "Parser anaphoric if. Temporary variable `it' is the result of test-form." `(let ((it ,test-form)) (if (not (eq 'error (car it))) ,then-form ,@(or else-forms '(it))))) -(defmacro zencoding-parse (regex nums label &rest body) +(defmacro emmet-parse (regex nums label &rest body) "Parse according to a regex and update the `input' variable." - `(zencoding-aif (zencoding-regex ,regex input ',(number-sequence 0 nums)) + `(emmet-aif (emmet-regex ,regex input ',(number-sequence 0 nums)) (let ((input (elt it ,nums))) ,@body) `,`(error ,(concat "expected " ,label)))) -(defmacro zencoding-run (parser then-form &rest else-forms) +(defmacro emmet-run (parser then-form &rest else-forms) "Run a parser and update the input properly, extract the parsed expression." - `(zencoding-pif (,parser input) + `(emmet-pif (,parser input) (let ((input (cdr it)) (expr (car it))) ,then-form) ,@(or else-forms '(it)))) -(defmacro zencoding-por (parser1 parser2 then-form &rest else-forms) +(defmacro emmet-por (parser1 parser2 then-form &rest else-forms) "OR two parsers. Try one parser, if it fails try the next." - `(zencoding-pif (,parser1 input) + `(emmet-pif (,parser1 input) (let ((input (cdr it)) (expr (car it))) ,then-form) - (zencoding-pif (,parser2 input) + (emmet-pif (,parser2 input) (let ((input (cdr it)) (expr (car it))) ,then-form) ,@else-forms))) -(defun zencoding-regex (regexp string refs) +(defun emmet-regex (regexp string refs) "Return a list of (`ref') matches for a `regex' on a `string' or nil." (if (string-match (concat "^" regexp "\\([^\n]*\\)$") string) (mapcar (lambda (ref) (match-string ref string)) diff --git a/src/mode-def.el b/src/mode-def.el index 1f7e396..07550ae 100644 --- a/src/mode-def.el +++ b/src/mode-def.el @@ -1,49 +1,49 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Zencoding minor mode +;; Emmet minor mode -(defgroup zencoding nil - "Customization group for zencoding-mode." +(defgroup emmet nil + "Customization group for emmet-mode." :group 'convenience) -(defun zencoding-expr-on-line () - "Extract a zencoding expression and the corresponding bounds +(defun emmet-expr-on-line () + "Extract a emmet expression and the corresponding bounds for the current line." (let* ((start (line-beginning-position)) (end (line-end-position)) (line (buffer-substring-no-properties start end)) - (expr (zencoding-regex "\\([ \t]*\\)\\([^\n]+\\)" line 2))) + (expr (emmet-regex "\\([ \t]*\\)\\([^\n]+\\)" line 2))) (if (first expr) (list (first expr) start end)))) -(defcustom zencoding-indentation 4 +(defcustom emmet-indentation 4 "Number of spaces used for indentation." :type '(number :tag "Spaces") - :group 'zencoding) + :group 'emmet) -(defun zencoding-prettify (markup indent) +(defun emmet-prettify (markup indent) (let ((first-col (format (format "%%%ds" indent) "")) - (tab (format (format "%%%ds" zencoding-indentation) ""))) + (tab (format (format "%%%ds" emmet-indentation) ""))) (concat first-col (replace-regexp-in-string "\n" (concat "\n" first-col) (replace-regexp-in-string " " tab markup))))) -(defun zencoding-transform (input) +(defun emmet-transform (input) (if (eql major-mode 'css-mode) - (zencoding-css-transform input) - (zencoding-html-transform input))) + (emmet-css-transform input) + (emmet-html-transform input))) ;;;###autoload -(defun zencoding-expand-line (arg) - "Replace the current line's zencode expression with the corresponding expansion. -If prefix ARG is given or region is visible call `zencoding-preview' to start an +(defun emmet-expand-line (arg) + "Replace the current line's emmet expression with the corresponding expansion. +If prefix ARG is given or region is visible call `emmet-preview' to start an interactive preview. Otherwise expand line directly. -For more information see `zencoding-mode'." +For more information see `emmet-mode'." (interactive "P") (let* ((here (point)) - (preview (if zencoding-preview-default (not arg) arg)) + (preview (if emmet-preview-default (not arg) arg)) (beg (if preview (progn (beginning-of-line) @@ -59,30 +59,30 @@ For more information see `zencoding-mode'." (if beg (progn (goto-char here) - (zencoding-preview beg end)) - (let ((expr (zencoding-expr-on-line))) + (emmet-preview beg end)) + (let ((expr (emmet-expr-on-line))) (if expr - (let ((markup (zencoding-transform (first expr)))) + (let ((markup (emmet-transform (first expr)))) (when markup - (let ((pretty (zencoding-prettify markup (current-indentation)))) + (let ((pretty (emmet-prettify markup (current-indentation)))) (save-excursion (delete-region (second expr) (third expr)) - (zencoding-insert-and-flash pretty)))))))))) + (emmet-insert-and-flash pretty)))))))))) -(defvar zencoding-mode-keymap nil - "Keymap for zencode minor mode.") +(defvar emmet-mode-keymap nil + "Keymap for emmet minor mode.") -(if zencoding-mode-keymap +(if emmet-mode-keymap nil (progn - (setq zencoding-mode-keymap (make-sparse-keymap)) - (define-key zencoding-mode-keymap (kbd "C-j") 'zencoding-expand-line) - (define-key zencoding-mode-keymap (kbd "") 'zencoding-expand-line))) + (setq emmet-mode-keymap (make-sparse-keymap)) + (define-key emmet-mode-keymap (kbd "C-j") 'emmet-expand-line) + (define-key emmet-mode-keymap (kbd "") 'emmet-expand-line))) ;;;###autoload -(define-minor-mode zencoding-mode +(define-minor-mode emmet-mode "Minor mode for writing HTML and CSS markup. -With zen coding for HTML and CSS you can write a line like +With emmet for HTML and CSS you can write a line like ul#name>li.item*2 @@ -95,30 +95,30 @@ and have it expanded to This minor mode defines keys for quick access: -\\{zencoding-mode-keymap} +\\{emmet-mode-keymap} -Home page URL `http://www.emacswiki.org/emacs/ZenCoding'. +Home page URL `http://www.emacswiki.org/emacs/Emmet'. -See also `zencoding-expand-line'." - :lighter " Zen" - :keymap zencoding-mode-keymap) +See also `emmet-expand-line'." + :lighter " Emmet" + :keymap emmet-mode-keymap) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Zencoding yasnippet integration +;; Emmet yasnippet integration -(defun zencoding-transform-yas (input) +(defun emmet-transform-yas (input) (let* ((leaf-count 0) - (zencoding-leaf-function + (emmet-leaf-function (lambda () (format "$%d" (incf leaf-count))))) - (zencoding-transform input))) + (emmet-transform input))) ;;;###autoload -(defun zencoding-expand-yas () +(defun emmet-expand-yas () (interactive) - (let ((expr (zencoding-expr-on-line))) + (let ((expr (emmet-expr-on-line))) (if expr - (let* ((markup (zencoding-transform-yas (first expr))) + (let* ((markup (emmet-transform-yas (first expr))) (filled (replace-regexp-in-string "><" ">\n<" markup))) (delete-region (second expr) (third expr)) (insert filled) @@ -136,87 +136,87 @@ See also `zencoding-expand-line'." ;;;;;;;;;; ;; Lennart's version -(defvar zencoding-preview-input nil) -(make-local-variable 'zencoding-preview-input) -(defvar zencoding-preview-output nil) -(make-local-variable 'zencoding-preview-output) -(defvar zencoding-old-show-paren nil) -(make-local-variable 'zencoding-old-show-paren) +(defvar emmet-preview-input nil) +(make-local-variable 'emmet-preview-input) +(defvar emmet-preview-output nil) +(make-local-variable 'emmet-preview-output) +(defvar emmet-old-show-paren nil) +(make-local-variable 'emmet-old-show-paren) -(defface zencoding-preview-input +(defface emmet-preview-input '((default :box t :inherit secondary-selection)) "Face for preview input field." - :group 'zencoding) + :group 'emmet) -(defface zencoding-preview-output +(defface emmet-preview-output '((default :inherit highlight)) "Face for preview output field." - :group 'zencoding) + :group 'emmet) -(defvar zencoding-preview-keymap +(defvar emmet-preview-keymap (let ((map (make-sparse-keymap))) - (define-key map (kbd "RET") 'zencoding-preview-accept) - (define-key map (kbd "") 'zencoding-preview-accept) - (define-key map [(control ?g)] 'zencoding-preview-abort) + (define-key map (kbd "RET") 'emmet-preview-accept) + (define-key map (kbd "") 'emmet-preview-accept) + (define-key map [(control ?g)] 'emmet-preview-abort) map)) -(defun zencoding-preview-accept () +(defun emmet-preview-accept () (interactive) - (let ((ovli zencoding-preview-input)) + (let ((ovli emmet-preview-input)) (if (not (and (overlayp ovli) (bufferp (overlay-buffer ovli)))) (message "Preview is not active") (let* ((indent (current-indentation)) - (markup (zencoding-preview-transformed indent))) + (markup (emmet-preview-transformed indent))) (when markup (delete-region (line-beginning-position) (overlay-end ovli)) - (zencoding-insert-and-flash markup))))) - (zencoding-preview-abort)) + (emmet-insert-and-flash markup))))) + (emmet-preview-abort)) -(defvar zencoding-flash-ovl nil) -(make-variable-buffer-local 'zencoding-flash-ovl) +(defvar emmet-flash-ovl nil) +(make-variable-buffer-local 'emmet-flash-ovl) -(defun zencoding-remove-flash-ovl (buf) +(defun emmet-remove-flash-ovl (buf) (with-current-buffer buf - (when (overlayp zencoding-flash-ovl) - (delete-overlay zencoding-flash-ovl)) - (setq zencoding-flash-ovl nil))) + (when (overlayp emmet-flash-ovl) + (delete-overlay emmet-flash-ovl)) + (setq emmet-flash-ovl nil))) -(defcustom zencoding-preview-default t +(defcustom emmet-preview-default t "If non-nil then preview is the default action. -This determines how `zencoding-expand-line' works by default." +This determines how `emmet-expand-line' works by default." :type 'boolean - :group 'zencoding) + :group 'emmet) -(defcustom zencoding-insert-flash-time 0.5 +(defcustom emmet-insert-flash-time 0.5 "Time to flash insertion. Set this to a negative number if you do not want flashing the expansion after insertion." :type '(number :tag "Seconds") - :group 'zencoding) + :group 'emmet) -(defun zencoding-insert-and-flash (markup) - (zencoding-remove-flash-ovl (current-buffer)) +(defun emmet-insert-and-flash (markup) + (emmet-remove-flash-ovl (current-buffer)) (let ((here (point))) (insert markup) - (setq zencoding-flash-ovl (make-overlay here (point))) - (overlay-put zencoding-flash-ovl 'face 'zencoding-preview-output) - (when (< 0 zencoding-insert-flash-time) - (run-with-idle-timer zencoding-insert-flash-time - nil 'zencoding-remove-flash-ovl (current-buffer))))) + (setq emmet-flash-ovl (make-overlay here (point))) + (overlay-put emmet-flash-ovl 'face 'emmet-preview-output) + (when (< 0 emmet-insert-flash-time) + (run-with-idle-timer emmet-insert-flash-time + nil 'emmet-remove-flash-ovl (current-buffer))))) ;;;###autoload -(defun zencoding-preview (beg end) - "Expand zencode between BEG and END interactively. -This will show a preview of the expanded zen code and you can +(defun emmet-preview (beg end) + "Expand emmet between BEG and END interactively. +This will show a preview of the expanded emmet code and you can accept it or skip it." (interactive (if mark-active (list (region-beginning) (region-end)) (list nil nil))) - (zencoding-preview-abort) + (emmet-preview-abort) (if (not beg) (message "Region not active") - (setq zencoding-old-show-paren show-paren-mode) + (setq emmet-old-show-paren show-paren-mode) (show-paren-mode -1) (let ((here (point))) (goto-char beg) @@ -226,71 +226,71 @@ accept it or skip it." (let* ((opos (point)) (ovli (make-overlay beg end nil nil t)) (ovlo (make-overlay opos opos)) - (info (propertize " Zen preview. Choose with RET. Cancel by stepping out. \n" + (info (propertize " Emmet preview. Choose with RET. Cancel by stepping out. \n" 'face 'tooltip))) - (overlay-put ovli 'face 'zencoding-preview-input) - (overlay-put ovli 'keymap zencoding-preview-keymap) - (overlay-put ovlo 'face 'zencoding-preview-output) + (overlay-put ovli 'face 'emmet-preview-input) + (overlay-put ovli 'keymap emmet-preview-keymap) + (overlay-put ovlo 'face 'emmet-preview-output) (overlay-put ovlo 'before-string info) - (setq zencoding-preview-input ovli) - (setq zencoding-preview-output ovlo) - (add-hook 'before-change-functions 'zencoding-preview-before-change t t) + (setq emmet-preview-input ovli) + (setq emmet-preview-output ovlo) + (add-hook 'before-change-functions 'emmet-preview-before-change t t) (goto-char here) - (add-hook 'post-command-hook 'zencoding-preview-post-command t t))))) + (add-hook 'post-command-hook 'emmet-preview-post-command t t))))) -(defvar zencoding-preview-pending-abort nil) -(make-variable-buffer-local 'zencoding-preview-pending-abort) +(defvar emmet-preview-pending-abort nil) +(make-variable-buffer-local 'emmet-preview-pending-abort) -(defun zencoding-preview-before-change (beg end) +(defun emmet-preview-before-change (beg end) (when - (or (> beg (overlay-end zencoding-preview-input)) - (< beg (overlay-start zencoding-preview-input)) - (> end (overlay-end zencoding-preview-input)) - (< end (overlay-start zencoding-preview-input))) - (setq zencoding-preview-pending-abort t))) - -(defun zencoding-preview-abort () - "Abort zen code preview." + (or (> beg (overlay-end emmet-preview-input)) + (< beg (overlay-start emmet-preview-input)) + (> end (overlay-end emmet-preview-input)) + (< end (overlay-start emmet-preview-input))) + (setq emmet-preview-pending-abort t))) + +(defun emmet-preview-abort () + "Abort emmet code preview." (interactive) - (setq zencoding-preview-pending-abort nil) - (remove-hook 'before-change-functions 'zencoding-preview-before-change t) - (when (overlayp zencoding-preview-input) - (delete-overlay zencoding-preview-input)) - (setq zencoding-preview-input nil) - (when (overlayp zencoding-preview-output) - (delete-overlay zencoding-preview-output)) - (setq zencoding-preview-output nil) - (remove-hook 'post-command-hook 'zencoding-preview-post-command t) - (when zencoding-old-show-paren (show-paren-mode 1))) - -(defun zencoding-preview-post-command () + (setq emmet-preview-pending-abort nil) + (remove-hook 'before-change-functions 'emmet-preview-before-change t) + (when (overlayp emmet-preview-input) + (delete-overlay emmet-preview-input)) + (setq emmet-preview-input nil) + (when (overlayp emmet-preview-output) + (delete-overlay emmet-preview-output)) + (setq emmet-preview-output nil) + (remove-hook 'post-command-hook 'emmet-preview-post-command t) + (when emmet-old-show-paren (show-paren-mode 1))) + +(defun emmet-preview-post-command () (condition-case err - (zencoding-preview-post-command-1) - (error (message "zencoding-preview-post: %s" err)))) + (emmet-preview-post-command-1) + (error (message "emmet-preview-post: %s" err)))) -(defun zencoding-preview-post-command-1 () - (if (and (not zencoding-preview-pending-abort) - (<= (point) (overlay-end zencoding-preview-input)) - (>= (point) (overlay-start zencoding-preview-input))) - (zencoding-update-preview (current-indentation)) - (zencoding-preview-abort))) +(defun emmet-preview-post-command-1 () + (if (and (not emmet-preview-pending-abort) + (<= (point) (overlay-end emmet-preview-input)) + (>= (point) (overlay-start emmet-preview-input))) + (emmet-update-preview (current-indentation)) + (emmet-preview-abort))) -(defun zencoding-preview-transformed (indent) +(defun emmet-preview-transformed (indent) (let* ((string (buffer-substring-no-properties - (overlay-start zencoding-preview-input) - (overlay-end zencoding-preview-input)))) - (let ((output (zencoding-transform string))) + (overlay-start emmet-preview-input) + (overlay-end emmet-preview-input)))) + (let ((output (emmet-transform string))) (when output - (zencoding-prettify output indent))))) + (emmet-prettify output indent))))) -(defun zencoding-update-preview (indent) - (let* ((pretty (zencoding-preview-transformed indent)) +(defun emmet-update-preview (indent) + (let* ((pretty (emmet-preview-transformed indent)) (show (when pretty (propertize pretty 'face 'highlight)))) (when show - (overlay-put zencoding-preview-output 'after-string + (overlay-put emmet-preview-output 'after-string (concat show "\n"))))) -(provide 'zencoding-mode) +(provide 'emmet-mode) -;;; zencoding-mode.el ends here +;;; emmet-mode.el ends here diff --git a/src/preferences.el b/src/preferences.el index a9bfc39..dc5f9c6 100644 --- a/src/preferences.el +++ b/src/preferences.el @@ -1,7 +1,7 @@ ;; src/preferences.el ;; This file is generated from conf/preferences.json ;; Don't edit. -(zencoding-defparameter zencoding-preferences +(emmet-defparameter emmet-preferences (let ((tbl (make-hash-table :test 'equal))) (puthash "html" (let ((tbl (make-hash-table :test 'equal))) (puthash "tags" (let ((tbl (make-hash-table :test 'equal))) diff --git a/src/snippets.el b/src/snippets.el index 9a508ed..df3a274 100644 --- a/src/snippets.el +++ b/src/snippets.el @@ -1,7 +1,7 @@ ;; src/snippets.el ;; This file is generated from conf/snippets.json ;; Don't edit. -(zencoding-defparameter zencoding-snippets +(emmet-defparameter emmet-snippets (let ((tbl (make-hash-table :test 'equal))) (puthash "html" (let ((tbl (make-hash-table :test 'equal))) (puthash "snippets" (let ((tbl (make-hash-table :test 'equal))) diff --git a/src/test.el b/src/test.el index dc021ae..0aedab1 100644 --- a/src/test.el +++ b/src/test.el @@ -1,11 +1,11 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Test-cases -(load-file (concat (file-name-directory load-file-name) "../zencoding-mode.el")) +(load-file (concat (file-name-directory load-file-name) "../emmet-mode.el")) -(zencoding-defparameter *zencoding-test-cases* nil) +(emmet-defparameter *emmet-test-cases* nil) -(defun zencoding-test-cases (&rest args) +(defun emmet-test-cases (&rest args) (let ((cmd (car args))) (flet ((run-cases @@ -24,13 +24,13 @@ (let ((name (cadr args)) (fn (caddr args)) (defs (cadddr args))) - (let ((place (assoc name *zencoding-test-cases*))) + (let ((place (assoc name *emmet-test-cases*))) (if place (setf (cdr place) (cons fn defs)) - (setq *zencoding-test-cases* - (cons (cons name (cons fn defs)) *zencoding-test-cases*)))))) + (setq *emmet-test-cases* + (cons (cons name (cons fn defs)) *emmet-test-cases*)))))) (t - (loop for test in (reverse *zencoding-test-cases*) do + (loop for test in (reverse *emmet-test-cases*) do (let ((name (symbol-name (car test))) (fn (cadr test)) (cases (cddr test))) @@ -39,23 +39,23 @@ (princ (concat " [PASS] | \"" name "\" " (number-to-string (length cases)) " tests.\n"))))))))))) -(defmacro define-zencoding-transform-test-case (name fn &rest tests) - `(zencoding-test-cases 'assign ',name +(defmacro define-emmet-transform-test-case (name fn &rest tests) + `(emmet-test-cases 'assign ',name ,fn ',(loop for x on tests by #'cddr collect (cons (car x) - (zencoding-join-string (cadr x) + (emmet-join-string (cadr x) "\n"))))) -(defmacro define-zencoding-transform-html-test-case (name &rest tests) - `(define-zencoding-transform-test-case ,name - 'zencoding-html-transform +(defmacro define-emmet-transform-html-test-case (name &rest tests) + `(define-emmet-transform-test-case ,name + 'emmet-html-transform ,@tests)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; XML-abbrev tests -(define-zencoding-transform-html-test-case Tags +(define-emmet-transform-html-test-case Tags "a" ("") "a.x" ("") "a#q.x" ("") @@ -69,13 +69,13 @@ "#q.x.y.z" ("
" "
")) -(define-zencoding-transform-html-test-case Empty-tags +(define-emmet-transform-html-test-case Empty-tags "a/" ("") "a/.x" ("") "a/#q.x" ("") "a/#q.x.y.z" ("")) -(define-zencoding-transform-html-test-case Self-closing-tags +(define-emmet-transform-html-test-case Self-closing-tags "input type=text" ("") "img" ("\"\"/") "img>metadata/*2" ("\"\"" @@ -83,7 +83,7 @@ " " "")) -(define-zencoding-transform-html-test-case Siblings +(define-emmet-transform-html-test-case Siblings "a+b" ("" "") "a+b+c" ("" @@ -98,7 +98,7 @@ "a#q.x.y.z+b#p.l.m.n" ("" "")) -(define-zencoding-transform-html-test-case Tag-expansion +(define-emmet-transform-html-test-case Tag-expansion "table+" ("" " " " " @@ -121,7 +121,7 @@ "
  • " "")) -(define-zencoding-transform-html-test-case Parent-child +(define-emmet-transform-html-test-case Parent-child "a>b" ("") "a>b>c" ("") "a.x>b" ("") @@ -141,7 +141,7 @@ " " "")) -(define-zencoding-transform-html-test-case Climb-up +(define-emmet-transform-html-test-case Climb-up "a>b>c^d" ("" " " " " @@ -183,7 +183,7 @@ " " "")) -(define-zencoding-transform-html-test-case Multiplication +(define-emmet-transform-html-test-case Multiplication "a*1" ("") "a*2" ("" "") @@ -214,7 +214,7 @@ " " "")) -(define-zencoding-transform-html-test-case Numbering +(define-emmet-transform-html-test-case Numbering "a.$x*3" ("" "" "") @@ -273,7 +273,7 @@ "
  • name: item3 price: 3$
  • " "")) -(define-zencoding-transform-html-test-case Properties +(define-emmet-transform-html-test-case Properties "a x" ("") "a x=" ("") "a x=\"\"" ("") @@ -299,7 +299,7 @@ " " "")) -(define-zencoding-transform-html-test-case Parentheses +(define-emmet-transform-html-test-case Parentheses "(a)" ("") "(a)+(b)" ("" "") @@ -324,7 +324,7 @@ "" "")) -(define-zencoding-transform-html-test-case Text +(define-emmet-transform-html-test-case Text "a{Click me}" ("Click me") "a>{Click me}*3" ("" " Click me" @@ -354,7 +354,7 @@ ("txt")) -(define-zencoding-transform-html-test-case Filter-comment +(define-emmet-transform-html-test-case Filter-comment "a.b|c" ("" "" "") @@ -367,7 +367,7 @@ "" "")) -(define-zencoding-transform-html-test-case Filter-HAML +(define-emmet-transform-html-test-case Filter-HAML "a|haml" ("%a") "a#q.x.y.z|haml" ("%a#q.x.y.z") "a#q.x x=y m=l|haml" ("%a#q.x{:x => \"y\", :m => \"l\"}") @@ -382,7 +382,7 @@ " %a{:href => \"#\"}" " %br")) -(define-zencoding-transform-html-test-case Filter-Hiccup +(define-emmet-transform-html-test-case Filter-Hiccup "a|hic" ("[:a]") "a#q.x.y.z|hic" ("[:a#q.x.y.z]") "a#q.x x=y m=l|hic" ("[:a#q.x {:x \"y\", :m \"l\"}]") @@ -399,21 +399,21 @@ " \"m\"" " [:b]]]")) -(define-zencoding-transform-html-test-case Filter-escape +(define-emmet-transform-html-test-case Filter-escape "script src="|e" ("<script src=\"&quot;\">" "</script>")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; CSS-abbrev tests -(defmacro define-zencoding-unit-test-case (name fn &rest tests) - `(zencoding-test-cases 'assign ',name +(defmacro define-emmet-unit-test-case (name fn &rest tests) + `(emmet-test-cases 'assign ',name ,fn ',(loop for x on tests by #'cddr collect (cons (car x) (cadr x))))) -(define-zencoding-unit-test-case CSS-toknize - #'zencoding-css-toknize +(define-emmet-unit-test-case CSS-toknize + #'emmet-css-toknize "" ("") "abc" ("abc") "abc+" ("abc+") @@ -427,8 +427,8 @@ "-abc+-xyz" ("-abc" "-xyz") "-abc+-10" ("-abc+-10")) -(define-zencoding-unit-test-case CSS-parse-arg-number - #'zencoding-css-arg-number +(define-emmet-unit-test-case CSS-parse-arg-number + #'emmet-css-arg-number "" (error "expected css number arguments") "0" (("0" "px") . "") "0-1-2" (("0" "px") . "1-2") @@ -437,8 +437,8 @@ "35p#a" (("35" "%") . "#a") " 0p" (("0" "%") . "")) -(define-zencoding-unit-test-case CSS-parse-arg-color - #'zencoding-css-arg-color +(define-emmet-unit-test-case CSS-parse-arg-color + #'emmet-css-arg-color "" (error "expected css color argument") "abc" (error "expected css color argument") "#x" (error "expected css color argument") @@ -451,29 +451,29 @@ "#1A2B3C4D-2" ("#1A2B3C" . "4D-2") " #abc" ("#abc" . "")) -(define-zencoding-unit-test-case CSS-parse-arg-something - #'zencoding-css-arg-something +(define-emmet-unit-test-case CSS-parse-arg-something + #'emmet-css-arg-something "" (error "expected css argument") "abc" ("abc" . "") "abc def" ("abc" . " def") "url(http://abc.com) auto" ("url(http://abc.com)" . " auto")) -(define-zencoding-unit-test-case CSS-parse-args - #'zencoding-css-parse-args +(define-emmet-unit-test-case CSS-parse-args + #'emmet-css-parse-args "" nil "1-2--3-4" (("1" "px") ("2" "px") ("-3" "px") ("4" "px")) "-10-2p-30#abc" (("-10" "px") ("2" "%") ("-30" "px") "#abc") "1p2x3-4e5x" (("1" "%") ("2" "ex") ("3" "px") ("4" "em") ("5" "ex")) "#abc#de#f-3" ("#abc" "#dedede" "#fff" ("-3" "px"))) -(define-zencoding-unit-test-case CSS-split-vendor-prefixes - #'zencoding-css-split-vendor-prefixes +(define-emmet-unit-test-case CSS-split-vendor-prefixes + #'emmet-css-split-vendor-prefixes "" ("" nil) "-abc" ("abc" auto) "-wmso-abc" ("abc" (119 109 115 111))) -(define-zencoding-unit-test-case CSS-exprs - #'zencoding-css-expr +(define-emmet-unit-test-case CSS-exprs + #'emmet-css-expr "" (("" nil nil)) "cl:l+ov:h+bg+" (("cl:l" nil nil) ("ov:h" nil nil) ("bg+" nil nil)) "m10-auto!" (("m" nil t ("10" "px") "auto")) @@ -482,12 +482,12 @@ ("p" nil nil ("0" "px") ("0" "px"))) "bg+#abc#bc#c-3!" (("bg+" nil t "#abc" "#bcbcbc" "#ccc" ("-3" "px")))) -(defmacro define-zencoding-transform-css-test-case (name &rest tests) - `(define-zencoding-transform-test-case ,name - 'zencoding-css-transform +(defmacro define-emmet-transform-css-test-case (name &rest tests) + `(define-emmet-transform-test-case ,name + 'emmet-css-transform ,@tests)) -(define-zencoding-transform-css-test-case CSS-transform +(define-emmet-transform-css-test-case CSS-transform ;; supplying values with units "m10" ("margin: 10px;") "m1.5" ("margin: 1.5em;") @@ -537,4 +537,4 @@ ) ;; start -(zencoding-test-cases) \ No newline at end of file +(emmet-test-cases) diff --git a/tools/json2hash b/tools/json2hash index 8dbe9ae..e46936c 100755 --- a/tools/json2hash +++ b/tools/json2hash @@ -73,7 +73,7 @@ def main(): out.write(';; This file is generated from ' + ','.join(options.file) + '\n') out.write(';; Don\'t edit.\n') if options.defvar: - out.write(u'(zencoding-defparameter ' + options.defvar + u'\n') + out.write(u'(emmet-defparameter ' + options.defvar + u'\n') p.write(out) if options.defvar: out.write(')\n')