X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=scripts%2Fcocanwiki_template.ml;h=9759cd525881f30a0f68a8b2501070215a4f304b;hb=2b332786c6f216c5e2e72cc1596ba4c66b5aa2a4;hp=ca0f915c5cb7ac2c6a30390fd5cdfcbc06bb19f8;hpb=714e5e5b4b585da1eca55274e3903ee9a1dbf0d6;p=cocanwiki.git diff --git a/scripts/cocanwiki_template.ml b/scripts/cocanwiki_template.ml index ca0f915..9759cd5 100644 --- a/scripts/cocanwiki_template.ml +++ b/scripts/cocanwiki_template.ml @@ -1,27 +1,106 @@ -(* COCANWIKI scripts. +(* COCANWIKI - a wiki written in Objective CAML. * Written by Richard W.M. Jones . * Copyright (C) 2004 Merjis Ltd. - * $Id: cocanwiki_template.ml,v 1.1 2004/09/07 13:40:10 rich Exp $ + * $Id: cocanwiki_template.ml,v 1.5 2004/09/09 12:21:22 rich Exp $ + * + * 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; either version 2 of the License, or + * (at your option) any later version. + * + * 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * This module wraps around the Template library. It provides caching + * of templates and fills in standard fields on a host-specific basis. + * *) -open Apache -open Cgi +open Unix -open Merjisforwiki +open Cocanwiki_files -(* Wrapper around [Cgi.Template.template] function which loads the - * template from a pre-defined path and sets up some default variables. - *) -let get_template = - let path = +let base = + let base = try Sys.getenv "COCANWIKI_TEMPLATES" with Not_found -> "/usr/share/cocanwiki/templates" in let is_dir path = try (Unix.stat path).Unix.st_kind = Unix.S_DIR with Unix.Unix_error _ -> false in - if not (is_dir path) then + if not (is_dir base) then failwith ("environment variable $COCANWIKI_TEMPLATES " ^ "must be set to point to my 'templates' directory " ^ "(see README file for more details)"); - fun filename -> - Template.template (path // filename) + base + +(* The webserver gets restarted regularly enough that this is reasonable. *) +let { tm_year = year } = gmtime (time ()) +let year = year + 1900 + +(* Cache of precompiled templates, arranged by full path. *) +let cache = Hashtbl.create 32 + +let _get_template filename = + let path = base // filename in + let stat = Unix.stat path in + let mtime = stat.st_mtime in + + try + let template, old_mtime = Hashtbl.find cache path in + if old_mtime < mtime then ( + (* The template has changed on disk since it was compiled. Reload. *) + let template = Template.template path in + Hashtbl.replace cache path (template, mtime); + template + ) else + template + with + Not_found -> + (* Template not seen before, so load it. *) + let template = Template.template path in + Hashtbl.replace cache path (template, mtime); + template + +let get_template (dbh : Dbi.connection) hostid filename = + let template = _get_template filename in + + (* Get standard fields concerning this host from the database. *) + let sth = dbh#prepare_cached "select theme_css from hosts + where id = ?" in + sth#execute [`Int hostid]; + + let theme_css = + match sth#fetch1 () with + [ `Null ] -> "/_css/standard.css" + | [ `String file ] -> file + | _ -> assert false in + + template#set "theme_css" theme_css; + + (* Site menu. *) + let sth = dbh#prepare_cached "select url, label, ordering from sitemenu + where hostid = ? order by ordering" in + sth#execute [`Int hostid]; + + let table = sth#map (function [`String url; `String label; _] -> + [ "url", Template.VarString url; + "label", Template.VarString label ] + | _ -> assert false) in + + template#table "sitemenu" table; + + (* Wiki version. *) + template#set "cocanwiki_package" Cocanwiki_version.package; + template#set "cocanwiki_version" Cocanwiki_version.version; + + (* Copyright year. *) + template#set "year" (string_of_int year); + + template