Bugfixes and some planned features.
authorSabine Engelhardt (Becker) <frosch@atari-frosch.de>
Fri, 14 Sep 2018 22:04:06 +0000 (00:04 +0200)
committerSabine Engelhardt (Becker) <frosch@atari-frosch.de>
Fri, 14 Sep 2018 22:04:06 +0000 (00:04 +0200)
.gitignore
CHANGELOG
MANUAL [new file with mode: 0644]
ToDo
filters/atarifrosch.py
filters/filter.py [new file with mode: 0755]
fullsettings.py
preparesite.py

index 1faf4b7..46c474c 100644 (file)
@@ -2,3 +2,4 @@ __pycache__/
 */__pycache/
 html/
 sites/
+gitcommand
\ No newline at end of file
index a728022..ba3ab61 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,10 +1,45 @@
+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.
+
+    * preparesite.py: String variables within .py files will now be stored
+      using standard double quotemarks instead of single quote marks, as
+      the single quotemark causes trouble if such a string contains a single
+      quotemark (like in "it's"). Double quotemarks within such a string
+      can be replaced by different quotemarks as given in the filter file
+      for the site (variables: quotemarkstart, quotemarkend).
+
+    * preparesite.py: xml:lang and lang from the html definition (like in
+      <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">)
+      are now read and set explicitly and not mixed with the language
+      definition in the meta tag DC.Language or that in the http-equiv
+      header "content-language". Additionally, the latter two definitions
+      now also get read and set separately in the page.py. The reason is
+      that xml:lang/lang in the html definition must contain only one
+      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 fullsettings.py from first experiences with settings.py for
+      a real website.
+
+    * Updated ToDo.
+
+    * Created a MANUAL file, content is still ToDo.
+
+
 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.
+    * makesite.py: After lots of bugfixing makesite delivers all pages of a
+      site, but will need to ignore some folders. And some minor page parts
+      are still missing.
 
-    * updated ToDo
+    * Updated ToDo.
 
 
 2018-09-10 frosch@atari-frosch.de
diff --git a/MANUAL b/MANUAL
new file mode 100644 (file)
index 0000000..f15f0e6
--- /dev/null
+++ b/MANUAL
@@ -0,0 +1,8 @@
+MANUAL for HTMLglue v0.0
+
+I know, nobody reads manuals. But if you want to use this set of scripts,
+you should, because if you don't, you will not end up with what you're
+expecting. :-)
+
+
+
diff --git a/ToDo b/ToDo
index 81ec26a..5fd5cf4 100644 (file)
--- a/ToDo
+++ b/ToDo
@@ -2,43 +2,25 @@ in general:
 
 * NEW: LICENSE file (GPLv3, I guess)
 
+* NEW: Write the MANUAL. *sigh* ;-)
+
 * 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
+  that a visitor of the website can change language at any page as long as
   there is an according page in the other language)
 
 
 preparesite.py:
 
-* 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.
-
-* 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: Move data from filter to settings.py after preparesite is done –
-  possible?
+* 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
 
 
 makesite.py:
 
-* 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
@@ -46,19 +28,24 @@ makesite.py:
 * ERROR: makefoot: last content modification is printed out in seconds
   instead of given strftime format
 
-* 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.
+* 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. 
+
+* FEAT: A page.py can contain a list menuadd with additional menu entries
+  that should show up only in this single page. They can contain
+  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.
 
 * 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.
+  DEFAULTS, and SNIPPETS, etc.). Also ignore all non *.htm files.
 
 * 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)?
@@ -66,14 +53,12 @@ makesite.py:
 * 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. Ignore timestamps if a command line
-  argument says „force recreation“.
+* FEAT: compare file timestamps of .htm/.menu/.py files and html, build new
+  html if page files are 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, …
 
index 5aa5418..ca70f29 100755 (executable)
@@ -7,8 +7,10 @@ targetpath = "/home/frosch/prog/htmlglue/sites/atarifrosch/"
 logfile = targetpath + "preparesite.log"
 loglevel = 5
 
-oldenc = "iso8859-15"
+oldenc = "iso8859-15"
 
+# unfortunately this does not work recursively, so ignoredirs must contain
+# all subdirectories that should be ignored, too
 ignoredirs = []
 ignoredirs.append("/bilder")
 ignoredirs.append("/bilder/18c3")
