Changeset 43 in code for trunk/cli


Ignore:
Timestamp:
Dec 18, 2022, 2:49:25 PM (2 years ago)
Author:
fox
Message:

Relation dates, with conversion condition upon it

Location:
trunk/cli
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/cli/conversion.ml

    r41 r43  
    11open Logarion
    22
    3 module Ref_set = Set.Make(String)
     3module Rel = struct
     4
     5module Rel_set = Set.Make(String)
    46module Id_map = Map.Make(String)
     7
     8type t = { last_rel: string; ref_set: String_set.t; rep_set: String_set.t }
     9type map_t = t Id_map.t
     10
     11let empty = { last_rel = ""; ref_set = Rel_set.empty; rep_set = Rel_set.empty }
     12let empty_map = Id_map.empty
     13
     14let acc_ref date source target = Id_map.update target (function
     15        | None -> Some { last_rel = date;
     16                ref_set = Rel_set.singleton source;
     17                rep_set = Rel_set.empty }
     18        | Some rel -> Some { rel with
     19                last_rel = if Date.compare date rel.last_rel > 0 then date else rel.last_rel;
     20                ref_set = Rel_set.add source rel.ref_set })
     21
     22let acc_rep date source target = Id_map.update target (function
     23        | None -> Some { last_rel = date;
     24                rep_set = Rel_set.singleton source;
     25                ref_set = Rel_set.empty }
     26        | Some rel -> Some { rel with
     27                last_rel = if Date.compare date rel.last_rel > 0 then date else rel.last_rel;
     28                rep_set = Rel_set.add source rel.rep_set })
     29
     30let acc_txt rels (text, _paths) =
     31        let acc_ref = acc_ref (Date.listing text.Text.date) text.Text.id in
     32        let acc_rep = acc_rep (Date.listing text.Text.date) text.Text.id in
     33        let rels = String_set.fold acc_ref (Text.set "references" text) rels in
     34        let rels = String_set.fold acc_rep (Text.set "in-reply-to" text) rels in
     35        rels
     36
     37let acc_pck rels peer =
     38        let path = try List.hd peer.Peers.pack.Header_pack.info.locations with Failure _->"" in
     39        try Header_pack.fold
     40                (fun rels id t _title _authors _topics refs_ls reps_ls ->
     41                        let acc_ref = acc_ref (Date.of_secs @@ Int32.to_int t) (Filename.concat path id) in
     42                        let acc_rep = acc_rep (Date.of_secs @@ Int32.to_int t) (Filename.concat path id) in
     43                        let rels = String_set.fold acc_ref (String_set.of_list refs_ls) rels in
     44                        let rels = String_set.fold acc_rep (String_set.of_list reps_ls) rels in
     45                        rels)
     46                rels peer.Peers.pack
     47        with e -> prerr_endline "acc_pck"; raise e
     48end
     49
    550
    651type t = {
     
    1055        topic_roots: string list;
    1156        topics: (String_set.t * String_set.t) Topic_set.Map.t;
    12         references: Ref_set.t Id_map.t;
    13         replies: Ref_set.t Id_map.t;
     57        relations: Rel.map_t;
    1458        texts: Text.t list
    1559}
     
    2670        topic_roots = [];
    2771        topics = Topic_set.Map.empty;
    28         references = Id_map.empty;
    29         replies = Id_map.empty;
     72        relations = Rel.Id_map.empty;
    3073        texts = []
    3174}
  • trunk/cli/convert.ml

    r42 r43  
    88                let source = List.hd files in
    99                let dest = Filename.concat r.Conversion.dir (Text.short_id text) in
    10                 List.fold_left
    11                         (fun a f ->
    12                                 match f.Conversion.page with None -> false || a
    13                                 | Some page ->
    14                                         let dest = dest ^ f.Conversion.ext in
    15                                         (if is_older source dest then (File_store.file dest (page r text); true) else false)
    16                                         || a)
     10                List.fold_left (fun a f ->
     11                        match f.Conversion.page with None -> false || a
     12                        | Some page ->
     13                                let dest = dest ^ f.Conversion.ext in
     14                                (if is_older source dest || Conversion.Rel.Id_map.mem text.Text.id r.relations
     15                                then (File_store.file dest (page r text); true) else false)
     16                                || a)
    1717                        false cs
    1818        | x -> Printf.eprintf "Can't convert Content-Type: %s file: %s" x text.Text.title; false
     
    2727        t
    2828
    29 let acc_rel source target a =
    30         prerr_endline source;
    31         Conversion.Id_map.update target
    32         (function Some set -> Some (Conversion.Ref_set.add source set)
    33                 | None -> Some (Conversion.Ref_set.singleton source))
    34         a
    35 
    36 let empty_rels () = Conversion.Id_map.empty, Conversion.Id_map.empty
    37 
    38 let acc_txt_refs text refs = String_set.fold (acc_rel text.Text.id) (Text.set "references" text) refs
    39 let acc_txt_reps text reps = String_set.fold (acc_rel text.Text.id) (Text.set "in-reply-to" text) reps
    40 let acc_txt_rels (refs, reps) (elt, _paths) =
    41         acc_txt_refs elt refs, acc_txt_reps elt reps
    42 
    43 let acc_pck_refs id refs_ls refs = String_set.fold (acc_rel id) (String_set.of_list refs_ls) refs
    44 let acc_pck_reps id reps_ls reps = String_set.fold (acc_rel id) (String_set.of_list reps_ls) reps
    45 let acc_pck_rels refs_reps peer =
    46         let path = try List.hd peer.Peers.pack.Header_pack.info.locations with Failure _ -> "" in
    47         try Header_pack.fold
    48                 (fun (refs, reps) id _t _title _authors _topics refs_ls reps_ls ->
    49                         let id = Filename.concat path id in
    50                         acc_pck_refs id refs_ls refs, acc_pck_reps id reps_ls reps)
    51                 refs_reps peer.Peers.pack
    52         with e -> prerr_endline "acc_pck_rels"; raise e
    53 
    5429let directory converters noindex repo =
    5530        let order = File_store.oldest in
    5631        let repo =
    57                 let references, replies =
    58                         File_store.fold ~dir:repo.Conversion.dir ~order acc_txt_rels (empty_rels ()) in
    59                 let references, replies = Peers.fold acc_pck_rels (references, replies) in
    60                 Printf.eprintf "%s %d\n" repo.Conversion.dir (Conversion.Id_map.cardinal replies);
    61                 { repo with references; replies } in
     32                let open Conversion in
     33                let rels = File_store.fold ~dir:repo.dir ~order Rel.acc_txt Rel.empty_map in
     34                let relations = Peers.fold Rel.acc_pck rels in
     35                { repo with relations } in
    6236        let acc (ts,ls,acc) ((elt,_) as r) = Topic_set.to_map ts (Text.set "topics" elt), elt::ls,
    6337                if convert converters repo r then acc+1 else acc in
     
    9670                        | Ok text ->
    9771                                let dir = "." in
    98                                 let references, replies = File_store.(fold ~dir ~order:newest acc_txt_rels (empty_rels ())) in
    99                                 let repo = { (Conversion.empty ()) with dir; kv = load_kv ""; references; replies } in
     72                                let open Conversion in
     73                                let relations = File_store.(fold ~dir ~order:newest Rel.acc_txt Rel.empty_map) in
     74                                let repo = { (Conversion.empty ()) with dir; kv = load_kv ""; relations } in
    10075                                ignore @@ convert (converters types repo.kv) repo (text, [path])
    10176                )
  • trunk/cli/dune

    r31 r43  
    33 (public_name txt)
    44 (modules txt authors convert conversion edit file index last listing
    5         new topics html atom gemini peers publish pull read recent)
     5  new topics html atom gemini peers publish pull read recent)
    66 (libraries text_parse.converter text_parse.parsers logarion msgpck curl str cmdliner))
  • trunk/cli/html.ml

    r42 r43  
    7474                        String_set.fold (fun r a -> sep_append a (link r)) x ""
    7575                in
    76                 Printf.eprintf "%s %d\n" text.id (Conversion.Id_map.cardinal conversion.Conversion.replies);
     76                let references, replies = let open Conversion in
     77                        let Rel.{ref_set; rep_set; _} =
     78                                try Rel.Id_map.find text.id conversion.relations
     79                                with Not_found -> Rel.empty in
     80                        ref_links ref_set, ref_links rep_set
     81                in
    7782                "<article><header><dl>"
    7883                ^ opt_kv "Title:" text.title
     
    8489                ^ opt_kv "Refers:" (ref_links (set "references" text))
    8590                ^ opt_kv "In reply to:" (ref_links (set "in-reply-to" text))
    86                 ^ opt_kv "Referred by:" (try
    87                                 ref_links (Conversion.Id_map.find text.id conversion.Conversion.references)
    88                                 with Not_found -> "")
    89                 ^ opt_kv "Replies:" (try
    90                                 ref_links (Conversion.Id_map.find text.id conversion.Conversion.replies)
    91                                 with Not_found -> "")
     91                ^ opt_kv "Referred by:" references
     92                ^ opt_kv "Replies:" replies
    9293                ^ {|</dl></header><pre style="white-space:pre-wrap">|} in
    9394        wrap conversion htm text.title ((T.of_string text.body header) ^ "</pre></article>")
  • trunk/cli/publish.ml

    r36 r43  
    99        print_endline "No txt.conf found. It's required for the repository name & id. Create one? (y/N)";
    1010        match input_line stdin with
    11         |"y"-> 
     11        |"y"->
    1212                let title =
    1313                        print_endline "Title for repository: ";
Note: See TracChangeset for help on using the changeset viewer.