[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master 97b9fdf 14/46: tiny.el: fixed up the previous change.
From: |
Oleh Krehel |
Subject: |
[elpa] master 97b9fdf 14/46: tiny.el: fixed up the previous change. |
Date: |
Sun, 22 Mar 2015 17:42:28 +0000 |
branch: master
commit 97b9fdf4426c182db3a36af79db98f8d7f25497f
Author: Oleh Krehel <address@hidden>
Commit: Oleh Krehel <address@hidden>
tiny.el: fixed up the previous change.
---
tiny.el | 179 +++++++++++++++++++++++++++++++++++++++------------------------
1 files changed, 111 insertions(+), 68 deletions(-)
diff --git a/tiny.el b/tiny.el
index ec7de1b..43a2df6 100644
--- a/tiny.el
+++ b/tiny.el
@@ -45,25 +45,26 @@
;; m5 10
;; m5,10
;; m5 10*xx
-;; m5 10*xx&x
-;; m5 10*xx&&0x&x
-;; m25+x?a&c
-;; m25+x?A&c
+;; m5 10*xx%x
+;; m5 10*xx|0x%x
+;; m25+x?a%c
+;; m25+x?A%c
;; m97,122stringx
;; m97,122stringxx
;; m97,120stringxupcasex
;; m97,120stringxupcasex)x
-;; m\n;; 10 &%(+ x x) and %(* x x) and &s
+;; m\n;; 10|%(+ x x) and %(* x x) and %s
;; m10*2+3x
;; m\n;; 10expx
-;; m5\n;; 20expx&014.2f
-;; m, 7&&0x&02x
-;; m1\n14&*** TODO http://emacsrocks.com/e&02d.html
-;; m1\n10&&convert img&s.jpg -monochrome -resize 50% -rotate 180 img&s_mono.pdf
-;; (setq foo-list '(m1 11+x96&?&c))
-;; m1\n10listx+x96&&convert img&s.jpg -monochrome -resize 50% -rotate 180
img&c_mono.pdf
-;; m1\n10listxnthxfoo-list&&convert img&s.jpg -monochrome -resize 50% -rotate
180 img&c_mono.pdf
-;; m\n;; 16list*xxx)*xx&s:&s:&s
+;; m5\n;; 20expx%014.2f
+;; m, 7|0x%02x
+;; m1\n14|*** TODO http://emacsrocks.com/e%02d.html
+;; m1\n10|convert img%s.jpg -monochrome -resize 50%% -rotate 180 img%s_mono.pdf
+;; (setq foo-list '(m1 11+x96|?%c))
+;; m1\n10listx+x96|convert img%s.jpg -monochrome -resize 50%% -rotate 180
img%c_mono.pdf
+;; m1\n10listxnthxfoo-list|convert img%s.jpg -monochrome -resize 50%% -rotate
180 img%c_mono.pdf
+;; m\n;; 16list*xxx)*xx%s:%s:%s
+;; m\n8|**** TODO Learning from Data Week %(+ x 2) \nSCHEDULED: <%(t-date "Oct
7" (* x 7))> DEADLINE: <%(t-date "Oct 14" (* x 7))>
;;
;; As you might have guessed, the syntax is as follows:
;; m[<range start:=0>][<separator:= >]<range end>[lisp expr][&][format expr]
@@ -172,63 +173,82 @@ expression."
(s1 (or (nth 1 parsed) " "))
(n2 (nth 2 parsed))
(expr (or (nth 3 parsed) "x"))
- (fmt (tiny-extract-sexps (or (nth 4 parsed) "%s")))
- (n-uses (or (nth 5 parsed) 1))
- (lexpr (read expr))
- (n-items (if (and (listp lexpr) (eq (car lexpr) 'list))
- (1- (length lexpr))
- 0))
+ (lexpr (read expr))
+ (n-have (if (and (listp lexpr) (eq (car lexpr) 'list))
+ (1- (length lexpr))
+ 0))
+ (expr (if (zerop n-have) `(list ,lexpr) lexpr))
+ (n-have (if (zerop n-have) 1 n-have))
+ (tes (tiny-extract-sexps (or (nth 4 parsed) "%s")))
+ (fmt (car tes))
+ (n-need (cl-count nil (cdr tes)))
+ (idx -1)
(format-expression
- (concat "(mapconcat (lambda(x) (let (("
- (if (zerop n-items) "y" "lst") " %s)) (format \"%s\" "
- (mapconcat #'identity
- (loop for i from 0 to (1- n-items)
- collecting (format "(nth %d lst)" i))
- " ")
- (mapconcat #'identity (cdr fmt) " ")
- (if (or (equal expr "x") (> n-items 0)) "x " "y ")
- (mapconcat #'identity
- (loop for i from (1+ n-items) to (1- n-uses)
- collecting "x")
+ (concat "(mapconcat (lambda(x) (let ((lst %s)) (format \"%s\" "
+ (mapconcat (lambda (x) (or x
+ (if (>= (1+ idx) n-have)
+ "x"
+ (format "(nth %d lst)" (incf idx)))))
+ (cdr tes)
" ")
")))(number-sequence %s %s) \"%s\")")))
(unless (>= (read n1) (read n2))
(format
format-expression
expr
- (car fmt)
+ fmt
n1
n2
s1))))
(defun tiny-extract-sexps (str)
- "Replace all %(...) forms in STR with %s.
-Return (STR forms)."
- (let (forms beg)
+ "Retruns (STR & FORMS), where each element of FORMS
+corresponds to a `format'-style % form in STR.
+
+ * %% forms are skipped
+ * %(sexp) is replaced with %s in STR, and put in FORMS
+ * the rest of forms are untouched in STR, and put as nil in FORMS"
+ (let ((start 0)
+ forms beg)
(condition-case nil
- (while (setq beg (string-match "%(" str))
+ (while (setq beg (string-match "%" str start))
(incf beg)
- (destructuring-bind (sexp . end) (read-from-string str beg)
- (push (substring str beg end) forms)
- (setq str (concat (substring str 0 (1- beg))
- "s"
- (substring str end)))))
+ (setq start beg)
+ (case (aref str beg)
+ (?% (incf start))
+ (?\( (destructuring-bind (sexp . end) (read-from-string str beg)
+ (push (substring str beg end) forms)
+ (setq str (concat (substring str 0 beg)
+ "s"
+ (substring str end)))))
+ (t (push nil forms))))
(error (message "Malformed sexp: %s" (substring str beg))))
(cons str (nreverse forms))))
+(defun tiny-extract-sexps-test ()
+ (equal
+ (tiny-extract-sexps "expr1 %(+ x x), nothing %% char %c, hex %x, and expr2
%(* x x), float %0.2f and sym %s")
+ '("expr1 %s, nothing %% char %c, hex %x, and expr2 %s, float %0.2f and sym
%s"
+ "(+ x x)" nil nil "(* x x)" nil nil)))
+
(defun tiny-mapconcat-parse ()
"Try to match a snippet of this form:
-m[START][SEPARATOR]END[EXPR][FORMAT]
+m[START][SEPARATOR]END[EXPR]|[FORMAT]
-* START - integer, default is 0
-* SEPARATOR - string, default is " "
-* END - integer, required
-* EXPR - lisp expression.
- Parens are optional if it's unambiguous, e.g.
- `(* 2 (+ x 3))' can be shortened to *2+x3,
- and `(exp x)' can be shortened to expx.
+* START - integer (defaults to 0)
+* SEPARATOR - string (defaults to \" \")
+* END - integer (required)
+* EXPR - lisp expression: function body with argument x (defaults to x)
+ Parens are optional if it's unambiguous:
+ - `(* 2 (+ x 3))' <-> *2+x3
+ - `(exp x)' <-> expx
A closing paren may be added to resolve ambiguity:
- *2+x3"
+ - `(* 2 (+ x 3) x) <-> *2+x3)
+* FORMAT - string, `format'-style (defaults to \"%s\")
+ | separator can be omitted if FORMAT starts with %.
+
+Return nil if nothing was matched, otherwise
+ (START SEPARATOR END EXPR FORMAT)"
(let (n1 s1 n2 expr fmt str n-uses)
(when (catch 'done
(cond
@@ -253,7 +273,7 @@ m[START][SEPARATOR]END[EXPR][FORMAT]
;; or [expr][fmt]
;;
;; First, try to match [expr][fmt]
- (string-match "^\\(.*?\\)\\(&.*\\)?$" str)
+ (string-match "^\\(.*?\\)\\(%.*\\)?$" str)
(setq expr (match-string-no-properties 1 str))
(setq fmt (match-string-no-properties 2 str))
;; If it's a valid expression, we're done
@@ -271,29 +291,16 @@ m[START][SEPARATOR]END[EXPR][FORMAT]
n1 nil))
;; match expr_fmt
(unless (zerop (length str))
- (if (string-match "^:?\\([^\n&]*?\\)\\(&[^\n]*\\)?$" str)
+ (if (or (string-match "^\\([^\n%|]*?\\)|\\([^\n]*\\)?$" str)
+ (string-match "^\\([^\n%|]*?\\)\\(%[^\n]*\\)?$" str))
(progn
(setq expr (tiny-tokenize (match-string-no-properties 1
str)))
(setq fmt (match-string-no-properties 2 str)))
(error "couldn't match %s" str)))
+ (when (equal expr "")
+ (setq expr nil))
t)
- (when fmt
- ;; & at the beginning is either a part of format expression
- ;; or just a separator
- (when (string-match "^&&" fmt)
- (setq fmt (substring fmt 2)))
- (when (eq (aref fmt 0) ?&)
- (unless (string-match "^&[+-#
0]*[0-9]*.?[0-9]*\\(?:s\\|d\\|o\\|x\\|X\\|e\\|f\\|g\\|c\\|S\\)" fmt)
- (setq fmt (substring fmt 1))))
- (setq n-uses (cl-count ?& fmt))
- (setq fmt
- (replace-regexp-in-string
- "&" "%"
- (replace-regexp-in-string
- "%" "%%" fmt))))
- (list n1 s1 n2
- (unless (equal expr "") expr)
- fmt n-uses))))
+ (list n1 s1 n2 expr fmt))))
;; TODO: check for arity: this doesn't work: exptxy
(defun tiny-tokenize (str)
@@ -365,5 +372,41 @@ m[START][SEPARATOR]END[EXPR][FORMAT]
(apply #'concat (nreverse out))
(make-string n-paren ?\))))))
+(defun tiny-mapconcat-parse-test ()
+ (let* ((tests
+ '(("m10" (nil nil "10" nil nil))
+ ("m5 10" ("5" " " "10" nil nil))
+ ("m5,10" ("5" "," "10" nil nil))
+ ("m5 10*xx" ("5" " " "10" "(* x x)" nil))
+ ("m5 10*xx%x" ("5" " " "10" "(* x x)" "%x"))
+ ("m5 10*xx|0x%x" ("5" " " "10" "(* x x)" "0x%x"))
+ ("m25+x?a%c" (nil nil "25" "(+ x 97)" "%c"))
+ ("m25+x?A%c" (nil nil "25" "(+ x 65)" "%c"))
+ ("m97,122stringx" ("97" "," "122" "(string x)" nil))
+ ("m97,122stringxx" ("97" "," "122" "(string x x)" nil))
+ ("m97,120stringxupcasex" ("97" "," "120" "(string x (upcase x))"
nil))
+ ("m97,120stringxupcasex)x" ("97" "," "120" "(string x (upcase x)
x)" nil))
+ ("m\\n;; 10|%(+ x x) and %(* x x) and %s"
+ (nil "\\n;; " "10" nil "%(+ x x) and %(* x x) and %s"))))
+ (fails (cl-remove-if
+ (lambda (test)
+ (equal (cadr test)
+ (with-temp-buffer
+ (insert (car test))
+ (tiny-mapconcat-parse))))
+ tests)))
+ (when fails
+ (message "`tiny-test' fails %s" fails))))
+;; (tiny-mapconcat-parse-test)
+
+(defun t-date (s &optional shift)
+ (let ((time (->> (current-time)
+ decode-time
+ (org-read-date-analyze s nil)
+ (apply 'encode-time))))
+ (when shift
+ (setq time (time-add time (days-to-time shift))))
+ (format-time-string "%Y-%m-%d %a" time)))
+
(provide 'tiny)
;;; tiny.el ends here
- [elpa] master 7cc4e00 07/46: tiny.el: x can be reused in format string., (continued)
- [elpa] master 7cc4e00 07/46: tiny.el: x can be reused in format string., Oleh Krehel, 2015/03/22
- [elpa] master d053709 08/46: tiny.el: expr now can return a list., Oleh Krehel, 2015/03/22
- [elpa] master 03aef85 09/46: tiny.el: fixed a bug introduced by previous commit., Oleh Krehel, 2015/03/22
- [elpa] master 835c63e 12/46: tiny.el: fixed a small whitespace issue in `tiny-tokenize'., Oleh Krehel, 2015/03/22
- [elpa] master 36c8dc0 10/46: tiny.el: added missing functions., Oleh Krehel, 2015/03/22
- [elpa] master 067e820 11/46: tiny.el: improved `tiny-mapconcat` and `tiny-mapconcat-parse'., Oleh Krehel, 2015/03/22
- [elpa] master cad8e50 13/46: tiny.el: added the option to include %(sexps) into the format string., Oleh Krehel, 2015/03/22
- [elpa] master 78241c4 15/46: tiny.el: fixed a bug for expansion of m5%x., Oleh Krehel, 2015/03/22
- [elpa] master 29b5b76 16/46: Added README.md, Oleh Krehel, 2015/03/22
- [elpa] master b9c35e1 17/46: README.md: minor update., Oleh Krehel, 2015/03/22
- [elpa] master 97b9fdf 14/46: tiny.el: fixed up the previous change.,
Oleh Krehel <=
- [elpa] master 80e64b8 18/46: README.md: minor update., Oleh Krehel, 2015/03/22
- [elpa] master 2bd9abb 21/46: tiny.el: moved tests to tiny-test.el., Oleh Krehel, 2015/03/22
- [elpa] master b99315d 20/46: tiny.el: updated the doc., Oleh Krehel, 2015/03/22
- [elpa] master 11722a1 19/46: tiny.el: fixed typos., Oleh Krehel, 2015/03/22
- [elpa] master b4fff55 23/46: tiny.el: fixed `tiny-tokenize', Oleh Krehel, 2015/03/22
- [elpa] master 5df4f79 25/46: tiny.el: removed `tiny-beginning-of-string', Oleh Krehel, 2015/03/22
- [elpa] master 8a3cab0 27/46: tiny.el: removed `tiny-replace-preceding-sexp', Oleh Krehel, 2015/03/22
- [elpa] master f1d1a2e 22/46: tiny-test.el: switched to ERT., Oleh Krehel, 2015/03/22
- [elpa] master 4c87ade 29/46: tiny.el: fixed a bug in `tiny-mapconcat-parse'., Oleh Krehel, 2015/03/22
- [elpa] master a6e4144 30/46: tiny.el (tiny-extract-sexps): can handle e.g. %0.1f(...) style formatting., Oleh Krehel, 2015/03/22