2007/05/19

Erlang クエックブックにインデックスを付ける

Erlang クエックブック にインデックスを付けました。
手でつけるのはめんどうだったので、Erlang でインデックスを付けるようにしました。
そのソースです。P とか R だったらもっと簡単にできる、というのはここではなしで。
if も case もなしで。
さらに、”クエック”って何よ、というのもなしで。


#!/usr/bin/env escript

main(_) ->
{ok, In} = file:read_file("cookbook_src.html"),
{Index, Contents} = f(binary_to_list(In), [], []),
Dest = insert_index(Index, Contents),
file:write_file("cookbook.html", Dest).

insert_index(Index, Contents) ->
P = find_index(Contents, 0),
{X, Y} = lists:split(P, Contents),
X ++ Index ++ (Y -- "*index_place*").

find_index("*index_place*" ++ _, N) ->
N;
find_index([_|C], N) ->
find_index(C, N+1).

f([], Index, Contents) ->
{lists:reverse(Index), lists:reverse(Contents)};
f("<h2>" ++ T, I, C) ->
[Ast|Ref] = erlang:ref_to_list(make_ref()),
I2 = io_lib:format("<h3><a href='~s'>", [[Ast|Ref]]),
H2 = io_lib:format("<h2><a name='~s'>", [Ref]),
h2(T, [I2|I], [H2|C]);
f("<h3>" ++ T, I, C) ->
[Ast|Ref] = erlang:ref_to_list(make_ref()),
I3 = io_lib:format("<a href='~s'>", [[Ast|Ref]]),
H3 = io_lib:format("<h3><a name='~s'>", [Ref]),
h3(T, [I3|I], [H3|C]);
f([X|T], I, C) ->
f(T, I, [X|C]).

h2("</h2>" ++ T, I, C) ->
f(T, ["</a></h3>"|I], ["</a></h2>"|C]);
h2([X|T], I, C) ->
h2(T, [X|I], [X|C]).

h3("</h3>" ++ T, I, C) ->
f(T, ["</a><br>"|I], ["</a></h3>"|C]);
h3([X|T], I, C) ->
h3(T, [X|I], [X|C]).

0 件のコメント: