Martin Holmes
This project began life as a Dreamweaver-constructed site which, although its interface and structure were functional and attractive, had become a huge mass of incomprehensible nested structures, including 24 JavaScript and 69 CSS files. In the fall of 2017, we began the process of rewriting it, with the aim of keeping it as simple as possible while reproducing and enhancing the design and functionality.
Although HCMC projects normally work with TEI XML and generate HTML from the XML, this project was so far advanced using HTML5 that we decided to retain XHTML5 as the encoding language, for the sake of simplicity; the encoding needs of the project are relatively simple, and if necessary we can generate TEI from the XHTML5, so we took this opportunity to try out the process of using a TEI ODD file to generate a very constrained RelaxNG schema, incorporating Schematron, to bring the advantages of XML editing in Oxygen to an XHTML5 project. This has worked very well so far.
To edit material for the site, you will need to be using a computer with the following software:
To build a local copy of the site to view your changes, in addition to the software above, you will also need to install Python 3. Python is used to figure out which images are actually used in the pages, and copy only those images to the output site.
To build the site and upload it to the webserver, in addition to the software above, you will also need to install rsync.
The project materials are all kept in a Subversion repository at https://hcmc.uvic.ca/svn/keats/. See the section on Using the Subversion repository for detailed instructions on how to get the materials and manage the files. The folder organization is as follows:
This contains HTML components that are used as templates when building the output pages. Edit with care, since changes will affect all pages on the site.
This folder contains all the editable content for the site, in XML files, along with associated audio, images, etc. Although the content files have the extension .xml, these files are actually XHTML5 documents rooted on the <div> element. The idea is that they remain as simple as possible to edit; the surrounding site stuff (banner, menu, footer etc.) is only added at build time.
The files fall into two distinct categories: Timeline files, whose filenames represent a date in the timeline, and Info files, which are named descriptively.
This contains a handful of audio files containing readings of some of the poems. These are linked from the individual poem files.
This folder contains all the image files for the image gallery on the site. It is divided into two folders, gallery_thumb (smaller images) and gallery_full (full-size images). These files are linked from content/theImages.xml, which is the gallery page.
This folder contains all of the non-map images used on timeline pages. Many of the files in this folder are not used, and will probably be deleted or archived at some point.
This folder contains a large number of images of maps, used at the beginning of the timeline articles. There are many redundancies (such as huge PNG versions of images where JPG versions are more appropriate, as well as actual duplicates with different names). There are also HTML pages which serve no purpose in the new version of the site. This needs cleaning up, and the unwanted material should be archived.
This contains XHTML5 files for all of Keats’s poems (with some possible exceptions). These poem pages were generated initially from the Oxford Text Archive TEI file of The Poems of John Keats, which is distributed by the University of Oxford under a Creative Commons Attribution-ShareAlike 3.0 Unported License. Minor corrections have been made, and more editorial work will be done on these in the future.
This folder contains CSS files for three purposes: the main site content on the published site (style.css), display of content when editing in Oxygen Author mode (oxygen.css), and display of instructions and documentation (instructions.css).
This folder contains the documentation generated from the ODD file. That's what you're reading now. It also includes any related files such as articles or presentations on the technical aspects of the site.
This contains the very small quantity of JavaScript used in the new version of the site. None of this script is actually required for the functioning of the site; it's just enhancement.
This folder is essentially obsolete, and will eventually be archived. It contains versions of the old site HTML which were processed to simplify them and make them well-formed, so that the content could be more easily integrated into the new site.
You will only see this folder once you have built the site; the build process creates the full website, containing all the complete pages and all (and only) the images which are actually used in those pages. This folder is not tracked in Subversion, and its contents are deleted and replaced during every build process.
This is the folder from which Oxygen draws a template to create a new page for the site, when you choose File / New / John Keats Site Content Document (for example).
This folder contains some Java, Python and other files which are used during the site build process.
All the XSLT files which turn the XML files in the content folder into HTML for the output are stored here, in addition to some other transformations used for automating some of the tagging process.
Inside the root folder are two ant build files: build.xml is the file that runs the site build process, and buildSchema.xml turns the ODD file into a RelaxNG schema. a Schematron schema, and the documentation you're reading now. During the schema build process, some information is harvested from the document collection so that (for example) when a person is tagged in the text, the list of possible values for the data-id attribute includes all the people from the content/people.xml file.
We keep all the project files in a Subversion Repository. This is a version-control system that ensures that every version of every file can be retrieved if necessary, and prevents one person from inadvertently overwriting changes to a file made by someone else.
Subversion runs on one of our HCMC servers, which is called hcmc.uvic.ca. In order to use it, you will need to install a Subversion client on your computer, and also learn a couple of simple command-line commands. Subversion is usually abbreviated to ‘svn’.
How you will do this depends on which operating system you are using.
Obtain a command-line client from SLIKSVN (https://sliksvn.com/download/). There is no cost. Make sure to download the correct version; there are versions for 32-bit and 64-bit Windows.
On older versions of Mac OSX (prior to 10.8), the Subversion client was installed by default, so if you're using one of those versions, you don't need to install it. However, it was removed from the default install of more recent versions. This is the simplest way to install it:
Subversion is installed as part of a regular desktop on most Linux distributions.
Once your subversion client is installed, the first thing we need to do is to check out the repository. To do this, you need to open a terminal window:
Now we'll check that svn is installed and working. Type svn checkout and press return. If the terminal responses that there are Not enough arguments provided, then svn is working OK.
Now we'll create a directory for our project files:
mkdir keats⚓
And now we've created that directory, we'll navigate into it:
cd keats⚓
And now we'll check out the files from the repository into our directory. Make sure you don't forget the space and period at the end of this command:
svn checkout https://hcmc.uvic.ca/svn/keats .⚓
The server should ask for your netlink user name and password. Then you should see the files download to your drive.
These are the basic rules when you're working with svn:
Before you start work, update your local files:
You can leave the terminal open while you work. Then, when you're ready to commit your changes:
svn update⚓(again, just in case anything else has been committed by someone else)
svn commit -m "A message explaining the changes you have made"⚓
That's basically it. If you see any warnings or error messages from svn, check that you're in the right folder in your terminal. You may also see error messages if two people have been editing the same file at the same time, and Subversion needs you to make a decision about whose changes should be kept. Contact Martin immediately if you have any problems with svn; it's best to solve problems quickly so that your work is always up to date and stored safely.
The ‘Timeline’ articles are the heart of the project. Each one consists of a single XML file which is named for its date, using standard ISO format:
There are two types of content in these files: some of them contain a chronology, which is an overview of the events over a period of (typically) a year, and some of them contain an article, which is a single entry in the timeline. Chronology documents typically have the name of a single year (such as 1819.xml, while regular articles have more granular dates such as 1819-01-02.xml.
A timeline article file looks like this:
Key points to note:
Info files are the other site pages which are not part of the timeline. They have descriptive filenames in camelBack format. Info pages look very similar to chronology pages:
The site includes a complete set of Keats's poetry, mostly generated from the Oxford Text Archive TEI file of The Poems of John Keats, which is distributed by the University of Oxford under a Creative Commons Attribution-ShareAlike 3.0 Unported License. Minor corrections have been made, some poems have been added from other sources, and more editorial work will be done on these in the future. All the poem files are inside the content/poems folder. A poem file looks like this:
The poem title is in an <h3> element, and the lines are list items in a <ul> element. For poems which contain multiple stanzas, each stanza is a separate <div> containing a <ul>. This structure allows a stanza number or other heading to be supplied:
Individual lines in a stanza may be indented by varying amounts. This can be encoded using the values of the class attribute on the <li> ant element:
The values in1, in2 ... in9 are available; in1 means ‘indent this line by the width of 1 em’, and so on.
This project has served as a pilot for the Endings project at UVic, and in particular for our research into ways to provide basic search functionality without a dependency on external services such as Google or on server-side processing. An experimental JavaScript-only search engine was developed for the site in 2018 by Martin Holmes at the HCMC. This search is based on index files which are generated during the full site build process.
These files are stored in site/js/search, and there are (currently) over 12,000 of them. The process works like this:
When a search is launched from the search page on the site, this is what happens:
The purpose of this search is not to improve on Google; in its current incarnation, it is inferior to a serious search engine in many ways. Instead, the idea is to provide a search function that will work anywhere, without dependencies or advertising, and which will work into the indefinite future. A Google Search page is also provided, but this of course depends on someone (currently Martin Holmes) maintaining a Google Custom Search profile for the site, and the results include ads.
The JavaScript Search functionality is expected to be further developed in future.
The organization of the repository is designed to keep the editing process as simple as possible, by removing all site-level global features such as menus and banners from the text which is actually being authored/edited. That means that a build process must be performed to produce the actual site which is uploaded to the server. This section documents the build process.
In order to run the full build process, you will need the following software to be installed on your computer:
In the root folder is a file called build.xml, which is the controller for the entire build process. It is an script file for the Apache Ant build tool. To see the full details of the build process, you can read that file, or just open a terminal in the project root and type:
ant -projecthelp⚓
These are the basic features of the full build process:
There is also a ‘quick’ build process (target quick) which is used within the Oxygen environment to build a quick version of the site without going through the long process of generating the search indexes. This leaves any existing search indexes intact, so it can be used for a quick rebuild during development once a set of indexes has been generated (although the indexes will no longer be in sync with any content changes that have happened, of course).
All the project materials are stored in our Subversion repository. See Using the Subversion Repository for information on how to check them out and commit changes.
All editing should be done with the Oxygen XML Editor. Start Oxygen, then click on Project / Open Project, browse to the project folder, and select keats.xpr. When Oxygen asks you if you want to allow it to make changes to the Oxygen interface, say OK.
All existing site content is stored in the content folder. Open a file in Oxygen and edit it. Before you commit changes back to the Subversion repository, make sure the file is valid by clicking on the Red Check icon.
If you want to add a new poem or create a new micro-article, do this:
camelBack.xml⚓for information files and
YYYY-MM-DD.xml⚓for timeline files.
svn add content/myNewFile.xml⚓
To do this, you will need to be on a computer which has Oxygen, and Python 3. With the XML file you have edited open in the Oxygen editor, click on the red triangle button in the toolbar (‘Apply Transformation Scenario’). If there are no errors, the site should be quickly rebuilt, and when the process is complete, the web page created from your file should be opened in your web browser.
Adding an image to a page is a three-stage process:
First, save the file in a suitable format, with a conformant filename. In most cases, the format should be JPEG, with some compression (say 93%). This is the best option for optimizing file size and clarity.
Now give it a conformant filename. Filenames should use ONLY letters, numbers, and underscores; never include punctuation, spaces, quotation marks or any similar character. Filenames should follow the camelback pattern, starting with a lower-case letter and marking each word-boundary by an uppercase; file extensions should always be lower-case:
You will notice that there are lots of images in the folders which do not follow these rules. These are evil and will be renamed when there is time to make the changes.
Next, you have to decide where the image should be stored in the repository. These are the options:
Now add the image(s) to svn. If it's a single image, it would be like this:
svn add content/images/wentworthHouse.jpg⚓
If you have created a folder with two images in it, just add the folder:
svn add content/neighbourhoodMaps/welbeckSt⚓
When you next do an
svn commit⚓
, the images will be sent to the server.
The gallery images are all stored in content/gallery. There are two subfolders:
Create the images, then add them to svn in the normal way.
The sequence of items in the topic index table is not significant; the alphabetical organization will be done automatically by the build process. So you can add a new entry at the beginning of the table, at the end, or anywhere else that’s convenient. To delete an entry, simply remove the table row containing it.
To do this, you will need to be on a computer which has Java, Ant, and Python 3. Open a terminal in the root folder of the project, and type:
ant⚓
If all goes well, the resulting site should be created in the site folder in the project root. The process takes three to five minutes, with most of the time taken up with creating the search index files.
To do this, you will need to be on a computer which has Java, Ant and rsync installed. Open a terminal in the root folder of the project, and type:
ant rsyncToLiveServer⚓
ant rsyncToLiveServer⚓
You will need to supply the password for the site, which is on the unix.uvic.ca server.
Note that the title of a poem in the poem itself is not tagged with a <span> element; instead it is an <h3> element.
There are keystroke shortcuts to apply many of these tags automatically in Oxygen.
The personography consists of a list of people considered important in Keats’s life and development, located in the content/people.xml file. The biographical information in this file is used to generate popups when mousing over someone's name in a text, and the people are also automatically indexed as a result of being in this file.
The placeography consists of a list of places considered important in Keats’s life and development, located in the content/places.xml file. The content in this file is currently used only in building the interactive maps (see below), but it may be used later in a similar manner to the personography data. Each location has a unique id consisting of a four-letter upper-case string based on its name.
Modern map showing locations and journeys of significance in Keats’s life is created using the BreezeMap project codebase. Since BreezeMap is a TEI project, the map data is stored in TEI XML files, in the map. folder. Refer to the BreezeMap documentation for information on how to edit geographical information in these files. Note that the actual place information is taken at build time from the content/places.xml file. The relationships between locations in the map files and the placeography is based on similar ids: for example, where a place in the placeography has the id AUCH, the equivalent TEI <place> element in the map file for Keats's Tour (map/keatsTour.xml) has the id KTAUCH.
The key information in the TEI files is a list of places, each of which has a unique id, a canonical placename, and a location, which contains a geo element with the coordinate geometry in GeoJSON format, along with a sequence of one or more date elements which are used to specify when Keats was at that location. This data is used to built interactive maps based on OpenLayers, using the BreezeMap project build process, as part of the main Keats site build. An empty <desc> element is populated at build time from the placeography file.
Keats’s Selected Social Network. It contains an HTML <details> element with an explanation of the diagram. The diagram itself is an SVG document, content/images/relationships/relationships.svg. The SVG is imported into the page at build time by virtue of a special processing instruction:
For the convenience of editors working on the texts in the Oxygen XML Editor, the following keystroke shortcuts are available. M1 = Command (Mac) or Control (Windows, Linux); M2 = Shift.
Shortcut | Description | Code inserted |
---|---|---|
M1 M2 A | Tag something as an article title | <span class="articleTitle">${selection}</span> |
M1 M2 B | Tag something as a book or monograph title | <span class="bookTitle">${selection}</span> |
M1 M2 Q | Quotation: Tag something as a quotation | <q>${selection}</q> |
M1 QUOTE | Curly apostrophe: U+2019 RIGHT SINGLE QUOTATION MARK: preferred character for apostrophe | ’ |
M1 M2 0 | Curly double closing quote | ” |
M1 M2 9 | Curly double opening quote | “ |
M1 M2 J | Tag something as a journal or periodical title | <span class="journalTitle">${selection}</span> |
M1 M2 P | Tag something as a poem title | <span class="poemTitle">${selection}</span> |
M1 M2 N | Tag a name with <span class="name"> | <span class="name" data-id="${caret}">${selection}</span> |
The two schemas (RelaxNG and Schematron) that we use to validate and constrain the content documents are both generated from the file schema/keats.odd, as is the documentation in documents/keats.html. ODD files are normally used to create schemas for TEI XML projects, but this project makes use of the ODD specification and processing provided by the TEI infrastructure to provide validation and documentation for documents which are not TEI at all; they're pure XHTML5.
‘Why not just use the standard HTML5 validator?’ Well, we do, in fact; the output pages in the site are all validated using the vnu.jar validator at the end of the build process. However, that validator allows the full range of HTML5 elements and attributes, and it does not constrain the values of important attributes; in other words, it's too permissive. Our own schema is intended to provide much tighter control over what is allowed in the documents in the content directory. This enables us to enforce site-wide styles, and provide more prompts and help for editors working in the Oxygen XML Editor.
If you need technical help with any aspect of this project/website, contact Martin Holmes mholmes@uvic.ca.
<a> | |||||||||||||||||||
Namespace | http://www.w3.org/1999/xhtml | ||||||||||||||||||
Module | xhtml5 | ||||||||||||||||||
Attributes |
|
||||||||||||||||||
Member of |
model.keatsPhrase
|
||||||||||||||||||
Contained by |
xhtml5: a blockquote caption em figcaption h3 h4 h5 li p q span strong summary td th
|
||||||||||||||||||
May contain |
xhtml5: a em figcaption iframe img q span strong summary
character data
|
||||||||||||||||||
Content model |
<content> <macroRef key="macro.keatsParaContent"/> </content> ⚓ |
||||||||||||||||||
Schema Declaration |
element a { att.classable.attributes, attribute href { text }, attribute title { text }?, attribute target { "_blank" }?, macro.keatsParaContent }⚓ |
<audio> Audio element used to provide audio recordings of poems. | |||||||||||||||||||
Namespace | http://www.w3.org/1999/xhtml | ||||||||||||||||||
Module | xhtml5 | ||||||||||||||||||
Attributes |
|
||||||||||||||||||
Member of |
model.keatsDivBody
|
||||||||||||||||||
Contained by |
xhtml5: details div
|
||||||||||||||||||
May contain | Character data only | ||||||||||||||||||
Content model |
<content> <textNode/> </content> ⚓ |
||||||||||||||||||
Schema Declaration |
element audio { att.classable.attributes, att.identifiable.attributes, attribute src { text }, attribute controls { "controls" }, attribute preload { "auto" }, text }⚓ |
<blockquote> Block quotation. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsDivBody
|
Contained by |
xhtml5: details div
|
May contain |
xhtml5: a br em figcaption iframe img p q span strong summary ul
character data
|
Content model |
<content> <alternate minOccurs="1" maxOccurs="unbounded"> <elementRef key="p"/> <elementRef key="ul"/> <elementRef key="br"/> <macroRef key="macro.keatsParaContent"/> </alternate> </content> ⚓ |
Schema Declaration |
element blockquote { att.classable.attributes, ( p | ul | br | macro.keatsParaContent )+ }⚓ |
<br> A hard-coded linebreak. Avoid unless you absolutely need it. Use it at the end of lines in poems. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Contained by |
xhtml5: blockquote em h3 li p q span
|
May contain | Empty element |
Content model |
<content> <empty/> </content> ⚓ |
Schema Declaration |
element br { att.classable.attributes, empty }⚓ |
<caption> A table caption. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Contained by |
xhtml5: table
|
May contain |
xhtml5: a em figcaption iframe img q span strong summary
character data
|
Content model |
<content> <macroRef key="macro.keatsParaContent"/> </content> ⚓ |
Schema Declaration |
element caption { macro.keatsParaContent }⚓ |
<data> A programmatic data element used for encoding relationships between individuals in the personography. It has custom attributes to store the data itself, and may contain text content constituting an optional description of the relationship being encoded. | |||||||||||||||||||||||||||||||
Namespace | http://www.w3.org/1999/xhtml | ||||||||||||||||||||||||||||||
Module | xhtml5 | ||||||||||||||||||||||||||||||
Attributes |
|
||||||||||||||||||||||||||||||
Contained by |
xhtml5: li
|
||||||||||||||||||||||||||||||
May contain | Character data only | ||||||||||||||||||||||||||||||
Content model |
<content> <textNode/> </content> ⚓ |
||||||||||||||||||||||||||||||
Schema Declaration |
element data { att.identifiable.attributes, attribute data-p1 { "abbey_r" | "bailey_b" | "beaumont_f" | "bentham_j" | "bewick_w" | "boccaccio" | "brawne_f" | "brougham_h" | "brown_c" | "burns_r" | "byron" | "chatterton_t" | "chaucer_g" | "christie_j" | "clairmont_c" | "clark_j" | "clarke_c" | "coleridge_s" | "cox_j" | "croker_j" | "dante" | "davenports_t" | "dilke_c" | "elgin_l" | "elmes_j" | "fletcher_j" | "godwin_w" | "hammond_t" | "haslam_w" | "haydon_br" | "hazlitt_w" | "hessey_j" | "hill_t" | "hogg_t" | "holmes_e" | "homer" | "hunt_j" | "hunt_l" | "hunt_r" | "hutchinson_s" | "jefferys_t" | "jennings_a" | "jennings_f" | "jennings_j" | "jennings_r" | "jones_i" | "jonson_b" | "kean_e" | "keats_f" | "keats_g" | "keats_g2" | "keats_t_jun" | "keats_t_sen" | "kingston_j" | "lamb_c" | "lockhart_j" | "lowther_l" | "mackintosh_j" | "mathew_g" | "milman_h" | "milton_j" | "monkhouse_t" | "montagu_b" | "moore_t" | "newton_i" | "novellos_t" | "ollier_c" | "ollier_j" | "peacock_t" | "quincey_t" | "randall_j" | "reynolds_j" | "rice_j" | "richards_c" | "richards_t" | "scott_j" | "scott_w" | "severn_j" | "shakespeare_w" | "shelley_m" | "shelley_p" | "smith_h" | "southey_r" | "spenser_e" | "spurgin_j" | "taylor_j" | "turner_n" | "virgil" | "voltaire" | "webbe_c" | "wells_c" | "west_b" | "westbrook_h" | "woodhouse_r" | "wordsworth_m" | "wordsworth_w" | "wylies_t" }, attribute data-p2 { "abbey_r" | "bailey_b" | "beaumont_f" | "bentham_j" | "bewick_w" | "boccaccio" | "brawne_f" | "brougham_h" | "brown_c" | "burns_r" | "byron" | "chatterton_t" | "chaucer_g" | "christie_j" | "clairmont_c" | "clark_j" | "clarke_c" | "coleridge_s" | "cox_j" | "croker_j" | "dante" | "davenports_t" | "dilke_c" | "elgin_l" | "elmes_j" | "fletcher_j" | "godwin_w" | "hammond_t" | "haslam_w" | "haydon_br" | "hazlitt_w" | "hessey_j" | "hill_t" | "hogg_t" | "holmes_e" | "homer" | "hunt_j" | "hunt_l" | "hunt_r" | "hutchinson_s" | "jefferys_t" | "jennings_a" | "jennings_f" | "jennings_j" | "jennings_r" | "jones_i" | "jonson_b" | "kean_e" | "keats_f" | "keats_g" | "keats_g2" | "keats_t_jun" | "keats_t_sen" | "kingston_j" | "lamb_c" | "lockhart_j" | "lowther_l" | "mackintosh_j" | "mathew_g" | "milman_h" | "milton_j" | "monkhouse_t" | "montagu_b" | "moore_t" | "newton_i" | "novellos_t" | "ollier_c" | "ollier_j" | "peacock_t" | "quincey_t" | "randall_j" | "reynolds_j" | "rice_j" | "richards_c" | "richards_t" | "scott_j" | "scott_w" | "severn_j" | "shakespeare_w" | "shelley_m" | "shelley_p" | "smith_h" | "southey_r" | "spenser_e" | "spurgin_j" | "taylor_j" | "turner_n" | "virgil" | "voltaire" | "webbe_c" | "wells_c" | "west_b" | "westbrook_h" | "woodhouse_r" | "wordsworth_m" | "wordsworth_w" | "wylies_t" }, attribute value { "unused" }, attribute data-level { "intimate" | "close" | "casual" | "acquaintance" }, attribute data-start { text }, text }⚓ |
<details> Expandable details element with summary child. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsDivBody
|
Contained by |
xhtml5: details div
|
May contain |
google: search
xhtml5: audio blockquote details div figure h3 h4 h5 img nav noscript ol p script style summary
table ul
|
Content model |
<content> <sequence minOccurs="1" maxOccurs="1"> <elementRef key="summary"/> <macroRef key="macro.keatsDivContent"/> </sequence> </content> ⚓ |
Schema Declaration |
element details { att.classable.attributes, att.identifiable.attributes, ( summary, macro.keatsDivContent ) }⚓ |
<div> (Division of a document; used as the root for Keats content blocks.) The core container element for a content block. This may also nest, to provide subsections. | |||||||
Namespace | http://www.w3.org/1999/xhtml | ||||||
Module | xhtml5 | ||||||
Attributes |
|
||||||
Member of |
model.keatsDivBody
|
||||||
Contained by |
xhtml5: details div
|
||||||
May contain |
google: search
xhtml5: audio blockquote details div figure h3 h4 h5 img nav noscript ol p script style table
ul
|
||||||
Schematron |
<sch:rule context="xh:div">
<sch:assert test="if (child::xh:h3) then count(ancestor::xh:div) = 0 else if (child::xh:h4)
then count(ancestor::xh:div) = 1 else if (child::xh:h5) then count(ancestor::xh:div)
= 2 else not(child::xh:h3 or child::xh:h4 or child::xh:h5)"> The level of your heading
(h3, h4 or h5) must fit with the depth of your
division nesting; so the top-level div would have h3, a div inside it would
have h4, and a div inside that would have h5. </sch:assert>
</sch:rule>
|
||||||
Content model |
<content> <macroRef key="macro.keatsDivContent"/> </content> ⚓ |
||||||
Schema Declaration |
element div { att.classable.attribute.style, att.identifiable.attributes, attribute class { "chronology" | "footnote" | "homePage" | "poem" | "gcse-searchbox" }?, macro.keatsDivContent }⚓ |
<em> Emphasized text; will be rendered by default in italics. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsPhrase
|
Contained by |
xhtml5: a blockquote caption em figcaption h3 h4 h5 li p q span strong summary td th
|
May contain |
xhtml5: a br em figcaption iframe img q span strong summary
character data
|
Content model |
<content> <alternate minOccurs="0" maxOccurs="unbounded"> <macroRef key="macro.keatsParaContent"/> <elementRef key="br"/> </alternate> </content> ⚓ |
Schema Declaration |
element em { att.classable.attributes, ( macro.keatsParaContent | br )* }⚓ |
<figcaption> Caption for an image in a figure element. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsPhrase
|
Contained by |
xhtml5: a blockquote caption em figcaption figure h3 h4 h5 li p q span strong summary td th
|
May contain |
xhtml5: a em figcaption iframe img q span strong summary
character data
|
Content model |
<content> <macroRef key="macro.keatsParaContent"/> </content> ⚓ |
Schema Declaration |
element figcaption { att.classable.attributes, macro.keatsParaContent }⚓ |
<figure> A figure consists of an image and a caption. | |||||||||||
Namespace | http://www.w3.org/1999/xhtml | ||||||||||
Module | xhtml5 | ||||||||||
Attributes |
|
||||||||||
Member of |
model.keatsDivBody
|
||||||||||
Contained by |
xhtml5: details div
|
||||||||||
May contain |
xhtml5: figcaption img
|
||||||||||
Content model |
<content> <sequence minOccurs="1" maxOccurs="1"> <elementRef key="img"/> <elementRef key="figcaption" minOccurs="0"/> </sequence> </content> ⚓ |
||||||||||
Schema Declaration |
element figure { att.classable.attribute.style, att.identifiable.attributes, attribute class { list { ( "leftFloat" | "center" | "rightFloat" )+ } }, ( img, figcaption? ) }⚓ |
<h3> (Level 3 heading) The h3 (level 3 heading) element provides the heading for micro-article documents. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsDivHeading
|
Contained by |
xhtml5: details div
|
May contain |
xhtml5: a br em figcaption iframe img q span strong summary
character data
|
Content model |
<content> <alternate minOccurs="1" maxOccurs="unbounded"> <macroRef key="macro.keatsParaContent"/> <elementRef key="br"/> </alternate> </content> ⚓ |
Schema Declaration |
element h3 { att.classable.attributes, ( macro.keatsParaContent | br )+ }⚓ |
<h4> (Level 4 heading) | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsDivHeading
|
Contained by |
xhtml5: details div
|
May contain |
xhtml5: a em figcaption iframe img q span strong summary
character data
|
Content model |
<content> <macroRef key="macro.keatsParaContent"/> </content> ⚓ |
Schema Declaration |
element h4 { att.classable.attributes, macro.keatsParaContent }⚓ |
<h5> (Level 5 heading) | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsDivHeading
|
Contained by |
xhtml5: details div
|
May contain |
xhtml5: a em figcaption iframe img q span strong summary
character data
|
Content model |
<content> <macroRef key="macro.keatsParaContent"/> </content> ⚓ |
Schema Declaration |
element h5 { att.classable.attributes, macro.keatsParaContent }⚓ |
<iframe> iframe element containing an embedded video. | |||||||||||||||||||||||||
Namespace | http://www.w3.org/1999/xhtml | ||||||||||||||||||||||||
Module | xhtml5 | ||||||||||||||||||||||||
Attributes |
|
||||||||||||||||||||||||
Member of |
model.keatsPhrase
|
||||||||||||||||||||||||
Contained by |
xhtml5: a blockquote caption em figcaption h3 h4 h5 li p q span strong summary td th
|
||||||||||||||||||||||||
May contain | Empty element | ||||||||||||||||||||||||
Content model |
<content> <empty/> </content> ⚓ |
||||||||||||||||||||||||
Schema Declaration |
element iframe { att.classable.attributes, att.identifiable.attributes, attribute width { text }, attribute height { text }, attribute src { text }, attribute allowfullscreen { text }?, empty }⚓ |
<img> Image element. May be rendered inline or as a block, depending on where it appears in the document structure. | |||||||||||||||||||||||||||||||||||||||||||||||
Namespace | http://www.w3.org/1999/xhtml | ||||||||||||||||||||||||||||||||||||||||||||||
Module | xhtml5 | ||||||||||||||||||||||||||||||||||||||||||||||
Attributes |
|
||||||||||||||||||||||||||||||||||||||||||||||
Member of |
model.keatsDivBody model.keatsPhrase
|
||||||||||||||||||||||||||||||||||||||||||||||
Contained by |
xhtml5: a blockquote caption details div em figcaption figure h3 h4 h5 li p q span strong
summary td th
|
||||||||||||||||||||||||||||||||||||||||||||||
May contain | Empty element | ||||||||||||||||||||||||||||||||||||||||||||||
Schematron |
<sch:rule context="xh:img">
<sch:assert test="(@alt and @title) or following-sibling::xh:figcaption or ancestor::xh:ul[@class='gallery']">
If your img element is not inside a figure element with a figcaption,
then it requires @alt and @title attributes to provide help for
visually-impaired users.
</sch:assert>
</sch:rule>
|
<li> Item in a list. | |||||||||||||
Namespace | http://www.w3.org/1999/xhtml | ||||||||||||
Module | xhtml5 | ||||||||||||
Attributes |
|
||||||||||||
Contained by |
xhtml5: ol ul
|
||||||||||||
May contain |
xhtml5: a br data em figcaption iframe img ol p q span strong summary ul
character data
|
||||||||||||
Content model |
<content> <alternate minOccurs="0" maxOccurs="unbounded"> <elementRef key="ul"/> <elementRef key="ol"/> <elementRef key="p"/> <elementRef key="data"/> <macroRef key="macro.keatsParaContent"/> <elementRef key="br"/> </alternate> </content> ⚓ |
||||||||||||
Schema Declaration |
element li { att.classable.attribute.style, att.identifiable.attributes, attribute class { "in1" | "in2" | "in3" | "in4" | "in5" | "in6" | "in7" | "in8" | "in9" | "in10" | "in11" | "in12" }?, attribute data-partLine { "firstPart" | "middlePart" | "lastPart" }?, ( ul | ol | p | data | macro.keatsParaContent | br )* }⚓ |
<noscript> Element which contains a message to be displayed to users when the user-agent (browser) does not support scripting. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsDivBody
|
Contained by |
xhtml5: details div
|
May contain | Character data only |
Content model |
<content> <textNode/> </content> ⚓ |
Schema Declaration |
element noscript { att.identifiable.attributes, text }⚓ |
<ol> Ordered list, usually numbered. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsDivBody
|
Contained by |
xhtml5: details div li
|
May contain |
xhtml5: li
|
Content model |
<content> <elementRef key="li" minOccurs="1" maxOccurs="unbounded"/> </content> ⚓ |
Schema Declaration |
element ol { att.classable.attributes, li+ }⚓ |
<p> Prose paragraph. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsDivBody
|
Contained by |
xhtml5: blockquote details div li
|
May contain |
xhtml5: a br em figcaption iframe img q span strong summary
character data
|
Content model |
<content> <alternate minOccurs="0" maxOccurs="unbounded"> <macroRef key="macro.keatsParaContent"/> <elementRef key="br"/> </alternate> </content> ⚓ |
Schema Declaration |
element p { att.classable.attributes, att.identifiable.attributes, ( macro.keatsParaContent | br )* }⚓ |
<q> Inline quotation. In rendering, quotation marks will be supplied, so do not include them. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsPhrase
|
Contained by |
xhtml5: a blockquote caption em figcaption h3 h4 h5 li p q span strong summary td th
|
May contain |
xhtml5: a br em figcaption iframe img q span strong summary
character data
|
Content model |
<content> <alternate minOccurs="1" maxOccurs="unbounded"> <elementRef key="br"/> <macroRef key="macro.keatsParaContent"/> </alternate> </content> ⚓ |
Schema Declaration |
element q { att.classable.attributes, ( br | macro.keatsParaContent )+ }⚓ |
<search> Special Google element required in the Google search page. DO NOT USE except on the search page. | |
Namespace | http://www.google.com/cse |
Module | |
Member of |
macro.keatsDivContent
|
Contained by |
xhtml5: details div
|
May contain | Empty element |
Content model |
<content> <empty/> </content> ⚓ |
Schema Declaration |
element search { empty }⚓ |
<span> General-purpose phrase-level element. Use only if there is no more specific alternative for what you want. | |||||||||||||||||||||||
Namespace | http://www.w3.org/1999/xhtml | ||||||||||||||||||||||
Module | xhtml5 | ||||||||||||||||||||||
Attributes |
|
||||||||||||||||||||||
Member of |
model.keatsPhrase
|
||||||||||||||||||||||
Contained by |
xhtml5: a blockquote caption em figcaption h3 h4 h5 li p q span strong summary td th
|
||||||||||||||||||||||
May contain |
xhtml5: a br em figcaption iframe img q span strong summary
character data
|
||||||||||||||||||||||
Schematron |
<sch:rule context="xh:span">
<sch:assert test="@data-id or (not(@class='name') or ancestor::xh:li[@id])">
A span element containing a reference to a person must have a data-id attribute
identifying the person.
</sch:assert>
</sch:rule>
|
||||||||||||||||||||||
Schematron |
<sch:rule context="xh:span">
<sch:assert test="@class or @style">
A span element must have either a style or a class attribute.
</sch:assert>
</sch:rule>
|
||||||||||||||||||||||
Content model |
<content> <alternate minOccurs="0" maxOccurs="unbounded"> <macroRef key="macro.keatsParaContent"/> <elementRef key="br"/> </alternate> </content> ⚓ |
||||||||||||||||||||||
Schema Declaration |
element span { att.classable.attribute.style, attribute class { list { ( "bookTitle" | "journalTitle" | "poemTitle" | "articleTitle" | "chapterTitle" | "artTitle" | "name" | "placeName" | "speaker" )+ } }?, attribute data-id { "abbey_r" | "bailey_b" | "beaumont_f" | "bentham_j" | "bewick_w" | "boccaccio" | "brawne_f" | "brougham_h" | "brown_c" | "burns_r" | "byron" | "chatterton_t" | "chaucer_g" | "christie_j" | "clairmont_c" | "clark_j" | "clarke_c" | "coleridge_s" | "cox_j" | "croker_j" | "dante" | "davenports_t" | "dilke_c" | "elgin_l" | "elmes_j" | "fletcher_j" | "godwin_w" | "hammond_t" | "haslam_w" | "haydon_br" | "hazlitt_w" | "hessey_j" | "hill_t" | "hogg_t" | "holmes_e" | "homer" | "hunt_j" | "hunt_l" | "hunt_r" | "hutchinson_s" | "jefferys_t" | "jennings_a" | "jennings_f" | "jennings_j" | "jennings_r" | "jones_i" | "jonson_b" | "kean_e" | "keats_f" | "keats_g" | "keats_g2" | "keats_t_jun" | "keats_t_sen" | "kingston_j" | "lamb_c" | "lockhart_j" | "lowther_l" | "mackintosh_j" | "mathew_g" | "milman_h" | "milton_j" | "monkhouse_t" | "montagu_b" | "moore_t" | "newton_i" | "novellos_t" | "ollier_c" | "ollier_j" | "peacock_t" | "quincey_t" | "randall_j" | "reynolds_j" | "rice_j" | "richards_c" | "richards_t" | "scott_j" | "scott_w" | "severn_j" | "shakespeare_w" | "shelley_m" | "shelley_p" | "smith_h" | "southey_r" | "spenser_e" | "spurgin_j" | "taylor_j" | "turner_n" | "virgil" | "voltaire" | "webbe_c" | "wells_c" | "west_b" | "westbrook_h" | "woodhouse_r" | "wordsworth_m" | "wordsworth_w" | "wylies_t" }?, attribute data-poem { "index_of_poems" | "poem_addressed_to_haydon" | "poem_addressed_to_the_same" | "poem_after_dark_vapours_have_oppressed_our" | "poem_ah_ken_ye_what_i_met" | "poem_ah_woe_is_me_poor_silver-wing" | "poem_all_gentle_folks_who_owe_a" | "poem_and_what_is_love_it_is" | "poem_apollo_to_the_graces" | "poem_as_from_the_darkening_gloom_a" | "poem_as_hermes_once_took_to_his" | "poem_asleep_o_sleep_a_little_while" | "poem_bards_of_passion_and_of_mirth" | "poem_before_he_went_to_live_with_owls_and_bats" | "poem_blue_tis_the_life_of_heaven" | "poem_bright_star_would_i_were_stedfast" | "poem_calidore_a_fragment" | "poem_character_of_cb" | "poem_daisys_song" | "poem_dear_reynolds_as_last_night_i" | "poem_endymion_book_i" | "poem_endymion_book_ii" | "poem_endymion_book_iii" | "poem_endymion_book_iv" | "poem_extracts_from_an_opera" | "poem_fancy" | "poem_fill_for_me_a_brimming_bowl" | "poem_follys_song" | "poem_for_theres_bishops_teign" | "poem_four_seasons_fill_the_measure_of" | "poem_fragment_of_a_castle-builder" | "poem_give_me_women_wine_and_snuff" | "poem_give_me_your_patience_sister_while" | "poem_god_of_the_golden_bow" | "poem_god_of_the_meridian" | "poem_had_i_a_mans_fair_form" | "poem_hadst_thou_livd_in_days_of" | "poem_happy_is_england_i_could_be" | "poem_hence_burgundy_claret_and_port" | "poem_hither_hither_love" | "poem_how_many_bards_gild_the_lapses" | "poem_hush_hush_tread_softly_hush_hush" | "poem_hyperion_a_dream_canto_i" | "poem_hyperion_a_dream_canto_ii" | "poem_hyperion_a_fragment_book_i" | "poem_hyperion_a_fragment_book_ii" | "poem_hyperion_a_fragment_book_iii" | "poem_i_am_as_brisk" | "poem_i_cry_your_mercy_pity_love" | "poem_i_had_a_dove_and_the" | "poem_i_stood_tip-toe_upon_a_little" | "poem_if_by_dull_rhymes_our_english" | "poem_imitation_of_spenser" | "poem_in_after_time_a_sage_of" | "poem_in_drear_nighted_december" | "poem_isabella_or_the_pot_of_basil" | "poem_keen_fitful_gusts_are_whispring_here" | "poem_king_stephen_act_i_scene_i" | "poem_king_stephen_act_i_scene_ii" | "poem_king_stephen_act_i_scene_iii" | "poem_king_stephen_act_i_scene_iv" | "poem_la_belle_dame_sans_merci" | "poem_lamia" | "poem_lines_on_seeing_a_lock_of" | "poem_lines_on_the_mermaid_tavern" | "poem_lines_written_on_29_may_the" | "poem_mother_of_hermes_and_still_youthful" | "poem_nature_withheld_cassandra_in_the_skies" | "poem_not_aladdin_magian" | "poem_o_blush_not_so_o_blush" | "poem_o_come_dearest_emma_the_rose" | "poem_o_grant_that_like_to_peter" | "poem_o_i_am_frightend_with_most" | "poem_o_solitude" | "poem_o_thou_whose_face_hath_felt" | "poem_ode_on_a_grecian_urn" | "poem_ode_on_indolence" | "poem_ode_on_melancholy" | "poem_ode_to_a_nightingale" | "poem_ode_to_apollo" | "poem_ode_to_psyche" | "poem_of_late_two_dainties_were_before" | "poem_oh_chatterton_how_very_sad_thy" | "poem_oh_how_i_love_on_a" | "poem_old_meg_she_was_a_gipsey" | "poem_on_a_leander_which_miss_reynolds" | "poem_on_fame_how_fevered_is_the" | "poem_on_fame_like_a_wayward_girl" | "poem_on_first_looking_into_chapmans_homer" | "poem_on_leaving_some_friends_at_an" | "poem_on_peace" | "poem_on_receiving_a_curious_shell_and" | "poem_on_receiving_a_laurel_crown_from" | "poem_on_seeing_the_elgin_marbles" | "poem_on_sitting_down_to_read_king" | "poem_on_some_skulls_in_beauley_abbey" | "poem_on_the_grasshopper_and_cricket" | "poem_on_the_sea" | "poem_on_the_story_of_rimini" | "poem_on_visiting_the_tomb_of_burns" | "poem_otho_act_i_scene_i" | "poem_otho_act_i_scene_ii" | "poem_otho_act_i_scene_iii" | "poem_otho_act_ii_scene_i" | "poem_otho_act_ii_scene_ii" | "poem_otho_act_iii_scene_i" | "poem_otho_act_iii_scene_ii" | "poem_otho_act_iv_scene_i" | "poem_otho_act_iv_scene_ii" | "poem_otho_act_v_scene_i" | "poem_otho_act_v_scene_ii" | "poem_otho_act_v_scene_iii" | "poem_otho_act_v_scene_iv" | "poem_otho_act_v_scene_v" | "poem_over_the_hill_and_over_the" | "poem_pensive_they_sit_and_roll_their" | "poem_read_me_a_lesson_muse_and" | "poem_robin_hood" | "poem_shed_no_tear_o_shed_no" | "poem_sleep_and_poetry" | "poem_song" | "poem_song_of_four_fairies_fire_air" | "poem_sonnet_to_sleep" | "poem_specimen_of_an_induction_to_a" | "poem_spenser_a_jealous_honorer_of_thine" | "poem_spirit_here_that_reignest" | "poem_stay_ruby_breasted_warbler_stay" | "poem_sweet_sweet_is_the_greeting_of" | "poem_the_day_is_gone_and_all" | "poem_the_eve_of_st_agnes" | "poem_the_eve_of_st_mark" | "poem_the_gothic_looks_solemn" | "poem_the_jealousies_a_faery_tale_written" | "poem_there_is_a_joy_in_footing" | "poem_there_was_a_naughty_boy" | "poem_think_not_of_it_sweet_one" | "poem_this_living_hand_now_warm_and" | "poem_this_mortal_body_of_a_thousand" | "poem_times_sea_hath_been_five_years" | "poem_tis_the_witching_time_of_night" | "poem_to_a_friend_who_sent_me" | "poem_to_a_young_lady_who_sent" | "poem_to_ailsa_rock" | "poem_to_autumn" | "poem_to_charles_cowden_clarke" | "poem_to_fanny" | "poem_to_gaw" | "poem_to_george_felton_mathew" | "poem_to_haydon_with_a_sonnet_written" | "poem_to_homer" | "poem_to_hope" | "poem_to_jr" | "poem_to_kosciusko" | "poem_to_leigh_hunt_esq" | "poem_to_lord_byron" | "poem_to_mrs_reynoldss_cat" | "poem_to_my_brother_george_1" | "poem_to_my_brother_george_2" | "poem_to_my_brothers" | "poem_to_one_who_has_been_long" | "poem_to_some_ladies" | "poem_to_the_ladies_who_saw_me" | "poem_to_the_nile" | "poem_two_or_three_posies" | "poem_unfelt_unheard_unseen" | "poem_upon_my_life_sir_nevis_i" | "poem_welcome_joy_and_welcome_sorrow" | "poem_what_can_i_do_to_drive" | "poem_when_i_have_fears_that_i" | "poem_when_they_were_come_unto_the" | "poem_where_be_ye_going_you_devon" | "poem_wheres_the_poet_show_him_show" | "poem_why_did_i_laugh_tonight" | "poem_woman_when_i_behold_thee_flippant" | "poem_written_in_disgust_of_vulgar_superstition" | "poem_written_on_a_blank_space_at" | "poem_written_on_the_day_that_mr" | "poem_you_say_you_love_but_with" }?, ( macro.keatsParaContent | br )* }⚓ |
<strong> Text that needs to be highlighted because it is important; will be rendered by default in bold. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsPhrase
|
Contained by |
xhtml5: a blockquote caption em figcaption h3 h4 h5 li p q span strong summary td th
|
May contain |
xhtml5: a em figcaption iframe img q span strong summary
character data
|
Content model |
<content> <macroRef key="macro.keatsParaContent"/> </content> ⚓ |
Schema Declaration |
element strong { att.classable.attributes, macro.keatsParaContent }⚓ |
<summary> Single-line summary for detaile element. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsPhrase
|
Contained by |
xhtml5: a blockquote caption details em figcaption h3 h4 h5 li p q span strong summary td
th
|
May contain |
xhtml5: a em figcaption iframe img q span strong summary
character data
|
Content model |
<content> <macroRef key="macro.keatsParaContent"/> </content> ⚓ |
Schema Declaration |
element summary { att.classable.attributes, macro.keatsParaContent }⚓ |
<table> A table. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Attributes |
|
Member of |
model.keatsDivBody
|
Contained by |
xhtml5: details div
|
May contain |
xhtml5: caption tr
|
Content model |
<content> <sequence minOccurs="1" maxOccurs="1"> <elementRef key="caption" minOccurs="0" maxOccurs="1"/> <elementRef key="tr" minOccurs="1" maxOccurs="unbounded"/> </sequence> </content> ⚓ |
Schema Declaration |
element table { att.classable.attributes, ( caption?, tr+ ) }⚓ |
<td> A table data cell. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Contained by |
xhtml5: tr
|
May contain |
xhtml5: a em figcaption iframe img q span strong summary
character data
|
Content model |
<content> <macroRef key="macro.keatsParaContent"/> </content> ⚓ |
Schema Declaration |
element td { macro.keatsParaContent }⚓ |
<th> A table label or heading cell. | |||||||
Namespace | http://www.w3.org/1999/xhtml | ||||||
Module | xhtml5 | ||||||
Attributes |
|
||||||
Contained by |
xhtml5: tr
|
||||||
May contain |
xhtml5: a em figcaption iframe img q span strong summary
character data
|
||||||
Content model |
<content> <macroRef key="macro.keatsParaContent"/> </content> ⚓ |
||||||
Schema Declaration |
element th { attribute scope { "col" | "row" }?, macro.keatsParaContent }⚓ |
<tr> A table row. | |
Namespace | http://www.w3.org/1999/xhtml |
Module | xhtml5 |
Contained by |
xhtml5: table
|
May contain |
xhtml5: td th
|
Content model |
<content> <sequence minOccurs="1" maxOccurs="unbounded"> <elementRef key="th" minOccurs="0" maxOccurs="unbounded"/> <elementRef key="td" minOccurs="0" maxOccurs="unbounded"/> </sequence> </content> ⚓ |
Schema Declaration |
element tr { ( th*, td* )+ }⚓ |
<ul> Unordered list, usually bulleted. | |||||||
Namespace | http://www.w3.org/1999/xhtml | ||||||
Module | xhtml5 | ||||||
Attributes |
|
||||||
Member of |
model.keatsDivBody
|
||||||
Contained by |
xhtml5: blockquote details div li nav
|
||||||
May contain |
xhtml5: li
|
||||||
Content model |
<content> <elementRef key="li" minOccurs="1" maxOccurs="unbounded"/> </content> ⚓ |
||||||
Schema Declaration |
element ul { att.classable.attribute.style, attribute class { "gallery" | "people" | "places" | "topicIndex" }?, li+ }⚓ |
model.attributable groups elements that contain a word or phrase that can be attributed to a source. [3.3.3. Quotation 4.3.2. Floating Texts] | |
Module | tei |
Used by |
model.inter
|
Members | model.quoteLike |
model.divPart groups paragraph-level elements appearing directly within divisions. [1.3. The TEI Class System] | |
Module | tei |
Used by | |
Members | model.lLike model.pLike |
Note |
Note that this element class does not include members of the model.inter class, which can appear either within or between paragraph-level items. |
model.global groups elements which may appear at any point within a TEI text. [1.3. The TEI Class System] | |
Module | tei |
Used by |
model.paraPart
|
Members | model.global.edit model.global.meta model.milestoneLike model.noteLike |
model.highlighted groups phrase-level elements which are typographically distinct. [3.3. Highlighting and Quotation] | |
Module | tei |
Used by |
model.phrase
|
Members | model.emphLike model.hiLike |
model.inter groups elements which can appear either within or between paragraph-like elements. [1.3. The TEI Class System] | |
Module | tei |
Used by |
model.paraPart
|
Members | model.attributable[model.quoteLike] model.biblLike model.egLike model.labelLike model.listLike model.oddDecl model.stageLike |
model.keatsDivBody Groups elements which can appear below the heading in a div. | |
Module | xhtml5 |
Used by |
macro.keatsDivContent
|
Members | audio blockquote details div figure img nav noscript ol p table ul |
model.keatsDivHeading Groups elements which can function as headings at the top of a div. | |
Module | xhtml5 |
Used by |
macro.keatsDivContent
|
Members | h3 h4 h5 |
model.keatsPhrase Groups elements which can appear at the phrase level. | |
Module | xhtml5 |
Used by |
macro.keatsParaContent
|
Members | a em figcaption iframe img q span strong summary |
model.limitedPhrase groups phrase-level elements excluding those elements primarily intended for transcription of existing sources. [1.3. The TEI Class System] | |
Module | tei |
Used by | |
Members | model.emphLike model.hiLike model.pPart.data[model.addressLike model.dateLike model.measureLike model.nameLike[model.nameLike.agent model.offsetLike model.placeStateLike[model.placeNamePart]]] model.pPart.editorial model.pPart.msdesc model.phrase.xml model.ptrLike |
model.nameLike groups elements which name or refer to a person, place, or organization. | |
Module | tei |
Used by |
model.pPart.data
|
Members | model.nameLike.agent model.offsetLike model.placeStateLike[model.placeNamePart] |
Note |
A superset of the naming elements that may appear in datelines, addresses, statements of responsibility, etc. |
model.pPart.data groups phrase-level elements containing names, dates, numbers, measures, and similar data. [3.6. Names, Numbers, Dates, Abbreviations, and Addresses] | |
Module | tei |
Used by |
model.limitedPhrase model.phrase
|
Members | model.addressLike model.dateLike model.measureLike model.nameLike[model.nameLike.agent model.offsetLike model.placeStateLike[model.placeNamePart]] |
model.pPart.edit groups phrase-level elements for simple editorial correction and transcription. [3.5. Simple Editorial Changes] | |
Module | tei |
Used by |
model.phrase
|
Members | model.pPart.editorial model.pPart.transcriptional |
model.paraPart groups elements that may appear in paragraphs and similar elements [3.1. Paragraphs] | |
Module | tei |
Used by | |
Members | model.gLike model.global[model.global.edit model.global.meta model.milestoneLike model.noteLike] model.inter[model.attributable[model.quoteLike] model.biblLike model.egLike model.labelLike model.listLike model.oddDecl model.stageLike] model.lLike model.phrase[model.graphicLike model.highlighted[model.emphLike model.hiLike] model.lPart model.pPart.data[model.addressLike model.dateLike model.measureLike model.nameLike[model.nameLike.agent model.offsetLike model.placeStateLike[model.placeNamePart]]] model.pPart.edit[model.pPart.editorial model.pPart.transcriptional] model.pPart.msdesc model.phrase.xml model.ptrLike model.segLike model.specDescLike] |
model.phrase groups elements which can occur at the level of individual words or phrases. [1.3. The TEI Class System] | |
Module | tei |
Used by |
model.paraPart
|
Members | model.graphicLike model.highlighted[model.emphLike model.hiLike] model.lPart model.pPart.data[model.addressLike model.dateLike model.measureLike model.nameLike[model.nameLike.agent model.offsetLike model.placeStateLike[model.placeNamePart]]] model.pPart.edit[model.pPart.editorial model.pPart.transcriptional] model.pPart.msdesc model.phrase.xml model.ptrLike model.segLike model.specDescLike |
Note |
This class of elements can occur within paragraphs, list items, lines of verse, etc. |
model.placeStateLike groups elements which describe changing states of a place. | |
Module | tei |
Used by |
model.nameLike
|
Members | model.placeNamePart |
att.classable Groups elements which can have a class attribute. | |||||||||||||
Module | xhtml5 | ||||||||||||
Members | a audio blockquote br details div em figcaption figure h3 h4 h5 iframe img li nav ol p q span strong summary table ul | ||||||||||||
Attributes |
|
att.identifiable Groups elements which may have an id attribute. | |||||||
Module | xhtml5 | ||||||
Members | audio data details div figure iframe img li noscript p | ||||||
Attributes |
|
macro.keatsDivContent Content model for div container. | |
Module | xhtml5 |
Used by |
details div
|
Content model |
<content> <sequence minOccurs="1" maxOccurs="1"> <classRef key="model.keatsDivHeading" minOccurs="0" maxOccurs="unbounded"/> <classRef key="model.keatsDivBody" minOccurs="0" maxOccurs="unbounded"/> <elementRef key="script" minOccurs="0" maxOccurs="unbounded"/> <elementRef key="style" minOccurs="0" maxOccurs="unbounded"/> <elementRef key="search" minOccurs="0" maxOccurs="1"/> </sequence> </content> ⚓ |
Declaration |
macro.keatsDivContent = model.keatsDivHeading*, model.keatsDivBody*, script*, style*, search?⚓ |
macro.keatsParaContent Content model for paragraph-type containers such as paragraphs, list items, and so on. | |
Module | xhtml5 |
Used by |
a blockquote caption em figcaption h3 h4 h5 li p q span strong summary td th
|
Content model |
<content> <alternate minOccurs="0" maxOccurs="unbounded"> <textNode/> <classRef key="model.keatsPhrase"/> </alternate> </content> ⚓ |
Declaration |
macro.keatsParaContent = ( text | model.keatsPhrase )*⚓ |
teidata.certainty defines the range of attribute values expressing a degree of certainty. | |
Module | tei |
Used by |
teidata.probCert
|
Content model |
<content> <valList type="closed"> <valItem ident="high"/> <valItem ident="medium"/> <valItem ident="low"/> <valItem ident="unknown"/> </valList> </content> ⚓ |
Declaration |
teidata.certainty = "high" | "medium" | "low" | "unknown"⚓ |
Note |
Certainty may be expressed by one of the predefined symbolic values high, medium, or low. The value unknown should be used in cases where the encoder does not wish to assert an opinion about the matter. |
teidata.count defines the range of attribute values used for a non-negative integer value used as a count. | |
Module | tei |
Used by | |
Content model |
<content> <dataRef name="nonNegativeInteger"/> </content> ⚓ |
Declaration |
teidata.count = xsd:nonNegativeInteger⚓ |
Note |
Any positive integer value or zero is permitted |
teidata.duration.iso defines the range of attribute values available for representation of a duration in time using ISO 8601 standard formats | |
Module | tei |
Used by | |
Content model |
<content> <dataRef name="token" restriction="[0-9.,DHMPRSTWYZ/:+\-]+"/> </content> ⚓ |
Declaration |
teidata.duration.iso = token { pattern = "[0-9.,DHMPRSTWYZ/:+\-]+" }⚓ |
Example |
<time dur-iso="PT0,75H">three-quarters of an hour</time>
|
Example |
<date dur-iso="P1,5D">a day and a half</date>
|
Example |
<date dur-iso="P14D">a fortnight</date>
|
Example |
<time dur-iso="PT0.02S">20 ms</time>
|
Note |
A duration is expressed as a sequence of number-letter pairs, preceded by the letter
P; the letter gives the unit and may be Y (year), M (month), D (day), H (hour), M
(minute), or S (second), in that order. The numbers are all unsigned integers, except
for the last, which may have a decimal component (using either For complete details, see ISO 8601 Data elements and interchange formats — Information interchange — Representation of dates and times. |
teidata.duration.w3c defines the range of attribute values available for representation of a duration in time using W3C datatypes. | |
Module | tei |
Used by | |
Content model |
<content> <dataRef name="duration"/> </content> ⚓ |
Declaration |
teidata.duration.w3c = xsd:duration⚓ |
Example |
<time dur="PT45M">forty-five minutes</time>
|
Example |
<date dur="P1DT12H">a day and a half</date>
|
Example |
<date dur="P7D">a week</date>
|
Example |
<time dur="PT0.02S">20 ms</time>
|
Note |
A duration is expressed as a sequence of number-letter pairs, preceded by the letter
P; the letter gives the unit and may be Y (year), M (month), D (day), H (hour), M
(minute), or S (second), in that order. The numbers are all unsigned integers, except
for the For complete details, see the W3C specification. |
teidata.enumerated defines the range of attribute values expressed as a single XML name taken from a list of documented possibilities. | |
Module | tei |
Used by | |
Content model |
<content> <dataRef key="teidata.word"/> </content> ⚓ |
Declaration |
teidata.enumerated = teidata.word⚓ |
Note |
Attributes using this datatype must contain a single ‘word’ which contains only letters, digits, punctuation characters, or symbols: thus it cannot include whitespace. Typically, the list of documented possibilities will be provided (or exemplified) by a value list in the associated attribute specification, expressed with a <valList> element. |
teidata.language defines the range of attribute values used to identify a particular combination of human language and writing system. [6.1. Language Identification] | |
Module | tei |
Used by | |
Content model |
<content> <alternate> <dataRef name="language"/> <valList> <valItem ident=""/> </valList> </alternate> </content> ⚓ |
Declaration |
teidata.language = xsd:language | ( "" )⚓ |
Note |
The values for this attribute are language ‘tags’ as defined in BCP 47. Currently BCP 47 comprises RFC 5646 and RFC 4647; over time, other IETF documents may succeed these as the best current practice. A ‘language tag’, per BCP 47, is assembled from a sequence of components or subtags separated by the hyphen character (-, U+002D). The tag is made of the following subtags, in the following order. Every subtag except the first is optional. If present, each occurs only once, except the fourth and fifth components (variant and extension), which are repeatable.
There are two exceptions to the above format. First, there are language tags in the IANA registry that do not match the above syntax, but are present because they have been ‘grandfathered’ from previous specifications. Second, an entire language tag can consist of only a private use subtag. These tags
start with Examples include
The W3C Internationalization Activity has published a useful introduction to BCP 47, Language tags in HTML and XML. |
teidata.name defines the range of attribute values expressed as an XML Name. | |
Module | tei |
Used by | |
Content model |
<content> <dataRef name="Name"/> </content> ⚓ |
Declaration |
teidata.name = xsd:Name⚓ |
Note |
Attributes using this datatype must contain a single word which follows the rules defining a legal XML name (see https://www.w3.org/TR/REC-xml/#dt-name): for example they cannot include whitespace or begin with digits. |
teidata.numeric defines the range of attribute values used for numeric values. | |
Module | tei |
Used by |
Element:
|
Content model |
<content> <alternate> <dataRef name="double"/> <dataRef name="token" restriction="(\-?[\d]+/\-?[\d]+)"/> <dataRef name="decimal"/> </alternate> </content> ⚓ |
Declaration |
teidata.numeric = xsd:double | token { pattern = "(\-?[\d]+/\-?[\d]+)" } | xsd:decimal⚓ |
Note |
Any numeric value, represented as a decimal number, in floating point format, or as a ratio. To represent a floating point number, expressed in scientific notation, ‘E notation’, a variant of ‘exponential notation’, may be used. In this format, the value is expressed as two numbers separated by the letter E. The first number, the significand (sometimes called the mantissa) is given in decimal format, while the second is an integer. The value is obtained by multiplying the mantissa by 10 the number of times indicated by the integer. Thus the value represented in decimal notation as 1000.0 might be represented in scientific notation as 10E3. A value expressed as a ratio is represented by two integer values separated by a solidus (/) character. Thus, the value represented in decimal notation as 0.5 might be represented as a ratio by the string 1/2. |
teidata.outputMeasurement defines a range of values for use in specifying the size of an object that is intended for display. | |
Module | tei |
Used by | |
Content model |
<content> <dataRef name="token" restriction="[\-+]?\d+(\.\d+)?(%|cm|mm|in|pt|pc|px|em|ex|ch|rem|vw|vh|vmin|vmax)"/> </content> ⚓ |
Declaration |
teidata.outputMeasurement = token { pattern = "[\-+]?\d+(\.\d+)?(%|cm|mm|in|pt|pc|px|em|ex|ch|rem|vw|vh|vmin|vmax)" }⚓ |
Example |
<figure>
<head>The TEI Logo</head>
<figDesc>Stylized yellow angle brackets with the letters <mentioned>TEI</mentioned> in
between and <mentioned>text encoding initiative</mentioned> underneath, all on a white
background.</figDesc>
<graphic height="600px" width="600px"
url="http://www.tei-c.org/logos/TEI-600.jpg"/>
</figure>
|
Note |
These values map directly onto the values used by XSL-FO and CSS. For definitions of the units see those specifications; at the time of this writing the most complete list is in the CSS3 working draft. |
teidata.pointer defines the range of attribute values used to provide a single URI, absolute or relative, pointing to some other resource, either within the current document or elsewhere. | |
Module | tei |
Used by |
Element:
|
Content model |
<content> <dataRef restriction="\S+" name="anyURI"/> </content> ⚓ |
Declaration |
teidata.pointer = xsd:anyURI { pattern = "\S+" }⚓ |
Note |
The range of syntactically valid values is defined by RFC 3986 Uniform Resource Identifier (URI): Generic Syntax. Note that the values themselves are encoded using RFC 3987 Internationalized Resource Identifiers (IRIs) mapping to URIs. For example, |
teidata.probCert defines a range of attribute values which can be expressed either as a numeric probability or as a coded certainty value. | |
Module | tei |
Used by | |
Content model |
<content> <alternate> <dataRef key="teidata.probability"/> <dataRef key="teidata.certainty"/> </alternate> </content> ⚓ |
Declaration |
teidata.probCert = teidata.probability | teidata.certainty⚓ |
teidata.probability defines the range of attribute values expressing a probability. | |
Module | tei |
Used by |
teidata.probCert
|
Content model |
<content> <dataRef name="double"> <dataFacet name="minInclusive" value="0"/> <dataFacet name="maxInclusive" value="1"/> </dataRef> </content> ⚓ |
Declaration |
teidata.probability = xsd:double⚓ |
Note |
Probability is expressed as a real number between 0 and 1; 0 representing certainly false and 1 representing certainly true. |
teidata.temporal.w3c defines the range of attribute values expressing a temporal expression such as a date, a time, or a combination of them, that conform to the W3C XML Schema Part 2: Datatypes Second Edition specification. | |
Module | tei |
Used by | |
Content model |
<content> <alternate> <dataRef name="date"/> <dataRef name="gYear"/> <dataRef name="gMonth"/> <dataRef name="gDay"/> <dataRef name="gYearMonth"/> <dataRef name="gMonthDay"/> <dataRef name="time"/> <dataRef name="dateTime"/> </alternate> </content> ⚓ |
Declaration |
teidata.temporal.w3c = xsd:date | xsd:gYear | xsd:gMonth | xsd:gDay | xsd:gYearMonth | xsd:gMonthDay | xsd:time | xsd:dateTime⚓ |
Note |
If it is likely that the value used is to be compared with another, then a time zone indicator should always be included, and only the dateTime representation should be used. |
teidata.text defines the range of attribute values used to express some kind of identifying string as a single sequence of Unicode characters possibly including whitespace. | |
Module | tei |
Used by |
Element:
|
Content model |
<content> <dataRef name="string"/> </content> ⚓ |
Declaration |
teidata.text = string⚓ |
Note |
Attributes using this datatype must contain a single ‘token’ in which whitespace and other punctuation characters are permitted. |
teidata.truthValue defines the range of attribute values used to express a truth value. | |
Module | tei |
Used by | |
Content model |
<content> <dataRef name="boolean"/> </content> ⚓ |
Declaration |
teidata.truthValue = xsd:boolean⚓ |
Note |
The possible values of this datatype are 1 or true, or 0 or false. This datatype applies only for cases where uncertainty is inappropriate; if the attribute concerned may have a value other than true or false, e.g. unknown, or inapplicable, it should have the extended version of this datatype: teidata.xTruthValue. |
teidata.versionNumber defines the range of attribute values used for version numbers. | |
Module | tei |
Used by | |
Content model |
<content> <dataRef name="token" restriction="[\d]+[a-z]*[\d]*(\.[\d]+[a-z]*[\d]*){0,3}"/> </content> ⚓ |
Declaration |
teidata.versionNumber = token { pattern = "[\d]+[a-z]*[\d]*(\.[\d]+[a-z]*[\d]*){0,3}" }⚓ |
teidata.word defines the range of attribute values expressed as a single word or token. | |
Module | tei |
Used by |
teidata.enumeratedElement:
|
Content model |
<content> <dataRef name="token" restriction="[^\p{C}\p{Z}]+"/> </content> ⚓ |
Declaration |
teidata.word = token { pattern = "[^\p{C}\p{Z}]+" }⚓ |
Note |
Attributes using this datatype must contain a single ‘word’ which contains only letters, digits, punctuation characters, or symbols: thus it cannot include whitespace. |
teidata.xTruthValue (extended truth value) defines the range of attribute values used to express a truth value which may be unknown. | |
Module | tei |
Used by | |
Content model |
<content> <alternate> <dataRef name="boolean"/> <valList> <valItem ident="unknown"/> <valItem ident="inapplicable"/> </valList> </alternate> </content> ⚓ |
Declaration |
teidata.xTruthValue = xsd:boolean | ( "unknown" | "inapplicable" )⚓ |
Note |
In cases where where uncertainty is inappropriate, use the datatype teidata.TruthValue. |
teidata.xpath defines attribute values which contain an XPath expression. | |
Module | tei |
Used by | |
Content model |
<content> <textNode/> </content> ⚓ |
Declaration |
teidata.xpath = text⚓ |
Note |
Any XPath expression using the syntax defined in 6.2.. When writing programs that evaluate XPath expressions, programmers should be mindful of the possibility of malicious code injection attacks. For further information about XPath injection attacks, see the article at OWASP. |
Schematron |
<sch:rule context="xh:img">
<sch:assert test="matches(@src, '^[a-zA-Z0-9/\._\-]+$') and (not(@data-lg-version)
or
matches(@data-lg-version, '^[a-zA-Z0-9/\._\-]+$'))"> Image file paths must be well-formed
(no spaces or punctuation).
</sch:assert>
<sch:assert test="matches(@src, '^(images/)|(neighbourhoodMaps/)|(gallery/)')"> Image
file paths must begin with images/, neighbourhoodMaps/, or gallery/.
</sch:assert>
<sch:assert test="not(@data-lg-version) or matches(@data-lg-version, '^(images/)|(neighbourhoodMaps/)|(gallery/)')">
Image file paths must begin with images/, neighbourhoodMaps/, or gallery/.
</sch:assert>
</sch:rule>
|
Schematron |
<sch:rule context="xh:div/xh:p[not(ancestor::xh:div[@class='poem'])]">
<sch:assert test="not(xh:br)"> Don't use br tags (linebreaks) inside paragraphs.
</sch:assert>
</sch:rule>
|
Schematron |
<sch:rule context="xh:div">
<sch:assert test="not(count(*) = 1 and child::xh:figure)"> There's no need to wrap
a figure element in a div.
</sch:assert>
</sch:rule>
|
Schematron |
<sch:rule context="xh:h3">
<sch:assert test="not(xh:a[@href])"> Don't place links inside h3 elements.
</sch:assert>
</sch:rule>
|
Schematron |
<sch:rule context="xh:a">
<sch:assert test="not(descendant::xh:a[@href])"> Don't place links inside other links.
</sch:assert>
</sch:rule>
|
Schematron |
<sch:rule context="xh:div[@class='chronology']/xh:ul/xh:li">
<sch:assert test="not(matches(., '\.\s*$'))"> Don't terminate a chronology entry with
a period.
</sch:assert>
</sch:rule>
|
Schematron |
<sch:rule context="xh:*[text()][not(ancestor-or-self::xh:script or ancestor-or-self::xh:style)]">
<sch:assert test="not(text()[matches(., $straightQuotes)])"> Do not use straight quotes
in text. Use the q or
span elements wherever possible; for apostrophes,
use the smart version (’).
</sch:assert>
</sch:rule>
|
Schematron |
<sch:rule context="xh:a">
<sch:assert test="not(matches(@href, '\s+'))"> There should be no spaces in href attributes
(links).
</sch:assert>
</sch:rule>
|
Schematron |
<sch:rule context="xh:img">
<sch:assert test="every $att in @* satisfies local-name($att) = ('src', 'data-lg-version',
'alt', 'title', 'width', 'height', 'id', 'style', 'class')"> Only the following attributes
are allowed on img: 'src', 'data-lg-version', 'alt', 'title', 'id', 'style', 'class',
'width' and 'height'.
</sch:assert>
</sch:rule>
|
Schematron |
<sch:rule context="xh:span[@class=('poemTitle', 'articleTitle', 'artTitle')][not(matches(.,
'[!\?]$'))]">
<sch:assert test="not(following-sibling::node()[1][matches(., '^[\.,]')])"> Periods
and commas belong inside the span element for a poem title
or an article title, because the poem or article title will be
rendered with quotation marks.
</sch:assert>
</sch:rule>
|
Schematron |
<sch:rule context="xh:a[@href]">
<sch:assert test="not(matches(., '[\.,:;]\s*$')) or matches(., '((Esq\.)|(A\.\s*W\.)|(\.\s*\.\s*\.))$')">
Don't include trailing periods and commas inside link text.
</sch:assert>
</sch:rule>
|
Schematron |
<sch:ns uri="http://www.w3.org/1999/xhtml"
prefix="xh"/>
<sch:pattern>
<sch:let name="smartDouble" value="'[“”]'"/>
<sch:let name="smartSingle" value="'[‘’]'"/>
<sch:let name="straightDouble" value="'"'"/>
<sch:let name="straightApos" value="''''"/>
<sch:let name="straightQuotes"
value="concat('[', $straightDouble, $straightApos, ']')"/>
</sch:pattern>
|
Schematron |
<sch:rule context="xh:*[text()]">
<sch:assert test="not(text()[matches(., '[^\.]\.[A-Z]')])"> Don't forget to put a
space after every period.
</sch:assert>
</sch:rule>
|
Schematron |
<sch:rule context="xh:*[text()]">
<sch:assert test="not(text()[matches(., '\.\.\.')])"> Use an ellipsis (…) rather than
three periods.
</sch:assert>
</sch:rule>
|