meta.modes: Metadata for (x)html

The module meta.modes in the directory of the gloss distribution and web pages contains the code for presenting metadata in (X)HTML standards-compliant pages.

1 Synopsis

This module defines a huge number of shorthands for adding link or meta tags to the HTML head element, including Dublin core metadata elements and many other commonly used HTML metadata elements. It can also add links to CSS, XSL and JS files. (This behaviour controlled by parameters so can be added to a group of documents by modifying the mv.)

For Dublin Core see Also uses other ad-hoc methods widely used in web.

Of particular importance are the following meta tags.

home ~URI     ; home document in a group
glossary ~URI ; glossary document in a group
contents ~URI ; contents document in a group
index ~URI    ; index document in a group
home ~URI     ; home document in a group
first ~URI    ; first document in a group     - omit if this IS the first one
next ~URI     ; next document in a group      - omit if this has no next one
previous ~URI ; previous document in a group  - omit if this IS the first one
author ~URI   ; author's home page
author  ; author's name
date    ; date of authoring

Use relative URI's if at all possible. Please see the file meta.modes for a full list of meta-tags that can be added.

The XSL file, html.xsl, in the same directory adds a "navigator bar" at the head and tail of each html file with links to some of the links present in the head.

This version is for simplified use at present. The scheme, xml:lang, hreflang, and other values for profile attributes are not supported except via general GLOSS-xml mechanisms, but they can be added.

2 The code

