see CHANGELOG 2018-09-15
authorSabine Engelhardt (Becker) <frosch@atari-frosch.de>
Sat, 15 Sep 2018 22:45:49 +0000 (00:45 +0200)
committerSabine Engelhardt (Becker) <frosch@atari-frosch.de>
Sat, 15 Sep 2018 22:45:49 +0000 (00:45 +0200)
16 files changed:
.gitignore
CHANGELOG
MANUAL
ToDo
__pycache__/defaults.cpython-34.pyc
filters/__pycache__/atarifrosch.cpython-34.pyc
filters/atarifrosch.py
filters/filter.py
fullsettings.py [deleted file]
makesite.py
preparesite.py
sites/atarifrosch/DEFAULTS/settings.py [changed mode: 0755->0644]
sites/atarifrosch/SNIPPETS/akvsbody.htm
sites/atarifrosch/SNIPPETS/footer.htm
sites/atarifrosch/SNIPPETS/menu.cacert.htm
sites/atarifrosch/SNIPPETS/menu.geocaching.htm

index 46c474c..50f8723 100644 (file)
@@ -2,4 +2,4 @@ __pycache__/
 */__pycache/
 html/
 sites/
-gitcommand
\ No newline at end of file
+./gitcommand
\ No newline at end of file
index ba3ab61..d1fd119 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,9 +1,41 @@
+2018-09-15 frosch@atari-frosch.de
+
+    * preparesite.py: All necessary variables and values are now imported
+      from the filter file, not partly from the (perhaps even not existing
+      at that point) settings file for a site.
+
+    * fullsettings.py has been removed. All variables and values set there
+      are now part of the default filter.py and must there be set for each
+      site.
+
+    * preparesite.py: New function makesetting creates the settings.py for a
+      site using variables and values from the filter.py for that site,
+      including (hopefully helpful) comments. If settings.py already exists
+      it will only be recreated if forcemakesettings in filter.py is set to
+      True.
+
+    * filter.py and settings.py: The variables for the standard htm snippets
+      to be used in makesite.py are now defined in a dict snippets{}.
+      Adapted in makesite.py.
+
+    * makesite.py: added new function makepagefoot to be called by function
+      buildpage; now checking not only settings.py for position of the menu,
+      but also page.py (preferred).
+
+    * preparesite.py: added new function makesnippets. If the snippets files
+      stated in filter.py do not exist, the files will be created (empty).
+
+    * preparesite.py: renamed function checkenc to changeenc, as it now does
+      not check on anything anymore but re-encodes the source file if oldenc
+      is True.
+
+
 2018-09-14 frosch@atari-frosch.de
 
     * preparesite.py: Corrected output of menuitem to menu.py
 
     * preparesite.py: If the CSS class for a menu item is empty, do not
-      output an empty string, but a . for clarification.
+      set an empty string, but a . for clarification.
 
     * preparesite.py: String variables within .py files will now be stored
       using standard double quotemarks instead of single quote marks, as
@@ -22,8 +54,8 @@
       language, while DC.Language and http-equiv content-language can
       contain more than one language definition.
 
-    * Overworked the import filter file, created a standard filter.py as a start
-      for every new site filter file (which cannot be used as is!).
+    * Overworked the import filter file, created a standard filter.py as a
+      start for every new site filter file (which cannot be used as is!).
 
     * Overworked fullsettings.py from first experiences with settings.py for
       a real website.
diff --git a/MANUAL b/MANUAL
index f15f0e6..a678a77 100644 (file)
--- a/MANUAL
+++ b/MANUAL
@@ -5,4 +5,73 @@ you should, because if you don't, you will not end up with what you're
 expecting. :-)
 
 
+[Status: completely unsorted.]
 
+
+Variables in settings.py and/or page.py
+
+* addcssfile (optional)
+
+The variable addcssfile is a list with two strings per list item. It can be
+set in the settings.py or in each page.py.
+
+Example:
+
+addcssfile = ["akv.css all"]
+-> will become: <link rel="stylesheet" media="all" href="/akv.css" type="text/css" />
+
+* addhead (optional)
+
+The variable addhead is a list of strings which contain SNIPPET file names.
+The .htm snippets must exist in the SNIPPETS folder of the site and will be
+put into the <head> section of each page by makesite.py. These snippets can
+contain additional static HTML code for the <head> section, i.e. inline CSS.
+addhead can be used in settings.py, but is preferably meant to use in a
+page.py. [KEYWORD]s in these snippets can only be processed if there is an
+according function in the settings.py or the page.py.
+
+
+* addmeta (optional)
+
+The variable addmeta is a list with two strings per list item. The first
+string defines the name of the meta tag, the second its content. It can be
+set in the settings.py or in each page.py.
+
+Example:
+
+addmeta = ["'mymetatag' 'mycontent'"]
+-> will become: <meta name="mymetatag" content="mycontent" />
+
+
+* addtobody (optional in page.py)
+
+The variable addtobody is of type dict and contains [KEYWORD]s which are
+expected to be in the content part of a page, and their replacements. It is
+set in the settings.py and can be extended in each page.py file for a single
+page. The entries can point to variables, values, functions, or htm
+snippets (which must then exist in the SNIPPETS folder).
+
+Example:
+
+settings.py:
+addtobody = {}
+
+index.py for the homepage:
+addtobody["[AKVSBODY]"] = "akvsbody.htm"
+
+
+* menuadd (optional)
+
+The variable menuadd is primarily meant to be used in a page.py, but can
+also be used for every page via the settings.py. Its type is list of
+strings. Each string contains the name of a snippet .htm file that should be
+added to the menu (navigation) part of a page. Note that these entries can
+only be added to the end of the page's menu, not anywhere in between.
+
+---
+
+What about JavaScript in the content part?
+
+Nothing. HTMLglue has nothing to do with anything within the content part as
+long as there is no [KEYWORD]. As a JavaScript does not have to be updated
+every time a page is rebuilt, it will be handled like text.
diff --git a/ToDo b/ToDo
index 5fd5cf4..da484ff 100644 (file)
--- a/ToDo
+++ b/ToDo
@@ -2,7 +2,7 @@ in general:
 
 * NEW: LICENSE file (GPLv3, I guess)
 
-* NEW: Write the MANUAL. *sigh* ;-)
+* NEW: Write the MANUAL. *sigh* ;-) (better in HTML?)
 
 * FEAT: Multi language support for websites (additional language menu so
   that a visitor of the website can change language at any page as long as
@@ -11,23 +11,25 @@ in general:
 
 preparesite.py:
 
-* CHANGE: Use only the filter.py of a site for preparesite.py, then: create
-  settings.py for the site with fullsettings.py and filter.py -> solves the
-  problem that identical parameters are needed in both filter.py and
-  settings.py
+* LASTERROR:
+  frosch@seerose:~/prog/htmlglue$ ./preparesite.py atarifrosch
+  Traceback (most recent call last):
+    File "./preparesite.py", line 238, in <module>
+      flt.oldenc
+  AttributeError: 'module' object has no attribute 'oldenc'
+  – of course not. That's why I use try: in the line above …
 
 
 makesite.py:
 
 * ERROR: created pages still have several errors, like double \n, missing
   parts, etc.
-  - 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
 
+* NEW: Use page.py of file, like addtobody{}!
+
 * CHANGE: move makehtmlhead and makefoot from settings to makesite.py. If
   they (or one of them) also exist(s) within settings or in the DEFAULTS
   folder, use them; if not, use the version within makesite as fallback. 
@@ -37,9 +39,6 @@ makesite.py:
   a) a line like in menuitem
   b) a path to a SNIPPETS .htm file
 
