emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Bruno Barbier <brubar.cs@gmail.com>
To: Ihor Radchenko <yantar92@posteo.net>
Cc: Damien Cassou <damien@cassou.me>, emacs-orgmode@gnu.org
Subject: Re: PATCH: Re: Reading the parameters of a special-block
Date: Wed, 19 Oct 2022 20:18:37 +0200	[thread overview]
Message-ID: <E1olDZU-0005vE-Ky@lists.gnu.org> (raw)
In-Reply-To: <871qr5hgr1.fsf@localhost>

[-- Attachment #1: Type: text/plain, Size: 1092 bytes --]


Ihor Radchenko <yantar92@posteo.net> writes:

> The property name could be simply :parameters. Just like in src blocks
> (see org-element-src-block-parser).

Indeed. Done.


> We probably want something like
>
> :parameters (and (org-string-nw-p parameters) (org-trim parameters))
>
> Just as in org-element-src-block-parser.

Actually, I forgot to raise the question; but, you answered it anyway! ;-)
Done.


>
> No dangling ")" please.

Sorry. Fixed.


>
>> +    (format "#+begin_%s%s%s\n%s#+end_%s" block-type
>> +            (if (string= "" block-parameters-line) "" " ") block-parameters-line
>> +            contents block-type)))
>
> We will not need to test against ="" with my above comment incorporated.

For `:parameters', I'm now doing the same as in
`org-element-src-block-interpreter'.


> May also test against empty parameters and space-only parameters.

I added more tests.

I also added a new independent patch, to fix a bug when interpreting a special
block that has no content, and some tests.

Let me know if I did miss something,
And thank you for the review!


Bruno


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Fix no content --]
[-- Type: text/x-diff, Size: 2478 bytes --]

From ca4ab60a11330b97e1fb8c8d2941e383189fd82e Mon Sep 17 00:00:00 2001
From: Bruno BARBIER <brubar.cs@gmail.com>
Date: Wed, 19 Oct 2022 00:37:05 +0200
Subject: [PATCH 1/2] org-element-special-block-interpreter: Fix when no
 content

* lisp/org-element.el (org-element-special-block-interpreter): Use
empty string when content is nil.

*
testing/lisp/test-org-element.el (test-org-element/special-block-interpreter):
Test the case with no content.
---
 lisp/org-element.el              |  2 +-
 testing/lisp/test-org-element.el | 12 ++++++++++--
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/lisp/org-element.el b/lisp/org-element.el
index 7b26e877e..ca3b61b49 100644
--- a/lisp/org-element.el
+++ b/lisp/org-element.el
@@ -1910,7 +1910,7 @@ (defun org-element-special-block-interpreter (special-block contents)
   "Interpret SPECIAL-BLOCK element as Org syntax.
 CONTENTS is the contents of the element."
   (let ((block-type (org-element-property :type special-block)))
-    (format "#+begin_%s\n%s#+end_%s" block-type contents block-type)))
+    (format "#+begin_%s\n%s#+end_%s" block-type (or contents "") block-type)))
 
 
 \f
diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el
index 187cadf7a..985108e37 100644
--- a/testing/lisp/test-org-element.el
+++ b/testing/lisp/test-org-element.el
@@ -2425,7 +2425,11 @@ (ert-deftest test-org-element/special-block-parser ()
   ;; Handle non-empty blank line at the end of buffer.
   (should
    (org-test-with-temp-text "#+BEGIN_SPECIAL\nC\n#+END_SPECIAL\n "
-     (= (org-element-property :end (org-element-at-point)) (point-max)))))
+     (= (org-element-property :end (org-element-at-point)) (point-max))))
+  ;; When contents is empty, the parsed contents is nil.
+  (should
+   (org-test-with-temp-text "#+BEGIN_SPECIAL\n#+END_SPECIAL"
+     (eq nil (org-element-contents (org-element-at-point))))))
 
 
 ;;;; Src Block
