Rehabilitating toc
This commit is contained in:
parent
5ec46e5140
commit
5852c184a8
29
cpdftoc.ml
29
cpdftoc.ml
|
@ -14,16 +14,33 @@ let rec real_newline = function
|
||||||
| x::r -> x::real_newline r
|
| x::r -> x::real_newline r
|
||||||
| [] -> []
|
| [] -> []
|
||||||
|
|
||||||
|
let rec collate_runs cfn a = function
|
||||||
|
| [] -> rev (map rev a)
|
||||||
|
| (charcode, fontnum, font) as h::t ->
|
||||||
|
match a with
|
||||||
|
| [] -> collate_runs fontnum [[h]] t
|
||||||
|
| this::rest ->
|
||||||
|
if fontnum = cfn
|
||||||
|
then collate_runs cfn ((h::this)::rest) t
|
||||||
|
else collate_runs fontnum ([h]::this::rest) t
|
||||||
|
|
||||||
|
let collate_runs = function
|
||||||
|
| [] -> []
|
||||||
|
| (_, fontnum, _)::_ as l -> collate_runs fontnum [] l
|
||||||
|
|
||||||
(* Run of Font / Text elements from a fontpack and UTF8 text *)
|
(* Run of Font / Text elements from a fontpack and UTF8 text *)
|
||||||
let of_utf8 fontpack fontsize t =
|
let of_utf8 fontpack fontsize t =
|
||||||
(* Use the fontpack to find which font is required, then return runs
|
|
||||||
of [Font (font, size); Text t] in a list *)
|
|
||||||
let codepoints = Pdftext.codepoints_of_utf8 t in
|
let codepoints = Pdftext.codepoints_of_utf8 t in
|
||||||
(* 1. Text to (charcode, font, fontnum) *)
|
|
||||||
let fonted = option_map (Cpdfembed.get_char fontpack) codepoints in
|
let fonted = option_map (Cpdfembed.get_char fontpack) codepoints in
|
||||||
(* 2. FIXME Collate them *)
|
let collated = collate_runs fonted in
|
||||||
(* 3. Produce the runs, converting to char *)
|
flatten
|
||||||
flatten (map (function (charcode, fontnum, font) -> [Cpdftype.Font (font, fontsize); Cpdftype.Text [char_of_int charcode]]) fonted)
|
(map
|
||||||
|
(function
|
||||||
|
| [] -> []
|
||||||
|
| (_, _, font) as h::t ->
|
||||||
|
let charcodes = map (fun (c, _, _) -> char_of_int c) (h::t) in
|
||||||
|
[Cpdftype.Font (font, fontsize); Cpdftype.Text charcodes])
|
||||||
|
collated)
|
||||||
|
|
||||||
(* Cpdftype codepoints from a font and PDFDocEndoding string *)
|
(* Cpdftype codepoints from a font and PDFDocEndoding string *)
|
||||||
let of_pdfdocencoding fontpack fontsize t =
|
let of_pdfdocencoding fontpack fontsize t =
|
||||||
|
|
|
@ -289,7 +289,7 @@ let write_glyf_table subset cmap bs mk_b glyfoffset loca =
|
||||||
with
|
with
|
||||||
Not_found -> ())
|
Not_found -> ())
|
||||||
subset;
|
subset;
|
||||||
let locnums = expand_composites mk_b loca glyfoffset (sort compare (map fst (list_of_hashtbl locnums))) in
|
let locnums = (*expand_composites mk_b loca glyfoffset*) (sort compare (map fst (list_of_hashtbl locnums))) in
|
||||||
(*if !dbg then*)
|
(*if !dbg then*)
|
||||||
(Printf.printf "We want glyfs for locations: ";
|
(Printf.printf "We want glyfs for locations: ";
|
||||||
iter (Printf.printf "%i ") locnums; Printf.printf "\n");
|
iter (Printf.printf "%i ") locnums; Printf.printf "\n");
|
||||||
|
@ -680,7 +680,7 @@ let parse ~subset data encoding =
|
||||||
write_font "one.ttf" one.subset_fontfile;
|
write_font "one.ttf" one.subset_fontfile;
|
||||||
(*Printf.printf "\nHigher subset:\n";
|
(*Printf.printf "\nHigher subset:\n";
|
||||||
debug_t (hd twos);*)
|
debug_t (hd twos);*)
|
||||||
write_font "two.ttf" (hd twos).subset_fontfile;
|
if twos <> [] then write_font "two.ttf" (hd twos).subset_fontfile;
|
||||||
one::twos
|
one::twos
|
||||||
|
|
||||||
let parse ~subset data encoding =
|
let parse ~subset data encoding =
|
||||||
|
|
Loading…
Reference in New Issue