@@ -64,28 +66,56 @@ ignoredirs.append("/tmp")
 ignorefiles = ["STANDARD.html"]
 
 ignorehtml = []
-# This 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 end.
-# Only preparesite.py changes this into a dictionary.
-# Do NOT ignore the menu here, as it needs a special treatment.
-
+# 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
+# end. preparesite.py changes this into a dictionary. Do NOT ignore the menu
+# (navigation) here, as it needs a special treatment.
 ignorehtml.append('<body> == <!--div#logo-->')
 ignorehtml.append('<div id="footer"> == </html>')
 ignorehtml.append('<!--[if gte IE 5.5]> == <![endif]-->')
 ignorehtml.append('<!-- AKVS body start v1.6 --> == <!-- AKVS body end -->')
 
+# 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
+# definitions will only be used for strings that preparesite.py stores as
+# variables. They will not be used on a page's contents; if you want to
+# replace them there, use the replacement list within settings.py. The
+# single quotation mark ' is not a problem here.
+quotemarkstart = "„"
+quotemarkend = "“"
+
+# preparesite.py needs a unique start and end mark in order to find the menu
+# (navigation) section. If your pages are missing these marks, you will have
+# to set them manually before running preparesite.py. Before you ask: Yes,
+# in EVERY html file.
 menustart = '<div id="menu">'
 menuend = '<!-- div#menu -->'
-firstmenuitem = 'menuitem.append(["htm home /index.html Startseite"])\n'
 
+# As preparesite.py also creates the menu.py file in each folder of the
+# site, it needs to know the parameters for the first menu item, which it
+# assumes are the data for the homepage.
+# 1. htm or dir (here: usually htm)
+# 2. CSS class of that menu item (. if none)
+# 3. name of the according html file (usually /index.html)
+# 4. name of the menu entry
+# Do not set the parameters in additional quotation marks!
+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.
 headlinekey = "<h1>"
 
+# preparesite.py needs a unique start and end mark in order to find the
+# content section of each page. If your pages are missing such marks, you
+# will have to set them manually before running preparesite.py. Before you
+# ask: Yes, in EVERY html file.
 contentstart = '<div id="content">'
 contentend = '<!-- div#content -->'
 
-# while reading the content, we can replace a few things
+# 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;"] = "“"
@@ -94,3 +124,4 @@ replacement["&reg;"] = "®"
 replacement["(tm)"] = "™"
 replacement["..."] = "…"
 replacement["&middot;"] = "·"
+replacement["&euro;"] = "€"
diff --git a/filters/filter.py b/filters/filter.py
new file mode 100755 (executable)
index 0000000..a80c57f
--- /dev/null
@@ -0,0 +1,76 @@
+#!/usr/bin/env python3
+# -*- coding: utf8 -*-
+
+origpath = "/srv/atarifrosch/"
+fileext = ".html"
+targetpath = "/home/frosch/prog/htmlglue/sites/atarifrosch/"
+logfile = targetpath + "preparesite.log"
+loglevel = 5
+
+oldenc = "iso8859-15"
+
+# unfortunately this does not work recursively, so ignoredirs must contain
+# all subdirectories that should be ignored, too
+ignoredirs = []
+ignoredirs.append("/bilder")
+
+ignorefiles = ["STANDARD.html"]
+
+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
+# end. preparesite.py changes this into a dictionary. Do NOT ignore the menu
+# (navigation) here, as it needs a special treatment.
+ignorehtml.append('<body> == <!--div#logo-->')
+ignorehtml.append('<div id="footer"> == </html>')
+
+# 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
+# definitions will only be used for strings that preparesite.py stores as
+# variables. They will not be used on a page's contents; if you want to
+# replace them there, use the replacement list within settings.py. The
+# single quotation mark ' is not a problem here.
+quotemarkstart = "„"
+quotemarkend = "“"
+
+# preparesite.py needs a unique start and end mark in order to find the menu
+# (navigation) section. If your pages are missing these marks, you will have
+# to set them manually before running preparesite.py. Before you ask: Yes,
+# in EVERY html file.
+menustart = '<div id="menu">'
+menuend = '<!-- div#menu -->'
+
+# As preparesite.py also creates the menu.py file in each folder of the
+# site, it needs to know the parameters for the first menu item, which it
+# assumes are the data for the homepage.
+# 1. htm or dir (here: usually htm)
+# 2. CSS class of that menu item (. if none)
+# 3. name of the according html file (usually /index.html)
+# 4. name of the menu entry
+# Do not set the parameters in additional quotation marks!
+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 (no matter where it will be placed later)
+headlinekey = "<h1>"
+
+# preparesite.py needs a unique start and end mark in order to find the
+# content section of each page. If your pages are missing such marks, you
+# will have to set them manually before running preparesite.py. Before you
+# ask: Yes, in EVERY html file.
+contentstart = '<div id="content">'
+contentend = '<!-- div#content -->'
+
+# 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;"] = "“"
+replacement["&mdash;"] = "–"
+replacement["&reg;"] = "®"
+replacement["(tm)"] = "™"
+replacement["..."] = "…"
+replacement["&middot;"] = "·"
+replacement["&euro;"] = "€"
index 3456c18..cddf152 100644 (file)
@@ -8,68 +8,69 @@
 ## otherwise. All settings in this file are just examples!
 #############################################################################
 