@@ -2943,7 +2947,11 @@ (ert-deftest test-org-element/special-block-interpreter ()
   "Test special block interpreter."
   (should (equal (org-test-parse-and-interpret
 		  "#+BEGIN_SPECIAL\nTest\n#+END_SPECIAL")
-		 "#+begin_SPECIAL\nTest\n#+end_SPECIAL\n")))
+		 "#+begin_SPECIAL\nTest\n#+end_SPECIAL\n"))
+  ;; No content
+  (should (equal (org-test-parse-and-interpret
+		  "#+BEGIN_SPECIAL\n#+END_SPECIAL")
+		 "#+begin_SPECIAL\n#+end_SPECIAL\n")))
 
 (ert-deftest test-org-element/babel-call-interpreter ()
   "Test Babel call interpreter."
-- 
2.37.3


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: Add :parameters to special blocks --]
[-- Type: text/x-diff, Size: 5349 bytes --]

From 584bdbc161abde761876bfa2f0c484f0363afb72 Mon Sep 17 00:00:00 2001
From: Bruno BARBIER <brubar.cs@gmail.com>
Date: Mon, 17 Oct 2022 20:19:02 +0200
Subject: [PATCH 2/2] lisp/org-element: Add a parameters-line property to
 special blocks

Add a property `:parameters' to special blocks, to store the
PARAMETERS as a string.

* lisp/org-element.el (org-element-special-block-parser): Parse
PARAMETERS and set the property `:parameters'.

(org-element-special-block-interpreter): Interpret the property
`:parameters'.

*
testing/lisp/test-org-element.el (test-org-element/special-block-parser):
Add a new test for PARAMETERS.

(test-org-element/special-block-interpreter): Add new tests for PARAMETERS.
---
 lisp/org-element.el              | 19 ++++++++++++------
 testing/lisp/test-org-element.el | 33 ++++++++++++++++++++++++++++++--
 2 files changed, 44 insertions(+), 8 deletions(-)

diff --git a/lisp/org-element.el b/lisp/org-element.el
index ca3b61b49..ce6daaef8 100644
--- a/lisp/org-element.el
+++ b/lisp/org-element.el
@@ -1868,13 +1868,15 @@ (defun org-element-special-block-parser (limit affiliated)
 their value.
 
 Return a list whose CAR is `special-block' and CDR is a plist
-containing `:type', `:begin', `:end', `:contents-begin',
-`:contents-end', `:post-blank' and `:post-affiliated' keywords.
+containing `:type', `:parameters', `:begin', `:end',
+`:contents-begin', `:contents-end', `:post-blank' and
+`:post-affiliated' keywords.
 
 Assume point is at the beginning of the block."
   (let* ((case-fold-search t)
-	 (type (progn (looking-at "[ \t]*#\\+BEGIN_\\(\\S-+\\)")
-		      (match-string-no-properties 1))))
+	 (type (progn (looking-at "[ \t]*#\\+BEGIN_\\(\\S-+\\)[ \t]*\\(.*\\)[ \t]*$")
+		      (match-string-no-properties 1)))
+	 (parameters (match-string-no-properties 2)))
     (if (not (save-excursion
 	       (re-search-forward
 		(format "^[ \t]*#\\+END_%s[ \t]*$" (regexp-quote type))
@@ -1898,6 +1900,8 @@ (defun org-element-special-block-parser (limit affiliated)
 	    (list 'special-block
 		  (nconc
 		   (list :type type
+			 :parameters (and (org-string-nw-p parameters)
+					  (org-trim parameters))
 			 :begin begin
 			 :end end
 			 :contents-begin contents-begin
@@ -1909,8 +1913,11 @@ (defun org-element-special-block-parser (limit affiliated)
 (defun org-element-special-block-interpreter (special-block contents)
   "Interpret SPECIAL-BLOCK element as Org syntax.
 CONTENTS is the contents of the element."
-  (let ((block-type (org-element-property :type special-block)))
-    (format "#+begin_%s\n%s#+end_%s" block-type (or contents "") block-type)))
+  (let ((block-type (org-element-property :type special-block))
+        (parameters (org-element-property :parameters special-block)))
+    (format "#+begin_%s%s\n%s#+end_%s" block-type
+            (if parameters (concat " " parameters) "")
+            (or contents "") block-type)))
 
 
 \f
diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el
index 985108e37..eb5b95e86 100644
--- a/testing/lisp/test-org-element.el
+++ b/testing/lisp/test-org-element.el
@@ -2429,7 +2429,19 @@ (ert-deftest test-org-element/special-block-parser ()
   ;; When contents is empty, the parsed contents is nil.
   (should
    (org-test-with-temp-text "#+BEGIN_SPECIAL\n#+END_SPECIAL"
-     (eq nil (org-element-contents (org-element-at-point))))))
+     (eq nil (org-element-contents (org-element-at-point)))))
+  ;; Parse parameters if any, trimming blanks.
+  (should
+   (org-test-with-temp-text "#+BEGIN_SPECIAL* s  p   :w 3   \nContent.\n#+END_SPECIAL*"
+     (equal "s  p   :w 3"
+	    (org-element-property :parameters (org-element-at-point)))))
+  ;; When parameters is blank, `:parameters' is nil.
+  (should
+   (org-test-with-temp-text "#+BEGIN_SPECIAL*     \t   \nContent.\n#+END_SPECIAL*"
+     (eq nil (org-element-property :parameters (org-element-at-point))))
+   ))
+
+
 
 
 ;;;; Src Block