-* MANUAL: A menu.py can contain additional menu entries to URLs which do not
-  point to a page within the same folder or even on the same site.
-
 * FEAT: While (re)creating the site, read the replacements list from
   settings.py and use it over the whole page, forcibly.
 
@@ -59,8 +58,9 @@ makesite.py:
 
 * FEAT: create sitemap.xml
 
-* FEAT: include content from other sites, like Piwigo (photos), Twitter,
-        GNUsocial, Mastodon, G+, a git, an rss feed, …
+* FEAT: Use addtobody{} and prepare functions that include content from
+        other sources and sites, like Piwigo (photos), Twitter, GNUsocial,
+        Mastodon, G+, a git, an rss feed, …
 
 * FEAT: create redirect for apache2 and nginx when moving a file?
 
index 2b83609..c98649e 100644 (file)
Binary files a/__pycache__/defaults.cpython-34.pyc and b/__pycache__/defaults.cpython-34.pyc differ
index d473dae..1ad391d 100644 (file)
Binary files a/filters/__pycache__/atarifrosch.cpython-34.pyc and b/filters/__pycache__/atarifrosch.cpython-34.pyc differ
index ca70f29..9d099ae 100755 (executable)
@@ -1,12 +1,86 @@
 #!/usr/bin/env python3
 # -*- coding: utf8 -*-
 
+sitename = "atarifrosch"
+
+## IMPORTANT: If a settings.py for your site already exists,
+# should it be recreated after a newly run of preparesite?
+forcemakesettings = True
+# forcemakesettings = False
+
+## These settings are not necessary for the import; BUT! they are needed
+## in order to create a settings.py for your site.
+
+# Standard protocol of the site (one out of "http", "https")
+proto = "https"
+
+# domain name of the site
+domain = "www.atari-frosch.de"
+
+# URL of the site. Change this line ONLY if you know what you're doing!
+myurl = proto + "://" + domain + "/"
+
+# Position of menu in the page output of makesite.py (NOT necessarily in the
+# original source files!): "above" or "below" content. Be reminded that this
+# is only the menu's position in the HTML code; where it will really be
+# placed within the graphical rendered page depends on your stylesheet.
+menupos = "above"
+
+# This is to be set to True if you have your own Python3 function for
+# creating the <head> section of your pages. In that case uncomment
+# htmlhead. htmlhead must then contain the name of your function and the
+# arguments it needs. The function must then be found in the DEFAULTS
+# folder for your site and will be imported to the settings.py.
+ownhtmlhead = False
+
+# If headfunc is uncommented and set, htmlhead must also be uncommented and
+# set!
+# headfunc = "makehead.py"  
+# htmlhead = "makehead(contentfile, snippetpath, sourcepy)"
+
+# This is true if you have your own Python3 function for creating the <head>
+# section of your pages. If not, set to True, and uncomment htmlhead.
+# htmlhead must then contain the name of your function and the arguments it
+# needs.
+ownpagefoot = False
+# If footfunc is set, pagefoot must also be set!
+# footfunc = "makefoot.py"
+# pagefoot = "makefoot(contentfile, targetfile, myurl)"
+
+
+## These settings are necessary directly for preparesite.py:
+
+# Where to find the current web site in the file system
 origpath = "/srv/atarifrosch/"
+
+# File extension for HTML files of the source site (some people use .htm
+# here, or even .HTML or .HTM).
 fileext = ".html"
+
+# Where the output of makesite should be written to (full path).
 targetpath = "/home/frosch/prog/htmlglue/sites/atarifrosch/"
-logfile = targetpath + "preparesite.log"
+
+# Logging is always good. But we need a name for the logfile (optional with
+# a path), and a log level.
+
+# Loglevels:
+# 1 = critical messages only
+# 2 = critical, and error messages
+# 3 = critical, error, and warning messages
+# 4 = critical, error, warning, and info messages
+# 5 = critical, error, warning, info, and debug messages (very verbose!)
+logfile = "atarifrosch-make.log"
 loglevel = 5
 
+# This is only necessary if the source HTML files are not encoded in UTF8.
+# HTMLglue always uses UTF8; if oldenc is set, makesite.py will re-encode
+# the files to UTF8 before storing the output. Uncomment if needed.
+
+# IMPORTANT: It is impossible to determine the encoding of a plain text file
+# by software. So you should be sure about your encoding. If you give a  
+# wrong source encoding here, the files HTMLglue creates might look a bit …
+# funny. In worst case they will be unreadable.
+
 # oldenc = "iso8859-15"
 
 # unfortunately this does not work recursively, so ignoredirs must contain
@@ -75,6 +149,27 @@ ignorehtml.append('<div id="footer"> == </html>')
 ignorehtml.append('<!--[if gte IE 5.5]> == <![endif]-->')
 ignorehtml.append('<!-- AKVS body start v1.6 --> == <!-- AKVS body end -->')
 
+# Partly expected standard definitions. These will be copied into the
+# settings.py for the site. If a page contains exactly these entries, their
+# page.py will not get a separate entry for them.
+doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
+htmlver = '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">'
+title = "Froschs Homepage"
+description = "Froschs Homepage"
+robots = 'index,follow'
+language = "de"
+author = "Atari-Frosch"
+dctitle = title
+dccreator = "Atari-Frosch"
+dcpublisher = "Atari-Frosch"
+dcrights = "Sabine 'Atari-Frosch' Becker"
+dccoverage = ""
+favicon = "favicon.ico"
+# This is the standard style sheet for the site. Additional style sheets for
+# a page can be added later in the page.py.
+stylesheet = "style.css"
+stylesheetmedia = "all"
+
 # In order to prevent string recognition problems in makesite.py, standard
 # quotation marks within strings should be replaced by quotation marks that
 # do not stand for the begin or end of a string within Python scripts. These
@@ -103,7 +198,7 @@ menuend = '<!-- div#menu -->'
 firstmenuitem = 'menuitem.append("htm home /index.html Startseite")\n'
 
 # How to find the headline in a single html file if it is part of the
-# page's top div.
+# page's top div (no matter where it will be placed later)
 headlinekey = "<h1>"
 
 # preparesite.py needs a unique start and end mark in order to find the
@@ -113,9 +208,20 @@ headlinekey = "<h1>"
 contentstart = '<div id="content">'
 contentend = '<!-- div#content -->'
 
+# Some html snippets are expected and needed by makesite.py in order to
+# create pages. Their names can be defined here; preparesite.py will create
+# the according files in the SNIPPETS folder of your site but without
+# filling them. That is something you need to do :-)
+snippets = {}
+snippets["htmlhead"] = "htmlhead.htm"
+snippets["bodytopfile"] = "bodytop.htm"
+snippets["logofile"] = "logo.htm"
+snippets["menustart"] = "menustart.htm"
+snippets["menuend"] = "menuend.htm"
+snippets["endoffile"] = "endoffile.htm"
+
 # While reading the content part (!), we can replace a few things like those
 # that are mostly left from the iso-latin age …
-
 replacement = {}
 replacement["&bdquo;"] = "„"
 replacement["&rdquo;"] = "“"
index a80c57f..1508522 100755 (executable)
@@ -1,13 +1,88 @@
 #!/usr/bin/env python3
 # -*- coding: utf8 -*-
 
