first commit
This commit is contained in:
commit
6b65794087
|
@ -0,0 +1 @@
|
|||
(lang dune 2.7)
|
|
@ -0,0 +1,115 @@
|
|||
let input = ref []
|
||||
let output = ref ""
|
||||
|
||||
let spec =
|
||||
[
|
||||
"-o", Arg.Set_string output,
|
||||
" file.html Specify the output file (default is stdout).";
|
||||
|
||||
"--", Rest(fun s -> input := s :: !input),
|
||||
" Consider all remaining arguments as input file names.";
|
||||
]
|
||||
|
||||
|
||||
let with_open_in fn f =
|
||||
let ic = open_in fn in
|
||||
match f ic with
|
||||
| r -> close_in ic; r
|
||||
| exception e -> close_in_noerr ic; raise e
|
||||
|
||||
let with_open_out fn f =
|
||||
let oc = open_out fn in
|
||||
match f oc with
|
||||
| r -> close_out oc; r
|
||||
| exception e -> close_out_noerr oc; raise e
|
||||
|
||||
let read_metadata ic =
|
||||
let rec go lst =
|
||||
let line =
|
||||
try input_line ic
|
||||
with End_of_file -> ""
|
||||
in
|
||||
match String.split_on_char ':' line with
|
||||
| tag::value1::rest -> go ((tag, String.trim (String.concat ":" (value1::rest)))::lst)
|
||||
| _ -> lst
|
||||
in go []
|
||||
|
||||
let format_post ~title ~tags ~date ~contents =
|
||||
String.concat "" [
|
||||
{|<!DOCTYPE html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||
<link rel="stylesheet" href="/static/style.css" />
|
||||
<link rel="alternate" href="/feed.xml" type="application/atom+xml" title="Atom feed" />
|
||||
<script type="text/x-mathjax-config">
|
||||
MathJax.Hub.Config({
|
||||
tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
|
||||
});</script>
|
||||
<script type="text/javascript" src="https://groupoid.moe/MathJax/MathJax.js?config=TeX-MML-AM_CHTML"></script>
|
||||
<title>|}; title; {|</title>|};
|
||||
{|</head>
|
||||
<body>
|
||||
<div class="menu">
|
||||
<span class="menu-item"><a href="/">home</a></span>
|
||||
<span class="menu-item"><a href="/pages/links.html">linkroll</a></span>
|
||||
<span class="menu-item"><a href="/feed.xml">atom feed</a></span>
|
||||
</div>
|
||||
<div id="wrapper">
|
||||
<h1>|}; title; {|</h1>|};
|
||||
{|<p class="author">|}; date; {|</p>|};
|
||||
{|<div class="abstract"><p>Tags: |}; tags; {|</p></div>|};
|
||||
{|<div class="post">|}; contents; {|</div>|};
|
||||
{| </div>
|
||||
<hr />
|
||||
<div class="footer">
|
||||
<p><img src="/static/created0.jpg" /></p>
|
||||
<p><a href="/feed.xml">atom</a></p>
|
||||
</div>
|
||||
</body>|}]
|
||||
|
||||
|
||||
let process ic oc =
|
||||
let metadata = read_metadata ic in
|
||||
let lookup_metadata k =
|
||||
match List.assoc_opt k metadata with
|
||||
| Some s -> s
|
||||
| None -> "-"
|
||||
in
|
||||
let md = Omd.of_channel ic in
|
||||
let html = format_post
|
||||
~title:(lookup_metadata "title")
|
||||
~tags:(lookup_metadata "tags")
|
||||
~date:(lookup_metadata "date")
|
||||
~contents:(Omd.to_html md)
|
||||
in
|
||||
output_string oc html
|
||||
|
||||
let main () =
|
||||
Arg.parse (Arg.align spec)
|
||||
(fun s -> input := s :: !input)
|
||||
"webcc [options] [inputfile1 .. inputfileN] [options]";
|
||||
let with_output f =
|
||||
if !output = "" then
|
||||
f stdout
|
||||
else
|
||||
with_open_out !output f
|
||||
in
|
||||
with_output @@ fun oc ->
|
||||
if !input = [] then process stdin oc
|
||||
else begin
|
||||
let f filename = with_open_in filename @@ fun ic -> process ic oc in
|
||||
List.iter f !input
|
||||
end
|
||||
|
||||
let () =
|
||||
try
|
||||
main ()
|
||||
with
|
||||
| Sys_error msg ->
|
||||
Printf.eprintf "Error: %s\n" msg;
|
||||
exit 1
|
||||
| exn ->
|
||||
Printf.eprintf "Error: %s\n" (Printexc.to_string exn);
|
||||
Printexc.print_backtrace stderr;
|
||||
exit 1
|
Loading…
Reference in New Issue