aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/css-abbrev.el46
-rw-r--r--src/test.el19
-rw-r--r--zencoding-mode.el46
3 files changed, 75 insertions, 36 deletions
diff --git a/src/css-abbrev.el b/src/css-abbrev.el
index 3c528e8..72021ad 100644
--- a/src/css-abbrev.el
+++ b/src/css-abbrev.el
@@ -44,18 +44,26 @@
it
(cons input "")))))
+(defun zencoding-css-important-p (input)
+ (let ((len (length input)))
+ (and (< 0 len)
+ (char-equal (aref input (1- len)) ?!))))
+
(defun zencoding-css-parse-args (args)
- (let ((rt nil))
- (loop
- (zencoding-pif (zencoding-css-parse-arg args)
- (progn (push (car it) rt)
- (setf args (cdr it)))
- (return (nreverse rt))))))
+ (when args
+ (let ((rt nil))
+ (loop
+ (zencoding-pif (zencoding-css-parse-arg args)
+ (progn (push (car it) rt)
+ (setf args (cdr it)))
+ (return (nreverse rt)))))))
(defun zencoding-css-subexpr (exp)
- (let* ((exp (zencoding-css-split-args exp))
+ (let* ((importantp (zencoding-css-important-p exp))
+ (exp (zencoding-css-split-args
+ (if importantp (subseq exp 0 -1) exp)))
(args (cdr exp)))
- (when args (setf (cdr exp) (zencoding-css-parse-args args)))
+ (setf (cdr exp) (cons importantp (zencoding-css-parse-args args)))
exp))
(defun zencoding-css-toknize (str)
@@ -132,21 +140,31 @@
(let ((set it) (fn nil) (unitlessp nil))
(if (stringp set)
(progn
+ ;; new pattern
+ ;; creating print function
(setf fn (zencoding-css-instantiate-lambda set))
+ ;; get unitless or no
(setf unitlessp
(not (null (string-match
zencoding-css-unitless-properties-regex set))))
+ ;; caching
(puthash (car expr) (cons fn unitlessp) zencoding-css-snippets))
- (progn (setf fn (car set))
- (setf unitlessp (cdr set))))
- (apply fn
- (mapcar #'(lambda (arg)
+ (progn
+ ;; cache hit.
+ (setf fn (car set))
+ (setf unitlessp (cdr set))))
+ (let ((transformed
+ (apply fn
+ (mapcar
+ #'(lambda (arg)
(if (listp arg)
(if unitlessp (car arg)
(apply #'concat arg))
arg))
- (cdr expr))))
-
+ (cddr expr)))))
+ (if (cadr expr)
+ (concat (subseq transformed 0 -1) " !important;")
+ transformed)))
(concat (car expr) ":"
(zencoding-join-string
(mapcar #'(lambda (arg)
diff --git a/src/test.el b/src/test.el
index c0d7e2b..f7b7889 100644
--- a/src/test.el
+++ b/src/test.el
@@ -456,13 +456,13 @@
(define-zencoding-unit-test-case CSS-exprs
#'zencoding-css-expr
- "" ((""))
- "cl:l+ov:h+bg+" (("cl:l") ("ov:h") ("bg+"))
- "m10-auto" (("m" ("10" "px") "auto"))
- "bg++c" (("bg+") ("c"))
- "m+0-10-10--20+p0-0" (("m+" ("0" "px") ("10" "px") ("10" "px") ("-20" "px"))
- ("p" ("0" "px") ("0" "px")))
- "bg+#abc#bc#c-3" (("bg+" "#aabbcc" "#bcbcbc" "#cccccc" ("-3" "px"))))
+ "" (("" nil))
+ "cl:l+ov:h+bg+" (("cl:l" nil) ("ov:h" nil) ("bg+" nil))
+ "m10-auto" (("m" nil ("10" "px") "auto"))
+ "bg++c" (("bg+" nil) ("c" nil))
+ "m+0-10-10--20+p0-0" (("m+" nil ("0" "px") ("10" "px") ("10" "px") ("-20" "px"))
+ ("p" nil ("0" "px") ("0" "px")))
+ "bg+#abc#bc#c-3" (("bg+" nil "#aabbcc" "#bcbcbc" "#cccccc" ("-3" "px"))))
(defmacro define-zencoding-transform-css-test-case (name &rest tests)
`(define-zencoding-transform-test-case ,name
@@ -471,7 +471,10 @@
(define-zencoding-transform-css-test-case CSS-transform
"m0+p0-1p2e3x" ("margin:0px;"
- "padding:0px 1% 2em 3ex;"))
+ "padding:0px 1% 2em 3ex;")
+ "p!+m10e!+f" ("padding: !important;"
+ "margin:10em !important;"
+ "font:;"))
;; start
(zencoding-test-cases) \ No newline at end of file
diff --git a/zencoding-mode.el b/zencoding-mode.el
index 9958cbb..4016218 100644
--- a/zencoding-mode.el
+++ b/zencoding-mode.el
@@ -1585,18 +1585,26 @@ tbl))
it
(cons input "")))))
+(defun zencoding-css-important-p (input)
+ (let ((len (length input)))
+ (and (< 0 len)
+ (char-equal (aref input (1- len)) ?!))))
+
(defun zencoding-css-parse-args (args)
- (let ((rt nil))
- (loop
- (zencoding-pif (zencoding-css-parse-arg args)
- (progn (push (car it) rt)
- (setf args (cdr it)))
- (return (nreverse rt))))))
+ (when args
+ (let ((rt nil))
+ (loop
+ (zencoding-pif (zencoding-css-parse-arg args)
+ (progn (push (car it) rt)
+ (setf args (cdr it)))
+ (return (nreverse rt)))))))
(defun zencoding-css-subexpr (exp)
- (let* ((exp (zencoding-css-split-args exp))
+ (let* ((importantp (zencoding-css-important-p exp))
+ (exp (zencoding-css-split-args
+ (if importantp (subseq exp 0 -1) exp)))
(args (cdr exp)))
- (when args (setf (cdr exp) (zencoding-css-parse-args args)))
+ (setf (cdr exp) (cons importantp (zencoding-css-parse-args args)))
exp))
(defun zencoding-css-toknize (str)
@@ -1673,21 +1681,31 @@ tbl))
(let ((set it) (fn nil) (unitlessp nil))
(if (stringp set)
(progn
+ ;; new pattern
+ ;; creating print function
(setf fn (zencoding-css-instantiate-lambda set))
+ ;; get unitless or no
(setf unitlessp
(not (null (string-match
zencoding-css-unitless-properties-regex set))))
+ ;; caching
(puthash (car expr) (cons fn unitlessp) zencoding-css-snippets))
- (progn (setf fn (car set))
- (setf unitlessp (cdr set))))
- (apply fn
- (mapcar #'(lambda (arg)
+ (progn
+ ;; cache hit.
+ (setf fn (car set))
+ (setf unitlessp (cdr set))))
+ (let ((transformed
+ (apply fn
+ (mapcar
+ #'(lambda (arg)
(if (listp arg)
(if unitlessp (car arg)
(apply #'concat arg))
arg))
- (cdr expr))))
-
+ (cddr expr)))))
+ (if (cadr expr)
+ (concat (subseq transformed 0 -1) " !important;")
+ transformed)))
(concat (car expr) ":"
(zencoding-join-string
(mapcar #'(lambda (arg)