From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tobias Zawada Subject: Bug in org-lob: Function call adds space to argument string with parenthesis Date: Fri, 18 Dec 2015 08:46:42 +0000 Message-ID: Mime-Version: 1.0 Content-Type: multipart/related; boundary="_004_b7e5f0cd5b2f4bfb91e06c3a695e9489VSExchange1DD1itilocal_"; type="multipart/alternative" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:52064) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a9r0c-0002iP-F0 for emacs-orgmode@gnu.org; Fri, 18 Dec 2015 04:07:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a9r0X-0000We-Fn for emacs-orgmode@gnu.org; Fri, 18 Dec 2015 04:07:30 -0500 Received: from mail.itisim.com ([94.135.232.140]:49482) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a9r0W-0000WU-UZ for emacs-orgmode@gnu.org; Fri, 18 Dec 2015 04:07:25 -0500 Content-Language: de-DE List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: "emacs-orgmode@gnu.org" --_004_b7e5f0cd5b2f4bfb91e06c3a695e9489VSExchange1DD1itilocal_ Content-Type: multipart/alternative; boundary="_000_b7e5f0cd5b2f4bfb91e06c3a695e9489VSExchange1DD1itilocal_" --_000_b7e5f0cd5b2f4bfb91e06c3a695e9489VSExchange1DD1itilocal_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable * Bug in org-lob: Function call adds space to argument string with parenthe= sis Dear all, Please see the following code. I would expect arg=3D"()" as result of the= call-line but the result is arg=3D"() " with an additional space. #+NAME: test #+BEGIN_SRC emacs-lisp :var arg=3D"" (message "arg=3D%S" arg) #+END_SRC #+RESULTS: : arg=3D"" #+call: test(arg=3D"()") #+RESULTS: : arg=3D"() " * My current fast and dirty hack is using sexps instead of regular expressi= ons: #+BEGIN_SRC emacs-lisp (require 'ob-lob) (defadvice org-babel-lob-get-info (around correct-args activate) "Return a Library of Babel function call as a list. 1st element is the function call as a string. 2nd element is the indentation width 3rd element is the name of the function call if this call is named." (setq ad-return-value (let ((case-fold-search t) (nonempty (lambda (a = b) = (let ((it (match-string a))) = (if (=3D (length it) 0) (match-string b) it))))) (save-excursion (beginning-of-line 1) (when (looking-at org-b= abel-lob-one-liner-regexp) (append (list (if (=3D (leng= th (match-string 12)) 0) = (org-babel-lob-get-info-call-line) (org= -babel-lob-get-info-inline))) (list (length (if (= =3D (length (match-string 12)) 0) = (match-string 2) (match-string 11))) (save-= excursion (for= ward-line -1) (and= (looking-at (concat org-babel-src-name-regexp = "\\([^\n]*\\)$")) = (org-no-properties (match-string 1))))))))))) (defun org-babel-lob-get-info-call-line () "Unify Library of Babel call string of form \"#+CALL:\" The unified syntax is ,,#+CALL: []() " (save-excursion (save-match-data (let ((name "") (inside-header-args "[]") (args "()") end-header-args) (skip-syntax-forward " ") (unless (looking-at "#\\+call:[[:space:]]+\\(\\(?:\\sw\\|\\= s_\\)+\\)") (error "Expecting #+CALL: at beginning of line")) (setq name (match-string 1)) (goto-char (match-end 0)) (skip-syntax-forward " ") (when (eq (char-after) ?\[) ;; inside-header-args (setq inside-header-args (buffer-substring-no-properties = (point) (goto-char (scan-sexps (point) 1))))) (skip-syntax-forward " ") (when (eq (char-after) ?\() (setq args (buffer-substring-no-properties (point) (goto-= char (scan-sexps (point) 1))))) (setq end-header-args (buffer-substring-no-properties (poin= t) (line-end-position))) (concat name inside-header-args args end-header-args))))) (defun org-babel-lob-get-info-inline () "Transform one-line Library of Babel calls of form call_[]()[] into the unified synt= ax ,,#+CALL: []() " (save-excursion (save-match-data (let ((name "") (inside-header-args "[]") (args "()") (end-header-args "")) (skip-syntax-forward " ") (unless (looking-at "call_\\(\\(?:\\sw\\|\\s_\\)+\\)") (error "Expecting #+CALL: at beginning of line")) (setq name (match-string 1)) (goto-char (match-end 0)) (skip-syntax-forward " ") (when (eq (char-after) ?\[) ;; inside-header-args (setq inside-header-args (buffer-substring-no-properties = (point) (goto-char (scan-sexps (point) 1))))) (skip-syntax-forward " ") (when (eq (char-after) ?\() (setq args (buffer-substring-no-properties (point) (goto-= char (scan-sexps (point) 1))))) (when (eq (char-after) ?\[) (setq end-header-args (buffer-substring-no-properties (1+= (point)) (1- (scan-sexps (point) 1))))) (concat name inside-header-args args end-header-args))))) #+END_SRC Emacs : GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK+ Version 3.14.13) of 2015-06-23 on desktop-new Package: Org-mode version 8.3.2 Mit freundlichen Gr=FC=DFen / Best regards Tobias Zawada Engineering / Software Development T +49 (351) 26050 0 F +49 (351) 26050 155 Zawada@itisim.com itisim.com ________________________________ SimulationX 3.7 now available More information Always up to date Subscribe to the ITI Newsletter! [cid:Charta-der-Vielfalt-Logo_2ed28c31-dc91-41ff-ad23-4b8bdeebfbf2.png] ________________________________ ITI GmbH Schweriner Stra=DFe 1 01067 Dresden Germany Managing Director/Gesch=E4ftsf=FChrer Dr. Andreas Uhlig Commercial Register/Handelsregister Amtsgericht Dresden =B7 HRB 2331 USt.-IdNr.: DE140297717 Diese E-Mail ist streng vertraulich und nur f=FCr den Empf=E4nger bestimmt. Sie kann Informationen enthalten, die rechtliche, gesch=E4ftliche oder ande= re Verg=FCnstigungen bedeuten. Sollten Sie nicht der ausdr=FCckliche Empf=E4nger sein, d=FCrfen Sie diese = Informationen nicht benutzen, ver=F6ffentlichen oder vervielf=E4ltigen. The information in this e-mail is strictly confidential, is intended solely= for the addressee, and may be privileged. If you are not the intended addressee you must not disclose, print or take = action based upon this transmission and should delete it from your system. --_000_b7e5f0cd5b2f4bfb91e06c3a695e9489VSExchange1DD1itilocal_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