@@ -2945,13 +2957,30 @@ (ert-deftest test-org-element/quote-block-interpreter ()
 
 (ert-deftest test-org-element/special-block-interpreter ()
   "Test special block interpreter."
+  ;; No parameters
   (should (equal (org-test-parse-and-interpret
 		  "#+BEGIN_SPECIAL\nTest\n#+END_SPECIAL")
 		 "#+begin_SPECIAL\nTest\n#+end_SPECIAL\n"))
   ;; No content
   (should (equal (org-test-parse-and-interpret
 		  "#+BEGIN_SPECIAL\n#+END_SPECIAL")
-		 "#+begin_SPECIAL\n#+end_SPECIAL\n")))
+		 "#+begin_SPECIAL\n#+end_SPECIAL\n"))
+  ;; Some parameters
+  (should
+   (equal (org-test-parse-and-interpret
+           "#+BEGIN_special some parameters until EOL\nA very special content\n#+END_special")
+          "#+begin_special some parameters until EOL\nA very special content\n#+end_special\n"))
+  ;; No parameters (blanks only)
+  (should
+   (equal (org-test-parse-and-interpret
+           "#+BEGIN_special   \t \nA very special content\n#+END_special")
+          "#+begin_special\nA very special content\n#+end_special\n"))
+  ;; Some parameters with leading and trailing blanks, no content, and
+  ;; a /special/ name.
+  (should
+   (equal (org-test-parse-and-interpret
+           "#+BEGIN_spe<c>ial  :a  :b \t  :c  \t \n#+END_spe<c>ial")
+          "#+begin_spe<c>ial :a  :b \t  :c\n#+end_spe<c>ial\n")))
 
 (ert-deftest test-org-element/babel-call-interpreter ()
   "Test Babel call interpreter."
-- 
2.37.3


  reply	other threads:[~2022-10-19 18:14 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-17  8:37 Reading the parameters of a special-block Damien Cassou
2022-10-17 19:28 ` PATCH: " Bruno Barbier
2022-10-18  4:56   ` Ihor Radchenko
2022-10-19 18:18     ` Bruno Barbier [this message]
2022-10-20  5:31       ` Ihor Radchenko
     [not found]         ` <notmuch-sha1-5aa2ae4e8031bcbe3c55fd813dfb0f61229b24d1>
2022-10-20  9:45           ` Ihor Radchenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=E1olDZU-0005vE-Ky@lists.gnu.org \
    --to=brubar.cs@gmail.com \
    --cc=damien@cassou.me \
    --cc=emacs-orgmode@gnu.org \
    --cc=yantar92@posteo.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).