makesite can recreate a whole website, but still missing parts in pages
authorSabine Engelhardt (Becker) <frosch@atari-frosch.de>
Tue, 11 Sep 2018 21:09:43 +0000 (23:09 +0200)
committerSabine Engelhardt (Becker) <frosch@atari-frosch.de>
Tue, 11 Sep 2018 21:09:43 +0000 (23:09 +0200)
CHANGELOG
ToDo
gitcommand [new file with mode: 0644]
makesite.py
sites/atarifrosch/CSS/frosch.css
sites/atarifrosch/DEFAULTS/settings.py
sites/atarifrosch/SNIPPETS/footer.htm

index 7bd82ac..a728022 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,13 @@
-2018-09-10 frosch
+2018-09-11 frosch@atari-frosch.de
+
+    * after lots of bugfixing makesite.py delivers all pages of a site, but
+      will need to ignore some folders. And some minor page parts are still
+      missing.
+
+    * updated ToDo
+
+
+2018-09-10 frosch@atari-frosch.de
 
     * preparesite.py: define menuitem list in all menu.py first before 
       appending menu items
@@ -21,7 +30,7 @@
       problems (still not running)
 
 
-2018-09-09 frosch
+2018-09-09 frosch@atari-frosch.de
 
     * preparesite.py: although it had worked before, now the script threw
       path and variable errors. Fixed.
diff --git a/ToDo b/ToDo
index 7bc0417..81ec26a 100644 (file)
--- a/ToDo
+++ b/ToDo
@@ -1,29 +1,79 @@
 in general:
 
-LICENSE missing
+* NEW: LICENSE file (GPLv3, I guess)
+
+* FEAT: Multi language support for websites (additional language menu so
+  that a visitor of the website can change language at any site as long as
+  there is an according page in the other language)
+
 
 preparesite.py:
 
-* NEW: Put data from filter to settings.py – possible?
+* ERROR: change menuitem.append in menu.py to
+  menuitem.append("... ... ... ...") instead of
+  menuitem.append(["... ... ... ..."])
+
+* ERROR: If there's a ' in a string variable in the according page.py it
+  must be stated with " around and vice versa; otherwise makesite will crash
+  while importing that page.py. Also means that a string variable in page.py
+  must not contain both characters together. It might help to exchange the
+  simple " into „ and “ or whatever characters one wants to use, depending
+  on the language of the site/page.
 
-fullsettings.py:
+* PROBLEM: Still trouble with pages in UTF8 encoding which have still the
+  marks for iso8859-1/iso8859-15. Possible solution: Check for file encoding
+  before processing; if encoding is already UTF8, don't try to change it
+  again. Looks awful. ;-)
 
-* FEAT: create function makehead
+* FEAT: Move data from filter to settings.py after preparesite is done –
+  possible?
 
 
 makesite.py:
 
-* ERROR: created pages have several errors, like double \n, missing parts,
-  etc.
+* ERROR: a ' within a string variable in page.py lets makesite crash as it
+  is recognised as end of string
+
+* ERROR: created pages still have several errors, like double \n, missing
+  parts, etc.
+  - after DC.Language in htmlhead two \n instead of only one
+  - no \n after favicon / before css
+  - no \n before </head>
+  - start of menu is missing, like <div> and <ul>
+  - end of menu is missing, like </ul> and </div>
+  - endoffile is missing / unused
+
+* ERROR: makefoot: last content modification is printed out in seconds
+  instead of given strftime format
 
-* ERROR: in site atarifrosch file missing.htm is not found, although there
+* CHANGE: move makehtmlhead and makefoot from settings to – where?
+  If in makesite, it might be too „static“ for some sites.
+  But they seem to be at the wrong place in settings, methinks.
+  Idea: If they (or one of them) exist(s) within settings or in the DEFAULTS
+  folder, use them; if not, use a fallback version within makesite.
+
+* FEAT: While (re)creating the site, read the replacements list from
+  settings.py and use it over the whole page, forcibly.
+
+* FEAT: While (re)creating the site, ignore a list of folders given in the
+  settings (like folders with work material, the standard folders CSS,
+  DEFAULTS, and SNIPPETS, etc.). Also ignore all non *.htm files? At least
+  __init__.py.
+
+* FEAT: If a folder is not ignored, and contains *.htm files, but no menu.py
+  file, try to create a menu.py (with standard keywords for the menu items)?
+
+* FEAT: compare file timestamps of menu.py and *.menu in each folder in
+  order to decide whether *.menu files should be recreated.
 
 * FEAT: compare file timestamps of pages and html, build new html if page is
-  newer or html does not exist at all. Needs no more arguments from the
-  command line.
+  newer or html does not exist at all. Ignore timestamps if a command line
+  argument says „force recreation“.
 
 * FEAT: create sitemap.xml
 