-def makehead(contentfile, targetfile, myurl):
-    pass
-
-# As I wanted to have some current information in the page foot, I wrote
-# this function that creates the footer section, using a SNIPPETS file, the
-# timestamp of the content file, and the current date/time. Of course you
-# don't have to use this and can build your footer the way you want it :-)
-def makefoot(contentfile, targetfile, myurl):
-    from os import path
-    from datetime import datetime
-    from time import strftime
-
-    f = open("../SNIPPETS/footer.htm", "r")
-    footer = f.read()
-    f.close()
 
-    filetime = path.getmtime(contentfile)
-    filetimestamp = strftime("%Y-%m-%d %H:%M", filetime)
-
-    currenttime = datetime.now()
-    curtimestamp = currenttime.strftime("%Y-%m-%d %H:%M")
-
-    footer = footer.replace("[FILETIME]", filetimestamp)
-    footer = footer.replace("[CURTIME]", curtimestamp)
-    footer = footer.replace("[MYURL]", myurl)
+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
 
-    return footer
+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/"
 
-# Name of the theme and also the name of the theme's directory, so better
-# don't use special characters here.
-theme = "mytheme"
+# 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 statement must NOT be overwritten by a page's .py file!
+# 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's .py file!
+# This statement must NOT be overwritten by a page.py!
 domain = "www.atari-frosch.de"
 
-## The following variables can be overwritten in a page's .py file.
+# 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 rendered page depends on your stylesheet.
+# 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 that is used in a document
+# 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
 
-# content of the <title> tag, usually to be overwritten in each page's .py file
-title = "Froschs Homepage"
-# will become: <title>Froschs Homepage</title>
+## 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'
+robots = "index,follow"
 # will become: <meta name="robots" content="index,follow" />
 
 # general language setting of the site
@@ -78,43 +79,47 @@ language = 'de'
 # and: <meta name="DC.Language" content="de" />
 
 # author of the page
-author = "Atari-Frosch"
-# will become: <meta name="author" content="Atari-Frosch" />
+author = "My Name"
+# will become: <meta name="author" content="My Name" />
 
-# Keywords for search engines – if you want to use them. And if, they should
-# be overwritten individually by each page's .py file.
-metakeywords = "atari-frosch, atari, computer, autismus, politik"
-# will become: <meta name="keywords" content="atari-frosch, atari, computer, autismus, politik" />
+# 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 = "Atari-Frosch"
-# will become: <meta name="DC.Title" content="Atari-Frosch" />
+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 = 'Atari-Frosch'
-# will become: <meta name="DC.Creator" content="Atari-Frosch" />
+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 = 'Atari-Frosch'
-# will become: <meta name="DC.Publisher" content="Atari-Frosch" />
+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.
-dccoverage = "Düsseldorf - Deutschland"
-# will become: <meta name="DC.Coverage" content="Düsseldorf - Deutschland" />
+# 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" />
 
-# copyright holder for the page content
-dcrights = "Sabine 'Atari-Frosch' Becker"
-# will become: <meta name="DC.Rights" content="Sabine 'Atari-Frosch' Becker" />
+# 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'
+favicon = "favicon.ico"
 # will become: <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
 
-# Primary style sheet for the site; file must exist in the CSS directory of
-# the theme
+# 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" />
@@ -122,6 +127,14 @@ stylesheetmedia = "all"
 # 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"
 
 
 #########################################################################
