defmodule ExDocAnki do @moduledoc """ Generate Anki flashcards from Elixir project documentation using ExDoc. """ @compile {:no_warn_undefined, ExDoc} @doc """ Generate Anki CSV file for the given project. ## Options * `:project` - project name (required) * `:version` - project version (required) * `:source_beam` - path to compiled beam files (required, can be a list) * `:output` - output directory, defaults to "doc" * `:source_url` - URL to source code repository * `:formatters` - list of formatter modules, defaults to `[ExDocAnki.Formatter]` ## Example ExDocAnki.generate( project: "MyApp", version: "1.0.0", source_beam: "_build/dev/lib/my_app/ebin" ) """ @spec generate(keyword()) :: String.t() def generate(opts) do project = Keyword.fetch!(opts, :project) version = Keyword.fetch!(opts, :version) source_beam = Keyword.fetch!(opts, :source_beam) source_beams = if is_list(source_beam), do: source_beam, else: [source_beam] options = opts |> Keyword.put(:source_beam, source_beams) |> Keyword.put_new(:output, "doc") |> Keyword.put_new(:formatters, [ExDocAnki.Formatter]) {:ok, _} = start_ex_doc_refs() [result | _] = ExDoc.generate(project, version, source_beams, options) result.entrypoint end defp start_ex_doc_refs do if :ets.whereis(ExDoc.Refs) == :undefined do GenServer.start_link(ExDoc.Refs, :ok, name: ExDoc.Refs) else {:ok, :already_started} end end end