This works perfectly (including in targeting org, my use case). Thanks so much!
Well, couldn't help but give it a shot. Here's a short filter that does the trick. Will work at arbitrary depth.
function fixList(elem)
local changed = false
local newList = pandoc.List:new()
local function isSubList(list)
return #list == 1
and (list[1].t == 'BulletList' or list[1].t == 'OrderedList')
end
for _,item in ipairs(elem.c) do
if #newList > 0 and isSubList(item) then
-- append item's sublist to the last item of newList
changed = true
newList[#newList]:insert(item[1])
else
-- otherwise append item to newList
newList:insert(item)
end
end
if changed then
elem.c = newList
end
return changed and elem or nil
end
return {{
OrderedList = fixList,
BulletList = fixList, }}On Monday, February 27, 2023 at 12:33:54 AM UTC JDTS wrote:
Thanks, I'll investigate this. The HTML structure is generated and therefore quite uniform, so it may be possible to do the munging there.On Sunday, February 26, 2023 at 10:47:36 AM UTC-5 Julien Dutant wrote:From my labelled-lists filter (https://github.com/dialoa/dialectica-filters/blob/main/labelled-lists/labelled-lists.lua), here is a filter + function that checks whether every item in a bullet list starts with a Span element.```lua--- is_custom_labelled_list: Look for custom labels markup
-- Custom label markup requires each item starting with a span
-- containing the label
-- @param element pandoc BulletList element
function is_custom_labelled_list (element)
local is_cl_list = true
-- the content of BulletList is a List of List of Blocks
for _,blocks in ipairs(element.c) do
-- check that the first element of the first block is Span
if not( blocks[1].c[1].t == 'Span' ) then
is_cl_list = false
break
end
end
return is_cl_listend
return {{
BulletList = function(element)
if is_custom_labelled_list(element) then
return pandoc.Para(pandoc.Str('Was a list of the required kind!)))
end
end, }}```The difficulty with manipulating lists is to follow their intricate structure: a BulletList element as a content (element.c) that is a pandoc List. Each item in it (element.c[1], element.c[2]) is of Blocks type, i.e. a pandoc.List where the each element is a block. In your case you should check that the list item only contains one block of type ordered list:if #elem.c[i] == 1 then list_item_contains_one_block_only = true endand check that this block is of type OrderedList:if #elem.c[i]==1 and elem.c[i].t == 'OrderedList' then ...you should then add that block to the previous item, and remove the current item.Hope this helps,JOn Saturday, February 25, 2023 at 10:06:45 PM UTC JDTS wrote:Thanks. Any pointers to lua filters that do something similar?On Saturday, February 25, 2023 at 10:01:08 AM UTC-5 Julien Dutant wrote:Looks feasible. Pandoc converts the first html to:[ BulletList
[ [ Plain
[ ... Inlines ]
]
, [ BulletList
[ [ Plain
[ ... Inlines ]
]
, [ Plain
[ ... Inlines ]
]
]
]
, [ Plain
[ Inlines ]
]
]
]I.e., the sublist is converted to its own list item. So the filter should pick up list, check if any item within them consists of a lone sublist, and if so, move it to the previous item. (And best, apply the filter recursively to that sublist itself.)On Saturday, February 25, 2023 at 2:26:04 PM UTC JDTS wrote:The Apple Notes app produces (via AppleScript) HTML for notes with nested lists structured like:<ul>
<li>Level 1 element 1</li>
<ul>
<li>Level 2 element 1</li>
<li>Level 2 element 2</li>
</ul>
<li>Level 1 element 2</li>
</ul>
As you can see, the sublist is incorrectly positioned. It should be positioned within the <li> Level 1 element 1 item, ala:<ul>
<li>Level 1 element 1
<ul>
<li>Level 2 element 1</li>
<li>Level 2 element 2</li>
</ul>
</li>
<li>Level 1 element 2</li>
</ul>
Is there a straightforward way with Lua filters to fix this at the AST level, for arbitrary-depth sublist nesting?