From 419a58a48e1ae961de236274180d8b495abba9ff Mon Sep 17 00:00:00 2001 From: Inhji Date: Sun, 9 Jul 2023 19:59:47 +0200 Subject: [PATCH] initial outline code --- lib/chiya_web/outline.ex | 21 +++++++++++++++++++++ test/chiya_web/outline_test.exs | 20 ++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 lib/chiya_web/outline.ex create mode 100644 test/chiya_web/outline_test.exs diff --git a/lib/chiya_web/outline.ex b/lib/chiya_web/outline.ex new file mode 100644 index 0000000..0d88e14 --- /dev/null +++ b/lib/chiya_web/outline.ex @@ -0,0 +1,21 @@ +defmodule ChiyaWeb.Outline do + @outline_regex ~r/\#{1,6}\s.+/ + @heading_regex ~r/^(#+)\s(.+)$/ + + def get(markdown) do + headings = + @outline_regex + |> Regex.scan(markdown, capture: :all) + + Enum.chunk_by(headings, fn h -> nil end) + end + + def level(heading) do + Regex.scan(@heading_regex, heading) + |> Enum.map(fn [_, level, heading] -> + [level_from_string(level), heading] + end) + end + + defp level_from_string(string), do: String.length(string) +end diff --git a/test/chiya_web/outline_test.exs b/test/chiya_web/outline_test.exs new file mode 100644 index 0000000..8722b0b --- /dev/null +++ b/test/chiya_web/outline_test.exs @@ -0,0 +1,20 @@ +defmodule ChiyaWeb.OutlineTest do + use Chiya.SimpleCase + + alias ChiyaWeb.Outline + + describe "extract_outline/1" do + test "extracts headlines from markdown" do + markdown = "# Heading\nsome paragraph\n## Sub Heading\n# Second Heading" + + assert [{1, "Heading", [{2, "Sub Heading", []}]}, {1, "Second Heading", []}] = + Outline.get(markdown) + end + end + + describe "outline_level/1" do + test "extracts outline level" do + assert {1, "Heading"} = Outline.level("# Heading") + end + end +end