[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Clarification on blank lines following list items
From: |
Tom Alexander |
Subject: |
Clarification on blank lines following list items |
Date: |
Sat, 19 Aug 2023 01:30:25 -0400 |
User-agent: |
Cyrus-JMAP/3.9.0-alpha0-624-g7714e4406d-fm-20230801.001-g7714e440 |
I am noticing the list items have some very context-sensitive specific behavior
regarding ownership of the trailing blank lines. I was hoping to get some
clarification on this (namely, are my observations correct, am I stumbling
across a bug, or have I not dug deep enough to suss out the real rules?). The
org-mode documentation states:
> With the exception of list items and footnote definitions blank lines belong
> to the preceding element with the narrowest possible scope
but it does not state who ends up owning those blank lines.
In a previous email the incredibly helpful Ihor Radchenko expanded on this
further with:
> Also, in addition to list items, footnote-definitions do not extend their
> contents to the trailing blank lines.
which, I would interpret as the list items do not own their trailing blank
lines but rather the list owns them. But that is not the behavior I am seeing.
If I had to summarize the behavior I am seeing into words it would be:
> List items own their trailing blank lines unless they are both the final list
> item and not the final element of a non-final list item.
Below I have how I reached this conclusion, but before diving into the weeds I
want to point two things out:
1. I have hastily thrown together a tool to help rapidly visualize the
ownership of nodes in org-mode's AST. Before this tool, I was manually running
org-element-parse-buffer and using M-g c to jump around to the various indices
to see where nodes started/ended. With this tool, I can paste in my org-mode
source and get a tree showing the contents of each node and I can click on the
nodes to highlight the relevant characters in the org-mode source. It is
available at https://github.com/tomalexander/org_mode_ast_investigation_tool .
2. I have flattened my analysis for plain-text consumption over email below,
but if you'd prefer the original org-mode version of this investigation it is
available at
https://github.com/tomalexander/org_mode_ast_investigation_tool/blob/cba1d1e988be230f3104f5f63dfaeaaf5cd0d280/notes/plain_list_ownership_notes.org
.
And now, here is how I reached that conclusion:
*** Test case 1
```
1. foo
1. bar
2. baz
2. lorem
ipsum
```
| Plain List *Item* | Owns trailing blank lines |
|------------------------+---------------------------|
| foo (includes bar baz) | Yes |
| bar | Yes |
| baz | Yes |
| lorem | No |
In this test case, we see that the only list item that doesn't own its trailing
blank lines is "lorem", the final list item of the outer-most list.
*** Test case 2
We add "cat" as a paragraph at the end of foo which makes "baz" lose its
trailing blank lines
```
1. foo
1. bar
2. baz
cat
2. lorem
ipsum
```
| Plain List *Item* | Owns trailing blank lines |
|-------------------------------+---------------------------|
| foo -> cat (includes bar baz) | Yes |
| bar | Yes |
| baz | No |
| lorem | No |
In isolation, this implies that the final plain list item does not own its
trailing blank lines, which conflicts with "baz" from test 1.
New theory: List items own their trailing blank lines unless they are both the
final list item and not the final element of a list item.
Adding why to the table:
| Plain List *Item* | Owns trailing blank lines | Why
|
|-------------------------------+---------------------------+-----------------------------------------------------------|
| foo -> cat (includes bar baz) | Yes | Not the final
list item |
| bar | Yes | Not the final
list item |
| baz | No | Final item of
bar->baz and not the final element of "foo" |
| lorem | No | Final item of
foo->lorem and not contained in a list item |
*** Test case 3
So if that theory is true, taking the entire (foo -> lorem) list from test 1
and nesting it inside a list should coerce "lorem" to own its trailing blank
lines since it would then be a final list item (of foo -> lorem) and the final
element of the new list.
```
1. cat
1. foo
1. bar
2. baz
2. lorem
ipsum
```
| Plain List *Item* | Owns trailing blank lines |
|-----------------------------+---------------------------|
| cat (includes foo -> lorem) | No |
| foo (includes bar baz) | Yes |
| bar | Yes |
| baz | Yes |
| lorem | No |
Against expectations, we did not coerce lorem to consume its trailing blank
lines. What is different between "baz" and "lorem"? Well, "baz" is contained
within "foo" which has a "lorem" after it, whereas "lorem" is contained within
"cat" which does not have any list items after it.
New theory: List items own their trailing blank lines unless they are both the
final list item and not the final element of a non-final list item.
| Plain List *Item* | Owns trailing blank lines | Why
|
|-----------------------------+---------------------------+------------------------------------------------------|
| cat (includes foo -> lorem) | No | Final list item and
not contained in a list item |
| foo (includes bar baz) | Yes | Not the final list
item |
| bar | Yes | Not the final list
item |
| baz | Yes | Final element of
non-final list item |
| lorem | No | Final list item and
final element of final list item |
*** Test case 4
So if that theory is true, then we should be able to coerce lorem to consume
its trailing blank lines by adding a second item to the cat list.
```
1. cat
1. foo
1. bar
2. baz
2. lorem
2. dog
ipsum
```
| Plain List *Item* | Owns trailing blank lines |
|-----------------------------+---------------------------|
| cat (includes foo -> lorem) | Yes |
| foo (includes bar baz) | Yes |
| bar | Yes |
| baz | Yes |
| lorem | Yes |
| dog | No |
For the first time our expectations were met!
Enduring theory: List items own their trailing blank lines unless they are both
the final list item and not the final element of a non-final list item.
| Plain List *Item* | Owns trailing blank lines | Why
|
|-----------------------------+---------------------------+--------------------------------------------------|
| cat (includes foo -> lorem) | Yes | Not the final list
item |
| foo (includes bar baz) | Yes | Not the final list
item |
| bar | Yes | Not the final list
item |
| baz | Yes | Final element of
non-final list item |
| lorem | Yes | Final element of
non-final list item |
| dog | No | Final list item and
not contained in a list item |
--
Tom Alexander
- Clarification on blank lines following list items,
Tom Alexander <=