+* FEAT: add htmlglue & version to SNIPPETS/footer.htm (in small)
+
 * FEAT: include content from other sites, like Piwigo (photos), Twitter,
         GNUsocial, Mastodon, G+, a git, an rss feed, …
 
diff --git a/gitcommand b/gitcommand
new file mode 100644 (file)
index 0000000..fcfa9c8
--- /dev/null
@@ -0,0 +1,3 @@
+:~$ git add .
+:~$ git commit -m "commit message"
+:~$ git push origin master
index 36b6cdb..7c4814e 100755 (executable)
@@ -13,7 +13,6 @@ import defaults
 
 def makemenus(curdir):
     curmenu = curdir + "/menu.py"
-    logging.debug('Processing %s.', curmenu)
     ln = "\n"
     if not os.path.exists(curmenu):
         logging.critical('No menu.py in <%s>.  Stop.', curdir)
@@ -24,23 +23,29 @@ def makemenus(curdir):
         curdirfiles = os.listdir(curdir)
         pagenames = []
         for file in curdirfiles:
-            logging.debug('makemenus, processing file <%s>', file)
+            logging.debug('makemenus: processing file <%s>', file)
             if file.endswith(".htm"):
                 pagenames.append(file)
         for i in range(len(pagenames)):
             pagenames[i] = pagenames[i].replace('.htm', '')
         for i in range(len(pagenames)):
             outfile = curdir + "/" + pagenames[i] + ".menu"
+            outfile = outfile.replace("//", "/")
+            if os.path.exists(outfile):
+                os.remove(outfile)
+                logging.debug('Removed old menu file %s.', outfile)
+            logging.debug('Creating new menu file %s', outfile)
             targetpage = pagenames[i] + ".html"
             targetfile = open(outfile, "w")
             menuitems = menumod["menuitem"]
             for j in range(len(menuitems)):
-                curmenuitems = menuitems[j]
+                curmenuitems = str(menuitems[j])
+                curmenuitems = curmenuitems[:-2]
                 # ToDo: Last item in each line can contain more than one word!
                 # replace " " with _ in last item or process this here?
                 curitems = curmenuitems.split(" ")
                 # ToDo: class can be '.' in menu.py, then there is no class!
-                if curitems[0] == "htm":
+                if curitems[0] == "['htm" or curitems[0] == "htm":
                     if targetpage in curitems[2]:
                         menuline = '<li class="' + curitems[1] + '">'
                         menuline += curitems[3] + '</li>' + ln
@@ -48,7 +53,7 @@ def makemenus(curdir):
                         menuline = '<li class="' + curitems[1] + '"><a href="' + curitems[2]
                         menuline += '">' + curitems[3] + '</a></li>' + ln
                     targetfile.write(menuline)
-                elif curitems[0] == "dir":
+                elif curitems[0] == "['dir" or curitems[0] == "dir":
                     menuline = '<li class="' + curitems[1] + '"><a href="' + curitems[2]
                     menuline += '">' + curitems[3] + '</a></li>' + ln
                     targetfile.write(menuline)
@@ -65,25 +70,23 @@ def buildpage(filename, curdir, targetdir):
     if not filename.endswith(".htm"):
         pass
     else:
-        pagepy = curdir + "/" + filename.replace(".htm", ".py")
+        pagepy = filename.replace(".htm", ".py")
         pageconfig = run_path(pagepy)
-        contenttime = os.path.getmtime(curdir + filename)
+        contenttime = os.path.getmtime(filename)
         fileday = datetime.fromtimestamp(contenttime).strftime('%Y-%m-%d')
         filetimestamp = datetime.fromtimestamp(contenttime).strftime('%Y-%m-%d %H:%M:%S')
-        targetfile = targetdir + filename + "l"
+        purefilename = os.path.basename(filename)
+        targetfile = targetdir + purefilename + "l"
 
-        from defaults import myversion
-    
-        logging.debug('Starting to build page <%s>.', curdir + targetfile)
+        logging.debug('Starting to build page <%s>.', targetfile)
         htmlpage = settings.makehtmlhead(filename, snippetspath, pagepy)
 
         try:
             settings.bodytopfile
         except NameError:
-            logging.critical('bodytopfile for <%s> is not defined.  Stop.')
-            sys.exit()
+            logging.error('bodytopfile for <%s> is not defined.')
         else:
-            bodytopfile = snippetspath + settings.bodytopfile
+            bodytopfile = snippetspath + "/" + settings.bodytopfile
             if os.path.exists(bodytopfile):
                 bodytop = open(bodytopfile, "r")
                 bodytophtml = bodytop.read()
@@ -91,35 +94,37 @@ def buildpage(filename, curdir, targetdir):
                 htmlpage += bodytophtml
                 logging.debug('bodytop file added to page.')
             else:
-                logging.critical("bodytop for site " + sitename + " does not exist, aborting.")
-                sys.exit()
+                logging.error("bodytop for site " + sitename + " does not exist.")
         
         try:
             settings.logofile
         except NameError:
-            logging.info('Could not find a logo file snippet.')
+            logging.info('Logo file not stated in settings.')
         else:
             logofile = snippetspath + settings.logofile
-            if os.path.exists(settings.logofile):
-                logo = open(settings.logofile, "r")
+            logging.debug('Logo file = <%s>', logofile)
+            if os.path.exists(logofile):
+                logo = open(logofile, "r")
                 logohtml = logo.read()
                 logo.close()
                 htmlpage += logohtml
                 logging.debug('Logo file added to page.')
+            else:
+                logging.error('Logo file for %s not found.', sitename)
 
     if settings.menupos == "above":
-        menufile = curdir + filename.replace(".htm", ".menu")
+        menufile = filename.replace(".htm", ".menu")
         if os.path.exists(menufile):
             m = open(menufile, "r")
             menu = m.read()
             m.close()
             htmlpage += menu
-            logging.debug('Menu added to page (<%s>).', settings.menupos)
+            logging.debug('Menu added to page (%s).', settings.menupos)
         else:
             logging.critical('No menu file for <%s>.  Stop.', filename)
             sys.exit()
 
-    contentfile = open(curdir + filename, "r")
+    contentfile = open(filename, "r")
     content = contentfile.read()
     contentfile.close()
     htmlpage += content
@@ -139,7 +144,7 @@ def buildpage(filename, curdir, targetdir):
             logging.critical('No menu file for <%s>.  Stop.', filename)
             sys.exit()
 
-    footer = settings.makefoot(curdir, filename, snippetspath, settings.myurl)
+    footer = settings.makefoot(filename, snippetspath, settings.myurl)
     htmlpage += footer
     logging.debug('Footer added to page.')
 
@@ -267,15 +272,27 @@ else:
 # gets called. To (re)build a single folder or a single page is on the ToDo
 # list, also moving pages from one folder to another.
 
+logging.debug('Starting to create menu files.')
 for dirpath, dirs, files in os.walk(sitepath):
-    for folder in dirs:
-        logging.debug('Current folder: <%s>', dirpath)
-        if os.path.exists(dirpath + "/menu.py"):
-            targetpath = dirpath.replace("sites", "html")
+    logging.debug('Current folder: %s', dirpath)
+    if "SNIPPETS" not in dirpath:
+        if 'menu.py' in files:
+            curmenufile = dirpath + 'menu.py'
+            makemenus(dirpath)
+            targetpath = dirpath.replace("sites", "html") + "/"
             logging.debug('Current targetpath is <%s>.', targetpath)
             if not os.path.exists(targetpath):
                 os.mkdir(targetpath)
-            makemenus(os.path.abspath(sitepath))
-            for eachfile in files:
-                if eachfile.endswith('.htm'):
-                    buildpage(eachfile, sitepath, targetpath)
+
+logging.debug('Starting to create pages.')
+for dirpath, dirs, files in os.walk(sitepath):
+    logging.debug('Current source folder: %s', dirpath)
+    if "SNIPPETS" not in dirpath:
+        for file in files:
+            curfile = dirpath + "/" + file
+            if curfile.endswith('.htm'):
+                targetpath = dirpath.replace("sites", "html") + "/"
+                targetpath = targetpath.replace("//", "/")
+                logging.debug('Passing %s to buildpage.', curfile)
+                sitepath = sitepath.replace("//", "/")
+                buildpage(curfile, sitepath, targetpath)
index ad27f41..b610323 100644 (file)
@@ -436,6 +436,12 @@ div#footer {
   text-indent      : 0;
 }
 
+#footer p.htmlglue {
+  text-align       : center;
+  font-size        : 70%;
+  font-style       : italic;
+}
+
 #footer a.graflink,#footer a.graflink:hover {
   border           : 0;
   background-color : transparent;
index 7f22576..0905d35 100755 (executable)
@@ -11,7 +11,7 @@ def makehtmlhead(contentfile, snippetpath, sourcepy):
     headfile = open(snippetpath + "/htmlhead.htm", "r")
     head = headfile.read()
     headfile.close()
-    metaend = '" />\n'
+    metaend = '" />'
     
     try:
         pageconf["doctype"]
@@ -57,7 +57,7 @@ def makehtmlhead(contentfile, snippetpath, sourcepy):
         r = '<meta name="robots" content="' + pageconf["robots"] + metaend
         head = head.replace("[ROBOTS]", r)
 
-    r = '<meta name="generator" content="' + defaults.generator
+    r = '<meta name="generator" content="' + defaults.generator + metaend
     head = head.replace("[GENERATOR]", r)
 
     try:
@@ -84,16 +84,20 @@ def makehtmlhead(contentfile, snippetpath, sourcepy):
         try:
             pageconf["contentdate"]
         except KeyError:
-            r = '<meta name="DC.Date" content="' + str(datetime.strftime(os.path.getmtime(contentfile), "%Y-%m-%d")) + metaend
-            head = head.replace("[DC.DATE]", r)
+            if os.path.exists(contentfile):
+                filetime = os.path.getmtime(contentfile)
+                filetimeconv = datetime.fromtimestamp(filetime)
+                filetimestamp = datetime.strftime(filetimeconv, '%Y-%m-%d')
+                r = '<meta name="DC.Date" content="' + filetimestamp + metaend
+                head = head.replace("[DC.DATE]", r)
         else:
             cdate = pageconf["contentdate"].split(" ", 0)
             r = '<meta name="DC.Date" content="' + cdate + metaend
-            head = head.replace("[DC.Date]", r)
+            head = head.replace("[DC.DATE]", r)
     else:
         curtimestamp = str(datetime.strftime(datetime.now(), '%Y-%m-%d'))
-        r = 'meta name="DC.Date" content="' + curtimestamp + metaend
-        head = head.replace("[DC.Date]", r)
+        r = '<meta name="DC.Date" content="' + curtimestamp + metaend
+        head = head.replace("[DC.DATE]", r)
 
     try:
         pageconf["language"]
@@ -137,13 +141,13 @@ def makehtmlhead(contentfile, snippetpath, sourcepy):
     try:
         pageconf["favicon"]
     except KeyError:
-        r = '    <link rel="shortcut icon" href="' + favicon + ' type="image/x-icon"' + metaend
+        r = '    <link rel="shortcut icon" href="' + favicon + '" type="image/x-icon' + metaend
         head += r
     else:
-        r = '    <link rel="shortcut icon" href="' + pageconf["favicon"] + ' type="image/x-icon"' + metaend
+        r = '    <link rel="shortcut icon" href="' + pageconf["favicon"] + '" type="image/x-icon' + metaend
         head += r
 
-    head += '    <link rel="stylesheet" media=' + stylesheetmedia + 'href="/' + stylesheet + 'type="text/css"' + metaend
+    head += '    <link rel="stylesheet" media="' + stylesheetmedia + '" href="/' + stylesheet + '" type="text/css' + metaend
     try:
         pageconf["addcssfile"]
     except KeyError:
@@ -152,28 +156,29 @@ def makehtmlhead(contentfile, snippetpath, sourcepy):
         for i in range(len(pageconf["addcssfile"])):
             cssfile = pageconf["addcssfile"][i]
             cssfileparts = cssfile.split(" ")
-            r = '    <link rel="stylesheet" media=' + cssfileparts[1] + 'href="/' + cssfileparts[0] + 'type="text/css"' + metaend
+            r = '    <link rel="stylesheet" media="' + cssfileparts[1] + '" href="/' + cssfileparts[0] + '" type="text/css' + metaend
             head += r
 
-    head += '</head>\n'
+    head += '  </head>\n'
     return head
 
 
-def makefoot(curpath, contentfile, snippetspath, myurl):
+def makefoot(contentfile, snippetspath, myurl):
     from datetime import datetime
-    from time import strftime
+    from defaults import generator
 
     f = open(snippetspath + "/footer.htm", "r")
     footer = f.read()
     f.close()
 
-    filetime = os.path.getmtime(curpath + "/" + contentfile)
+    filetime = os.path.getmtime(contentfile)
     filetimestamp = datetime.fromtimestamp(filetime).strftime('%Y-%m-%d %H:%M')
     curtimestamp = datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M')
 
     footer = footer.replace("[FILETIME]", str(filetime))
     footer = footer.replace("[CURTIME]", str(curtimestamp))
     footer = footer.replace("[MYURL]", myurl)
+    footer = footer.replace("[GLUE]", generator)
 
     return footer
 
@@ -221,6 +226,6 @@ metakeywords = "atari-frosch"
 headline = "Qua®k!"
 
 htmlhead = "/htmlhead.htm"
-bodytopfile = "/bodytop.htm"
-logofile = "/logo.htm"
-endoffile = "/endoffile.htm"
+bodytopfile = "bodytop.htm"
+logofile = "logo.htm"
+endoffile = "endoffile.htm"
index 4690e89..3ea46a4 100644 (file)
@@ -5,4 +5,5 @@
         <p>URL: [MYURL]</p>
         <p>last content modification: [FILETIME]</p>
         <p>last file modification: [CURTIME]</p>
+        <p class="htmlglue">proudly patched together with [GLUE]</p>
       </div><!-- div#footer -->