generate the post index
This commit is contained in:
		
							
								
								
									
										10
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								Makefile
									
									
									
									
									
								
							@@ -8,11 +8,12 @@ post_compiler := src/webcc.ml
 | 
				
			|||||||
builddir := _build/default
 | 
					builddir := _build/default
 | 
				
			||||||
 | 
					
 | 
				
			||||||
POSTCC := $(builddir)/$(patsubst %.ml,%.exe,$(post_compiler))
 | 
					POSTCC := $(builddir)/$(patsubst %.ml,%.exe,$(post_compiler))
 | 
				
			||||||
 | 
					INDEXCC := $(POSTCC) -i
 | 
				
			||||||
 | 
					
 | 
				
			||||||
post-sources := $(shell find $(src)/ -type f)
 | 
					post-sources := $(shell find $(src)/ -type f)
 | 
				
			||||||
post-htmls   := $(patsubst $(src)/%.md,$(www)/%.html,$(post-sources))
 | 
					post-htmls   := $(patsubst $(src)/%.md,$(www)/%.html,$(post-sources))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: all serve clean $(post_index)
 | 
					.PHONY: all serve clean $(POSTCC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
all: $(POSTCC) $(post-htmls) $(post_index) $(www_root)/static
 | 
					all: $(POSTCC) $(post-htmls) $(post_index) $(www_root)/static
 | 
				
			||||||
	cp -R ~/www/* $(www_root)
 | 
						cp -R ~/www/* $(www_root)
 | 
				
			||||||
@@ -23,10 +24,8 @@ $(www):
 | 
				
			|||||||
$(www)/%.html: $(src)/%.md $(www)
 | 
					$(www)/%.html: $(src)/%.md $(www)
 | 
				
			||||||
	$(POSTCC) $< -o $@
 | 
						$(POSTCC) $< -o $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# make sure that this target is .PHONY!
 | 
					$(post_index): $(post-sources)
 | 
				
			||||||
$(post_index):
 | 
						$(INDEXCC) $^ -o $@
 | 
				
			||||||
	echo hm > $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(www_root)/static:
 | 
					$(www_root)/static:
 | 
				
			||||||
	cp -R static $@
 | 
						cp -R static $@
 | 
				
			||||||
@@ -35,7 +34,6 @@ $(POSTCC): $(post_compiler)
 | 
				
			|||||||
	dune build
 | 
						dune build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clean:
 | 
					clean:
 | 
				
			||||||
	rm $(POSTCC)
 | 
					 | 
				
			||||||
	rm -fr $(www_root)
 | 
						rm -fr $(www_root)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
serve:
 | 
					serve:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								src/dune
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								src/dune
									
									
									
									
									
								
							@@ -1,3 +1,3 @@
 | 
				
			|||||||
(executable
 | 
					(executable
 | 
				
			||||||
 (name webcc)
 | 
					 (name webcc)
 | 
				
			||||||
 (libraries omd ISO8601))
 | 
					 (libraries omd ISO8601 str))
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										40
									
								
								src/webcc.ml
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								src/webcc.ml
									
									
									
									
									
								
							@@ -13,6 +13,7 @@ let spec =
 | 
				
			|||||||
  ]
 | 
					  ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type post_metadata = { title : string ; date : float ; tags : string list ;
 | 
					type post_metadata = { title : string ; date : float ; tags : string list ;
 | 
				
			||||||
 | 
					                       filename : string ;
 | 
				
			||||||
                       other : (string * string) list }
 | 
					                       other : (string * string) list }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(** Utitilies *)
 | 
					(** Utitilies *)
 | 
				
			||||||
@@ -28,7 +29,7 @@ let with_open_out fn f =
 | 
				
			|||||||
  | r -> close_out oc; r
 | 
					  | r -> close_out oc; r
 | 
				
			||||||
  | exception e -> close_out_noerr oc; raise e
 | 
					  | exception e -> close_out_noerr oc; raise e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let read_metadata ic : post_metadata =
 | 
					let read_metadata filename ic : post_metadata =
 | 
				
			||||||
  let rec go lst =
 | 
					  let rec go lst =
 | 
				
			||||||
    let line =
 | 
					    let line =
 | 
				
			||||||
      try input_line ic
 | 
					      try input_line ic
 | 
				
			||||||
@@ -48,6 +49,7 @@ let read_metadata ic : post_metadata =
 | 
				
			|||||||
  { title = lookup "title";
 | 
					  { title = lookup "title";
 | 
				
			||||||
    date  = date;
 | 
					    date  = date;
 | 
				
			||||||
    tags  = String.split_on_char ',' (lookup "tags");
 | 
					    tags  = String.split_on_char ',' (lookup "tags");
 | 
				
			||||||
 | 
					    filename = filename;
 | 
				
			||||||
    other = md }
 | 
					    other = md }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -94,8 +96,8 @@ let format_post ~title ~tags ~date ~contents =
 | 
				
			|||||||
  format_page ~title ~contents:inner
 | 
					  format_page ~title ~contents:inner
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(* convert contents from [ic] to a post webpage, output to [oc] *)
 | 
					(* convert contents from [ic] to a post webpage, output to [oc] *)
 | 
				
			||||||
let process ic oc =
 | 
					let process filename ic oc =
 | 
				
			||||||
  let metadata = read_metadata ic in
 | 
					  let metadata = read_metadata filename ic in
 | 
				
			||||||
  let md = Omd.of_channel ic in
 | 
					  let md = Omd.of_channel ic in
 | 
				
			||||||
  let html = format_post
 | 
					  let html = format_post
 | 
				
			||||||
               ~title:(metadata.title)
 | 
					               ~title:(metadata.title)
 | 
				
			||||||
@@ -106,15 +108,36 @@ let process ic oc =
 | 
				
			|||||||
  output_string oc html
 | 
					  output_string oc html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let compile_posts oc =
 | 
					let compile_posts oc =
 | 
				
			||||||
  if !input = [] then process stdin oc
 | 
					  if !input = [] then process "<stdin>" stdin oc
 | 
				
			||||||
  else begin
 | 
					  else begin
 | 
				
			||||||
    let f filename = with_open_in filename @@ fun ic -> process ic oc in
 | 
					    let f filename = with_open_in filename @@ fun ic -> process filename ic oc in
 | 
				
			||||||
    List.iter f !input
 | 
					    List.iter f !input
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(** Generating index of posts *)
 | 
					(** Generating index of posts *)
 | 
				
			||||||
(* let generate_index oc = () *)
 | 
					let generate_index oc =
 | 
				
			||||||
 | 
					  let f filename = with_open_in filename (read_metadata filename) in
 | 
				
			||||||
 | 
					  let mds = List.map f !input in
 | 
				
			||||||
 | 
					  let mds = List.sort (fun md1 md2 -> compare md2.date md1.date) mds in
 | 
				
			||||||
 | 
					  (* TODO! Fix the paths here!!!!!! *)
 | 
				
			||||||
 | 
					  let format_item md =
 | 
				
			||||||
 | 
					    (* path to the html file *)
 | 
				
			||||||
 | 
					    let fname = md.filename in
 | 
				
			||||||
 | 
					    let target_fname =
 | 
				
			||||||
 | 
					      let open Str in
 | 
				
			||||||
 | 
					      if string_match (regexp {|content/\(.*\)\.md|}) fname 0
 | 
				
			||||||
 | 
					      then matched_group 1 fname ^ ".html"
 | 
				
			||||||
 | 
					      else fname
 | 
				
			||||||
 | 
					    in
 | 
				
			||||||
 | 
					    String.concat "" [
 | 
				
			||||||
 | 
					        {|<li><a href="/posts/|}; target_fname; {|">|};
 | 
				
			||||||
 | 
					                 md.title;
 | 
				
			||||||
 | 
					              {|</a> - |}; ISO8601.Permissive.string_of_date md.date ; {|</li>|}]
 | 
				
			||||||
 | 
					  in
 | 
				
			||||||
 | 
					  let contents = String.concat "\n" @@ List.map format_item mds in
 | 
				
			||||||
 | 
					  let html = format_page ~title:"Recent posts" ~contents in
 | 
				
			||||||
 | 
					  output_string oc html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(** main *)
 | 
					(** main *)
 | 
				
			||||||
let main () =
 | 
					let main () =
 | 
				
			||||||
@@ -127,7 +150,10 @@ let main () =
 | 
				
			|||||||
    else
 | 
					    else
 | 
				
			||||||
      with_open_out !output f
 | 
					      with_open_out !output f
 | 
				
			||||||
  in
 | 
					  in
 | 
				
			||||||
  with_output compile_posts
 | 
					  with_output @@
 | 
				
			||||||
 | 
					    if !gen_index
 | 
				
			||||||
 | 
					    then generate_index
 | 
				
			||||||
 | 
					    else compile_posts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let () =
 | 
					let () =
 | 
				
			||||||
  try
 | 
					  try
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,9 +29,9 @@ html {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
body {
 | 
					body {
 | 
				
			||||||
  font-family: 'Latin Modern', serif;
 | 
					  font-family: 'Latin Modern Roman', Georgia, serif;
 | 
				
			||||||
  font-size: 110%;
 | 
					  font-size: 110%;
 | 
				
			||||||
  line-height: 1.8;
 | 
					  line-height: 1.4;
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  max-width: 100ch;
 | 
					  max-width: 100ch;
 | 
				
			||||||
  min-height: 100vh;
 | 
					  min-height: 100vh;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user