package stog

  1. Overview
  2. Docs
Static web site compiler, able to handle blog posts as well as regular pages or any XML document in general

Install

Dune Dependency

Authors

Maintainers

Sources

stog-1.1.0.tar.bz2
md5=03c4072037bf05666a249d02954396c3
sha512=299fdb7036c92bd5317726ed20f982123f57897e0d8611dfae383251a6d793e63d372c6628742412d803224a3155ab021f79550fada2e980c7d6179d90f8e43f

doc/src/stog/filter.ml.html

Source file filter.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
(*********************************************************************************)
(*                Stog                                                           *)
(*                                                                               *)
(*    Copyright (C) 2012-2024 INRIA All rights reserved.                         *)
(*    Author: Maxence Guesdon, INRIA Saclay                                      *)
(*                                                                               *)
(*    This program is free software; you can redistribute it and/or modify       *)
(*    it under the terms of the GNU General Public License as                    *)
(*    published by the Free Software Foundation, version 3 of the License.       *)
(*                                                                               *)
(*    This program is distributed in the hope that it will be useful,            *)
(*    but WITHOUT ANY WARRANTY; without even the implied warranty of             *)
(*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the               *)
(*    GNU General Public License for more details.                               *)
(*                                                                               *)
(*    You should have received a copy of the GNU General Public                  *)
(*    License along with this program; if not, write to the Free Software        *)
(*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA                   *)
(*    02111-1307  USA                                                            *)
(*                                                                               *)
(*    As a special exception, you have permission to link this program           *)
(*    with the OCaml compiler and distribute executables, as long as you         *)
(*    follow the requirements of the GNU GPL in regard to all of the             *)
(*    software in the executable aside from the OCaml compiler.                  *)
(*                                                                               *)
(*    Contact: Maxence.Guesdon@inria.fr                                          *)
(*                                                                               *)
(*********************************************************************************)

(** *)

open Types;;
open Filter_types;;

module XR = Xtmpl.Rewrite

let filter_of_string str =
  let lexbuf = Lexing.from_string str in
  Filter_parser.filter Filter_lexer.main lexbuf
;;

module Set =
  Set.Make
    (struct
       type t = (doc_id * doc)
       let compare (id1,_) (id2, _) = Tmap.compare_key id1 id2
     end)

let filter_pred env att s data (doc_id, doc) =
  let (data, v) =
    let xmls = XR.from_string s in
    let (data, xmls) = XR.apply_to_xmls data env xmls in
    (data, XR.to_string xmls)
  in
  let (data, v_doc) =
    match Types.get_def doc.doc_defs att  with
      None -> (data, "")
    | Some (_, body) ->
        let (data, xmls) = XR.apply_to_xmls data env body in
        (data, XR.to_string xmls)
  in
  (data, v = v_doc)
;;

let set_filter =
  let f pred doc (data, set) =
    let (data,b) = pred data doc in
    let set = if b then Set.add doc set else set in
    (data, set)
  in
  fun data pred set ->
    Set.fold (f pred) set (data, Set.empty)
;;

let rec filter data env set = function
  Pred (att, v) -> set_filter data (filter_pred env att v) set
| Or (f1, f2) ->
    let (data, s1) = filter data env set f1 in
    let (data, s2) = filter data env set f2 in
    (data, Set.union s1 s2)
| And (f1, f2) ->
    let (data, s2) = filter data env set f2 in
    filter data env s2 f1
| Not f ->
    let (data, s) = filter data env set f in
    (data, Set.diff set s)


let filter_docs data env t docs =
  let set = List.fold_right Set.add docs Set.empty in
  let (data, set) = filter data env set t in
  (data, Set.elements set)
;;
  
OCaml

Innovation. Community. Security.