" title msg
+
+let paginate ~size ~page l =
+ let min = 1 + (page-1) * size in
+ let max = page * size in
+ let rec aux i l =
+ match (i, l) with
+ | _, [] -> []
+ | i, hd :: tl when i < min -> aux (i+1) tl
+ | i, hd :: tl when i >= min && i <= max -> hd :: aux (i+1) tl
+ | i, hd :: tl -> []
+ in
+ assert (size > 0 && page > 0);
+ aux 1 l
(** pretty print a list of URIs to an HELM theory file *)
-let theory_of_result req result =
- let max_results_no =
- Helm_registry.get_opt_default Helm_registry.get_int 10
- "search_engine.max_results_no"
+let theory_of_result page result =
+ let results_per_page =
+ Helm_registry.get_int "search_engine.results_per_page"
in
- let results_no = List.length result in
- let query_kind = pp_request req in
- let template query_kind summary results =
- sprintf
- "
-
-
-
%s
-
%s
-
-
-
-
-
- %s
-
"
- query_kind summary results
- in
+ let results_no = List.length result in
+ let buffer = Buffer.create (200 * results_no) in
+ let result = paginate ~size:results_per_page ~page result in
if results_no > 0 then
- let mode = if results_no > max_results_no then "linkonly" else "typeonly" in
- let results =
- let idx = ref (results_no + 1) in
- List.fold_right
- (fun uri i ->
- decr idx ;
- sprintf
- "
-
%d.
-
-
%s"
- !idx uri mode i)
- result ""
+ let mode = "typeonly" in
+ let output_results () =
+ let idx = ref ((page - 1) * results_per_page) in
+ List.iter
+ (fun uri ->
+ incr idx;
+ Printf.bprintf buffer
+ "
+
%d.
+
%s
+
+
+
+
+
"
+ !idx uri uri mode) result ;
in
- template query_kind
- (sprintf "%d result%s found"
- results_no (if results_no > 1 then "s" else ""))
- (sprintf
- "
- %s
-
"
- results)
+ let summary =
+ sprintf "%d result%s found"
+ results_no (if results_no > 1 then "s" else "")
+ in
+ begin
+ Buffer.add_string buffer
+ "