!declare-prefix @prefix[meta] @uri[] {
!declare-prefix @prefix[html] @uri[] {
!declare-prefix @prefix[xml] @uri[] {

!init-parameter @name[meta:xsl] @value[]  ; e.g. html.xsl
!init-parameter @name[meta:css] @value[]  ; e.g. html.css
!init-parameter @name[meta:js] @value[]   ; e.g. html.js
!init-parameter @name[meta:icon] @value[] ; e.g. favicon.ico
!init-parameter @name[meta:profile] @value[http$://] 
!init-parameter @name[meta:object] @value[]   ; include a special OBJECT element (e.g. for mathplayer)
!init-parameter @name[meta:objectid] @value[]
!init-parameter @name[meta:objectclasid] @value[]
!init-parameter @name[meta:importnamespace] @value[]

Mode meta inserts a link or a meta tag with data ${meta:name}, ${meta:content}

!mode @name[meta:meta] @accept[uri|\[] @type[process]
    !element @name[link]
      !attribute @name[rel] [$\{meta:name\}]
      !attribute @name[href] [$v]
      !if @test[$\{meta:type\}]
        !attribute @name[type] [$\{meta:type\}]
      !process-tokens @mode[xml:attribute-list]

    !execute @mode[xml:get-attr]
      !set-parameter @name[xml:attr-param] @value[meta:content]
    !element @name[meta]
      !attribute @name[name] [$\{meta:name\}]
      !attribute @name[content] [$\{meta:content\}]
      !process-tokens @mode[xml:attribute-list]


Mode text-only is as for meta, but only accepts text data for meta tag by default this mode just includes the meta:meta mode.

!mode @name[meta:text-only] @accept[\[|] @type[process]
  !include @mode[meta:meta]
  !default !error [Text is required here]

Mode link-only is as for meta, but only accepts an href for link tag by default this mode just includes the meta:meta mode.

!mode @name[meta:link-only] @accept[uri|] @type[process]
  !include @mode[meta:meta]
  !default !error [A URI is required here]

The head mode controls the basic structure of the head element parameter meta:profile defines the profile. Allowed metadata includes dublincore and other ad-hoc formats. Perhaps this default needs reviewing. (Possible TO DO.) This section also allows css, icon, js, xsl stylsheets/scripts to be added to the page via parameters.

!mode @name[meta:head-start] @accept[] @use-indentation[false] @type[execute]
  !hook @mode[html:head-content] @action[preprocess]
    !if @test[$\{meta:head-done\}] !return
    !set-parameter @name[meta:head-done] @value[yes]
    !attribute @name[profile] [$\{meta:profile\}]
    !element @name[link] 
      !attribute @name[rel] [schema.DC] 
      !attribute @name[href] [http$://]

    !element @name[link]
      !attribute @name[rel] [schema.DCTERMS]
      !attribute @name[href] [http$://]

    !if @test[$\{meta:xsl\}]
      !element @name[link]
        !attribute @name[rel] [stylesheet]
        !attribute @name[type] [application/xml]
        !attribute @name[href] [$\{meta:xsl\}] 
        !attribute @name[title] [XSL Stylesheet]

    !if @test[$\{meta:css\}]
      !element @name[link]
        !attribute @name[rel] [stylesheet]
        !attribute @name[type] [text/css]
        !attribute @name[href] [$\{meta:css\}] 
        !attribute @name[title] [CSS Stylesheet]

    !if @test[$\{meta:js\}]
      !element @name[script]
        !attribute @name[type] [text/javascript]
        !attribute @name[src] [$\{meta:js\}] 
        !comment[ preventing it being an empty tag ]

    !if @test[$\{meta:icon\}]
      !element @name[link]
        !attribute @name[rel] [shortcut icon]
        !attribute @name[type] [image/x-icon]
        !attribute @name[href] [$\{meta:icon\}] 

    !if @test[$\{meta:object\}]
      !element @name[object]
        !attribute @name[id] [$\{meta:object-id\}]
        !attribute @name[classid] [$\{meta:object-classid\}]
        !comment[comment required to prevent this becoming an empty tag]
    !if @test[$\{meta:object\}]
      !processing-instruction @target[import] [namespace="$\{meta:import-namespace\}" implementation="#$\{meta:import-id\}"]

    !process-tokens @mode[meta:add-to-head]
    !process-tokens @mode[html:head-content] @hook[preprocess]

Additional head-content to hook onto:

!mode @name[meta:add-to-head] @accept[] @use-indentation[false] @type[process]

The head-content mode adds the new functionality.

!mode @name[meta:head-content] @template[html:head-content] @type[process]
  !hook @mode[html:head-content] @action[process]

We start with a small number of important tags that appear in DC and in other important general ways, so that when given they will be issued twice.

"title" maps to the head's title element and to DC.title, and is also used to create an h1 element straight after body.

It requires a basic text argument, is in: "title[text of title]" and maps to both the html title tag and the DC.title data.

    !process-tokens @mode[xml:process-attr]
      !set-parameter @name[xml:attr-param] @value[meta:content]
    !element @name[title] [$\{meta:content\}]

    !element @name[meta]
      !attribute @name[name][DC.title]
      !attribute @name[content][$\{meta:content\}]

"description" is key to many search engines, and despite a DC version of the tag, we use the one most search engines read. See also "descr" below.

    !process-tokens @mode[xml:process-attr]
      !set-parameter @name[xml:attr-param] @value[meta:content]
    !element @name[meta]
      !attribute @name[name][description]
      !attribute @name[content][$\{meta:content\}]

Dublin Core elements.

standard DC metadata; these may use the meta @name[...] @content[...] or the link @rel[...] @href[...] format and receive a basic-text or URI argument.

  contributor !process-tokens @mode[meta:meta] ${meta:name}="DC.$n"
  coverage !process-tokens @mode[meta:meta] ${meta:name}="DC.$n"
  creator !process-tokens @mode[meta:meta] ${meta:name}="DC.$n"
  date !process-tokens @mode[meta:meta] ${meta:name}="DC.$n"
  descr !process-tokens @mode[meta:meta] ${meta:name}="DC.description" ; DC version of description
  format !process-tokens @mode[meta:meta] ${meta:name}="DC.$n"
  identifier !process-tokens @mode[meta:meta] ${meta:name}="DC.$n"
  language !process-tokens @mode[meta:meta] ${meta:name}="DC.$n"
  publisher !process-tokens @mode[meta:meta] ${meta:name}="DC.$n"
  relation !process-tokens @mode[meta:meta] ${meta:name}="DC.$n"
  rights !process-tokens @mode[meta:meta] ${meta:name}="DC.$n"
  source !process-tokens @mode[meta:meta] ${meta:name}="DC.$n"
  subject !process-tokens @mode[meta:meta] ${meta:name}="DC.$n"
  type !process-tokens @mode[meta:meta] ${meta:name}="DC.$n"
  abstr !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.abstract" ; DC version of abstract
  accessRights !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  accrualMethod !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  accrualPeriodicity !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  accrualPolicy !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  alternative !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  audience !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  available !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  bibliographicCitation !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  conformsTo !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  created !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  dateAccepted !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  dateCopyrighted !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  dateSubmitted !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  educationLevel !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  extent !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  hasFormat !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  hasPart !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  hasVersion !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  instructionalMethod !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  isFormatOf !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  isPartOf !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  isReferencedBy !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  isReplacedBy !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  isRequiredBy !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  issued !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  isVersionOf !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  license !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n" ; UGGH: spelling!!!!
  mediator !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  medium !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  modified !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  provenance !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  references !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  replaces !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  requires !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  rightsHolder !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  spatial !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  tableOfContents !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  temporal !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"
  valid !process-tokens @mode[meta:meta] ${meta:name}="DCTERMS.$n"

Other ad-hoc metadata.

Here are some ad-hoc metadata formats that are regularly used See for example I've added a few of my own. I recommend only a few where the semantics are clear and the word used clearly represents the relationship of the linked document or metadata to **this**document* (not the content of this document, author of this doc, or anything else). Where ?? is given below, the word is unclear to me or not relevant in the metadata section of a document's head.

See alsoe the document source at this point for possible extras that have been considered but not included yet.

  abstract !process-tokens @mode[meta:meta] ${meta:name}="$n" ; abstract to this document or group of documents
  annotation !process-tokens @mode[meta:meta] ${meta:name}="$n" ; annotation to this document
  author !process-tokens @mode[meta:meta] ${meta:name}="$n" ; author's homepage or name
  begin !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; synonym for start, first
  bibliography !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; bibliography for group of pages
  child !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; synonym for subdocument
  citation ${meta:name}="$n" ; a citation from this document/page to other work
  contents !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; table of contents for group of pages
  copyright ${meta:name}="$n" ; copyright statement
  disclaimer ${meta:name}="$n" ; legal disclaimer
  editor ${meta:name}="$n" ; link to or name of editor
  last !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; last document of a group, synonym for end
  first !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; first element in sequence, synonym for start, begin
  footnote ${meta:name}="$n" ; footnote to this document/page
  glossary !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; glossary for group of pages
  help !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; help document for group of pages
  history ${meta:name}="$n" ; list of document versions or similar
  home !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; home document for group of pages
  icon !process-tokens @mode[meta:link-only] ${meta:type}="image/x-icon" ${meta:name}="shortcut icon" ; standard icon data
  index !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; index to group of documents
  keywords !process-tokens @mode[meta:text-only] ${meta:name}="$n"
  last !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; last element in sequence, synonym for end 
  maintainer ${meta:name}="$n" ; mantainer of this document
  navigator !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; navigational aid for group of documents
  next !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; next document in sequence
  parent !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; parent document in group
  previous !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; previous document in sequence, synonym of last
  reply !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; link to reply to this document
  robots !process-tokens @mode[meta:text-only] ${meta:name}="$n" ; standard robots metadata standard
  schema ${meta:name}="$n" ; define metadata schema
  sibling !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; itentifies sibling document
  stylesheet !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; stylesheet
  subdocument !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; child document in group, synonym for child
  supercedes !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; link to previous version of this document
  trademark ${meta:name}="$n" ; trademark notice
  translation !process-tokens @mode[meta:link-only] ${meta:name}="$n" ; translation into another language

Others will be considered, more permissive variations of the above too.

Of course, hand-coded "link" "meta" and other head elements are allowed too in the normal GLOSS-xml style.

  !include @mode[html:head-content] @hook[process]

}; declare xml prefix
}; declare html prefix
}; declare meta prefix

This file is part of the GLOSS system, Copyright Richard Kaye Usage permitted under the GPL. No Warranty.

This page is copyright. Web page design and creation by GLOSS.