2019-11-04 01:35:04 +01:00
|
|
|
defmodule Textile.TokenCoalescer do
|
|
|
|
# The lexer, as a practical concern, does not coalesce runs of
|
|
|
|
# character tokens. This fixes that.
|
2019-11-09 03:33:08 +01:00
|
|
|
def coalesce_lex(tokens) do
|
2019-11-04 01:35:04 +01: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-09 02:43:38 +01:00
|
|
|
end)
|
2019-11-04 01:35:04 +01:00
|
|
|
end
|
2019-11-09 03:33:08 +01: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-04 01:35:04 +01:00
|
|
|
end
|