Packages

Extractly `mix xtra` task to render `EEx` templates with easy access to hexdocs. The Extractly module gives easy access to Elixir metainformation of the application using the extractly package, notably, module and function documentation.

Current section

Files

Jump to
extractly lib extractly helpers.ex
Raw

lib/extractly/helpers.ex

defmodule Extractly.Helpers do
@moduledoc false
def fdoc_headline(name, opts) do
case Keyword.get(opts, :headline) do
level when is_number(level) -> _fdoc_headline(name, level)
_ -> ""
end
end
def wrap_code_blocks(input, lang)
def wrap_code_blocks(input, lang) when is_binary(input) do
input
|> String.split("\n")
|> wrap_code_blocks(lang)
end
def wrap_code_blocks(lines, lang) do
_wrap(:start, lines, lang, [])
|> Enum.reverse
|> Enum.join("\n")
end
defp _fdoc_headline(name, level) do
( Stream.cycle(~w{#})
|> Enum.take(level)
|> Enum.join ) <> " #{name}\n\n"
end
@delim "```"
@empty ~r{\A \s* \z}x
@iex ~r[\A \s{4,} (?: iex | \.\.\. ) \( \d+ \) \> ]x
defp _wrap(state, lines, lang, result)
defp _wrap(:inner, [], _, result), do: [@delim | result]
defp _wrap(_, [], _, result), do: result
defp _wrap(:start, [line|rest], lang, result) do
if Regex.match?(@empty, line) do
_wrap(:blank, rest, lang, [line|result])
else
_wrap(:start, rest, lang, [line|result])
end
end
defp _wrap(:blank, [line|rest], lang, result) do
if Regex.match?(@empty, line) do
_wrap(:blank, rest, lang, [line|result])
else
_wrap_from_blank(line, rest, lang, result)
end
end
defp _wrap(:inner, [line|rest], lang, result) do
if Regex.match?(@empty, line) do
_wrap(:blank, rest, lang, [line, @delim | result])
else
_wrap(:inner, rest, lang, [line|result])
end
end
defp _wrap_from_blank(line, rest, lang, result) do
if Regex.match?(@iex, line) do
_wrap(:inner, rest, lang, [line, "#{@delim}#{lang}" | result])
else
_wrap(:start, rest, lang, [line|result])
end
end
end
# SPDX-License-Identifier: Apache-2.0