-origpath = "/srv/atarifrosch/"
+sitename = "mysite"
+
+## IMPORTANT: If a settings.py for your site already exists,
+# should it be recreated after a newly run of preparesite?
+forcemakesettings = True
+# forcemakesettings = False
+
+## These settings are not necessary for the import; BUT! they are needed
+## in order to create a settings.py for your site.
+
+# Standard protocol of the site (one out of "http", "https")
+proto = "https"
+
+# domain name of the site
+domain = "www.mydomain.tld"
+
+# URL of the site. Change this line ONLY if you know what you're doing!
+myurl = proto + "://" + domain + "/"
+
+# Position of menu in the page output of makesite.py (NOT necessarily in the
+# original source files!): "above" or "below" content. Be reminded that this
+# is only the menu's position in the HTML code; where it will really be
+# placed within the graphical rendered page depends on your stylesheet.
+menupos = "above"
+
+# This is to be set to True if you have your own Python3 function for
+# creating the <head> section of your pages. In that case uncomment
+# htmlhead. htmlhead must then contain the name of your function and the
+# arguments it needs. The function must then be found in the DEFAULTS
+# folder for your site and will be imported to the settings.py.
+ownhtmlhead = False
+
+# If headfunc is uncommented and set, htmlhead must also be uncommented and
+# set!
+# headfunc = "makehead.py"
+# htmlhead = "makehead(contentfile, snippetpath, sourcepy)"
+
+# This is true if you have your own Python3 function for creating the <head>
+# section of your pages. If not, set to True, and uncomment htmlhead.
+# htmlhead must then contain the name of your function and the arguments it
+# needs.
+ownpagefoot = False
+
+# If footfunc is set, pagefoot must also be set!
+# footfunc = "makefoot.py"
+# pagefoot = "makefoot(contentfile, targetfile, myurl)"
+
+
+## These settings are necessary directly for preparesite.py:
+
+# Where to find the current web site in the file system
+origpath = "/srv/mysite/"
+
+# File extension for HTML files of the source site (some people use .htm
+# here, or even .HTML or .HTM).
 fileext = ".html"
+
+# Where the output of makesite should be written to (full path).
 targetpath = "/home/frosch/prog/htmlglue/sites/atarifrosch/"
-logfile = targetpath + "preparesite.log"
-loglevel = 5
 
-oldenc = "iso8859-15"
+# Logging is always good. But we need a name for the logfile (optional with
+# a path), and a log level.
+
+# Loglevels:
+# 1 = critical messages only
+# 2 = critical, and error messages
+# 3 = critical, error, and warning messages
+# 4 = critical, error, warning, and info messages
+# 5 = critical, error, warning, info, and debug messages (very verbose!)
+makelogfile = "mysite.log"
+makeloglevel = 4
+
+# This is only necessary if the source HTML files are not encoded in UTF8.
+# HTMLglue always uses UTF8; if oldenc is set, makesite.py will re-encode
+# the files to UTF8 before storing the output. Uncomment if needed.
+
+# IMPORTANT: It is impossible to determine the encoding of a plain text file
+# by software. So you should be sure about your encoding. If you give a
+# wrong source encoding here, the files HTMLglue creates might look a bit …
+# funny. In worst case they will be unreadable.
+
+# oldenc = "iso8859-15"
 
 # unfortunately this does not work recursively, so ignoredirs must contain
 # all subdirectories that should be ignored, too
@@ -16,6 +91,12 @@ ignoredirs.append("/bilder")
 
 ignorefiles = ["STANDARD.html"]
 
+# OPTIONAL: You can add additional css files here; each entry needs a css
+# file name and the media type it is meant for.
+# Variable type: list of strings with 2 arguments per list item.
+addcssfile = ["akv.css all"]
+# will become: <link rel="stylesheet" media="all" href="/akv.css" type="text/css" />
+
 ignorehtml = []
 # This variable defines a keyword from the first line and a keyword from the
 # last line that has to be ignored. == is the placeholder between start and
@@ -24,6 +105,26 @@ ignorehtml = []
 ignorehtml.append('<body> == <!--div#logo-->')
 ignorehtml.append('<div id="footer"> == </html>')
 
+# Partly expected standard definitions. These will be copied into the
+# settings.py for the site. If a page contains exactly these entries, their
+# page.py will not get a separate entry for them.
+doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
+htmlver = '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">'
+description = "My Homepage"
+robots = 'index,follow'
+language = "de"
+author = "My Name"
+dctitle = title
+# dctitle = "My Title"
+dccreator = "My Name"
+dcpublisher = "My Name"
+dcrights = "My Name"
+dccoverage = ""
+favicon = "favicon.ico"
+# This is the standard style sheet for the site. Additional style sheets for
+# a page can be added later in the page.py.
+stylesheet = "style.css"
+
 # In order to prevent string recognition problems in makesite.py, standard
 # quotation marks within strings should be replaced by quotation marks that
 # do not stand for the begin or end of a string within Python scripts. These
@@ -62,9 +163,21 @@ headlinekey = "<h1>"
 contentstart = '<div id="content">'
 contentend = '<!-- div#content -->'
 
+# Some html snippets are expected and needed by makesite.py in order to
+# create pages. Their names can be defined here; preparesite.py will create
+# the according files in the SNIPPETS folder of your site but without
+# filling them. That is something you need to do :-)
+snippets = {}
+snippets["htmlhead"] = "htmlhead.htm"
+snippets["bodytopfile"] = "bodytop.htm"
+snippets["logofile"] = "logo.htm"
+snippets["menustart"] = "menustart.htm"
+snippets["menuend"] = "menuend.htm"
+snippets["endoffile"] = "endoffile.htm"
+
+
 # While reading the content part (!), we can replace a few things like those
 # that are mostly left from the iso-latin age …
-
 replacement = {}
 replacement["&bdquo;"] = "„"
 replacement["&rdquo;"] = "“"
