philomena/lib/textile/token_coalescer.ex

31 lines
669 B
Elixir
Raw Normal View History

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.
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
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