@@ -139,43 +152,37 @@ 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.
-myurl = proto + "://" + domain + targetfile
+myuri = myurl + targetfile
 
-# You can add additional css files here; each entry needs a css file name
-# and the media type it is meant for. The added css files must exist in
-# the theme's CSS directory. Optional.
-# Variable type: list of strings with 2 statements per list item.
+# 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" />
 
-# 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. Optional.
+# 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 = [""]
 
-# You can add additional HTML code to the <head> section. Optional. You can
+# 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:
 
-# In this file we should find the content section of the current page. It is
-# expected to be in the same directory as the according .py file. If it does
-# not exist, the according page and menu entries will not be created. So this
-# statement is NOT optional.
-contentfile = "index.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 theme, the keyword will just be
+# 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]"] = myurl
+addtobody["[MYURL]"] = myuri
 addtobody["[AKVSBODY]"] = "akvsbody.htm"
 addtobody["[LOGO]"] = "logo.htm"
 
index 2fa2b6f..91b8a21 100755 (executable)
@@ -11,6 +11,9 @@ from defaults import myversion
 # functions
 
 def checkenc(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!
     logging.debug('Checking %s for old encoding.', curfile)
     with open(curfile, 'r', encoding=oldenc) as f:
         firstline = f.readline().strip()
@@ -93,18 +96,10 @@ if not os.path.exists(targetpath):
     os.mkdir(defaultsdir)
     snippetdir = targetpath + "/SNIPPETS"
     os.mkdir(snippetdir)
-    # fullsettings = mypath + "/fullsettings.py"
-    # localsettings = defaultsdir + "/settings.py"
-    # import shutil
-    # shutil.copyfile(fullsettings, localsettings)
     initfile = targetpath + "/__init__.py"
     init = open(initfile, "w")
     init.close()
     call(["/bin/chmod", "755", initfile])
-    # outline = "Please edit <" + localsettings + ">!"
-    # print(outline)
-    # print("Without a correct filter the site cannot be prepared for htmlglue.")
-    # logging.critical('Please edit DEFAULTS/settings.py.')
     sys.exit()
 
 if not flt.origpath.startswith("/"):
@@ -225,6 +220,7 @@ for dirpath, dirs, files in os.walk(origpath):
                 pyfile.write(pyhead)
 
                 ln = "'\n"
+                lns = '"\n'
                 addcssfile = []
                 ignorestop = ""
                 menuread = False
@@ -242,7 +238,7 @@ for dirpath, dirs, files in os.walk(origpath):
                         if ign in curline:
                             ignorestop = ignorehtml[ign]
 
-                    # special case: reading the menu from an index.html
+                    # special case: reading the menu from index.html
                     if menuread:
                         origmenu += curline + "\n"
                         if flt.menuend in curline:
@@ -285,17 +281,29 @@ for dirpath, dirs, files in os.walk(origpath):
                         if curline != settings.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)
+
                             outline = "htmlver = '" + curline + ln
                             pyfile.write(outline)
+
                     elif "<title>" in curline:
                         lineparts = curline.split("<title>")
                         title = lineparts[1].replace("</title>", "")
                         title = title.strip()
                         if title != settings.title:
-                            outline = "title = '" + title + ln
+                            outline = 'title = "' + title + lns
                             pyfile.write(outline)
 
                     elif "<meta" in curline:
@@ -307,41 +315,49 @@ for dirpath, dirs, files in os.walk(origpath):
                         contentpart = contentpart.strip()
                         if 'name="robots"' in curline:
                             if contentpart != settings.robots:
