aboutsummaryrefslogtreecommitdiff
path: root/ellinika/cgi.scmi
blob: c457ca6a548016cb216c466ee839c218a20ef4cb (plain)
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
;;;;                                   -*- scheme -*-
=AUTOGENERATED=
;;;; Greek Dictionary Web Engine
;;;; Copyright (C) 2005 Sergey Poznyakoff
;;;; 
;;;; 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; if not, write to the Free Software
;;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
;;;;

(define-module (ellinika cgi))

(use-modules (www cgi)
	     (gamma gettext))
  
;;; User-definable variables
(define-public base-dir "=PREFIX=")
(define-public html-dir "=HTMLDIR=")
(define-public sysconf-dir "=SYSCONFDIR=")
(define-public locale-dir "=LOCALEDIR=")
(define-public ref-loc #f)

(define-public dict-cgi-path "cgi-bin/dict.cgi") 
(define-public nea-cgi-path "cgi-bin/nea.cgi")         ;; Path to the cgi (relative
                                                       ;; to the Base HREF)

(define-public config-file-name "ellinika.conf")
(define-public dict-template-file-name "dict.html")
(define-public nea-template-file-name "nea.html")
(define-public monima-nea-template-file-name "monima.html")
(define-public target-language "el_GR")

(define-public word-forms-reference '())

(define-public sql-iface "mysql")       ;; SQL interface ("mysql" or "postgres")
(define-public sql-host "localhost")    ;; SQL server hostname or a path to the UNIX
                                        ;; socket
(define-public sql-port 3306)           ;; SQL port number (0 for sockaddr_un
                                        ;; connection)
(define-public sql-database "ellinika") ;; Name of the database
(define-public sql-username "gray")     ;; Database user name
(define-public sql-password "")         ;; Password for that user name

(define-public match-list-columns 4)    ;; Number of colums in fuzzy search output
;;; End of user-definable variables

(define-public (language-code lang)
  (cond
   ((string-index lang #\_) =>
    (lambda (len)
      (substring lang 0 len)))
   (else
    lang)))

(define-public (template-file lang template-file-name)
  (string-append html-dir "/" (language-code lang) "/" template-file-name))

(define-public (make-cgi-name cgi-path . rest)
  (apply
   string-append
   (cons
    cgi-path
    (let ((arglist (let ((lang (cgi:value "LANG")))
		     (do ((ilist (if lang
				     (cons "LANG" (cons lang rest))
				     rest) (cdr ilist))
			  (i 1 (1+ i))
			  (olist '()))
			 ((null? ilist) (if (null? olist)
					    olist
					    (reverse (cdr olist))))
		       (set! olist (cons (car ilist) olist))
		       (set! olist (cons 
				    (if (odd? i) "=" "&")
				    olist))))))
      (if (null? arglist)
	  arglist
	  (cons "?" arglist))))))

(define-public (expand-template explist template)
  "(expand-template EXPLIST TEMPLATE)

Expands string TEMPLATE in accordance with EXPLIST. EXPLIST is a list
of elements:

  (cons WORD THUNK)

Each occurrence of WORD in TEMPLATE is replaced with the return value of
THUNK.
"
  (let loop ((template template))
    (cond
     ((string-index template #\@) =>
      (lambda (w)
	(display (substring template 0 w))
	(if (and (< (+ w 2) (string-length template))
		 (char=? (string-ref template (1+ w)) #\@))
	    (let ((end-pos (string-index template #\@ (+ w 2))))
	      (if (and end-pos
		       (< (1+ end-pos) (string-length template))
		       (char=? (string-ref template (1+ end-pos)) #\@))
		  (let* ((name (substring template w (+ end-pos 2)))
			 (entry (assoc name explist)))
		    (cond
		     (entry
		      ((cdr entry))
		      (loop (substring template (+ end-pos 2))))
		     (else
		      (display "@@")
		      (loop (substring template (+ w 2))))))
		  (begin
		    (display "@")
		    (loop (substring template (+ w 1))))))
	    (begin
	      (display "@")
	      (loop (substring template (1+ w)))))))
     (else
      (display template)))))

  
(define-public (ellinika-cgi-init template-file-name)
  ;;; Load the site defaults
  (let ((rc-file (string-append sysconf-dir "/" config-file-name)))
    (if (file-exists? rc-file)
	(load rc-file)))

;;; Load the language-specific defaults
  (cond
   ((cgi:value "LANG") =>
    (lambda (x)
      (if (and (file-exists? (template-file x template-file-name))
	       (false-if-exception (setlocale LC_ALL x)))
	  (set! target-language x)))))

;;; Initialize i18n
  (setlocale LC_ALL target-language)
  (bindtextdomain "=PACKAGE=" locale-dir)
  (bind_textdomain_codeset "=PACKAGE=" "UTF-8")
  (textdomain "=PACKAGE="))

;;; End of cgi.scmi

Return to:

Send suggestions and report system problems to the System administrator.