diff --git a/fullsettings.py b/fullsettings.py
deleted file mode 100644 (file)
index cddf152..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf8 -*-
-
-#############################################################################
-## These variables are expected to be set in the DEFAULTS/settings.py file
-## of each theme, so that they can be used as a standard for every single
-## page. All variables are expected to be of type string if not stated
-## otherwise. All settings in this file are just examples!
-#############################################################################
-
-
-def makehead(contentfile, snippetpath, sourcepy):
-    # This function can be used to create a <head> section different from
-    # the standard <head> section of makesite.py. Don't change this
-    # function's name!
-    pass
-
-def makefoot(contentfile, snippetspath, myurl):
-    # This function can be used to create a standard page foot different
-    # from the standard page foot of makesite.py. Don't change this
-    # function's name!
-    pass
-
-# Name and path of the site's directory, so don't use special characters here.
-sitename = "mysite"
-sitepath = "/home/user/htmlglue/sites/mysite/"
-
-# Logfile and log level for makesite.py runs on this site.
-# Loglevels:
-# 1 = critical messages only
-# 2 = critical and error messages
-# 3 = critical, error, and warning messages
-# 4 = critical, error, warning, and info messages
-# 5 = critical, error, warning, info, and debug messages (very talkative!)
-makelogfile = "mysite.log"
-makeloglevel = 4
-
-# Standard protocol of the site (one out of "http", "https")
-# This variable can not be overwritten by a page.py!
-proto = "https"
-
-# domain name of the site
-# This statement must NOT be overwritten by a page.py!
-domain = "www.atari-frosch.de"
-
-# URL of the site. Change this only if you know what you're doing!
-myurl = proto + "://" + domain + "/"
-
-## The following variables can be overwritten in a page.py file.
-
-# Position of menu: "above" or "below" content. Be reminded that this is
-# only the menu's position in the HTML code; where it will really be placed
-# within the graphical rendered page depends on your stylesheet.
-menupos = "above"
-
-# Document type to be stated at the beginning of each html document
-doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
-
-# HTML version. The language set in this statement (xml:lang and lang) can
-# be overwritten in a page.py. The example statement is for XHTML 1.0, if
-# you use another standard, you need to change this variable accordingly.
-htmlver = '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">'
-
-
-## Standard settings for each document's <head> section. These can mostly be
-## overwritten by a page.py.
-
-# standard content of the <title> tag
-title = "My Homepage"
-# will become: <title>My Homepage</title>
-
-# settings for the robots statement
-robots = "index,follow"
-# will become: <meta name="robots" content="index,follow" />
-
-# general language setting of the site
-language = 'de'
-# will become: <meta http-equiv="content-language" content="de" />
-# and: <meta name="DC.Language" content="de" />
-
-# author of the page
-author = "My Name"
-# will become: <meta name="author" content="My Name" />
-
-# Keywords for search engines – if you want to use them. And if, they can
-# and should be overwritten individually by a page.py file.
-metakeywords = "htmlglue"
-# will become: <meta name="keywords" content="htmlglue" />
-
-# The content of the DC.Title meta tag
-dctitle = "My Homepage"
-# will become: <meta name="DC.Title" content="My Homepage" />
-# If this variable is empty but requested in the htmlhead.htm snippet, and
-# if it can also not be found in the according page.py, the content of the
-# variable title (from this settings file or the page.py) will be used
-# instead.
-
-# Creator of the page (not necessarily the same person as the author of
-# the page content)
-dccreator = 'Creator'
-# will become: <meta name="DC.Creator" content="Creator" />
-
-# Publisher of the page (not necessarily the same person as the author
-# or the creator of the page)
-dcpublisher = 'Publisher'
-# will become: <meta name="DC.Publisher" content="Publisher" />
-
-# Coverage: This meta tag is only useful if the page is about a special
-# area, region, town, etc. Mostly set in the page.py, not for the whole
-# site, if that site is not completely dedicated to a place.
-dccoverage = "Town - Country"
-# will become: <meta name="DC.Coverage" content="Town - Country" />
-
-# standard copyright holder of a page's content.
-dcrights = "My Name"
-# will become: <meta name="DC.Rights" content="My Name" />
-
-# file name of the favicon (leave empty if there is none)
-favicon = "favicon.ico"
-# will become: <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
-
-# Primary style sheet for the site; file should exist in the CSS directory
-stylesheet = "frosch.css"
-stylesheetmedia = "all"
-# will become: <link rel="stylesheet" media="all" href="/frosch.css" type="text/css" />
-
-# The meta tags 'generator' and 'DC.Date' will be created for each page
-# during runtime of htmlglue.
-
-# These files, which are placed in the SNIPPETS folder in sitepath, are
-# usually needed in order to complete the pages. They can contain keywords
-# ([KEYWORD]) which are recognized by makesite.py, functions in a page.py,
-# or additional functions in this settings.py.
-htmlhead = "/htmlhead.htm"
-bodytopfile = "bodytop.htm"
-logofile = "logo.htm"
-endoffile = "endoffile.htm"
-
-
-#########################################################################
-## The following variables can or need to be used additionally in .py
-## files for single pages. If the optional variables are not set here,
-## their data will not appear in the target file.
-#########################################################################
-
-# Name of the file that should be created, including directory path
-# (= URL without protocol and domain name).
-# If not set, the target file's name will be created by the name of the
-# content file and the directory it sits in.
-targetfile = "/index.html"
-
-# This will be the complete URL of the page; we need this variable later.
-# This setting is needed in each page's .py file and is NOT optional. You
-# should not change anything here.
-myuri = myurl + targetfile
-
-# OPTIONAL: You can add additional css files here; each entry needs a css
-# file name and the media type it is meant for.
-# Variable type: list of strings with 2 arguments per list item.
-addcssfile = ["akv.css all"]
-# will become: <link rel="stylesheet" media="all" href="/akv.css" type="text/css" />
-
-# OPTIONAL: You can add more meta tags to the <head> section here; the
-# stated .htm files must exist in the SNIPPETS directory of the theme. Don't
-# add css files this way, use the addcssfile variable instead.
-# Variable type: list of strings
-addmeta = [""]
-
-# OPTIONAL: You can add additional HTML code to the <head> section. You can
-# also add inline (!) CSS for an individual page by adding another SNIPPETS
-# file to this list in the .py file of that page.
-# Variable type: list of strings
-addhead = ["akvhead.htm"]
-
-
-## Now for the content section:
-
-# Here you can state keywords with a SNIPPETS file, and while creating the
-# page the keywords will be replaced by the snippet. If the snippet does not
-# exist in the SNIPPETS directory of the site, the keyword will just be
-# deleted from the content.
-# Variable type: dictionary with keywords and variables/values or SNIPPET
-# file names
-addtobody = {}
-addtobody["[MYURL]"] = myuri
-addtobody["[AKVSBODY]"] = "akvsbody.htm"
-addtobody["[LOGO]"] = "logo.htm"
-
-# As the menu is not given as an .htm file, but built by htmlglue while
-# processing a menu.py of a (sub)directory of the theme, we cannot use a
-# dictionary like addtobody to add static menu entries from the SNIPPETS on
-# single pages. Instead the files from this list get added to a page's menu.
-# This also means that static menu entries from the SNIPPETS cannot be
-# placed anywhere in the menu list, but only added to its end.
-# Variable type: list of strings
-menuadd = ["menu.geocaching.htm", "menu.cacert.htm"]
-
-# This will be the headline of the current page. Depending on the way your
-# theme is built it is possible that the headline is not part of the page
-# content section; but only the content section is to be placed into the
-# content file, so the headline should be stated in the .py file, at least
-# if necessary.
-headline = "Qua®k!"
-
-pagefoot = makefoot(contentfile, targetfile, myurl)
-
-# EOF
index 7c4814e..0e855ee 100755 (executable)
@@ -2,9 +2,8 @@
 # -*- coding: utf8 -*-
 
 import os, sys
-from time import strftime, gmtime
+from time import gmtime
 from datetime import datetime
-# from importlib import import_module
 from runpy import run_path
 import logging
 import defaults
@@ -62,7 +61,7 @@ def makemenus(curdir):
             targetfile.close()
                 
 
-def buildpage(filename, curdir, targetdir):
+def buildpage(filename, curdir, targetdir, snippets):
     # we have: contentfile.htm + contentfile.menu + contentfile.py
     # filename = contentfile.htm
     logging.debug('Running buildpage with filename %s, curdir %s, targetdir %s.', filename, curdir, targetdir)
@@ -81,68 +80,49 @@ def buildpage(filename, curdir, targetdir):
         logging.debug('Starting to build page <%s>.', targetfile)
         htmlpage = settings.makehtmlhead(filename, snippetspath, pagepy)
 
-        try:
-            settings.bodytopfile
-        except NameError:
-            logging.error('bodytopfile for <%s> is not defined.')
-        else:
-            bodytopfile = snippetspath + "/" + settings.bodytopfile
-            if os.path.exists(bodytopfile):
-                bodytop = open(bodytopfile, "r")
-                bodytophtml = bodytop.read()
-                bodytop.close()
-                htmlpage += bodytophtml
-                logging.debug('bodytop file added to page.')
-            else:
-                logging.error("bodytop for site " + sitename + " does not exist.")
+        bodytopfile = snippetspath + "/" + snippets["bodytopfile"]
+        bodytop = open(bodytopfile, "r")
+        bodytophtml = bodytop.read()
+        bodytop.close()
+        htmlpage += bodytophtml
+        logging.debug('bodytop file added to page.')
         
-        try:
-            settings.logofile
-        except NameError:
-            logging.info('Logo file not stated in settings.')
-        else:
-            logofile = snippetspath + settings.logofile
-            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 = filename.replace(".htm", ".menu")
-        if os.path.exists(menufile):
-            m = open(menufile, "r")
-            menu = m.read()
-            m.close()
+        logofile = snippetspath + snippets["logofile"]
+        logging.debug('Logo file = <%s>', logofile)
+        f = open(logofile, "r")
+        logohtml = f.read()
+        f.close()
+        htmlpage += logohtml
+        logging.debug('Logo file added to page.')
+
+    try:
+        pageconfig.menupos
+    except NameError:
+        if settings.menupos == "above":
+            menu = makepagemenu(filename, snippets, snippetspath)
             htmlpage += menu
             logging.debug('Menu added to page (%s).', settings.menupos)
         else:
