Lua: split strings into words when treating them as Inline list (#7712)

Using a Lua string where a list of inlines is expected will cause the
string to be split into words, replacing spaces and tabs into
`pandoc.Space()` elements and newlines into `pandoc.SoftBreak()`.

The previous behavior was to treat the string `s` as `{pandoc.Str(s)}`.
The old behavior can be recovered by wrapping the string into a table
`{s}`.
This commit is contained in:
Albert Krewinkel 2021-11-23 18:30:48 +01:00 committed by GitHub
parent a039f024f2
commit 0c0945b93c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 6 deletions

View file

@ -67,6 +67,7 @@ import Text.Pandoc.Lua.Marshaling.ListAttributes
(peekListAttributes, pushListAttributes)
import qualified HsLua as Lua
import qualified Text.Pandoc.Builder as B
import qualified Text.Pandoc.Lua.Util as LuaUtil
instance Pushable Pandoc where
@ -796,10 +797,12 @@ peekInlineFuzzy = retrieving "Inline" . choice
-- | Try extra-hard to return the value at the given index as a list of
-- inlines.
peekInlinesFuzzy :: LuaError e => Peeker e [Inline]
peekInlinesFuzzy = choice
[ peekList peekInlineFuzzy
, fmap pure . peekInlineFuzzy
]
peekInlinesFuzzy idx = liftLua (ltype idx) >>= \case
TypeString -> B.toList . B.text <$> peekText idx
_ -> choice
[ peekList peekInlineFuzzy
, fmap pure . peekInlineFuzzy
] idx
-- | Try extra hard to retrieve a Block value from the stack. Treats bar
-- Inline elements as if they were wrapped in 'Plain'.

View file

@ -480,7 +480,10 @@ return {
assert.are_same(deflist.content[1][2][2],
{pandoc.Plain{pandoc.Str 'company'}})
assert.are_same(deflist.content[2][2],
{{pandoc.Plain{pandoc.Str 'Best when hot.'}}})
{{pandoc.Plain{
pandoc.Str 'Best', pandoc.Space(),
pandoc.Str 'when', pandoc.Space(),
pandoc.Str 'hot.'}}})
end),
test('modify items via property `content`', function ()
local deflist = pandoc.DefinitionList{
@ -532,7 +535,7 @@ return {
assert.are_same(header.content, {pandoc.Str 'test'})
header.content = {'new text'}
assert.are_equal(header, pandoc.Header(1, 'new text'))
assert.are_equal(header, pandoc.Header(1, {'new text'}))
end),
test('access Attr via property `attr`', function ()
local header = pandoc.Header(1, 'test', {'my-test'})
@ -968,5 +971,26 @@ return {
)
assert.are_equal('1234', table.concat(acc))
end)
},
group 'Marshal' {
group 'Inlines' {
test('Strings are broken into words', function ()
assert.are_equal(
pandoc.Emph 'Nice, init?',
pandoc.Emph{pandoc.Str 'Nice,', pandoc.Space(), pandoc.Str 'init?'}
)
end)
},
group 'Blocks' {
test('Strings are broken into words and wrapped in Plain', function ()
assert.are_equal(
pandoc.Div{
pandoc.Plain{pandoc.Str 'Nice,', pandoc.Space(), pandoc.Str 'init?'}
},
pandoc.Div{'Nice, init?'}
)
end)
}
}
}