* Bug in org-lob: Function call adds space to argume= nt string with parenthesis

Dear all,

  Please see the following code. I would expect= arg=3D"()" as result of the  call-line but the result is ar= g=3D"() " with an additional space.

 

  #+NAME: test

  #+BEGIN_SRC emacs-lisp :var arg=3D"&= quot;

(message "arg=3D%S" arg)

  #+END_SRC

 

  #+RESULTS:

  : arg=3D""

 

  #+call: test(arg=3D"()")

 

  #+RESULTS:

  : arg=3D"() "

 

 

* My current fast and dirty hack is using sexps inst= ead of regular expressions:

 

  #+BEGIN_SRC emacs-lisp

(require 'ob-lob)

(defadvice org-babel-lob-get-info (around correct-ar= gs activate)

  "Return a Library of Babel function call= as a list.

1st element is the function call as a string.

2nd element is the indentation width

3rd element is the name of the function call if this= call is named."

  (setq ad-return-value (let ((case-fold-search= t)

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;       (nonempty (lambda (a b)

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;          (let ((it (match-str= ing a)))

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;            (if (=3D= (length it) 0) (match-string b) it)))))

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;   (save-excursion

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;     (beginning-of-line 1)

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;     (when (looking-at org-babel-lob-one-liner-regexp)<= o:p>

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;       (append

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;        (list (if (=3D (length (match-st= ring 12)) 0)

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;        (org-babel-lob-get-info-cal= l-line)

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            (org-babel-= lob-get-info-inline)))

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;        (list (length (if (=3D (length (= match-string 12)) 0)

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            (match= -string 2) (match-string 11)))

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;          (save-excursion

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            (forward-li= ne -1)

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            (and (looki= ng-at (concat org-babel-src-name-regexp

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;      "\\([^\n]*\\)$"))<= /p>

        &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;           &nbs= p;            &= nbsp;            (org-no-= properties (match-string 1)))))))))))

 

(defun org-babel-lob-get-info-call-line ()

  "Unify Library of Babel call string of f= orm \"#+CALL:\"

The unified syntax is

,,#+CALL: <name>[<inside header argumen= ts>](<arguments>) <end header arguments>"

  (save-excursion

    (save-match-data

      (let ((name "&qu= ot;)

        &nbs= p;           (inside-header-ar= gs "[]")

        &nbs= p;           (args "()&qu= ot;)

        &nbs= p;           end-header-args)<= o:p>

        &nbs= p;       (skip-syntax-forward " ")<= o:p>

        &nbs= p;       (unless (looking-at "#\\+ca= ll:[[:space:]]+\\(\\(?:\\sw\\|\\s_\\)+\\)")

        &nbs= p;         (error "Expecting #+= CALL: at beginning of line"))

        &nbs= p;       (setq name (match-string 1))

        &nbs= p;       (goto-char (match-end 0))=

        &nbs= p;       (skip-syntax-forward " ")<= o:p>

        &nbs= p;       (when (eq (char-after) ?\[) ;; insid= e-header-args

        &nbs= p;         (setq inside-header-args (buf= fer-substring-no-properties (point) (goto-char (scan-sexps (point) 1)))))

        &nbs= p;       (skip-syntax-forward " ")<= o:p>

        &nbs= p;       (when (eq (char-after) ?\()

        &nbs= p;         (setq args (buffer-substring-= no-properties (point) (goto-char (scan-sexps (point) 1)))))

        &nbs= p;       (setq end-header-args (buffer-substr= ing-no-properties (point) (line-end-position)))

        &nbs= p;       (concat name inside-header-args args= end-header-args)))))

 

(defun org-babel-lob-get-info-inline ()

  "Transform one-line Library of Babel cal= ls of form call_<name>[<inside header arguments>](<arguments= >)[<end header arguments>] into the unified syntax

,,#+CALL: <name>[<inside header argumen= ts>](<arguments>) <end header arguments>"

  (save-excursion

    (save-match-data

      (let ((name "&qu= ot;)

        &nbs= p;           (inside-header-ar= gs "[]")

        &nbs= p;           (args "()&qu= ot;)

        &nbs= p;           (end-header-args = ""))

        &nbs= p;       (skip-syntax-forward " ")<= o:p>

        &nbs= p;       (unless (looking-at "call_\\(\\= (?:\\sw\\|\\s_\\)+\\)")

        &nbs= p;         (error "Expecting #+= CALL: at beginning of line"))

        &nbs= p;       (setq name (match-string 1))

        &nbs= p;       (goto-char (match-end 0))=

        &nbs= p;       (skip-syntax-forward " ")<= o:p>

        &nbs= p;       (when (eq (char-after) ?\[) ;; insid= e-header-args

        &nbs= p;         (setq inside-header-args (buf= fer-substring-no-properties (point) (goto-char (scan-sexps (point) 1)))))

        &nbs= p;       (skip-syntax-forward " ")<= o:p>

        &nbs= p;       (when (eq (char-after) ?\()

        &nbs= p;         (setq args (buffer-substring-= no-properties (point) (goto-char (scan-sexps (point) 1)))))

        &nbs= p;       (when (eq (char-after) ?\[)

        &nbs= p;         (setq end-header-args (buffer= -substring-no-properties (1+ (point)) (1- (scan-sexps (point) 1)))))

        &nbs= p;       (concat name inside-header-args args= end-header-args)))))

  #+END_SRC

 

 

  Emacs  : GNU Emacs 24.5.1 (x86_64-unknow= n-cygwin, GTK+ Version 3.14.13)

of 2015-06-23 on desktop-new<= /o:p>

Package: Org-mode version 8.3.2

 

Mit freundlichen Gr=FC=DFen /= Best regards

Tobias Zawada
Engineering / Software Development

T

+49 (351) 26050 0<= /o:p>

F

+49 (351) 26050 155

Zawada@itisim.com

 

= itisim.com
____________= ____________________

SimulationX 3.7 now available
More information

Always up to date
Subscribe to the ITI Newsletter!


________________________________

<= span id=3D"c1-id-43" style=3D"COLOR: #e30916">ITI G= mbH
Schweriner Stra=DFe 1
01067 Dresden
Germany

<= font color=3D"#d52b1e">Manag= ing Director/Gesch=E4ftsf=FChrer
Dr. Andreas Uhlig

<= font color=3D"#d52b1e">Comme= rcial Register/Handelsregister
Amtsgericht Dresden =B7 HRB 2331
USt.-IdNr.: DE140297717

Di= ese E-Mail ist streng vertraulich und nur f=FCr den Empf=E4nger bestimmt. Sie kann Informationen enthalten, die rechtliche, gesch=E4ftliche oder ande= re Verg=FCnstigungen bedeuten.
Sollten Sie nicht der ausdr=FCckliche Empf=E4nger sein, d=FCrfen Sie diese = Informationen nicht benutzen, ver=F6ffentlichen oder vervielf=E4ltigen.

Th= e information in this e-mail is strictly confidential, is intended solely f= or the addressee, and may be privileged.
If you are not the intended addressee you must not disclose, print or take = action based upon this transmission and should delete it from your system.<= /span>

--_000_b7e5f0cd5b2f4bfb91e06c3a695e9489VSExchange1DD1itilocal_-- --_004_b7e5f0cd5b2f4bfb91e06c3a695e9489VSExchange1DD1itilocal_ Content-Type: image/png; name="Charta-der-Vielfalt-Logo_2ed28c31-dc91-41ff-ad23-4b8bdeebfbf2.png" Content-Description: Charta-der-Vielfalt-Logo_2ed28c31-dc91-41ff-ad23-4b8bdeebfbf2.png Content-Disposition: inline; filename="Charta-der-Vielfalt-Logo_2ed28c31-dc91-41ff-ad23-4b8bdeebfbf2.png"; size=6608; creation-date="Fri, 18 Dec 2015 08:47:05 GMT"; modification-date="Fri, 18 Dec 2015 08:47:05 GMT" Content-ID: Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAMgAAAA9CAMAAADf2dYGAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAABBJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5z OmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1 bWVudElEPSJ1dWlkOjVCMjA4OTI0OTNCRkRCMTE5MTRBODU5MEQzMTUwOEM4IiB4bXBNTTpEb2N1 bWVudElEPSJ4bXAuZGlkOkI0MzU0QTJGOTc0RDExRTVBNDJGRTFCQ0VEQjE0NUY1IiB4bXBNTTpJ bnN0YW5jZUlEPSJ4bXAuaWlkOkI0MzU0QTJFOTc0RDExRTVBNDJGRTFCQ0VEQjE0NUY1IiB4bXA6 Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVy aXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBOTlEMzlCRjk3NDgxMUU1QjFDMjkw NDM0MjVBRUM4QSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBOTlEMzlDMDk3NDgxMUU1QjFD MjkwNDM0MjVBRUM4QSIvPiA8ZGM6dGl0bGU+IDxyZGY6QWx0PiA8cmRmOmxpIHhtbDpsYW5nPSJ4 LWRlZmF1bHQiPkNoYXJ0YSBkZXIgVmllbGZhbHQtTGVpdGZhZGVuLVVudGVyemVpY2huZXItVjE8 L3JkZjpsaT4gPC9yZGY6QWx0PiA8L2RjOnRpdGxlPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6 UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpRYUNcAAAMAUExURe6IjgEIddrn 8BxcpLfM4wGO6YaGhXSZxv//+83SBNpQWDNnqvz//2pqacx8OwGKLVeFu5a1Xv3IAdHd7PLy8rkK noSkzPGqzPP2+kR5tOLq8gE6kmyUw0REQzFbpHrM77S0tPjHyKrB3WaHvQEXfvX5/LTG3yhjqfEA Aertiv7VA+Xl5c2TK9zc3Onp6jc3NtPT01hYV6W+28PT5v7NNwE0j87a6vz006LXtf78//yzAwEt ikuuaszMzCcnJeuOw7IBc/j4+AB4G/eMBnFxcYmpz/3cderx9fTM4JKs0q+8M+7z+Jqamv3WVPn+ /qSkpNcDDvcAVgEBAby8vMjm0eXna8rkABhNnJCQkAEghMTV6dXg7dr+Ae0Cb47V8v7stBgYF3uh yX5+fezt7hVVoAS3S6Pg86ysq2aPwJWmzTxxOGOrKVXA7fz//Juz1tjj76i+3MqyMZKx1P766MPD wwVLnVl+t+4yks3V5QFAlS9pc9RWqakfF//7Ab7Q5Ju41gFEmNvz/ASZSOkChf3mnfz8+wHO/QlN m/j6/fnb5cEYaz10sUyAuCJQnuolc0BjqJ252dx6t8kDg+5cqKG72YCdyOb1+vzw+rK92jpxsPn7 +gEpiBOX2s3xAO0SHek3QF6Lvvv8/letlsnY5+o5Dv/98/77/fDys77N4g5QndG6Dq3G3k92sgEl hsfV5////+z5/DZtrY+u03iPwglElwNHmRNElQG28t7o8v3GHgEvjeEApTAwLgEOmB8fHv/+//7/ /////f7+/v7//f7+/P7+///+/P/+/Q4ODZez2NLsAE9PTvR7I9jbIL7m9nGvgKq62pM8qBMmhMPa 7IdJKCqa3Cejxf7WIf3egEG269zkQ1SDXWp7s2ZbuZ/X9Pvx8P/3+kCydre3t+b27ENuriA4jlFq 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 --_004_b7e5f0cd5b2f4bfb91e06c3a695e9489VSExchange1DD1itilocal_--