2019-11-03 19:35:04 -05:00
|
|
|
defmodule Textile.TokenCoalescer do
|
|
|
|
# The lexer, as a practical concern, does not coalesce runs of
|
|
|
|
# character tokens. This fixes that.
|
2019-11-08 21:33:08 -05:00
|
|
|
def coalesce_lex(tokens) do
|
2019-11-03 19:35:04 -05:00
|
|
|
tokens
|
|
|
|
|> Enum.chunk_by(&is_number(&1))
|
|
|
|
|> Enum.flat_map(fn
|
|
|
|
[t | _rest] = str when is_number(t) ->
|
|
|
|
[text: List.to_string(str)]
|
|
|
|
|
|
|
|
t ->
|
|
|
|
t
|
2019-11-08 20:43:38 -05:00
|
|
|
end)
|
2019-11-03 19:35:04 -05:00
|
|
|
end
|
2019-11-08 21:33:08 -05:00
|
|
|
|
|
|
|
def coalesce_parse(tokens) do
|
|
|
|
tokens
|
|
|
|
|> List.flatten()
|
|
|
|
|> Enum.chunk_by(fn {k, _v} -> k == :text end)
|
|
|
|
|> Enum.flat_map(fn t ->
|
|
|
|
[{type, _v} | _rest] = t
|
|
|
|
|
|
|
|
value =
|
|
|
|
t
|
|
|
|
|> Enum.map(fn {_k, v} -> v end)
|
|
|
|
|> Enum.join("")
|
|
|
|
|
|
|
|
[{type, value}]
|
|
|
|
end)
|
|
|
|
end
|
2019-11-03 19:35:04 -05:00
|
|
|
end
|