+ let in_base_uri = Filename.concat st.input_base_uri name in
+ let out_base_uri = Filename.concat st.output_base_uri name in
+ let filter path = function
+ | T.Inline (b, k, obj, p, f, params) ->
+ let obj, p =
+ if b then Filename.concat (make_path path) obj, make_prefix path
+ else obj, p
+ in
+ let ext = G.string_of_inline_kind k in
+ let s = Filename.concat in_base_uri (obj ^ ext) in
+ let params =
+ params @
+ get_iparams st "*" @
+ get_iparams st ("*" ^ ext) @
+ get_iparams st (Filename.concat name obj)
+ in
+ path, Some (T.Inline (b, k, s, p, f, params))
+ | T.Include (moo, s) ->
+ begin
+ try path, Some (T.Include (moo, List.assoc s st.requires))
+ with Not_found -> path, None
+ end
+ | T.Coercion (b, obj) ->
+ let str = get_coercion st obj in
+ if str <> "" then path, Some (T.Coercion (b, str)) else
+ let base_uri = if b then out_base_uri else in_base_uri in
+ let s = obj ^ G.string_of_inline_kind T.Con in
+ path, Some (T.Coercion (b, Filename.concat base_uri s))
+ | T.Section (b, id, _) as item ->
+ let path = if b then id :: path else List.tl path in
+ path, Some item
+ | T.Verbatim s ->
+ let pat, templ = st.input_base_uri, st.output_base_uri in
+ path, Some (T.Verbatim (Pcre.replace ~pat ~templ s))
+ | item -> path, Some item
+ in
+ let set_includes st name =
+ try require st name true (List.assoc name st.includes)
+ with Not_found -> ()
+ in
+ let rec remove_lines ich n =
+ if n > 0 then let _ = input_line ich in remove_lines ich (pred n)