some changes
[htmlglue.git] / htmlglue.py
1 #!/usr/bin/env python3
2 # -*- coding: utf8 -*-
3
4 import sys, os
5 from time import strftime
6 from datetime import datetime
7
8 def checkfiles(sourcepath):
9     filelist = os.listdir(sourcepath)    
10     cleanfiles = []
11     for i in range(len(filelist)):
12         currentfilename = filelist[i]
13         ignorelist = ['', '.', '..']
14         if not currentfilename in ignorelist:
15             if not os.path.isfile(currentfilename):
16                 cleanfiles.append(currentfilename)
17             if currentfilename.endswith(".htm"):
18                 cleanfiles.append(currentfilename)
19     return cleanfiles
20
21 def buildpage(sourcepath, sourceconf, theme):
22     from sourcepath import sourceconf as pageconfig
23     filetime = os.path.getmtime(pageconfig.contentfile)
24     fileday = strftime(filetime, "%Y-%m-%d")
25     filetimestamp = strftime(filetime, "%Y-%m-%d %H:%M:%S")
26     targetfile = pageconfig.targetfile
27
28     from defaults import myversion
29
30     metaend = '" />\n'
31
32     if pageconfig.doctype in locals():
33         htmlpage = settings.doctype + "\n"
34     elif settings.doctype in locals():
35         htmlpage = pageconfig.doctype + "\n"
36     else:
37         htmlpage = ""
38
39     if pageconfig.htmlver in locals():
40         htmlpage += htmlver + "\n"
41     elif settings.htmlver in locals():
42         htmlpage += htmlver + "\n"
43     else:
44         htmlpage += '<html>\n'
45     htmlpage += '  <head>\n'
46
47     if pageconfig.title in locals():
48         htmlpage += '    <title>' + pageconfig.title + '</title>\n'
49     elif settings.title in locals():
50         htmlpage += '    <title>' + settings.title + '</title\n'
51     elif pageconfig.dctitle in locals():
52         htmlpage += '    <title>' + pageconfig.dctitle + '</title>\n'
53     elif settings.dctitle in locals():
54         htmlpage += '    <title>' + settings.dctitle + '</title>\n'
55     else:
56         htmlpage += '    <title>' + settings.domain + '</title>\n'
57
58     if pageconfig.description in locals():
59         htmlpage += '    <meta name="description" content="' + pageconfig.description + metaend
60     elif settings.description in locals():
61         htmlpage += '    <meta name="description" content="' + settings.description + metaend
62
63     if pageconfig.creator in locals():
64         htmlpage += '    <meta name="author" content="' + pageconfig.creator + metaend
65     elif settings.creator in locals():
66         htmlpage += '    <meta name="author" content="' + settings.creator + metaend
67
68     if pageconfig.robots in locals():
69         htmlpage += '    <meta name="robots" content="' + pageconfig.robots + metaend
70     elif settings.robots in locals():
71         htmlpage += '    <meta name="robots" content="' + settings.robots + metaend
72     else:
73         htmlpage += '    <meta name="robots" content="index,follow' + metaend
74
75     htmlpage += '    <meta name="generator" content="HTMLglue v' + myversion + metaend
76
77     if pageconfig.language in locals():
78         htmlpage += '    <meta http-equiv="content-language" content="' + pageconfig.language + metaend
79     elif settings.language in locals():
80         htmlpage += '    <meta http-equiv="content-language" content="' + settings.language + metaend
81     else:
82         pass
83
84     if pageconfig.dctitle in locals():
85         htmlpage += '    <meta name="DC.Title" content="' + pageconfig.dctitle + metaend
86     elif settings.dctitle in locals():
87         htmlpage += '    <meta name="DC.Title" content="' + settings.dctitle + metaend
88     else:
89         pass
90
91     if pageconfig.creator in locals():
92         htmlpage += '    <meta name="DC.Creator" content="' + pageconfig.creator + metaend
93     elif settings.creator in locals():
94         htmlpage += '    <meta name="DC.Creator" content="' + settings.creator + metaend
95     else:
96         pass
97
98     if pageconfig.subject in locals():
99         htmlpage += '    <meta name="DC.Subject" content="' + pageconfig.subject + metaend
100     elif settings.subject in locals():
101         htmlpage += '    <meta name="DC.Subject" content="' + settings.subject + metaend
102     else:
103         pass
104
105     if pageconfig.description in locals():
106         htmlpage += '    <meta name="DC.Description" content="' + pageconfig.description + metaend
107     elif settings.description in locals():
108         htmlpage += '    <meta name="DC.Description" content="' + settings.description + metaend
109     else:
110         pass
111
112     if pageconfig.publisher in locals():
113         htmlpage += '    <meta name="DC.Publisher" content="' + pageconfig.publisher + metaend
114     elif settings.publisher in locals():
115         htmlpage += '    <meta name="DC.Publisher" content="' + settings.publisher + metaend
116     else:
117         pass
118
119     htmlpage += '    <meta name="DC.Date" content="' + fileday + metaend
120
121     if pageconfig.dclang in locals():
122         htmlpage += '    <meta name="DC.Language" content="' + pageconfig.dclang + metaend
123     elif settings.dclang in locals():
124         htmlpage += '    <meta name="DC.Language" content="' + settings.dclang + metaend
125     elif pageconfig.language in locals():
126         htmlpage += '    <meta name="DC.Language" content="' + pageconfig.language + metaend
127     elif settings.language in locals():
128         htmlpage += '    <meta name="DC.Language" content="' + settings.language + metaend
129     else:
130         pass
131
132     if pageconfig.dccoverage in locals():
133         htmlpage += '    <meta name="DC.Coverage" content="' + pageconfig.dccoverage + metaend
134     elif settings.dccoverage in locals():
135         htmlpage += '    <meta name="DC.Coverage" content="' + settings.dccoverage + metaend
136     else:
137         pass
138
139     if pageconfig.dcrights in locals():
140         htmlpage += '    <meta name="DC.Rights" content="' + pageconfig.dcrights + metaend
141     elif settings.dcrights in locals():
142         htmlpage += '    <meta name="DC.Rights" content="' + settings.dcrights + metaend
143     else:
144         pass
145
146     # only in start page of the whole site
147     if pageconfig.flattr in locals():
148         htmlpage += '    <meta name="verify-v1" content="' + flattr + metaend
149
150     if pageconfig.favicon in locals():
151         htmlpage += '    link rel="shortcut icon" href="' + pageconfig.favicon + 'type="image/x-icon' + metaend
152     elif settings.favicon in locals():
153         htmlpage += '    link rel="shortcut icon" href="' + settings.favicon + 'type="image/x-icon' + metaend
154     else:
155         pass
156
157     if pageconfig.stylesheet in locals():
158         htmlpage += '   <link rel="stylesheet" media="all" href="' + pageconfig.stylesheet + 'type="text/css' + metaend
159     elif settings.stylesheet in locals():
160         htmlpage += '   <link rel="stylesheet" media="all" href="' + settings.stylesheet + 'type="text/css' + metaend
161     else:
162         pass
163
164     # additional css files are only expected in single pages, not for the whole site
165     if pageconfig.addcss in locals():
166         addcss = pageconfig.addcss
167         for i in range(len(addcss)):
168             cssinfoparts = addcss[i].split(" ")
169             htmlpage += '    <link rel="stylesheet" media="' + cssinfoparts[1] + '"'
170             htmlpage += 'href="' + cssinfoparts[0] + 'type="text/css' + metaend
171
172     # same for additional entries in <head>
173     if pageconfig.addhead in locals():
174         htmlpage += pageconfig.addhead
175
176     htmlpage += '  </head>\n'
177
178     bodytopfile = themepath + "/bodytop.htm"
179     logofile = themepath + "/logo.htm"
180
181     if os.path.exists(bodytopfile):
182         bodytop = open(bodytopfile, "r")
183         bodytophtml = bodytop.read()
184         bodytop.close()
185         htmlpage += bodytophtml
186     else:
187         print("bodytop in theme " + theme + " does not exist, aborting.")
188         exit()
189
190
191     if os.path.exists(logofile):
192         logo = open(logofile, "r")
193         logohtml = logo.read()
194         logo.close()
195         htmlpage += logohtml
196
197     if settings.menupos == "above":
198         # like in below
199
200     contentfile = open(sourcehtml, "r")
201     content = contentfile.read()
202     contentfile.close()
203     htmlpage += content
204
205     if settings.menupos == "below":
206         if pageconfig.menuadd in locals():
207             menu = buildmenu(sourcepath, pageconfig.menuentry, pageconfig.menuadd, pageconfig.menuclass, settings.menuhome)
208         else:
209             menu = buildmenu(sourcepath, pageconfig.menuentry, "", pageconfig.menuclass, settings.menuhome)
210         htmlpage += menu
211
212     # footer        
213
214
215 def buildmenu(sourcepath, menuadd, mymenuclass, menuhome):
216
217     from sourcepath import menu
218
219     # TODO: replace this with a menustart.htm snippet
220     menulist  = '      <div id="menu">\n'
221     menulist += '        <ul>'
222
223     listitemend = '</a></li>\n'
224
225     # Startpage
226
227     for item in range(len(menu.menuitem)):
228         menuitemparts = menu.menuitem[item].split(", ")
229         if len(menuitemparts) == 4:
230             menutype = menuitemparts[0]
231             menuclass = menuitemparts[1]
232             menufile = menuitemparts[2]
233             menuitemname = menuitemparts[3]
234             
235             if item == 0:
236                 # start page
237                 pass
238             else:
239                 pass
240         
241         else:
242             print("Error in menu.py in", sourcepath)
243             exit()
244
245
246
247     if mymenuclass == "home":
248         menu += '<li class="home">' + menuentry + '</li>\n'
249     else:
250         menu += '<li class="home"><a href="/">' + menuhome + listend
251
252     allfiles = os.listdir(sourcepath)
253     cleanfiles = checkfiles(allfiles)
254     if cleanfolders != "":
255         cleanfolders = cleanfolders.sort()
256         for i in range(len(cleanfolders)):
257             if cleanfo
258             from cleanfolders[1] import index
259             menu += 
260             
261                 
262
263     if menuadd in locals():
264         for i in range(len(menuadd)):
265             snippetpath = mypath + "/theme/" + theme
266             snippetfile = snippetpath + "/menu." + menuadd[i] + ".htm"
267             snippet = open(snippetfile, "r")
268             menusnippet = snippet.read()
269             snippet.close()
270             htmlpage += menusnippet + "\n"
271
272 # End of functions
273
274
275 # check arguments
276 mypath = "/".join(sys.argv[0]("/")[:-1])
277
278 if len(sys.argv) > 1:
279     arguments = {"theme" = "", "targetdir" = "", "targetfile" = ""}
280     for args in range(len(sys.argv)):
281         if sys.argv[args] == "-t" or sys.argv[args] == "--theme":
282             arguments["theme"] = sys.argv[args + 1]
283         elif sys.argv[args] == "-d" or sys.argv[args] == "--dir":
284             arguments["targetdir"] = sys.argv[args + 1]
285         elif sys.argv[args] == "-f" or sys.argv[args] == "--file":
286             arguments["targetfile"] = sys.argv[args + 1]
287 else:
288     print("Cannot work without at least a given theme.")
289     exit()
290
291 # ToDo instead: compare file timestamps of pages and html, build
292 # new html if page is newer or html does not exist at all.
293 # Needs no more arguments from the command line.
294 # How to find out if theme has been changed (and everything must
295 # be rebuilt)?
296
297 if arguments("theme") == "":
298     print("Cannot work without at least a given theme.")
299     exit()
300 else:
301     themepath = mypath + "/themes/" + arguments["theme"]
302     sys.path.insert(0, themepath)
303
304
305 targetpath = mypath + "/html/" + arguments["theme"] 
306 if not targetpath.endswith("/"):
307     targetpath += "/"
308
309 if arguments["directory"] != "":
310     targetpath += arguments["directory"]
311     if os.path.exists(targetpath):
312         os.mkdir(targetpath)
313
314 # In this version the first file with given name gets used!
315 # If there is another file with same name in another directory, it will not be found.
316 if arguments("targetfile") != "":
317     targetfile = arguments["targetfile"]
318     if not targetfile.endswith(".html"):
319         print("invalid target file")
320         exit()
321
322     if "/" in targetfile:
323         targetfileparts = targetfile.split("/")
324         targetpath = mypath
325         for i in range(len(targetfileparts) -1):
326             targetpath += targetfileparts[i]
327         targetfile = targetfileparts[len(targetfileparts)]
328     else:
329         searchfile = targetpath + targetfile
330         if not os.path.exists(searchfile):
331             allfolders = os.listdir(filepath)
332             cleanfolders = checkfolders(allfolders)
333             for curfold in range(len(cleanfolders)):
334                 currentfolder = cleanfolders[curfold]
335                 currentpath = filepath + currentfolder + "/"
336                 filelist = filesoffolder(currentpath)
337                 if targetfile in filelist:
338                     targetpath = currentpath
339                     break