-            logging.critical('No menu file for <%s>.  Stop.', filename)
-            sys.exit()
+            menupos = "below"
+    else:
+        if pageconf.menupos == "above":
+            menu = makepagemenu(filename, snippets, snippetspath)
+            htmlpage += menu
+            logging.debug('Menu added to page (%s).', pageconf.menupos)
+        else:
+            menupos = "below"
 
     contentfile = open(filename, "r")
     content = contentfile.read()
     contentfile.close()
     htmlpage += content
 
-    # ToDo: Check pagepy for variable replace{} and execute replacements.
-    # Problem: Imports of own .py files does not work.
+    # ToDo: Check pagepy for dicts addtobody{}
 
-    if settings.menupos == "below":
-        menufile = curdir + 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)
-        else:
-            logging.critical('No menu file for <%s>.  Stop.', filename)
-            sys.exit()
+    if menupos == "below":
+        menu = makepagemenu(filename, snippets, snippetspath)
+        htmlpage += menu
+        logging.debug('Menu added to page (%s).', menupos)
 
     footer = settings.makefoot(filename, snippetspath, settings.myurl)
     htmlpage += footer
@@ -154,6 +134,27 @@ def buildpage(filename, curdir, targetdir):
     logging.info('<%s> created.', targetfile)
 
 
+def makepagemenu(filename, snippets, snippetspath):
+    menufile = filename.replace(".htm", ".menu")
+    if os.path.exists(menufile):
+        menustartfile = snippetspath + snippets["menustart"]
+        f = open(menustartfile, "r")
+        menustart = f.read()
+        f.close()
+        m = open(menufile, "r")
+        menu = m.read()
+        m.close()
+        menuendfile = snippetspath + snippets["menuend"]
+        f = open(menuendfile, "r")
+        menuend = f.read()
+        f.close()
+        menucomplete = menustart + menu + menuend
+        return menucomplete
+    else:
+        logging.critical('No menu file for <%s>.  Stop.', filename)
+        sys.exit()
+
+
 # end of functions
 
 # check arguments
@@ -295,4 +296,4 @@ for dirpath, dirs, files in os.walk(sitepath):
                 targetpath = targetpath.replace("//", "/")
                 logging.debug('Passing %s to buildpage.', curfile)
                 sitepath = sitepath.replace("//", "/")
-                buildpage(curfile, sitepath, targetpath)
+                buildpage(curfile, sitepath, targetpath, settings.snippets)
index 91b8a21..bdc6565 100755 (executable)
@@ -10,22 +10,17 @@ from defaults import myversion
 
 # functions
 
-def checkenc(curfile, tmpfile, oldenc):
+def changeenc(curfile, tmpfile, oldenc):
     # Be aware that this will only work if the file is really encoded with
-    # the given oldenc, because it is impossible to determine the true
-    # encoding of a text file!
+    # the given oldenc, because it is impossible to determine the encoding
+    # of a text file by software!
     logging.debug('Checking %s for old encoding.', curfile)
-    with open(curfile, 'r', encoding=oldenc) as f:
-        firstline = f.readline().strip()
-        logging.debug('Found: %s', firstline)
-        if firstline.startswith("<?xml"):
-            logging.debug('%s has old encoding.', curfile)
-            with open(curfile, 'r', encoding=oldenc) as toconv:
-                cont = toconv.read()
-            with open(tmpfile, 'w', encoding='utf8') as toconv:
-                toconv.write(cont)
-            logging.debug('Successfully saved reencoded version to <%s>.', tmpfile)
-            return True
+    with open(curfile, 'r', encoding=oldenc) as toconv:
+        cont = toconv.read()
+    with open(tmpfile, 'w', encoding='utf8') as toconv:
+        toconv.write(cont)
+    logging.debug('Successfully saved reencoded version to <%s>.', tmpfile)
+    return True
 
 def checkfolder(curpath):
     igndir = False
@@ -34,11 +29,123 @@ def checkfolder(curpath):
         igndir = True
     return igndir
 
-def makesetting(settingfile, flt):
-    pass
-#    import fullsettings
-#    # ???    
-
+def makesetting(settingsfile, flt):
+    if os.path.exists(settingsfile):
+        if flt.forcemakesettings:
+            os.remove(settingsfile)
+            logging.debug("makesetting: Found old settings file and removed it.")
+        else:
+            logging.debug("makesetting: Setting file already exists and shall not be renewed.")
+            return
+
+    set = open(settingsfile, "w")
+    logging.debug("Opened new settings file.")
+
+    set.write("#!usr/bin/env python3")
+    set.write("# -*- coding: utf8 -*-\n")
+    ln = "\n"
+
+    set.write("# Folder name for the site")
+    set.write('sitename = ' + flt.sitename + ln)
+
+    set.write("# File path for this site; content files with page.py files, menu.py files,")
+    set.write("# folders DEFAULTS, SNIPPETS, and CSS will be stored here.")
+    set.write("sitepath = " + flt.targetpath + ln)
+
+    set.write("# Standard protocol of the site (one out of http, https)")
+    set.write('proto = "https"' + ln)
+
+    set.write("# domain name of the site")
+    set.write('domain = ' + flt.domain + ln)
+
+    set.write("# URL of the site. Change this line ONLY if you know what you're doing!")
+    set.write('myurl = proto + "://" + domain + "/"' + ln)
+
+    set.write("# Logging is always good. But we need a name for the logfile (optional with")
+    set.write("# a path), and a log level.")
+    set.write("# Loglevels:")
+    set.write("# 1 = critical messages only")
+    set.write("# 2 = critical, and error messages")
+    set.write("# 3 = critical, error, and warning messages")
+    set.write("# 4 = critical, error, warning, and info messages")
+    set.write("# 5 = critical, error, warning, info, and debug messages (very verbose!)")
+    set.write('makelogfile = "mysite.log"')
+    set.write('makeloglevel = 4' + ln)
+
+    if flt.ownhtmlhead:
+        logging.debug("Own function for <head> section is set.")
+        if os.path.exists(flt.headfunc):
+            set.write("# Name of your own function for creating the <head> section of each page")
+            set.write('makehtmlhead = ' + flt.headfunc + ln)
+        else:
+            logging.warning("ownhtmlhead is True, but according function not found.")
+    if flt.ownpagefoot:
+        logging.debug("Own page foot function is set.")
+        if os.path.exists(flt.footfunc):
+            set.write("# Name of your own function for creating the standard page foot")
+            set.write("makefoot = " + flt.pagefoot + ln)
+        else:
+            logging.warning("ownpagefoot is True, but according function not found.")
+            
+    set.write("## Standard settings for the <head> section of each page" + ln)
+    set.write("# These settings can be overwritten in each page.py")
+    set.write('language = ' + flt.language)
+    set.write("# language will also be used for DC.Language")
+    set.write('doctype = ' + flt.doctype)
+    set.write('htmlver = ' + flt.htmlver)
+    set.write('title = ' + flt.title)
+    set.write("# title will also be used for DC.Title if dctitle is not set")
+    set.write('description = ' + flt.description)
+    set.write("# description will also be used for DC.Description if dcdescription is not set")
+    set.write('robots = ' + flt.robots)
+    set.write('author = ' + flt.author)
+    set.write('# dctitle = ' + flt.title)
+    set.write('dccreator = ' + flt.dccreator)
+    set.write('dcpublisher = ' + flt.dcpublisher)
+    set.write('dcrights = ' + flt.dcrights)
+    set.write('dccoverage = ""' + ln)
+
+    set.write('favicon = ' + flt.favicon)
+    set.write('stylesheet = ' + flt.stylesheet)
+    set.write('stylesheetmedia = ' + flt.stylesheetmedia + ln)
+
+    set.write("# Position of menu: above or below content. Be reminded that this is")
+    set.write("# only the menu's position in the HTML code; where it will really be placed")
+    set.write("# within the graphical rendered page depends on your stylesheet.")
+    set.write('menupos = ' + flt.menupos + ln)
+
+    set.write("# These files, which are placed in the SNIPPETS folder in sitepath, are")
+    set.write("# usually needed in order to complete the pages. They can contain keywords")
+    set.write("# ([KEYWORD]) which are recognized by makesite.py, functions in a page.py,")
+    set.write("# or additional functions in this settings.py.")
+    set.write('snippets = {}')
+    set.write('snippets["htmlhead"] = ' + flt.snippets["htmlhead"])
+    set.write('snippets["bodytopfile"] = ' + flt.snippets["bodytopfile"])
+    set.write('snippets["logofile"] = ' + flt.snippets["logofile"])
+    set.write('snippets["menustart"] = ' + flt.snippets["menustart"])
+    set.write('snippets["menuend"] = ' + flt.snippets["menuend"])
+    set.write('snippets["endoffile"] = ' + flt.snippets["endoffile"] + ln)
+
+    set.write("# The variable addtobody is of type dict and is set here in order to be")
+    set.write("# extended in page.py files. It can be used to add htm snippets, variables,")
+    set.write("# values, and even the return of a function into the content of a page.")
+    set.write('addtobody = {}')
+    set.write('# Example with snippet: addtobody["[AKVSBODY]"] = "akvsbody.htm"')
+    set.write('# Example with variable: addtobody["[MYURI]"] = myuri')
+    set.write('# Example with value: addtobody["[APPLES]"] = 4')
+    set.write('# Example with function: addtobody["[TODAY]"] = datetime.now().strftime("%Y-%m-%d")' + ln)
+
+    set.write("## EOF")
+    set.close()
+
+
+def makesnippets(snippetspath, snippets):
+    from pathlib import Path
+    for snip in snippets:
+        snipfile = snippetspath + snippets[snip]
+        if not os.path.exists(snipfile):
+            Path(snipfile).touch()
+    
 
 # end of functions
 