-                                pyfile.write("robots = '" + contentpart + ln)
-                        elif 'http-equiv="content-language"' in curline or 'DC.Language' in curline:
+                                pyfile.write('robots = "' + contentpart + lns
+                            else:
+                                pyfile.write('robots = "' + setting.robots + lns
+                        elif 'http-equiv="content-language"' in curline:
+                            if contentpart != settings.language:
+                                pyfile.write("contentlanguage = '" + contentpart + ln)
+                            else:
+                                pyfile.write("contentlanguage = '" + settings.language + ln)
+                        elif 'DC.Language' in curline:
                             if contentpart != settings.language:
                                 pyfile.write("language = '" + contentpart + ln)
-                                # might write this line twice into the .py file if both exist!
+                            else:
+                                pyfile.write("language = '" + settings.language + ln)
                         elif 'name="author"' in curline:
                             if contentpart != settings.author:
-                                pyfile.write("author = '" + contentpart + ln)
+                                pyfile.write('author = "' + contentpart + lns)
                         elif 'name="keywords"' in curline:
                             if contentpart != settings.metakeywords:
-                                pyfile.write("metakeywords = '" + contentpart + ln)
+                                pyfile.write('metakeywords = "' + contentpart + lns)
                         elif "DC.Title" in curline:
                             if contentpart != settings.dctitle:
-                                pyfile.write("dctitle = '" + contentpart + ln)
+                                pyfile.write('dctitle = "' + contentpart + lns)
                         elif "DC.Creator" in curline:
                             if contentpart != settings.dccreator:
-                                pyfile.write("dcreator = '" + contentpart + ln)
+                                pyfile.write('dcreator = "' + contentpart + lns)
                         elif "DC.Publisher" in curline:
                             if contentpart != settings.dcpublisher:
-                                pyfile.write("dcpublisher = '" + contentpart + ln)
+                                pyfile.write('dcpublisher = "' + contentpart + lns)
                         elif "DC.Coverage" in curline:
                             if settings.dccoverage != "":
                                 if contentpart != settings.dccoverage:
-                                    pyfile.write("dccoverage = '" + contentpart + ln)
+                                    pyfile.write('dccoverage = "' + contentpart + lns)
                         elif "DC.Rights" in curline:
                             if contentpart != settings.dcrights:
-                                pyfile.write("dcrights = '" + contentpart + ln)
+                                pyfile.write('dcrights = "' + contentpart + lns)
                         elif "DC.Date" in curline:
                             logging.debug('Found date <%s> in DC.Date"', contentpart)
                             pyfile.write("dcdate = '" + contentpart + ln)
                             filetime = gmtime(os.path.getmtime(curfile))
                             fileday = strftime('%Y-%m-%d', filetime)
                             logging.debug('Extracted fileday as %s.', fileday)
-                            # this is needed later for touching the .htm file
-                            # after closing it
+                            # this is needed later for touching the .htm
+                            # file after closing it
                             if contentpart == fileday:
                                 contentdate = strftime('%Y-%m-%d %H:%M:%S', filetime)
                                 htmtouchtime = strftime('%Y%m%d%H%M.%S', filetime)
@@ -349,7 +365,7 @@ for dirpath, dirs, files in os.walk(origpath):
                                 htmtouchtime = contentpart.replace("-", "") + "0000.00"
                                 contentdate = contentpart + ' 00:00:00'
                             pyfile.write('contentdate = "' + contentdate + '"\n')
-                            pyfile.write('# as seen by preparesite.py v' + myversion + '\n')
+                            pyfile.write('# as seen by htmlglue/preparesite.py v' + myversion + '\n')
                             logging.debug('Will touch htm file with timestamp "%s"', htmtouchtime)
 
                     elif '<link rel=' in curline:
@@ -384,7 +400,7 @@ for dirpath, dirs, files in os.walk(origpath):
                         headline = headline.split(headlineend)[0]
                         headline = headline.strip()
                         logging.debug('Found headline "%s" in <%s>.', headline, curfile)
-                        pyfile.write("headline = '" + headline + ln)
+                        pyfile.write('headline = "' + headline + lns)
 
                     else:
                         pass
@@ -420,7 +436,7 @@ for dirpath, dirs, files in os.walk(origpath):
                                 menuclass = menuclass.split(">")[0]
                                 menuclass = menuclass.replace('"', '')
                             else:
-                                menuclass = ""
+                                menuclass = "."
 
                             if "href" in curitem:
                                 menuhref = curitem.split('href="')[1]
@@ -433,8 +449,8 @@ for dirpath, dirs, files in os.walk(origpath):
                                 else:
                                     filetype = "dir"
 
-                                outline = 'menuitem.append(["' + filetype + ' ' + menuclass
-                                outline += ' ' + menufilename + ' ' + menuitemname + '"])\n'
+                                outline = 'menuitem.append("' + filetype + ' ' + menuclass
+                                outline += ' ' + menufilename + ' ' + menuitemname + '")\n'
                                 menu.write(outline)
 
                     menu.close()