
Format - New B32 ID Index - New option: txt index --print - Move scheme to peers - Replace peer.*.conf files with index packed locations Instead of adding a URL to peers.*.conf, run `txt pull <url>` Conversion - Rewritten converters - txt-convert looks for a .convert.conf containing `key: value` lines. - Specifiable topic-roots from .convert.conf. - Added `Topics:` key, with comma seperated topics. If set only those topics will appear in the main index and used as topic roots. Other topics will have sub-indices generated, but won't be listed in the main index. - HTML converter header & footer options - HTML-index renamed to HTM-index Internal - Change types: uuid:Uuid -> id:string - File_store merges identical texts - Use peer ID for store path, store peers' texts in .local/share/texts - Simple URN resolution for converter Continue to next feed if parsing one fails - Phasing-out Archive, replaced by improved packs - Eliminate Bos, Cohttp, lwt, uri, tls, Re, Ptime, dependencies - Lock version for Cmdliner, fix dune-project - Optional resursive store - Improve header_pack - Fix recursive mkdir git-svn-id: file:///srv/svn/repo/kosuzu/trunk@3 eb64cd80-c68d-6f47-b6a3-0ada418499da
58 lines
2.3 KiB
OCaml
58 lines
2.3 KiB
OCaml
let esc = Converter.Html.esc
|
|
|
|
let element tag content = "<" ^ tag ^ ">" ^ content ^ "</" ^ tag ^ ">"
|
|
|
|
let opt_element tag_name content =
|
|
if content <> ""
|
|
then element tag_name content
|
|
else ""
|
|
|
|
module P = Parsers.Plain_text.Make (Converter.Html)
|
|
|
|
let id txt = "<id>urn:uuid:" ^ Logarion.(txt.Text.id) ^ "</id>"
|
|
let title text = "<title>" ^ esc text.Logarion.Text.title ^ "</title>"
|
|
|
|
let authors text =
|
|
let u acc addr = acc ^ element "uri" addr in
|
|
let open Logarion in
|
|
let fn txt a =
|
|
a ^ "<author>" ^ (opt_element "name" @@ esc txt.Person.name)
|
|
^ (List.fold_left u "" txt.Person.addresses)
|
|
^ "</author>" in
|
|
Person.Set.fold fn text.Text.authors ""
|
|
|
|
let updated txt = let open Logarion in
|
|
"<updated>"^ Date.(txt.Text.date |> listing |> rfc_string) ^"</updated>"
|
|
|
|
let htm_entry base_url text =
|
|
let open Logarion in
|
|
let u = Text.short_id text in
|
|
"<entry><link rel=\"alternate\" href=\"" ^ base_url ^ "/" ^ u ^ ".htm\" />"
|
|
^ title text ^ id text ^ updated text ^ authors text
|
|
^ (opt_element "summary" @@ esc @@ Text.str "abstract" text)
|
|
^ String_set.fold (fun elt a -> a ^ "<category term=\"" ^ esc elt ^ "\"/>") (Text.set "topics" text) ""
|
|
^ "<content type=\"xhtml\"><div xmlns=\"http://www.w3.org/1999/xhtml\">"
|
|
^ P.of_string text.body ""
|
|
^ "</div></content></entry>\n"
|
|
|
|
let gmi_entry base_url text =
|
|
let open Logarion in
|
|
let u = Text.short_id text in
|
|
"<entry><link rel=\"alternate\" href=\"" ^ base_url ^ "/" ^ u ^ ".gmi\" />"
|
|
^ title text ^ id text ^ updated text ^ authors text
|
|
^ (opt_element "summary" @@ esc @@ Text.str "abstract" text)
|
|
^ String_set.fold (fun elt a -> a ^ "<category term=\"" ^ elt ^ "\"/>") (Text.set "topics" text) ""
|
|
^ "</entry>\n"
|
|
|
|
let feed title archive_id base_url alternate_type texts =
|
|
let entry, self = match alternate_type with
|
|
| "text/gemini" -> gmi_entry, base_url^"/gmi.atom"
|
|
| "text/html" | _ -> htm_entry, base_url^"/feed.atom" in
|
|
{|<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:base="|} ^ base_url ^ {|"><title>|}
|
|
^ title ^ {|</title><link rel="alternate" type="|} ^ alternate_type ^ {|" href="|}
|
|
^ base_url ^ {|/" /><link rel="self" type="application/atom+xml" href="|}
|
|
^ self ^ {|" /><id>urn:uuid:|} ^ archive_id ^ "</id><updated>"
|
|
^ Logarion.Date.now () ^ "</updated>\n"
|
|
^ List.fold_left (fun acc t -> acc ^ entry base_url t) "" texts
|
|
^ "</feed>"
|