diff options
author | Ted Zlatanov <tzz@lifelogs.com> | 2012-05-15 04:47:38 -0400 |
---|---|---|
committer | Ted Zlatanov <tzz@lifelogs.com> | 2012-05-15 04:47:38 -0400 |
commit | 530e968e58a69071207897600ca2a019ea878600 (patch) | |
tree | 563a48eb196bf01c9edc174b3589565ac82cea0a /lisp/url/url-util.el | |
parent | 3a427266b688e084e908ae2ede9b6e373d8b0032 (diff) | |
download | emacs-530e968e58a69071207897600ca2a019ea878600.tar.gz |
add url-build-query-string and improve url-parse-query-string as per bug#8706
* url/url-util.el (url-build-query-string): New function.
(url-parse-query-string): Allow that '=' is not required and split
URL parameters on ';', not just '&'.
Diffstat (limited to 'lisp/url/url-util.el')
-rw-r--r-- | lisp/url/url-util.el | 67 |
1 files changed, 54 insertions, 13 deletions
diff --git a/lisp/url/url-util.el b/lisp/url/url-util.el index 71bc84cab09..18fc51f0d10 100644 --- a/lisp/url/url-util.el +++ b/lisp/url/url-util.el @@ -263,24 +263,65 @@ Will not do anything if `url-show-status' is nil." ;;;###autoload (defun url-parse-query-string (query &optional downcase allow-newlines) (let (retval pairs cur key val) - (setq pairs (split-string query "&")) + (setq pairs (split-string query "[;&]")) (while pairs (setq cur (car pairs) pairs (cdr pairs)) - (if (not (string-match "=" cur)) - nil ; Grace - (setq key (url-unhex-string (substring cur 0 (match-beginning 0)) - allow-newlines)) - (setq val (url-unhex-string (substring cur (match-end 0) nil) - allow-newlines)) - (if downcase - (setq key (downcase key))) - (setq cur (assoc key retval)) - (if cur - (setcdr cur (cons val (cdr cur))) - (setq retval (cons (list key val) retval))))) + (unless (string-match "=" cur) + (setq cur (concat cur "="))) + + (when (string-match "=" cur) + (setq key (url-unhex-string (substring cur 0 (match-beginning 0)) + allow-newlines)) + (setq val (url-unhex-string (substring cur (match-end 0) nil) + allow-newlines)) + (if downcase + (setq key (downcase key))) + (setq cur (assoc key retval)) + (if cur + (setcdr cur (cons val (cdr cur))) + (setq retval (cons (list key val) retval))))) retval)) +;;;###autoload +(defun url-build-query-string (query &optional semicolons keep-empty) + "Build a query-string. + +Given a QUERY in the form: +'((key1 val1) + (key2 val2) + (key3 val1 val2) + (key4) + (key5 "")) + +\(This is the same format as produced by `url-parse-query-string') + +This will return a string +\"key1=val1&key2=val2&key3=val1&key3=val2&key4&key5\". Keys may +be strings or symbols; if they are symbols, the symbol name will +be used. + +When SEMICOLONS is given, the separator will be \";\". + +When KEEP-EMPTY is given, empty values will show as \"key=\" +instead of just \"key\" as in the example above." + (mapconcat + (lambda (key-vals) + (let ((escaped + (mapcar (lambda (sym) + (url-hexify-string (format "%s" sym))) key-vals))) + (mapconcat (lambda (val) + (let ((vprint (format "%s" val)) + (eprint (format "%s" (car escaped)))) + (concat eprint + (if (or keep-empty + (and val (not (zerop (length vprint))))) + "=" + "") + vprint))) + (or (cdr escaped) '("")) (if semicolons ";" "&")))) + query (if semicolons ";" "&"))) + (defun url-unhex (x) (if (> x ?9) (if (>= x ?a) |