@@ -87,20 +194,28 @@ else:
     logging.basicConfig(format='%(asctime)s %(message)s', datefmt=dateformat, filename=logfile,level=logging.INFO)
     logging.error('could not determine loglevel, using INFO as default')
 
+defaultsdir = targetpath + "/DEFAULTS/"
+snippetspath = targetpath + "/SNIPPETS/"
+cssdir = targetpath + "/CSS"
 
 if not os.path.exists(targetpath):
     os.mkdir(targetpath)
-    cssdir = targetpath + "/CSS"
     os.mkdir(cssdir)
-    defaultsdir = targetpath + "/DEFAULTS"
     os.mkdir(defaultsdir)
-    snippetdir = targetpath + "/SNIPPETS"
-    os.mkdir(snippetdir)
+    os.mkdir(snippetspath)
     initfile = targetpath + "/__init__.py"
     init = open(initfile, "w")
     init.close()
     call(["/bin/chmod", "755", initfile])
     sys.exit()
+else:
+    if not os.path.exists(defaultsdir):
+        os.mkdir(defaultsdir)
+    if not os.path.exists(cssdir):
+        os.mkdir(cssdir)
+    if not os.path.exists(snippetspath):
+        os.mkdir(snippetspath)
+    makesnippets(snippetspath, flt.snippets)
 
 if not flt.origpath.startswith("/"):
     print("This is no full path.  Aborted.")
@@ -116,15 +231,15 @@ else:
     fileext = flt.fileext
 logging.debug('HTML files end with <%s>.', fileext)
 
-settingfile = targetpath + "DEFAULTS/settings.py"
-if not os.path.exists(settingfile):
-    logging.debug('Settings file will be created as <%s>.', settingfile)
-    makesetting(settingfile, flt)
+settingsfile = targetpath + "DEFAULTS/settings.py"
+makesetting(settingsfile, flt)
+
+try:
+    flt.oldenc
+except NameError:
+    isoldenc = False
 else:
-    logging.debug('Setting file already exists.')
-    defaultpath = targetpath + "DEFAULTS/"
-    os.sys.path.append(defaultpath)
-    
+    isoldenc = True
 
 if len(flt.ignorehtml) > 0:
     ignorehtml = {}
@@ -180,11 +295,11 @@ for dirpath, dirs, files in os.walk(origpath):
                 curfile = os.path.join(dirpath, filename)
                 tmpfile = os.path.join(dirpath, "preptmp.html")
                 logging.info('Next file to process is <%s>.', curfile)
-                newenc = False
-                # first check for an old encoding
-                newenc = checkenc(curfile, tmpfile, flt.oldenc)
-                if newenc:
-                    curfile = tmpfile
+                if isoldenc:
+                    logging.debug("Re-encoding first …")
+                    newenc = changeenc(curfile, tmpfile, flt.oldenc)
+                    if newenc:
+                         curfile = tmpfile
 
                 htmlfile = open(curfile, "rt")
                 logging.debug('Successfully opened <%s> for processing.', curfile)
@@ -274,27 +389,16 @@ for dirpath, dirs, files in os.walk(origpath):
                         htm.write(curline + ln)
                         continue
 
-                    import settings
-
                     if curline.startswith('<DOCTYPE'):
                         logging.debug('Found DocType.')
-                        if curline != settings.doctype:
+                        if curline != flt.doctype:
                             outline = "doctype = '" + curline + ln
                             pyfile.write(outline)
 
                     # <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
                     elif curline.startswith('<html'):
                         logging.debug('Found HTML definition.')
-                        if curline != settings.htmlver:
-                            if not "xml:lang" in curline:
-                                try:
-                                    flt.xmllang
-                                except NameError:
-                                    pass
-                                else:
-                                    r = 'xml:lang="' + flt.xmllang + '" lang="' + flt.xmllang + '">'
-                                    curline = curline.replace('>', r)
-
+                        if curline != flt.htmlver:
                             outline = "htmlver = '" + curline + ln
                             pyfile.write(outline)
 
@@ -315,40 +419,33 @@ for dirpath, dirs, files in os.walk(origpath):
                         contentpart = contentpart.strip()
                         if 'name="robots"' in curline:
                             if contentpart != settings.robots:
