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:
parent
a039f024f2
commit
0c0945b93c
2 changed files with 33 additions and 6 deletions
|
@ -67,6 +67,7 @@ import Text.Pandoc.Lua.Marshaling.ListAttributes
|
||||||
(peekListAttributes, pushListAttributes)
|
(peekListAttributes, pushListAttributes)
|
||||||
|
|
||||||
import qualified HsLua as Lua
|
import qualified HsLua as Lua
|
||||||
|
import qualified Text.Pandoc.Builder as B
|
||||||
import qualified Text.Pandoc.Lua.Util as LuaUtil
|
import qualified Text.Pandoc.Lua.Util as LuaUtil
|
||||||
|
|
||||||
instance Pushable Pandoc where
|
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
|
-- | Try extra-hard to return the value at the given index as a list of
|
||||||
-- inlines.
|
-- inlines.
|
||||||
peekInlinesFuzzy :: LuaError e => Peeker e [Inline]
|
peekInlinesFuzzy :: LuaError e => Peeker e [Inline]
|
||||||
peekInlinesFuzzy = choice
|
peekInlinesFuzzy idx = liftLua (ltype idx) >>= \case
|
||||||
[ peekList peekInlineFuzzy
|
TypeString -> B.toList . B.text <$> peekText idx
|
||||||
, fmap pure . peekInlineFuzzy
|
_ -> choice
|
||||||
]
|
[ peekList peekInlineFuzzy
|
||||||
|
, fmap pure . peekInlineFuzzy
|
||||||
|
] idx
|
||||||
|
|
||||||
-- | Try extra hard to retrieve a Block value from the stack. Treats bar
|
-- | Try extra hard to retrieve a Block value from the stack. Treats bar
|
||||||
-- Inline elements as if they were wrapped in 'Plain'.
|
-- Inline elements as if they were wrapped in 'Plain'.
|
||||||
|
|
|
@ -480,7 +480,10 @@ return {
|
||||||
assert.are_same(deflist.content[1][2][2],
|
assert.are_same(deflist.content[1][2][2],
|
||||||
{pandoc.Plain{pandoc.Str 'company'}})
|
{pandoc.Plain{pandoc.Str 'company'}})
|
||||||
assert.are_same(deflist.content[2][2],
|
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),
|
end),
|
||||||
test('modify items via property `content`', function ()
|
test('modify items via property `content`', function ()
|
||||||
local deflist = pandoc.DefinitionList{
|
local deflist = pandoc.DefinitionList{
|
||||||
|
@ -532,7 +535,7 @@ return {
|
||||||
assert.are_same(header.content, {pandoc.Str 'test'})
|
assert.are_same(header.content, {pandoc.Str 'test'})
|
||||||
|
|
||||||
header.content = {'new text'}
|
header.content = {'new text'}
|
||||||
assert.are_equal(header, pandoc.Header(1, 'new text'))
|
assert.are_equal(header, pandoc.Header(1, {'new text'}))
|
||||||
end),
|
end),
|
||||||
test('access Attr via property `attr`', function ()
|
test('access Attr via property `attr`', function ()
|
||||||
local header = pandoc.Header(1, 'test', {'my-test'})
|
local header = pandoc.Header(1, 'test', {'my-test'})
|
||||||
|
@ -968,5 +971,26 @@ return {
|
||||||
)
|
)
|
||||||
assert.are_equal('1234', table.concat(acc))
|
assert.are_equal('1234', table.concat(acc))
|
||||||
end)
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue