Packages
fnord
0.7.8
0.9.40
0.9.39
0.9.38
0.9.37
0.9.36
0.9.35
0.9.34
0.9.33
0.9.32
0.9.31
0.9.30
0.9.29
0.9.28
0.9.27
0.9.26
0.9.25
0.9.24
0.9.23
0.9.22
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.14
0.9.13
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.99
0.8.98
0.8.97
0.8.96
0.8.95
0.8.94
0.8.93
0.8.92
0.8.91
0.8.90
0.8.89
0.8.88
0.8.87
0.8.86
0.8.85
0.8.84
0.8.83
0.8.82
0.8.81
0.8.80
0.8.79
0.8.78
0.8.77
0.8.76
0.8.75
0.8.74
0.8.73
0.8.72
0.8.71
0.8.70
0.8.69
0.8.68
0.8.67
0.8.66
0.8.65
0.8.64
0.8.63
0.8.62
0.8.61
0.8.60
0.8.59
0.8.58
0.8.57
0.8.56
0.8.55
0.8.54
0.8.53
0.8.52
0.8.51
0.8.50
0.8.49
0.8.48
0.8.47
0.8.46
0.8.45
0.8.44
0.8.43
0.8.42
0.8.41
0.8.40
0.8.39
0.8.38
0.8.37
0.8.36
0.8.35
0.8.34
0.8.33
0.8.32
0.8.31
0.8.30
0.8.29
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.1
0.8.0
0.7.24
0.7.23
0.7.22
0.7.21
0.7.20
0.7.19
0.7.18
0.7.17
0.7.16
0.7.15
0.7.14
0.7.13
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.3
0.7.2
0.7.1
0.7.0
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.1
0.6.0
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.44
0.4.43
0.4.42
0.4.41
0.4.40
0.4.39
0.4.38
0.4.37
0.4.36
0.4.35
0.4.34
0.4.33
0.4.32
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.0
0.2.0
0.1.0
AI code archaeology
Current section
Files
Jump to
Current section
Files
lib/store/project/note_parser.ex
defmodule Store.Project.NoteParser do
@moduledoc """
This module is deprecated. It remains to support `Store.Project.Note`.
"""
@re_topic ~r/
^
\s*
{
\s*
topic
\s+
(?<topic>
(?: " (?: [^"] | \\")* ")
| (?: [^{}]+)
)
\s*
(?<facts>.*)
$
/x
@re_fact ~r/
{
\s*
fact
\s+
(?<fact>
(?: " (?: [^"] | \\")* ")
| (?: [^{}]+)
)
/x
@re_string ~r/
\s*
(?:
(?: " (?<quoted> (?: [^"] | \\")*) ")
| (?<bare> [^{}]+)
)
\s*
/x
@spec parse(binary) :: {:ok, {String.t(), [String.t()]}} | {:error, atom, atom}
def parse(input) do
if is_binary(input) do
with {:ok, topic, facts_string} <- parse_topic(input),
{:ok, facts} <- parse_facts(facts_string) do
{:ok, {topic, facts}}
end
else
{:error, :invalid_format, :input}
end
end
defp parse_topic(input) do
with %{"topic" => topic, "facts" => facts} <- Regex.named_captures(@re_topic, input),
{:ok, content} <- parse_string(topic) do
{:ok, content, String.trim(facts)}
else
_ -> {:error, :invalid_format, :topic}
end
end
defp parse_facts(input) do
Regex.scan(@re_fact, input, capture: :all_but_first)
|> case do
[] ->
{:error, :invalid_format, :facts}
facts ->
facts
|> Enum.reduce_while([], fn [fact], acc ->
case parse_string(fact) do
{:ok, content} -> {:cont, [content | acc]}
_ -> {:halt, {:error, :invalid_format, :fact}}
end
end)
|> then(fn facts -> {:ok, facts |> Enum.reverse()} end)
end
end
defp parse_string(input) do
input = String.trim(input)
Regex.named_captures(@re_string, input)
|> case do
%{"quoted" => quoted, "bare" => ""} -> {:ok, quoted}
%{"quoted" => "", "bare" => bare} -> {:ok, bare}
_ -> {:error, :invalid_format, :string}
end
end
end