-                                pyfile.write('robots = "' + contentpart + lns
+                                pyfile.write('robots = "' + contentpart + lns)
                             else:
-                                pyfile.write('robots = "' + setting.robots + lns
+                                pyfile.write('robots = "' + setting.robots + lns)
                         elif 'http-equiv="content-language"' in curline:
-                            if contentpart != settings.language:
+                            if contentpart != flt.language:
                                 pyfile.write("contentlanguage = '" + contentpart + ln)
-                            else:
-                                pyfile.write("contentlanguage = '" + settings.language + ln)
                         elif 'DC.Language' in curline:
-                            if contentpart != settings.language:
+                            if contentpart != flt.language:
                                 pyfile.write("language = '" + contentpart + ln)
-                            else:
-                                pyfile.write("language = '" + settings.language + ln)
                         elif 'name="author"' in curline:
-                            if contentpart != settings.author:
+                            if contentpart != flt.author:
                                 pyfile.write('author = "' + contentpart + lns)
-                        elif 'name="keywords"' in curline:
-                            if contentpart != settings.metakeywords:
-                                pyfile.write('metakeywords = "' + contentpart + lns)
                         elif "DC.Title" in curline:
-                            if contentpart != settings.dctitle:
+                            if contentpart != flt.dctitle:
                                 pyfile.write('dctitle = "' + contentpart + lns)
                         elif "DC.Creator" in curline:
-                            if contentpart != settings.dccreator:
+                            if contentpart != flt.dccreator:
                                 pyfile.write('dcreator = "' + contentpart + lns)
                         elif "DC.Publisher" in curline:
-                            if contentpart != settings.dcpublisher:
+                            if contentpart != flt.dcpublisher:
                                 pyfile.write('dcpublisher = "' + contentpart + lns)
                         elif "DC.Coverage" in curline:
-                            if settings.dccoverage != "":
-                                if contentpart != settings.dccoverage:
+                            if flt.dccoverage != "":
+                                if contentpart != flt.dccoverage:
                                     pyfile.write('dccoverage = "' + contentpart + lns)
                         elif "DC.Rights" in curline:
-                            if contentpart != settings.dcrights:
+                            if contentpart != flt.dcrights:
                                 pyfile.write('dcrights = "' + contentpart + lns)
                         elif "DC.Date" in curline:
                             logging.debug('Found date <%s> in DC.Date"', contentpart)
@@ -370,13 +467,14 @@ for dirpath, dirs, files in os.walk(origpath):
 
                     elif '<link rel=' in curline:
                         if "shortcut icon" in curline:
-                            # extract .ico file name
+                            # extract .ico file name from
                             # <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
                             faviconfile = curline.split('href="')[1]
                             faviconfile = faviconfile.split('"',1)[0]
                             faviconfile = faviconfile.rsplit('/')[1]
-                            if faviconfile != settings.favicon:
+                            if faviconfile != flt.favicon:
                                 pyfile.write("favicon = '" + faviconfile + ln)
+
                         elif "stylesheet" in curline:
                             csspart = curline.split('href="')[1]
                             csspart = csspart.split('"', 1)[0]
@@ -387,7 +485,7 @@ for dirpath, dirs, files in os.walk(origpath):
                             else:
                                 csspart = csspart.replace("/", "")
 
-                            if csspart != settings.stylesheet:
+                            if csspart != flt.stylesheet:
                                 # <link rel="stylesheet" media="all" href="/akv.css" type="text/css" />
                                 media = curline.split('media="')[1]
                                 media = media.split('"', 1)[0]
old mode 100755 (executable)
new mode 100644 (file)
index 0905d35..ed80cc0
-#!/usr/bin/env python3
-# -*- coding: utf8 -*-
-
-import os, sys
-from runpy import run_path
-from datetime import datetime
-
-def makehtmlhead(contentfile, snippetpath, sourcepy):
-    pageconf = run_path(sourcepy)
-    import defaults
-    headfile = open(snippetpath + "/htmlhead.htm", "r")
-    head = headfile.read()
-    headfile.close()
-    metaend = '" />'
-    
-    try:
-        pageconf["doctype"]
-    except KeyError:
-        head = head.replace("[DOCTYPE]", doctype)
-    else:
-        head = head.replace("[DOCTYPE]", pageconf["doctype"])
-
-    try:
-        pageconf["title"]
-    except KeyError:
-        head = head.replace("[TITLE]", title)
-        r = '<meta name="DC.Title" content="' + title + metaend
-        head = head.replace("[DC.TITLE]", r)
-        r = '<meta name="DC.Subject" content="' + title + metaend
-        head = head.replace("[DC.SUBJECT]", r)
-    else:
-        head = head.replace("[TITLE]", pageconf["title"])
-        r = '<meta name="DC.Title" content="' + pageconf["title"] + metaend
-        head = head.replace("[DC.TITLE]", r)
-        r = '<meta name="DC.Subject" content="' + pageconf["title"] + metaend
-        head = head.replace("[DC.SUBJECT]", r)
-
-    try:
-        pageconf["description"]
-    except KeyError:
-        r = '<meta name="description" content="' + description + metaend
-        head = head.replace("[METADESCRIPT]", r)
-        r = '<meta name="DC.Description" content="' + description + metaend
-        head = head.replace("[DC.DESCRIPTION]", r)
-    else:
-        r = '<meta name="description" content="' + pageconf["description"] + metaend
-        head = head.replace("[METADESCRIPT]", r)
-        r = '<meta name="DC.Description" content="' + pageconf["description"] + metaend
-        head = head.replace("[DC.DESCRIPTION]", r)
-
-    try:
-        pageconf["robots"]
-    except KeyError:
-        r = '<meta name="robots" content="' + robots + metaend
-        head = head.replace("[ROBOTS]", r)
-    else:
-        r = '<meta name="robots" content="' + pageconf["robots"] + metaend
-        head = head.replace("[ROBOTS]", r)
-
-    r = '<meta name="generator" content="' + defaults.generator + metaend
-    head = head.replace("[GENERATOR]", r)
-
-    try:
-        pageconf["dccreator"]
-    except KeyError:
-        r = '<meta name="DC.Creator" content="' + dccreator + metaend
-        head = head.replace("[DC.CREATOR]", r)
-    else:
-        r = '<meta name="DC.Creator" content="' + pageconf["dccreator"] + metaend
-        head = head.replace("[DC.CREATOR]", r)
-
-    try:
-        pageconf["dcpublisher"]
-    except KeyError:
-        r = '<meta name="DC.Publisher" content="' + dcpublisher + metaend
-        head = head.replace("[DC.PUBLISHER]", r)
-    else:
-        r = '<meta name="DC.Publisher" content="' + pageconf["dcpublisher"] + metaend
-        head = head.replace("[DC.PUBLISHER]", r)
-
-    try:
-        pageconf["dcdate"]
-    except KeyError:
-        try:
-            pageconf["contentdate"]
-        except KeyError:
-            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)
-    else:
-        curtimestamp = str(datetime.strftime(datetime.now(), '%Y-%m-%d'))
-        r = '<meta name="DC.Date" content="' + curtimestamp + metaend
-        head = head.replace("[DC.DATE]", r)
-
-    try:
-        pageconf["language"]
-    except KeyError:
-        r = '<meta name="DC.Language" content="' + language + metaend
-        head = head.replace("[DC.LANGUAGE]", r)
-        head = head.replace("[HTMLVER]", htmlver)
-    else:
-        r = '<meta name="DC.Language" content="' + pageconf["language"] + metaend
-        head = head.replace("[DC.LANGUAGE]", r)
-        try:
-            pageconf["htmlver"]
-        except KeyError:
-            head = head.replace("[HTMLVER]", htmlver)
-        else:
-            head = head.replace("[HTMLVER]", pageconf["htmlver"])
-
-
-    if "[DC.COVERAGE]" in head:
-        try:
-            pageconf["dccoverage"]
-        except KeyError:
-            if dccoverage != "":
-                r = '<meta name="DC.Coverage" content="' + dccoverage + metaend
-                head = head.replace("[DC.COVERAGE]", r)
-            else:
-                head = head.replace("[DC.COVERAGE]", "")
-        else:
-            r = '<meta name="DC.Coverage" content="' + pageconf["dccoverage"] + metaend
-            head = head.replace("[DC.COVERAGE]", r)
-
-    try:
-        pageconf["dcrights"]
-    except KeyError:
-        r = '<meta name="DC.Rights" content="' + dcrights + metaend
-        head = head.replace("[DC.RIGHTS]", r)
-    else:
-        r = '<meta name="DC.Rights" content="' + pageconf["dcrights"] + metaend
-        head = head.replace("[DC.RIGHTS]", r)
-
-    try:
-        pageconf["favicon"]
-    except KeyError:
-        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
-        head += r
-
-    head += '    <link rel="stylesheet" media="' + stylesheetmedia + '" href="/' + stylesheet + '" type="text/css' + metaend
-    try:
-        pageconf["addcssfile"]
-    except KeyError:
-        pass
-    else:
-        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
-            head += r
-
-    head += '  </head>\n'
-    return head
-
-
-def makefoot(contentfile, snippetspath, myurl):
-    from datetime import datetime
-    from defaults import generator
-
-    f = open(snippetspath + "/footer.htm", "r")
-    footer = f.read()
-    f.close()
-
-    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
-
-sitepath = "/home/frosch/prog/htmlglue/sites/atarifrosch/"
-
-preplogfile = "atarifrosch-prep.log"
-preploglevel = 5
-
-makelogfile = "atarifrosch-make.log"
-makeloglevel = 5
-
-sitename = "atarifrosch"
-proto = "https"
-domain = "www.atari-frosch.de"
-myurl = proto + "://" + domain + "/"
-
-language = 'de'
-# language will also be used for xml:lang and DC.Language
-doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
-htmlver = '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="' + language + '" lang="' + language + '">'
-title = "Atari-Frosch"
-# title will also be used for DC.Subject
-description = "Homepage von Sabine 'Atari-Frosch' Becker"
-# description will also be used for DC.Description
-robots = 'index,follow'
-author = "Atari-Frosch"
-
-dctitle = "Atari-Frosch"
-dccreator = 'Atari-Frosch'
-dcpublisher = 'Atari-Frosch'
-dcrights = "Sabine 'Atari-Frosch' Becker"
-dccoverage = ""
-
-favicon = 'favicon.ico'
-stylesheet = 'frosch.css'
-stylesheetmedia = "all"
-
-menupos = "above"
-
-metakeywords = "atari-frosch"
-
-# replacement = []
-# replacement.append["Sabine Engelhardt", "Sabine 'Atari-Frosch' Becker"]
-
-headline = "Qua®k!"
-
-htmlhead = "/htmlhead.htm"
-bodytopfile = "bodytop.htm"
-logofile = "logo.htm"
-endoffile = "endoffile.htm"
+#!usr/bin/env python3# -*- coding: utf8 -*-
+# Folder name for the sitesitename = atarifrosch
+# File path for this site; content files with page.py files, menu.py files,# folders DEFAULTS, SNIPPETS, and CSS will be stored here.sitepath = /home/frosch/prog/htmlglue/sites/atarifrosch/
+# Standard protocol of the site (one out of http, https)proto = "https"
+# domain name of the sitedomain = www.atari-frosch.de
+# URL of the site. Change this line ONLY if you know what you're doing!myurl = proto + "://" + domain + "/"
+# Logging is always good. But we need a name for the logfile (optional with# a path), and a log level.# Loglevels:# 1 = critical messages only# 2 = critical, and error messages# 3 = critical, error, and warning messages# 4 = critical, error, warning, and info messages# 5 = critical, error, warning, info, and debug messages (very verbose!)makelogfile = "mysite.log"makeloglevel = 4
+## Standard settings for the <head> section of each page
+# These settings can be overwritten in each page.pylanguage = de# language will also be used for DC.Languagedoctype = <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">htmlver = <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">title = Froschs Homepage# title will also be used for DC.Title if dctitle is not setdescription = Froschs Homepage# description will also be used for DC.Description if dcdescription is not setrobots = index,followauthor = Atari-Frosch# dctitle = Froschs Homepagedccreator = Atari-Froschdcpublisher = Atari-Froschdcrights = Sabine 'Atari-Frosch' Beckerdccoverage = ""
+favicon = favicon.icostylesheet = style.cssstylesheetmedia = all
+# Position of menu: above or below content. Be reminded that this is# only the menu's position in the HTML code; where it will really be placed# within the graphical rendered page depends on your stylesheet.menupos = above
+# These files, which are placed in the SNIPPETS folder in sitepath, are# usually needed in order to complete the pages. They can contain keywords# ([KEYWORD]) which are recognized by makesite.py, functions in a page.py,# or additional functions in this settings.py.snippets = {}snippets["htmlhead"] = htmlhead.htmsnippets["bodytopfile"] = bodytop.htmsnippets["logofile"] = logo.htmsnippets["menustart"] = menustart.htmsnippets["menuend"] = menuend.htmsnippets["endoffile"] = endoffile.htm
+# The variable addtobody is of type dict and is set here in order to be# extended in page.py files. It can be used to add htm snippets, variables,# values, and even the return of a function into the content of a page.addtobody = {}# Example with snippet: addtobody["[AKVSBODY]"] = "akvsbody.htm"# Example with variable: addtobody["[MYURI]"] = myuri# Example with value: addtobody["[APPLES]"] = 4# Example with function: addtobody["[TODAY]"] = datetime.now().strftime("%Y-%m-%d")
+## EOF
\ No newline at end of file
index 539fa55..57e2c14 100644 (file)
@@ -1,12 +1,12 @@
         <!-- AKVS body start v1.6 -->
-        <div id="akct"><a id="akpeel" href="http://www.vorratsdatenspeicherung.de/aktuell"
+        <div id="akct"><a id="akpeel" href="https://www.vorratsdatenspeicherung.de/aktuell"
              title="Stoppt die Vorratsdatenspeicherung! Jetzt klicken &amp; handeln!"><img
-             src="http://wiki.vorratsdatenspeicherung.de/images/Akvst.gif"
+             src="https://wiki.vorratsdatenspeicherung.de/images/Akvst.gif"
              alt="Stoppt die Vorratsdatenspeicherung! Jetzt klicken &amp; handeln!" /></a>
-         <a id="akpreload" href="http://wiki.vorratsdatenspeicherung.de/?title=Online-Demo"
+         <a id="akpreload" href="https://wiki.vorratsdatenspeicherung.de/?title=Online-Demo"
              title="Willst du auch an der Aktion teilnehmen? Hier findest du alle
                     relevanten Infos und Materialien:"><img
-             src="http://wiki.vorratsdatenspeicherung.de/images/Akvsi.gif"
+             src="https://wiki.vorratsdatenspeicherung.de/images/Akvsi.gif"
              alt="Willst du auch an der Aktion teilnehmen? Hier findest du alle
                   relevanten Infos und Materialien." /></a></div>
         <!-- AKVS body end -->'''
index 3ea46a4..5587dd1 100644 (file)
@@ -1,9 +1,9 @@
       <div id="footer">
-        <a class="graflink" href="http://validator.w3.org/check?uri=referer"> 
+        <a class="graflink" href="https://validator.w3.org/check?uri=referer"> 
           <img src="/bilder/valid-xhtml10.png" width="88" height="31"
                alt="W3C – valid XHTML 1.0" /></a>
         <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>
+        <p class="htmlglue">proudly glued together with [GLUE]</p>
       </div><!-- div#footer -->
index 70970f8..40008f4 100644 (file)
@@ -1,5 +1,5 @@
         <p class="center">
-          <a class="graflink" href="http://www.cacert.org/">
+          <a class="graflink" href="https://www.cacert.org/">
             <img src="/bilder/cacert-100.png" width="100" height="23"
                  alt="CaCert" /></a><br />
             Wer im Raum Düsseldorf eine CaCert Assurance benötigt,
index 820084a..14a5689 100644 (file)
@@ -1,5 +1,5 @@
         <p class="center">
           <a class="graflink"
-             href="http://www.geocaching.com/profile/?guid=6a47d0cc-706d-4d48-8db0-d6af51d43344">
+             href="https://www.geocaching.com/profile/?guid=6a47d0cc-706d-4d48-8db0-d6af51d43344">
             <img src="http://img.geocaching.com/stats/img.aspx?txt=View+my+profile&amp;uid=6a47d0cc-706d-4d48-8db0-d6af51d43344" width="200" height="50"
                  alt="Geocaching.com Profil" /></a></p>