53 lines
1.3 KiB
Text
53 lines
1.3 KiB
Text
import util.
|
|
|
|
go =>
|
|
Story = read_story(),
|
|
println("Fill in the proper values:"),
|
|
nl,
|
|
Map = get_info(get_tags(Story)) ,
|
|
println("\nHere is the story:\n"),
|
|
println(replace_tags(Story,Map)),
|
|
nl.
|
|
|
|
read_story() = Story =>
|
|
println("Write the story template with <tag> for the tags and finish with an empty line."),
|
|
nl,
|
|
Story1 = read_line(),
|
|
while (Line = read_line(), Line != "")
|
|
Story1 := Story1 ++ " " ++ Line
|
|
end,
|
|
Story = Story1.
|
|
|
|
%
|
|
% Get the tags between <...>.
|
|
%
|
|
get_tags(S) = Tags =>
|
|
Len = S.length,
|
|
StartPos = [P: {C,P} in zip(S,1..Len), C = '<'],
|
|
EndPos = [P: {C,P} in zip(S,1..Len), C = '>'],
|
|
Tags = [slice(S,Start,End) : {Start,End} in zip(StartPos,EndPos)].remove_dups().
|
|
|
|
%
|
|
% Get the tag info from user and return a map
|
|
%
|
|
get_info(Tags) = Map =>
|
|
Map = new_map(),
|
|
foreach(Tag in Tags)
|
|
printf("%w: ", Tag),
|
|
Map.put(Tag,readln())
|
|
end.
|
|
|
|
% Replace all the <tags> with user values.
|
|
replace_tags(S,Map) = S =>
|
|
foreach(Tag=Value in Map)
|
|
S := replace_string(T,Tag,Value)
|
|
end.
|
|
|
|
% Picat's replace/3 does not handle substrings well,
|
|
% so we roll our own...
|
|
replace_string(List,Old,New) = Res =>
|
|
Res = copy_term(List),
|
|
while (find(Res,Old,_,_))
|
|
once(append(Before,Old,After,Res)),
|
|
Res := Before ++ New ++ After
|
|
end.
|