* Weird behavior of org-element-object-lex
@ 2022-10-19 19:23 Damien Cassou
2022-10-20 5:27 ` Ihor Radchenko
0 siblings, 1 reply; 7+ messages in thread
From: Damien Cassou @ 2022-10-19 19:23 UTC (permalink / raw)
To: emacs-orgmode
Hi,
here is the beginning of `org-element-object-lex`:
(defun org-element--object-lex (restriction)
"Return next object in current buffer or nil.
RESTRICTION is a list of object types, as symbols, that should be
looked after. This function assumes that the buffer is narrowed
to an appropriate container (e.g., a paragraph)."
(cond
((memq 'table-cell restriction) (org-element-table-cell-parser))
((memq 'citation-reference restriction)
(org-element-citation-reference-parser))
(t …)))
From what I understand, if `restriction` includes 'table-cell (or
'citation-reference), and if the content isn't a table-cell,
`org-element--object-lex` will immediately return nil without trying
other object types.
Is that a bug?
--
Damien Cassou
"Success is the ability to go from one failure to another without
losing enthusiasm." --Winston Churchill
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Weird behavior of org-element-object-lex
2022-10-19 19:23 Weird behavior of org-element-object-lex Damien Cassou
@ 2022-10-20 5:27 ` Ihor Radchenko
2022-10-20 6:00 ` Damien Cassou
0 siblings, 1 reply; 7+ messages in thread
From: Ihor Radchenko @ 2022-10-20 5:27 UTC (permalink / raw)
To: Damien Cassou; +Cc: emacs-orgmode
Damien Cassou <damien@cassou.me> writes:
> here is the beginning of `org-element-object-lex`:
>
> (defun org-element--object-lex (restriction)
> "Return next object in current buffer or nil.
> RESTRICTION is a list of object types, as symbols, that should be
> looked after. This function assumes that the buffer is narrowed
> to an appropriate container (e.g., a paragraph)."
> (cond
> ((memq 'table-cell restriction) (org-element-table-cell-parser))
> ((memq 'citation-reference restriction)
> (org-element-citation-reference-parser))
> (t …)))
>
> From what I understand, if `restriction` includes 'table-cell (or
> 'citation-reference), and if the content isn't a table-cell,
> `org-element--object-lex` will immediately return nil without trying
> other object types.
>
> Is that a bug?
Not really. table-cell and citation-reference do not have a regexp
signature and are handled specially. For these two types of objects,
org-element--object-lex is called only when the parent is a table-row or
citation object. Not very elegant, but it is internal function, and it
works :)
--
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Weird behavior of org-element-object-lex
2022-10-20 5:27 ` Ihor Radchenko
@ 2022-10-20 6:00 ` Damien Cassou
2022-10-20 9:56 ` Ihor Radchenko
0 siblings, 1 reply; 7+ messages in thread
From: Damien Cassou @ 2022-10-20 6:00 UTC (permalink / raw)
To: Ihor Radchenko; +Cc: emacs-orgmode
Ihor Radchenko <yantar92@posteo.net> writes:
> Damien Cassou <damien@cassou.me> writes:
>> Is that a bug?
>
> Not really. table-cell and citation-reference do not have a regexp
> signature and are handled specially. For these two types of objects,
> org-element--object-lex is called only when the parent is a table-row or
> citation object. Not very elegant, but it is internal function, and it
> works :)
I understand. Thank you. This is a problem for me but the workaround is
easy. For information, the rest of this email describes my problem and
the workaround but I'm not expecting anything from you, the workaround
is good enough.
I'm writing an exporter that is basically the same as ODT with some
differences that are mandatory to get articles published in the magazine
GNU/Linux Magazine. This magazine wants lists to have no special markups:
<text:p text:style-name="Normal">- item 1 ;</text:p>
<text:p text:style-name="Normal">- item 2 ;</text:p>
So, I wrote a plain-list transcoder and an item transcoder:
(defun ox-linuxmag--plain-list (plain-list contents _info)
contents)
(defun ox-linuxmag--item (item contents info)
(let* ((plain-content (buffer-substring-no-properties
(org-element-property :contents-begin item)
(org-element-property :contents-end item)))
(parse-tree (org-element-parse-secondary-string
plain-content
;; org-element-parse-secondary-string acts
;; weirdly if either 'table-cell or
;; 'citation-reference are included:
(cl-remove-if
(lambda (type) (seq-contains-p '(table-cell citation-reference) type))
org-element-all-objects)))
(item-content (org-export-data parse-tree info)))
(ox-linuxmag--format-text:p (format "- %s" item-content))))
The reason `ox-linuxmag--item` has to parse ITEM again is because
CONTENTS contains "<text:p text:style-name="Normal">item 1 ;</text:p>"
which misses the initial dash "-" character: i.e., I would like "- item
1 ;" in the paragraph instead.
As you can see, the code uses `org-element-parse-secondary-string` with
most of `org-element-all-objects` as RESTRICTION argument but neither
`table-cell` nor `citation-reference`.
Do you see a simpler way to achieve this?
--
Damien Cassou
"Success is the ability to go from one failure to another without
losing enthusiasm." --Winston Churchill
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Weird behavior of org-element-object-lex
2022-10-20 6:00 ` Damien Cassou
@ 2022-10-20 9:56 ` Ihor Radchenko
2022-10-20 13:41 ` Damien Cassou
0 siblings, 1 reply; 7+ messages in thread
From: Ihor Radchenko @ 2022-10-20 9:56 UTC (permalink / raw)
To: Damien Cassou; +Cc: emacs-orgmode
Damien Cassou <damien@cassou.me> writes:
> (defun ox-linuxmag--item (item contents info)
> ...
> The reason `ox-linuxmag--item` has to parse ITEM again is because
> CONTENTS contains "<text:p text:style-name="Normal">item 1 ;</text:p>"
> which misses the initial dash "-" character: i.e., I would like "- item
> 1 ;" in the paragraph instead.
Just use ITEM.
You can access the contents of ITEM with org-element-contents.
If you just need to append the bullet, use (org-element-property :bullet item)
--
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Weird behavior of org-element-object-lex
2022-10-20 9:56 ` Ihor Radchenko
@ 2022-10-20 13:41 ` Damien Cassou
2022-10-20 14:15 ` Damien Cassou
0 siblings, 1 reply; 7+ messages in thread
From: Damien Cassou @ 2022-10-20 13:41 UTC (permalink / raw)
To: Ihor Radchenko; +Cc: emacs-orgmode
Ihor Radchenko <yantar92@posteo.net> writes:
> Damien Cassou <damien@cassou.me> writes:
>> (defun ox-linuxmag--item (item contents info)
>> ...
>> The reason `ox-linuxmag--item` has to parse ITEM again is because
>> CONTENTS contains "<text:p text:style-name="Normal">item 1 ;</text:p>"
>> which misses the initial dash "-" character: i.e., I would like "- item
>> 1 ;" in the paragraph instead.
>
> Just use ITEM.
> You can access the contents of ITEM with org-element-contents.
> If you just need to append the bullet, use (org-element-property :bullet item)
I don't understand your solution. `org-element-contents` returns a
paragraph element. What should I do with it? I can't just export it
because that would result in a '<text:p text:style-name="Normal">item
1 ;</text:p>' string which misses the initial "- ".
--
Damien Cassou
"Success is the ability to go from one failure to another without
losing enthusiasm." --Winston Churchill
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Weird behavior of org-element-object-lex
2022-10-20 13:41 ` Damien Cassou
@ 2022-10-20 14:15 ` Damien Cassou
2022-10-20 16:50 ` Max Nikulin
0 siblings, 1 reply; 7+ messages in thread
From: Damien Cassou @ 2022-10-20 14:15 UTC (permalink / raw)
To: Ihor Radchenko; +Cc: emacs-orgmode
Damien Cassou <damien@cassou.me> writes:
> Ihor Radchenko <yantar92@posteo.net> writes:
>> Damien Cassou <damien@cassou.me> writes:
>>> (defun ox-linuxmag--item (item contents info)
>>> ...
>>> The reason `ox-linuxmag--item` has to parse ITEM again is because
>>> CONTENTS contains "<text:p text:style-name="Normal">item 1 ;</text:p>"
>>> which misses the initial dash "-" character: i.e., I would like "- item
>>> 1 ;" in the paragraph instead.
After a quick chat with yantar92 on IRC, I understood that the easiest
solution is to fix the paragraph transcoder to inject the "- " when its
parent is an item. The item transcoder can just return CONTENTS.
Here is the corresponding code:
(defun ox-linuxmag--paragraph (paragraph contents info)
"Transcode a PARAGRAPH element from Org to ODT.
CONTENTS is the contents of the paragraph, as a string. INFO is
the plist used as a communication channel."
(let* ((parent (org-export-get-parent paragraph))
(parent-type (org-element-type parent))
(prefix (when (eq parent-type 'item) "- ")))
(org-odt--format-paragraph
paragraph
(concat prefix contents)
info
(or (org-element-property :style paragraph) "Normal")
""
"")))))
Thank you so much for your help.
--
Damien Cassou
"Success is the ability to go from one failure to another without
losing enthusiasm." --Winston Churchill
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-10-20 17:12 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-19 19:23 Weird behavior of org-element-object-lex Damien Cassou
2022-10-20 5:27 ` Ihor Radchenko
2022-10-20 6:00 ` Damien Cassou
2022-10-20 9:56 ` Ihor Radchenko
2022-10-20 13:41 ` Damien Cassou
2022-10-20 14:15 ` Damien Cassou
2022-10-20 16:50 ` Max Nikulin
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).