lollipop版本分开,有些新特性android5.0和6.0不支持

This commit is contained in:
kunfei
2023-03-30 08:40:58 +08:00
parent 058cc93be4
commit 8f62c1ab5e
258 changed files with 12817 additions and 13529 deletions
+10 -3
View File
@@ -41,7 +41,7 @@ android {
} }
defaultConfig { defaultConfig {
applicationId "io.legado.app" applicationId "io.legado.app"
minSdk 21 minSdk 24
targetSdk 33 targetSdk 33
versionCode 10000 + gitCommits versionCode 10000 + gitCommits
versionName version versionName version
@@ -107,6 +107,11 @@ android {
applicationId "io.legado.play" applicationId "io.legado.play"
manifestPlaceholders.put("APP_CHANNEL_VALUE", "google") manifestPlaceholders.put("APP_CHANNEL_VALUE", "google")
} }
lollipop {
dimension "mode"
minSdk 21
manifestPlaceholders.put("APP_CHANNEL_VALUE", "lollipop")
}
} }
compileOptions { compileOptions {
@@ -198,10 +203,12 @@ dependencies {
implementation('org.jsoup:jsoup:1.15.4') implementation('org.jsoup:jsoup:1.15.4')
implementation('com.jayway.jsonpath:json-path:2.8.0') implementation('com.jayway.jsonpath:json-path:2.8.0')
implementation('cn.wanghaomiao:JsoupXpath:2.5.3') implementation('cn.wanghaomiao:JsoupXpath:2.5.3')
implementation(project(path: ':book')) implementation(project(path: ':modules:book'))
//JS rhino //JS rhino
implementation(project(path: ':rhino')) appImplementation(project(path: ':modules:rhino1.4'))
googleImplementation(project(path: ':modules:rhino1.4'))
lollipopImplementation(project(path: ':modules:rhino1.3'))
//网络 //网络
implementation('com.squareup.okhttp3:okhttp:4.10.0') implementation('com.squareup.okhttp3:okhttp:4.10.0')
@@ -1,13 +0,0 @@
package me.ag2s.epublib;
public interface Constants {
String CHARACTER_ENCODING = "UTF-8";
String DOCTYPE_XHTML = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">";
String NAMESPACE_XHTML = "http://www.w3.org/1999/xhtml";
String EPUB_GENERATOR_NAME = "Ag2S EpubLib";
String EPUB_DUOKAN_NAME = "DK-SONGTI";
char FRAGMENT_SEPARATOR_CHAR = '#';
String DEFAULT_TOC_ID = "toc";
}
@@ -1,158 +0,0 @@
package me.ag2s.epublib.browsersupport;
import java.util.EventObject;
import me.ag2s.epublib.domain.EpubBook;
import me.ag2s.epublib.domain.Resource;
import me.ag2s.epublib.util.StringUtil;
/**
* Used to tell NavigationEventListener just what kind of navigation action
* the user just did.
*
* @author paul
*
*/
@SuppressWarnings("unused")
public class NavigationEvent extends EventObject {
private static final long serialVersionUID = -6346750144308952762L;
private Resource oldResource;
private int oldSpinePos;
private Navigator navigator;
private EpubBook oldBook;
private int oldSectionPos;
private String oldFragmentId;
public NavigationEvent(Object source) {
super(source);
}
public NavigationEvent(Object source, Navigator navigator) {
super(source);
this.navigator = navigator;
this.oldBook = navigator.getBook();
this.oldFragmentId = navigator.getCurrentFragmentId();
this.oldSectionPos = navigator.getCurrentSectionPos();
this.oldResource = navigator.getCurrentResource();
this.oldSpinePos = navigator.getCurrentSpinePos();
}
/**
* The previous position within the section.
*
* @return The previous position within the section.
*/
public int getOldSectionPos() {
return oldSectionPos;
}
public Navigator getNavigator() {
return navigator;
}
public String getOldFragmentId() {
return oldFragmentId;
}
// package
void setOldFragmentId(String oldFragmentId) {
this.oldFragmentId = oldFragmentId;
}
public EpubBook getOldBook() {
return oldBook;
}
// package
void setOldPagePos(int oldPagePos) {
this.oldSectionPos = oldPagePos;
}
public int getCurrentSectionPos() {
return navigator.getCurrentSectionPos();
}
public int getOldSpinePos() {
return oldSpinePos;
}
public int getCurrentSpinePos() {
return navigator.getCurrentSpinePos();
}
public String getCurrentFragmentId() {
return navigator.getCurrentFragmentId();
}
public boolean isBookChanged() {
if (oldBook == null) {
return true;
}
return oldBook != navigator.getBook();
}
public boolean isSpinePosChanged() {
return getOldSpinePos() != getCurrentSpinePos();
}
public boolean isFragmentChanged() {
return StringUtil.equals(getOldFragmentId(), getCurrentFragmentId());
}
public Resource getOldResource() {
return oldResource;
}
public Resource getCurrentResource() {
return navigator.getCurrentResource();
}
public void setOldResource(Resource oldResource) {
this.oldResource = oldResource;
}
public void setOldSpinePos(int oldSpinePos) {
this.oldSpinePos = oldSpinePos;
}
public void setNavigator(Navigator navigator) {
this.navigator = navigator;
}
public void setOldBook(EpubBook oldBook) {
this.oldBook = oldBook;
}
public EpubBook getCurrentBook() {
return getNavigator().getBook();
}
public boolean isResourceChanged() {
return oldResource != getCurrentResource();
}
@SuppressWarnings("NullableProblems")
public String toString() {
return StringUtil.toString(
"oldSectionPos", oldSectionPos,
"oldResource", oldResource,
"oldBook", oldBook,
"oldFragmentId", oldFragmentId,
"oldSpinePos", oldSpinePos,
"currentPagePos", getCurrentSectionPos(),
"currentResource", getCurrentResource(),
"currentBook", getCurrentBook(),
"currentFragmentId", getCurrentFragmentId(),
"currentSpinePos", getCurrentSpinePos()
);
}
public boolean isSectionPosChanged() {
return oldSectionPos != getCurrentSectionPos();
}
}
@@ -1,207 +0,0 @@
package me.ag2s.epublib.browsersupport;
import java.util.ArrayList;
import java.util.List;
import me.ag2s.epublib.domain.EpubBook;
import me.ag2s.epublib.domain.Resource;
/**
* A history of the user's locations with the epub.
*
* @author paul.siegmann
*/
public class NavigationHistory implements NavigationEventListener {
public static final int DEFAULT_MAX_HISTORY_SIZE = 1000;
private static final long DEFAULT_HISTORY_WAIT_TIME = 1000;
private static class Location {
private String href;
public Location(String href) {
super();
this.href = href;
}
@SuppressWarnings("unused")
public void setHref(String href) {
this.href = href;
}
public String getHref() {
return href;
}
}
private long lastUpdateTime = 0;
private List<Location> locations = new ArrayList<>();
private final Navigator navigator;
private int currentPos = -1;
private int currentSize = 0;
private int maxHistorySize = DEFAULT_MAX_HISTORY_SIZE;
private long historyWaitTime = DEFAULT_HISTORY_WAIT_TIME;
public NavigationHistory(Navigator navigator) {
this.navigator = navigator;
navigator.addNavigationEventListener(this);
initBook(navigator.getBook());
}
public int getCurrentPos() {
return currentPos;
}
public int getCurrentSize() {
return currentSize;
}
public void initBook(EpubBook book) {
if (book == null) {
return;
}
locations = new ArrayList<>();
currentPos = -1;
currentSize = 0;
if (navigator.getCurrentResource() != null) {
addLocation(navigator.getCurrentResource().getHref());
}
}
/**
* If the time between a navigation event is less than the historyWaitTime
* then the new location is not added to the history.
*
* When a user is rapidly viewing many pages using the slider we do not
* want all of them to be added to the history.
*
* @return the time we wait before adding the page to the history
*/
public long getHistoryWaitTime() {
return historyWaitTime;
}
public void setHistoryWaitTime(long historyWaitTime) {
this.historyWaitTime = historyWaitTime;
}
public void addLocation(Resource resource) {
if (resource == null) {
return;
}
addLocation(resource.getHref());
}
/**
* Adds the location after the current position.
* If the currentposition is not the end of the list then the elements
* between the current element and the end of the list will be discarded.
*
* Does nothing if the new location matches the current location.
* <br/>
* If this nr of locations becomes larger then the historySize then the
* first item(s) will be removed.
*v
* @param location d
*/
public void addLocation(Location location) {
// do nothing if the new location matches the current location
if (!(locations.isEmpty()) &&
location.getHref().equals(locations.get(currentPos).getHref())) {
return;
}
currentPos++;
if (currentPos != currentSize) {
locations.set(currentPos, location);
} else {
locations.add(location);
checkHistorySize();
}
currentSize = currentPos + 1;
}
/**
* Removes all elements that are too much for the maxHistorySize
* out of the history.
*/
private void checkHistorySize() {
while (locations.size() > maxHistorySize) {
locations.remove(0);
currentSize--;
currentPos--;
}
}
public void addLocation(String href) {
addLocation(new Location(href));
}
private String getLocationHref(int pos) {
if (pos < 0 || pos >= locations.size()) {
return null;
}
return locations.get(currentPos).getHref();
}
/**
* Moves the current positions delta positions.
*
* move(-1) to go one position back in history.<br/>
* move(1) to go one position forward.<br/>发
*
* @param delta f
*
* @return Whether we actually moved. If the requested value is illegal
* it will return false, true otherwise.
*/
public boolean move(int delta) {
if (((currentPos + delta) < 0)
|| ((currentPos + delta) >= currentSize)) {
return false;
}
currentPos += delta;
navigator.gotoResource(getLocationHref(currentPos), this);
return true;
}
/**
* If this is not the source of the navigationEvent then the addLocation
* will be called with the href of the currentResource in the navigationEvent.
*/
@Override
public void navigationPerformed(NavigationEvent navigationEvent) {
if (this == navigationEvent.getSource()) {
return;
}
if (navigationEvent.getCurrentResource() == null) {
return;
}
if ((System.currentTimeMillis() - this.lastUpdateTime) > historyWaitTime) {
// if the user scrolled rapidly through the pages then the last page
// will not be added to the history. We fix that here:
addLocation(navigationEvent.getOldResource());
addLocation(navigationEvent.getCurrentResource().getHref());
}
lastUpdateTime = System.currentTimeMillis();
}
public String getCurrentHref() {
if (currentPos < 0 || currentPos >= locations.size()) {
return null;
}
return locations.get(currentPos).getHref();
}
public void setMaxHistorySize(int maxHistorySize) {
this.maxHistorySize = maxHistorySize;
}
public int getMaxHistorySize() {
return maxHistorySize;
}
}
@@ -1,220 +0,0 @@
package me.ag2s.epublib.browsersupport;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import me.ag2s.epublib.domain.EpubBook;
import me.ag2s.epublib.domain.Resource;
/**
* A helper class for epub browser applications.
* <p>
* It helps moving from one resource to the other, from one resource
* to the other and keeping other elements of the application up-to-date
* by calling the NavigationEventListeners.
*
* @author paul
*/
public class Navigator implements Serializable {
private static final long serialVersionUID = 1076126986424925474L;
private EpubBook book;
private int currentSpinePos;
private Resource currentResource;
private int currentPagePos;
private String currentFragmentId;
private final List<NavigationEventListener> eventListeners = new ArrayList<>();
public Navigator() {
this(null);
}
public Navigator(EpubBook book) {
this.book = book;
this.currentSpinePos = 0;
if (book != null) {
this.currentResource = book.getCoverPage();
}
this.currentPagePos = 0;
}
private synchronized void handleEventListeners(
NavigationEvent navigationEvent) {
for (int i = 0; i < eventListeners.size(); i++) {
NavigationEventListener navigationEventListener = eventListeners.get(i);
navigationEventListener.navigationPerformed(navigationEvent);
}
}
public boolean addNavigationEventListener(
NavigationEventListener navigationEventListener) {
return this.eventListeners.add(navigationEventListener);
}
public boolean removeNavigationEventListener(
NavigationEventListener navigationEventListener) {
return this.eventListeners.remove(navigationEventListener);
}
public int gotoFirstSpineSection(Object source) {
return gotoSpineSection(0, source);
}
public int gotoPreviousSpineSection(Object source) {
return gotoPreviousSpineSection(0, source);
}
public int gotoPreviousSpineSection(int pagePos, Object source) {
if (currentSpinePos < 0) {
return gotoSpineSection(0, pagePos, source);
} else {
return gotoSpineSection(currentSpinePos - 1, pagePos, source);
}
}
public boolean hasNextSpineSection() {
return (currentSpinePos < (book.getSpine().size() - 1));
}
public boolean hasPreviousSpineSection() {
return (currentSpinePos > 0);
}
public int gotoNextSpineSection(Object source) {
if (currentSpinePos < 0) {
return gotoSpineSection(0, source);
} else {
return gotoSpineSection(currentSpinePos + 1, source);
}
}
public int gotoResource(String resourceHref, Object source) {
Resource resource = book.getResources().getByHref(resourceHref);
return gotoResource(resource, source);
}
public int gotoResource(Resource resource, Object source) {
return gotoResource(resource, 0, null, source);
}
public int gotoResource(Resource resource, String fragmentId, Object source) {
return gotoResource(resource, 0, fragmentId, source);
}
public int gotoResource(Resource resource, int pagePos, Object source) {
return gotoResource(resource, pagePos, null, source);
}
public int gotoResource(Resource resource, int pagePos, String fragmentId,
Object source) {
if (resource == null) {
return -1;
}
NavigationEvent navigationEvent = new NavigationEvent(source, this);
this.currentResource = resource;
this.currentSpinePos = book.getSpine().getResourceIndex(currentResource);
this.currentPagePos = pagePos;
this.currentFragmentId = fragmentId;
handleEventListeners(navigationEvent);
return currentSpinePos;
}
public int gotoResourceId(String resourceId, Object source) {
return gotoSpineSection(book.getSpine().findFirstResourceById(resourceId),
source);
}
public int gotoSpineSection(int newSpinePos, Object source) {
return gotoSpineSection(newSpinePos, 0, source);
}
/**
* Go to a specific section.
* Illegal spine positions are silently ignored.
*
* @param newSpinePos f
* @param source f
* @return The current position within the spine
*/
public int gotoSpineSection(int newSpinePos, int newPagePos, Object source) {
if (newSpinePos == currentSpinePos) {
return currentSpinePos;
}
if (newSpinePos < 0 || newSpinePos >= book.getSpine().size()) {
return currentSpinePos;
}
NavigationEvent navigationEvent = new NavigationEvent(source, this);
currentSpinePos = newSpinePos;
currentPagePos = newPagePos;
currentResource = book.getSpine().getResource(currentSpinePos);
handleEventListeners(navigationEvent);
return currentSpinePos;
}
public int gotoLastSpineSection(Object source) {
return gotoSpineSection(book.getSpine().size() - 1, source);
}
public void gotoBook(EpubBook book, Object source) {
NavigationEvent navigationEvent = new NavigationEvent(source, this);
this.book = book;
this.currentFragmentId = null;
this.currentPagePos = 0;
this.currentResource = null;
this.currentSpinePos = book.getSpine().getResourceIndex(currentResource);
handleEventListeners(navigationEvent);
}
/**
* The current position within the spine.
*
* @return something &lt; 0 if the current position is not within the spine.
*/
public int getCurrentSpinePos() {
return currentSpinePos;
}
public Resource getCurrentResource() {
return currentResource;
}
/**
* Sets the current index and resource without calling the eventlisteners.
*
* If you want the eventListeners called use gotoSection(index);
*
* @param currentIndex f
*/
public void setCurrentSpinePos(int currentIndex) {
this.currentSpinePos = currentIndex;
this.currentResource = book.getSpine().getResource(currentIndex);
}
public EpubBook getBook() {
return book;
}
/**
* Sets the current index and resource without calling the eventlisteners.
*
* If you want the eventListeners called use gotoSection(index);
*
*/
public int setCurrentResource(Resource currentResource) {
this.currentSpinePos = book.getSpine().getResourceIndex(currentResource);
this.currentResource = currentResource;
return currentSpinePos;
}
public String getCurrentFragmentId() {
return currentFragmentId;
}
public int getCurrentSectionPos() {
return currentPagePos;
}
}
@@ -1,37 +0,0 @@
package me.ag2s.epublib.domain;
import androidx.annotation.NonNull;
import java.io.IOException;
import java.io.InputStream;
import me.ag2s.epublib.util.zip.ZipEntryWrapper;
import me.ag2s.epublib.util.zip.ZipFileWrapper;
/**
* @author jake
*/
public class EpubResourceProvider implements LazyResourceProvider {
private final ZipFileWrapper zipFileWrapper;
public EpubResourceProvider(ZipFileWrapper zipFileWrapper) {
this.zipFileWrapper = zipFileWrapper;
}
@Override
public InputStream getResourceStream(@NonNull String href) throws IOException {
//ZipFile zipFile = new ZipFile(epubFilename);
ZipEntryWrapper zipEntry = zipFileWrapper.getEntry(href);
if (zipEntry == null) {
//zipFile.close();
throw new IllegalStateException(
"Cannot find entry " + href + " in epub file " + zipFileWrapper);
}
return new ResourceInputStream(zipFileWrapper.getInputStream(zipEntry));
}
}
@@ -1,128 +0,0 @@
package me.ag2s.epublib.domain;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* The guide is a selection of special pages of the book.
* Examples of these are the cover, list of illustrations, etc.
*
* It is an optional part of an epub, and support for the various types
* of references varies by reader.
*
* The only part of this that is heavily used is the cover page.
*
* @author paul
*
*/
public class Guide implements Serializable {
/**
*
*/
private static final long serialVersionUID = -6256645339915751189L;
public static final String DEFAULT_COVER_TITLE = GuideReference.COVER;
private List<GuideReference> references = new ArrayList<>();
private static final int COVERPAGE_NOT_FOUND = -1;
private static final int COVERPAGE_UNITIALIZED = -2;
private int coverPageIndex = -1;
public List<GuideReference> getReferences() {
return references;
}
public void setReferences(List<GuideReference> references) {
this.references = references;
uncheckCoverPage();
}
private void uncheckCoverPage() {
coverPageIndex = COVERPAGE_UNITIALIZED;
}
public GuideReference getCoverReference() {
checkCoverPage();
if (coverPageIndex >= 0) {
return references.get(coverPageIndex);
}
return null;
}
@SuppressWarnings("UnusedReturnValue")
public int setCoverReference(GuideReference guideReference) {
if (coverPageIndex >= 0) {
references.set(coverPageIndex, guideReference);
} else {
references.add(0, guideReference);
coverPageIndex = 0;
}
return coverPageIndex;
}
private void checkCoverPage() {
if (coverPageIndex == COVERPAGE_UNITIALIZED) {
initCoverPage();
}
}
private void initCoverPage() {
int result = COVERPAGE_NOT_FOUND;
for (int i = 0; i < references.size(); i++) {
GuideReference guideReference = references.get(i);
if (guideReference.getType().equals(GuideReference.COVER)) {
result = i;
break;
}
}
coverPageIndex = result;
}
/**
* The coverpage of the book.
*
* @return The coverpage of the book.
*/
public Resource getCoverPage() {
GuideReference guideReference = getCoverReference();
if (guideReference == null) {
return null;
}
return guideReference.getResource();
}
public void setCoverPage(Resource coverPage) {
GuideReference coverpageGuideReference = new GuideReference(coverPage,
GuideReference.COVER, DEFAULT_COVER_TITLE);
setCoverReference(coverpageGuideReference);
}
@SuppressWarnings("UnusedReturnValue")
public ResourceReference addReference(GuideReference reference) {
this.references.add(reference);
uncheckCoverPage();
return reference;
}
/**
* A list of all GuideReferences that have the given
* referenceTypeName (ignoring case).
*
* @param referenceTypeName referenceTypeName
* @return A list of all GuideReferences that have the given
* referenceTypeName (ignoring case).
*/
public List<GuideReference> getGuideReferencesByType(
String referenceTypeName) {
List<GuideReference> result = new ArrayList<>();
for (GuideReference guideReference : references) {
if (referenceTypeName.equalsIgnoreCase(guideReference.getType())) {
result.add(guideReference);
}
}
return result;
}
}
@@ -1,103 +0,0 @@
package me.ag2s.epublib.domain;
import java.io.Serializable;
import me.ag2s.epublib.util.StringUtil;
/**
* These are references to elements of the book's guide.
*
* @see Guide
*
* @author paul
*
*/
public class GuideReference extends TitledResourceReference
implements Serializable {
private static final long serialVersionUID = -316179702440631834L;
/**
* the book cover(s), jacket information, etc.
*/
public static final String COVER = "cover";
/**
* human-readable page with title, author, publisher, and other metadata
*/
public static String TITLE_PAGE = "title-page";
/**
* Human-readable table of contents.
* Not to be confused the epub file table of contents
*
*/
public static String TOC = "toc";
/**
* back-of-book style index
*/
public static String INDEX = "index";
public static String GLOSSARY = "glossary";
public static String ACKNOWLEDGEMENTS = "acknowledgements";
public static String BIBLIOGRAPHY = "bibliography";
public static String COLOPHON = "colophon";
public static String COPYRIGHT_PAGE = "copyright-page";
public static String DEDICATION = "dedication";
/**
* an epigraph is a phrase, quotation, or poem that is set at the
* beginning of a document or component.
*
* source: http://en.wikipedia.org/wiki/Epigraph_%28literature%29
*/
public static String EPIGRAPH = "epigraph";
public static String FOREWORD = "foreword";
/**
* list of illustrations
*/
public static String LOI = "loi";
/**
* list of tables
*/
public static String LOT = "lot";
public static String NOTES = "notes";
public static String PREFACE = "preface";
/**
* A page of content (e.g. "Chapter 1")
*/
public static String TEXT = "text";
private String type;
public GuideReference(Resource resource) {
this(resource, null);
}
public GuideReference(Resource resource, String title) {
super(resource, title);
}
public GuideReference(Resource resource, String type, String title) {
this(resource, type, title, null);
}
public GuideReference(Resource resource, String type, String title,
String fragmentId) {
super(resource, title, fragmentId);
this.type = StringUtil.isNotBlank(type) ? type.toLowerCase() : null;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
@@ -1,131 +0,0 @@
package me.ag2s.epublib.domain;
import java.io.Serializable;
import java.util.List;
import java.util.UUID;
import me.ag2s.epublib.util.StringUtil;
/**
* A Book's identifier.
*
* Defaults to a random UUID and scheme "UUID"
*
* @author paul
*/
public class Identifier implements Serializable {
private static final long serialVersionUID = 955949951416391810L;
@SuppressWarnings("unused")
public interface Scheme {
String UUID = "UUID";
String ISBN = "ISBN";
String URL = "URL";
String URI = "URI";
}
private boolean bookId = false;
private String scheme;
private String value;
/**
* Creates an Identifier with as value a random UUID and scheme "UUID"
*/
public Identifier() {
this(Scheme.UUID, UUID.randomUUID().toString());
}
public Identifier(String scheme, String value) {
this.scheme = scheme;
this.value = value;
}
/**
* The first identifier for which the bookId is true is made the
* bookId identifier.
*
* If no identifier has bookId == true then the first bookId identifier
* is written as the primary.
*
* @param identifiers i
* @return The first identifier for which the bookId is true is made
* the bookId identifier.
*/
public static Identifier getBookIdIdentifier(List<Identifier> identifiers) {
if (identifiers == null || identifiers.isEmpty()) {
return null;
}
Identifier result = null;
for (Identifier identifier : identifiers) {
if (identifier.isBookId()) {
result = identifier;
break;
}
}
if (result == null) {
result = identifiers.get(0);
}
return result;
}
public String getScheme() {
return scheme;
}
public void setScheme(String scheme) {
this.scheme = scheme;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public void setBookId(boolean bookId) {
this.bookId = bookId;
}
/**
* This bookId property allows the book creator to add multiple ids and
* tell the epubwriter which one to write out as the bookId.
*
* The Dublin Core metadata spec allows multiple identifiers for a Book.
* The epub spec requires exactly one identifier to be marked as the book id.
*
* @return whether this is the unique book id.
*/
public boolean isBookId() {
return bookId;
}
public int hashCode() {
return StringUtil.defaultIfNull(scheme).hashCode() ^ StringUtil
.defaultIfNull(value).hashCode();
}
public boolean equals(Object otherIdentifier) {
if (!(otherIdentifier instanceof Identifier)) {
return false;
}
return StringUtil.equals(scheme, ((Identifier) otherIdentifier).scheme)
&& StringUtil.equals(value, ((Identifier) otherIdentifier).value);
}
@SuppressWarnings("NullableProblems")
@Override
public String toString() {
if (StringUtil.isBlank(scheme)) {
return "" + value;
}
return "" + scheme + ":" + value;
}
}
@@ -1,144 +0,0 @@
package me.ag2s.epublib.domain;
import android.util.Log;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import me.ag2s.epublib.util.IOUtil;
/**
* A Resource that loads its data only on-demand from a EPUB book file.
* This way larger books can fit into memory and can be opened faster.
*/
public class LazyResource extends Resource {
private static final long serialVersionUID = 5089400472352002866L;
private final String TAG= getClass().getName();
private final LazyResourceProvider resourceProvider;
private final long cachedSize;
/**
* Creates a lazy resource, when the size is unknown.
*
* @param resourceProvider The resource provider loads data on demand.
* @param href The resource's href within the epub.
*/
public LazyResource(LazyResourceProvider resourceProvider, String href) {
this(resourceProvider, -1, href);
}
public LazyResource(LazyResourceProvider resourceProvider, String href, String originalHref) {
this(resourceProvider, -1, href, originalHref);
}
/**
* Creates a Lazy resource, by not actually loading the data for this entry.
*
* The data will be loaded on the first call to getData()
*
* @param resourceProvider The resource provider loads data on demand.
* @param size The size of this resource.
* @param href The resource's href within the epub.
*/
public LazyResource(
LazyResourceProvider resourceProvider, long size, String href) {
super(null, null, href, MediaTypes.determineMediaType(href));
this.resourceProvider = resourceProvider;
this.cachedSize = size;
}
public LazyResource(
LazyResourceProvider resourceProvider, long size, String href, String originalHref) {
super(null, null, href, originalHref, MediaTypes.determineMediaType(href));
this.resourceProvider = resourceProvider;
this.cachedSize = size;
}
/**
* Gets the contents of the Resource as an InputStream.
*
* @return The contents of the Resource.
*
* @throws IOException IOException
*/
public InputStream getInputStream() throws IOException {
if (isInitialized()) {
return new ByteArrayInputStream(getData());
} else {
return resourceProvider.getResourceStream(this.originalHref);
}
}
/**
* Initializes the resource by loading its data into memory.
*
* @throws IOException IOException
*/
public void initialize() throws IOException {
getData();
}
/**
* The contents of the resource as a byte[]
*
* If this resource was lazy-loaded and the data was not yet loaded,
* it will be loaded into memory at this point.
* This included opening the zip file, so expect a first load to be slow.
*
* @return The contents of the resource
*/
public byte[] getData() throws IOException {
if (data == null) {
Log.d(TAG, "Initializing lazy resource: " + this.getHref());
InputStream in = resourceProvider.getResourceStream(this.originalHref);
byte[] readData = IOUtil.toByteArray(in, (int) this.cachedSize);
if (readData == null) {
throw new IOException(
"Could not load the contents of resource: " + this.getHref());
} else {
this.data = readData;
}
in.close();
}
return data;
}
/**
* Tells this resource to release its cached data.
*
* If this resource was not lazy-loaded, this is a no-op.
*/
public void close() {
if (this.resourceProvider != null) {
this.data = null;
}
}
/**
* Returns if the data for this resource has been loaded into memory.
*
* @return true if data was loaded.
*/
public boolean isInitialized() {
return data != null;
}
/**
* Returns the size of this resource in bytes.
*
* @return the size.
*/
public long getSize() {
if (data != null) {
return data.length;
}
return cachedSize;
}
}
@@ -1,21 +0,0 @@
package me.ag2s.epublib.domain;
@SuppressWarnings("unused")
public enum ManifestItemProperties implements ManifestProperties {
COVER_IMAGE("cover-image"),
MATHML("mathml"),
NAV("nav"),
REMOTE_RESOURCES("remote-resources"),
SCRIPTED("scripted"),
SVG("svg"),
SWITCH("switch");
private final String name;
ManifestItemProperties(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
@@ -1,16 +0,0 @@
package me.ag2s.epublib.domain;
@SuppressWarnings("unused")
public enum ManifestItemRefProperties implements ManifestProperties {
PAGE_SPREAD_LEFT("page-spread-left"),
PAGE_SPREAD_RIGHT("page-spread-right");
private final String name;
ManifestItemRefProperties(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
@@ -1,73 +0,0 @@
package me.ag2s.epublib.domain;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
/**
* MediaType is used to tell the type of content a resource is.
*
* Examples of mediatypes are image/gif, text/css and application/xhtml+xml
*
* All allowed mediaTypes are maintained bye the MediaTypeService.
*
* @see MediaTypes
*
* @author paul
*/
public class MediaType implements Serializable {
private static final long serialVersionUID = -7256091153727506788L;
private final String name;
private final String defaultExtension;
private final Collection<String> extensions;
public MediaType(String name, String defaultExtension) {
this(name, defaultExtension, new String[]{defaultExtension});
}
public MediaType(String name, String defaultExtension,
String[] extensions) {
this(name, defaultExtension, Arrays.asList(extensions));
}
public int hashCode() {
if (name == null) {
return 0;
}
return name.hashCode();
}
public MediaType(String name, String defaultExtension,
Collection<String> mextensions) {
super();
this.name = name;
this.defaultExtension = defaultExtension;
this.extensions = mextensions;
}
public String getName() {
return name;
}
public String getDefaultExtension() {
return defaultExtension;
}
public Collection<String> getExtensions() {
return extensions;
}
public boolean equals(Object otherMediaType) {
if (!(otherMediaType instanceof MediaType)) {
return false;
}
return name.equals(((MediaType) otherMediaType).getName());
}
@SuppressWarnings("NullableProblems")
public String toString() {
return name;
}
}
@@ -1,95 +0,0 @@
package me.ag2s.epublib.domain;
import java.util.HashMap;
import java.util.Map;
import me.ag2s.epublib.util.StringUtil;
/**
* Manages mediatypes that are used by epubs
*
* @author paul
*/
public class MediaTypes {
public static final MediaType XHTML = new MediaType("application/xhtml+xml",
".xhtml", new String[]{".htm", ".html", ".xhtml"});
public static final MediaType EPUB = new MediaType("application/epub+zip",
".epub");
public static final MediaType NCX = new MediaType("application/x-dtbncx+xml",
".ncx");
public static final MediaType JAVASCRIPT = new MediaType("text/javascript",
".js");
public static final MediaType CSS = new MediaType("text/css", ".css");
// images
public static final MediaType JPG = new MediaType("image/jpeg", ".jpg",
new String[]{".jpg", ".jpeg"});
public static final MediaType PNG = new MediaType("image/png", ".png");
public static final MediaType GIF = new MediaType("image/gif", ".gif");
public static final MediaType SVG = new MediaType("image/svg+xml", ".svg");
// fonts
public static final MediaType TTF = new MediaType(
"application/x-truetype-font", ".ttf");
public static final MediaType OPENTYPE = new MediaType(
"application/vnd.ms-opentype", ".otf");
public static final MediaType WOFF = new MediaType("application/font-woff",
".woff");
// audio
public static final MediaType MP3 = new MediaType("audio/mpeg", ".mp3");
public static final MediaType OGG = new MediaType("audio/ogg", ".ogg");
// video
public static final MediaType MP4 = new MediaType("video/mp4", ".mp4");
public static final MediaType SMIL = new MediaType("application/smil+xml",
".smil");
public static final MediaType XPGT = new MediaType(
"application/adobe-page-template+xml", ".xpgt");
public static final MediaType PLS = new MediaType("application/pls+xml",
".pls");
public static final MediaType[] mediaTypes = new MediaType[]{
XHTML, EPUB, JPG, PNG, GIF, CSS, SVG, TTF, NCX, XPGT, OPENTYPE, WOFF,
SMIL, PLS, JAVASCRIPT, MP3, MP4, OGG
};
public static final Map<String, MediaType> mediaTypesByName = new HashMap<>();
static {
for (MediaType mediaType : mediaTypes) {
mediaTypesByName.put(mediaType.getName(), mediaType);
}
}
public static boolean isBitmapImage(MediaType mediaType) {
return mediaType == JPG || mediaType == PNG || mediaType == GIF;
}
/**
* Gets the MediaType based on the file extension.
* Null of no matching extension found.
*
* @param filename filename
* @return the MediaType based on the file extension.
*/
public static MediaType determineMediaType(String filename) {
for (MediaType mediaType : mediaTypesByName.values()) {
for (String extension : mediaType.getExtensions()) {
if (StringUtil.endsWithIgnoreCase(filename, extension)) {
return mediaType;
}
}
}
return null;
}
public static MediaType getMediaTypeByName(String mediaTypeName) {
return mediaTypesByName.get(mediaTypeName);
}
}
File diff suppressed because it is too large Load Diff
@@ -1,340 +0,0 @@
package me.ag2s.epublib.domain;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.Serializable;
import me.ag2s.epublib.Constants;
import me.ag2s.epublib.util.IOUtil;
import me.ag2s.epublib.util.StringUtil;
import me.ag2s.epublib.util.commons.io.XmlStreamReader;
/**
* Represents a resource that is part of the epub.
* A resource can be a html file, image, xml, etc.
*
* @author paul
*
*/
public class Resource implements Serializable {
private static final long serialVersionUID = 1043946707835004037L;
private String id;
private String title;
private String href;
private String properties;
protected final String originalHref;
private MediaType mediaType;
private String inputEncoding;
protected byte[] data;
/**
* Creates an empty Resource with the given href.
*
* Assumes that if the data is of a text type (html/css/etc) then the encoding will be UTF-8
*
* @param href The location of the resource within the epub. Example: "chapter1.html".
*/
public Resource(String href) {
this(null, new byte[0], href, MediaTypes.determineMediaType(href));
}
/**
* Creates a Resource with the given data and MediaType.
* The href will be automatically generated.
*
* Assumes that if the data is of a text type (html/css/etc) then the encoding will be UTF-8
*
* @param data The Resource's contents
* @param mediaType The MediaType of the Resource
*/
public Resource(byte[] data, MediaType mediaType) {
this(null, data, null, mediaType);
}
/**
* Creates a resource with the given data at the specified href.
* The MediaType will be determined based on the href extension.
*
* Assumes that if the data is of a text type (html/css/etc) then the encoding will be UTF-8
*
* @see MediaTypes#determineMediaType(String)
*
* @param data The Resource's contents
* @param href The location of the resource within the epub. Example: "chapter1.html".
*/
public Resource(byte[] data, String href) {
this(null, data, href, MediaTypes.determineMediaType(href),
Constants.CHARACTER_ENCODING);
}
/**
* Creates a resource with the data from the given Reader at the specified href.
* The MediaType will be determined based on the href extension.
*
* @see MediaTypes#determineMediaType(String)
*
* @param in The Resource's contents
* @param href The location of the resource within the epub. Example: "cover.jpg".
*/
public Resource(Reader in, String href) throws IOException {
this(null, IOUtil.toByteArray(in, Constants.CHARACTER_ENCODING), href,
MediaTypes.determineMediaType(href),
Constants.CHARACTER_ENCODING);
}
/**
* Creates a resource with the data from the given InputStream at the specified href.
* The MediaType will be determined based on the href extension.
*
* @see MediaTypes#determineMediaType(String)
*
* Assumes that if the data is of a text type (html/css/etc) then the encoding will be UTF-8
*
* It is recommended to us the {@link #Resource(Reader, String)} method for creating textual
* (html/css/etc) resources to prevent encoding problems.
* Use this method only for binary Resources like images, fonts, etc.
*
*
* @param in The Resource's contents
* @param href The location of the resource within the epub. Example: "cover.jpg".
*/
public Resource(InputStream in, String href) throws IOException {
this(null, IOUtil.toByteArray(in), href,
MediaTypes.determineMediaType(href));
}
/**
* Creates a resource with the given id, data, mediatype at the specified href.
* Assumes that if the data is of a text type (html/css/etc) then the encoding will be UTF-8
*
* @param id The id of the Resource. Internal use only. Will be auto-generated if it has a null-value.
* @param data The Resource's contents
* @param href The location of the resource within the epub. Example: "chapter1.html".
* @param mediaType The resources MediaType
*/
public Resource(String id, byte[] data, String href, MediaType mediaType) {
this(id, data, href, mediaType, Constants.CHARACTER_ENCODING);
}
public Resource(String id, byte[] data, String href, String originalHref, MediaType mediaType) {
this(id, data, href, originalHref, mediaType, Constants.CHARACTER_ENCODING);
}
/**
* Creates a resource with the given id, data, mediatype at the specified href.
* If the data is of a text type (html/css/etc) then it will use the given inputEncoding.
*
* @param id The id of the Resource. Internal use only. Will be auto-generated if it has a null-value.
* @param data The Resource's contents
* @param href The location of the resource within the epub. Example: "chapter1.html".
* @param mediaType The resources MediaType
* @param inputEncoding If the data is of a text type (html/css/etc) then it will use the given inputEncoding.
*/
public Resource(String id, byte[] data, String href, MediaType mediaType,
String inputEncoding) {
this.id = id;
this.href = href;
this.originalHref = href;
this.mediaType = mediaType;
this.inputEncoding = inputEncoding;
this.data = data;
}
public Resource(String id, byte[] data, String href, String originalHref, MediaType mediaType,
String inputEncoding) {
this.id = id;
this.href = href;
this.originalHref = originalHref;
this.mediaType = mediaType;
this.inputEncoding = inputEncoding;
this.data = data;
}
/**
* Gets the contents of the Resource as an InputStream.
*
* @return The contents of the Resource.
*
* @throws IOException IOException
*/
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(getData());
}
/**
* The contents of the resource as a byte[]
*
* @return The contents of the resource
*/
public byte[] getData() throws IOException {
return data;
}
/**
* Tells this resource to release its cached data.
*
* If this resource was not lazy-loaded, this is a no-op.
*/
public void close() {
}
/**
* Sets the data of the Resource.
* If the data is a of a different type then the original data then make sure to change the MediaType.
*
* @param data the data of the Resource
*/
public void setData(byte[] data) {
this.data = data;
}
/**
* Returns the size of this resource in bytes.
*
* @return the size.
*/
public long getSize() {
return data.length;
}
/**
* If the title is found by scanning the underlying html document then it is cached here.
*
* @return the title
*/
public String getTitle() {
return title;
}
/**
* Sets the Resource's id: Make sure it is unique and a valid identifier.
*
* @param id Resource's id
*/
public void setId(String id) {
this.id = id;
}
/**
* The resources Id.
*
* Must be both unique within all the resources of this book and a valid identifier.
* @return The resources Id.
*/
public String getId() {
return id;
}
/**
* The location of the resource within the contents folder of the epub file.
*
* Example:<br/>
* images/cover.jpg<br/>
* content/chapter1.xhtml<br/>
*
* @return The location of the resource within the contents folder of the epub file.
*/
public String getHref() {
return href;
}
/**
* Sets the Resource's href.
*
* @param href Resource's href.
*/
public void setHref(String href) {
this.href = href;
}
/**
* The character encoding of the resource.
* Is allowed to be null for non-text resources like images.
*
* @return The character encoding of the resource.
*/
public String getInputEncoding() {
return inputEncoding;
}
/**
* Sets the Resource's input character encoding.
*
* @param encoding Resource's input character encoding.
*/
public void setInputEncoding(String encoding) {
this.inputEncoding = encoding;
}
/**
* Gets the contents of the Resource as Reader.
*
* Does all sorts of smart things (courtesy of apache commons io XMLStreamREader) to handle encodings, byte order markers, etc.
*
* @return the contents of the Resource as Reader.
* @throws IOException IOException
*/
public Reader getReader() throws IOException {
return new XmlStreamReader(new ByteArrayInputStream(getData()),
getInputEncoding());
}
/**
* Gets the hashCode of the Resource's href.
*
*/
public int hashCode() {
return href.hashCode();
}
/**
* Checks to see of the given resourceObject is a resource and whether its href is equal to this one.
*
* @return whether the given resourceObject is a resource and whether its href is equal to this one.
*/
public boolean equals(Object resourceObject) {
if (!(resourceObject instanceof Resource)) {
return false;
}
return href.equals(((Resource) resourceObject).getHref());
}
/**
* This resource's mediaType.
*
* @return This resource's mediaType.
*/
public MediaType getMediaType() {
return mediaType;
}
public void setMediaType(MediaType mediaType) {
this.mediaType = mediaType;
}
public void setTitle(String title) {
this.title = title;
}
public String getProperties() {
return properties;
}
public void setProperties(String properties) {
this.properties = properties;
}
@SuppressWarnings("NullableProblems")
public String toString() {
return StringUtil.toString("id", id,
"title", title,
"encoding", inputEncoding,
"mediaType", mediaType,
"href", href,
"size", (data == null ? 0 : data.length));
}
}
@@ -1,43 +0,0 @@
package me.ag2s.epublib.domain;
import java.io.Serializable;
public class ResourceReference implements Serializable {
private static final long serialVersionUID = 2596967243557743048L;
protected Resource resource;
public ResourceReference(Resource resource) {
this.resource = resource;
}
public Resource getResource() {
return resource;
}
/**
* Besides setting the resource it also sets the fragmentId to null.
*
* @param resource resource
*/
public void setResource(Resource resource) {
this.resource = resource;
}
/**
* The id of the reference referred to.
*
* null of the reference is null or has a null id itself.
*
* @return The id of the reference referred to.
*/
public String getResourceId() {
if (resource != null) {
return resource.getId();
}
return null;
}
}
@@ -1,192 +0,0 @@
package me.ag2s.epublib.domain;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import me.ag2s.epublib.util.StringUtil;
/**
* The spine sections are the sections of the book in the order in which the book should be read.
*
* This contrasts with the Table of Contents sections which is an index into the Book's sections.
*
* @see TableOfContents
*
* @author paul
*/
public class Spine implements Serializable {
private static final long serialVersionUID = 3878483958947357246L;
private Resource tocResource;
private List<SpineReference> spineReferences;
public Spine() {
this(new ArrayList<>());
}
/**
* Creates a spine out of all the resources in the table of contents.
*
* @param tableOfContents tableOfContents
*/
public Spine(TableOfContents tableOfContents) {
this.spineReferences = createSpineReferences(
tableOfContents.getAllUniqueResources());
}
public Spine(List<SpineReference> spineReferences) {
this.spineReferences = spineReferences;
}
public static List<SpineReference> createSpineReferences(
Collection<Resource> resources) {
List<SpineReference> result = new ArrayList<>(
resources.size());
for (Resource resource : resources) {
result.add(new SpineReference(resource));
}
return result;
}
public List<SpineReference> getSpineReferences() {
return spineReferences;
}
public void setSpineReferences(List<SpineReference> spineReferences) {
this.spineReferences = spineReferences;
}
/**
* Gets the resource at the given index.
* Null if not found.
*
* @param index index
* @return the resource at the given index.
*/
public Resource getResource(int index) {
if (index < 0 || index >= spineReferences.size()) {
return null;
}
return spineReferences.get(index).getResource();
}
/**
* Finds the first resource that has the given resourceId.
*
* Null if not found.
*
* @param resourceId resourceId
* @return the first resource that has the given resourceId.
*/
public int findFirstResourceById(String resourceId) {
if (StringUtil.isBlank(resourceId)) {
return -1;
}
for (int i = 0; i < spineReferences.size(); i++) {
SpineReference spineReference = spineReferences.get(i);
if (resourceId.equals(spineReference.getResourceId())) {
return i;
}
}
return -1;
}
/**
* Adds the given spineReference to the spine references and returns it.
*
* @param spineReference spineReference
* @return the given spineReference
*/
public SpineReference addSpineReference(SpineReference spineReference) {
if (spineReferences == null) {
this.spineReferences = new ArrayList<>();
}
spineReferences.add(spineReference);
return spineReference;
}
/**
* Adds the given resource to the spine references and returns it.
*
* @return the given spineReference
*/
@SuppressWarnings("unused")
public SpineReference addResource(Resource resource) {
return addSpineReference(new SpineReference(resource));
}
/**
* The number of elements in the spine.
*
* @return The number of elements in the spine.
*/
public int size() {
return spineReferences.size();
}
/**
* As per the epub file format the spine officially maintains a reference to the Table of Contents.
* The epubwriter will look for it here first, followed by some clever tricks to find it elsewhere if not found.
* Put it here to be sure of the expected behaviours.
*
* @param tocResource tocResource
*/
public void setTocResource(Resource tocResource) {
this.tocResource = tocResource;
}
/**
* The resource containing the XML for the tableOfContents.
* When saving an epub file this resource needs to be in this place.
*
* @return The resource containing the XML for the tableOfContents.
*/
public Resource getTocResource() {
return tocResource;
}
/**
* The position within the spine of the given resource.
*
* @param currentResource currentResource
* @return something &lt; 0 if not found.
*
*/
public int getResourceIndex(Resource currentResource) {
if (currentResource == null) {
return -1;
}
return getResourceIndex(currentResource.getHref());
}
/**
* The first position within the spine of a resource with the given href.
*
* @return something &lt; 0 if not found.
*
*/
public int getResourceIndex(String resourceHref) {
int result = -1;
if (StringUtil.isBlank(resourceHref)) {
return result;
}
for (int i = 0; i < spineReferences.size(); i++) {
if (resourceHref.equals(spineReferences.get(i).getResource().getHref())) {
result = i;
break;
}
}
return result;
}
/**
* Whether the spine has any references
* @return Whether the spine has any references
*/
public boolean isEmpty() {
return spineReferences.isEmpty();
}
}
@@ -1,56 +0,0 @@
package me.ag2s.epublib.domain;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* An item in the Table of Contents.
*
* @see TableOfContents
*
* @author paul
*/
public class TOCReference extends TitledResourceReference
implements Serializable {
private static final long serialVersionUID = 5787958246077042456L;
private List<TOCReference> children;
private static final Comparator<TOCReference> COMPARATOR_BY_TITLE_IGNORE_CASE = (tocReference1, tocReference2) -> String.CASE_INSENSITIVE_ORDER.compare(tocReference1.getTitle(), tocReference2.getTitle());
@Deprecated
public TOCReference() {
this(null, null, null);
}
public TOCReference(String name, Resource resource) {
this(name, resource, null);
}
public TOCReference(String name, Resource resource, String fragmentId) {
this(name, resource, fragmentId, new ArrayList<>());
}
public TOCReference(String title, Resource resource, String fragmentId,
List<TOCReference> children) {
super(resource, title, fragmentId);
this.children = children;
}
@SuppressWarnings("unused")
public static Comparator<TOCReference> getComparatorByTitleIgnoreCase() {
return COMPARATOR_BY_TITLE_IGNORE_CASE;
}
public List<TOCReference> getChildren() {
return children;
}
public TOCReference addChildSection(TOCReference childSection) {
this.children.add(childSection);
return childSection;
}
public void setChildren(List<TOCReference> children) {
this.children = children;
}
}
@@ -1,73 +0,0 @@
package me.ag2s.epublib.epub;
import android.util.Log;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import me.ag2s.epublib.domain.EpubBook;
/**
* A book processor that combines several other bookprocessors
* <p>
* Fixes coverpage/coverimage.
* Cleans up the XHTML.
*
* @author paul.siegmann
*/
@SuppressWarnings("unused declaration")
public class BookProcessorPipeline implements BookProcessor {
private static final String TAG= BookProcessorPipeline.class.getName();
private List<BookProcessor> bookProcessors;
public BookProcessorPipeline() {
this(null);
}
public BookProcessorPipeline(List<BookProcessor> bookProcessingPipeline) {
this.bookProcessors = bookProcessingPipeline;
}
@Override
public EpubBook processBook(EpubBook book) {
if (bookProcessors == null) {
return book;
}
for (BookProcessor bookProcessor : bookProcessors) {
try {
book = bookProcessor.processBook(book);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
}
return book;
}
public void addBookProcessor(BookProcessor bookProcessor) {
if (this.bookProcessors == null) {
bookProcessors = new ArrayList<>();
}
this.bookProcessors.add(bookProcessor);
}
public void addBookProcessors(Collection<BookProcessor> bookProcessors) {
if (this.bookProcessors == null) {
this.bookProcessors = new ArrayList<>();
}
this.bookProcessors.addAll(bookProcessors);
}
public List<BookProcessor> getBookProcessors() {
return bookProcessors;
}
public void setBookProcessingPipeline(
List<BookProcessor> bookProcessingPipeline) {
this.bookProcessors = bookProcessingPipeline;
}
}
@@ -1,190 +0,0 @@
package me.ag2s.epublib.epub;
import android.util.Log;
import org.xmlpull.v1.XmlSerializer;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import me.ag2s.epublib.domain.EpubBook;
import me.ag2s.epublib.domain.MediaTypes;
import me.ag2s.epublib.domain.Resource;
import me.ag2s.epublib.util.IOUtil;
/**
* Generates an epub file. Not thread-safe, single use object.
*
* @author paul
*/
public class EpubWriter {
private static final String TAG= EpubWriter.class.getName();
// package
static final String EMPTY_NAMESPACE_PREFIX = "";
private BookProcessor bookProcessor;
public EpubWriter() {
this(BookProcessor.IDENTITY_BOOKPROCESSOR);
}
public EpubWriter(BookProcessor bookProcessor) {
this.bookProcessor = bookProcessor;
}
public void write(EpubBook book, OutputStream out) throws IOException {
book = processBook(book);
ZipOutputStream resultStream = new ZipOutputStream(out);
writeMimeType(resultStream);
writeContainer(resultStream);
initTOCResource(book);
writeResources(book, resultStream);
writePackageDocument(book, resultStream);
resultStream.close();
}
private EpubBook processBook(EpubBook book) {
if (bookProcessor != null) {
book = bookProcessor.processBook(book);
}
return book;
}
private void initTOCResource(EpubBook book) {
Resource tocResource;
try {
if (book.isEpub3()) {
tocResource = NCXDocumentV3.createNCXResource(book);
} else {
tocResource = NCXDocumentV2.createNCXResource(book);
}
Resource currentTocResource = book.getSpine().getTocResource();
if (currentTocResource != null) {
book.getResources().remove(currentTocResource.getHref());
}
book.getSpine().setTocResource(tocResource);
book.getResources().add(tocResource);
} catch (Exception ex) {
Log.e(TAG,
"Error writing table of contents: "
+ ex.getClass().getName() + ": " + ex.getMessage(), ex);
}
}
private void writeResources(EpubBook book, ZipOutputStream resultStream) {
for (Resource resource : book.getResources().getAll()) {
writeResource(resource, resultStream);
}
}
/**
* Writes the resource to the resultStream.
*
* @param resource resource
* @param resultStream resultStream
*/
private void writeResource(Resource resource, ZipOutputStream resultStream) {
if (resource == null) {
return;
}
try {
resultStream.putNextEntry(new ZipEntry("OEBPS/" + resource.getHref()));
InputStream inputStream = resource.getInputStream();
IOUtil.copy(inputStream, resultStream);
inputStream.close();
} catch (Exception e) {
Log.e(TAG,e.getMessage(), e);
}
}
private void writePackageDocument(EpubBook book, ZipOutputStream resultStream)
throws IOException {
resultStream.putNextEntry(new ZipEntry("OEBPS/content.opf"));
XmlSerializer xmlSerializer = EpubProcessorSupport
.createXmlSerializer(resultStream);
PackageDocumentWriter.write(this, xmlSerializer, book);
xmlSerializer.flush();
// String resultAsString = result.toString();
// resultStream.write(resultAsString.getBytes(Constants.ENCODING));
}
/**
* Writes the META-INF/container.xml file.
*
* @param resultStream resultStream
* @throws IOException IOException
*/
private void writeContainer(ZipOutputStream resultStream) throws IOException {
resultStream.putNextEntry(new ZipEntry("META-INF/container.xml"));
Writer out = new OutputStreamWriter(resultStream);
out.write("<?xml version=\"1.0\"?>\n");
out.write(
"<container version=\"1.0\" xmlns=\"urn:oasis:names:tc:opendocument:xmlns:container\">\n");
out.write("\t<rootfiles>\n");
out.write(
"\t\t<rootfile full-path=\"OEBPS/content.opf\" media-type=\"application/oebps-package+xml\"/>\n");
out.write("\t</rootfiles>\n");
out.write("</container>");
out.flush();
}
/**
* Stores the mimetype as an uncompressed file in the ZipOutputStream.
*
* @param resultStream resultStream
* @throws IOException IOException
*/
private void writeMimeType(ZipOutputStream resultStream) throws IOException {
ZipEntry mimetypeZipEntry = new ZipEntry("mimetype");
mimetypeZipEntry.setMethod(ZipEntry.STORED);
byte[] mimetypeBytes = MediaTypes.EPUB.getName().getBytes();
mimetypeZipEntry.setSize(mimetypeBytes.length);
mimetypeZipEntry.setCrc(calculateCrc(mimetypeBytes));
resultStream.putNextEntry(mimetypeZipEntry);
resultStream.write(mimetypeBytes);
}
private long calculateCrc(byte[] data) {
CRC32 crc = new CRC32();
crc.update(data);
return crc.getValue();
}
String getNcxId() {
return "ncx";
}
String getNcxHref() {
return "toc.ncx";
}
String getNcxMediaType() {
return MediaTypes.NCX.getName();
}
@SuppressWarnings("unused")
public BookProcessor getBookProcessor() {
return bookProcessor;
}
@SuppressWarnings("unused")
public void setBookProcessor(BookProcessor bookProcessor) {
this.bookProcessor = bookProcessor;
}
}
@@ -1,97 +0,0 @@
package me.ag2s.epublib.epub;
/**
* Functionality shared by the PackageDocumentReader and the PackageDocumentWriter
*
* @author paul
*
*/
public class PackageDocumentBase {
public static final String BOOK_ID_ID = "duokan-book-id";
public static final String NAMESPACE_OPF = "http://www.idpf.org/2007/opf";
public static final String NAMESPACE_DUBLIN_CORE = "http://purl.org/dc/elements/1.1/";
public static final String PREFIX_DUBLIN_CORE = "dc";
//public static final String PREFIX_OPF = "opf";
//在EPUB3标准中,packge前面没有opf头,一些epub阅读器也不支持opf头。
//Some Epub Reader not reconize op:packge,So just let it empty;
public static final String PREFIX_OPF = "";
//添加 version 变量来区分Epub文件的版本
//Add the version field to distinguish the version of EPUB file
public static final String version="version";
public static final String dateFormat = "yyyy-MM-dd";
protected interface DCTags {
String title = "title";
String creator = "creator";
String subject = "subject";
String description = "description";
String publisher = "publisher";
String contributor = "contributor";
String date = "date";
String type = "type";
String format = "format";
String identifier = "identifier";
String source = "source";
String language = "language";
String relation = "relation";
String coverage = "coverage";
String rights = "rights";
}
protected interface DCAttributes {
String scheme = "scheme";
String id = "id";
}
protected interface OPFTags {
String metadata = "metadata";
String meta = "meta";
String manifest = "manifest";
String packageTag = "package";
String itemref = "itemref";
String spine = "spine";
String reference = "reference";
String guide = "guide";
String item = "item";
}
protected interface OPFAttributes {
String uniqueIdentifier = "unique-identifier";
String idref = "idref";
String name = "name";
String content = "content";
String type = "type";
String href = "href";
String linear = "linear";
String event = "event";
String role = "role";
String file_as = "file-as";
String id = "id";
String media_type = "media-type";
String title = "title";
String toc = "toc";
String version = "version";
String scheme = "scheme";
String property = "property";
//add for epub3
/**
* add for epub3
*/
String properties="properties";
}
protected interface OPFValues {
String meta_cover = "cover";
String reference_cover = "cover";
String no = "no";
String generator = "generator";
String duokan = "duokan-body-font";
}
}
@@ -1,187 +0,0 @@
package me.ag2s.epublib.epub;
import org.xmlpull.v1.XmlSerializer;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import me.ag2s.epublib.Constants;
import me.ag2s.epublib.domain.Author;
import me.ag2s.epublib.domain.Date;
import me.ag2s.epublib.domain.EpubBook;
import me.ag2s.epublib.domain.Identifier;
import me.ag2s.epublib.util.StringUtil;
public class PackageDocumentMetadataWriter extends PackageDocumentBase {
/**
* Writes the book's metadata.
*
* @param book book
* @param serializer serializer
* @throws IOException IOException
* @throws IllegalStateException IllegalStateException
* @throws IllegalArgumentException IllegalArgumentException
*/
public static void writeMetaData(EpubBook book, XmlSerializer serializer)
throws IllegalArgumentException, IllegalStateException, IOException {
serializer.startTag(NAMESPACE_OPF, OPFTags.metadata);
serializer.setPrefix(PREFIX_DUBLIN_CORE, NAMESPACE_DUBLIN_CORE);
serializer.setPrefix(PREFIX_OPF, NAMESPACE_OPF);
writeIdentifiers(book.getMetadata().getIdentifiers(), serializer);
writeSimpleMetdataElements(DCTags.title, book.getMetadata().getTitles(),
serializer);
writeSimpleMetdataElements(DCTags.subject, book.getMetadata().getSubjects(),
serializer);
writeSimpleMetdataElements(DCTags.description,
book.getMetadata().getDescriptions(), serializer);
writeSimpleMetdataElements(DCTags.publisher,
book.getMetadata().getPublishers(), serializer);
writeSimpleMetdataElements(DCTags.type, book.getMetadata().getTypes(),
serializer);
writeSimpleMetdataElements(DCTags.rights, book.getMetadata().getRights(),
serializer);
// write authors
for (Author author : book.getMetadata().getAuthors()) {
serializer.startTag(NAMESPACE_DUBLIN_CORE, DCTags.creator);
serializer.attribute(NAMESPACE_OPF, OPFAttributes.role,
author.getRelator().getCode());
serializer.attribute(NAMESPACE_OPF, OPFAttributes.file_as,
author.getLastname() + ", " + author.getFirstname());
serializer.text(author.getFirstname() + " " + author.getLastname());
serializer.endTag(NAMESPACE_DUBLIN_CORE, DCTags.creator);
}
// write contributors
for (Author author : book.getMetadata().getContributors()) {
serializer.startTag(NAMESPACE_DUBLIN_CORE, DCTags.contributor);
serializer.attribute(NAMESPACE_OPF, OPFAttributes.role,
author.getRelator().getCode());
serializer.attribute(NAMESPACE_OPF, OPFAttributes.file_as,
author.getLastname() + ", " + author.getFirstname());
serializer.text(author.getFirstname() + " " + author.getLastname());
serializer.endTag(NAMESPACE_DUBLIN_CORE, DCTags.contributor);
}
// write dates
for (Date date : book.getMetadata().getDates()) {
serializer.startTag(NAMESPACE_DUBLIN_CORE, DCTags.date);
if (date.getEvent() != null) {
serializer.attribute(NAMESPACE_OPF, OPFAttributes.event,
date.getEvent().toString());
}
serializer.text(date.getValue());
serializer.endTag(NAMESPACE_DUBLIN_CORE, DCTags.date);
}
// write language
if (StringUtil.isNotBlank(book.getMetadata().getLanguage())) {
serializer.startTag(NAMESPACE_DUBLIN_CORE, "language");
serializer.text(book.getMetadata().getLanguage());
serializer.endTag(NAMESPACE_DUBLIN_CORE, "language");
}
// write other properties
if (book.getMetadata().getOtherProperties() != null) {
for (Map.Entry<QName, String> mapEntry : book.getMetadata()
.getOtherProperties().entrySet()) {
serializer.startTag(mapEntry.getKey().getNamespaceURI(), OPFTags.meta);
serializer.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX,
OPFAttributes.property, mapEntry.getKey().getLocalPart());
serializer.text(mapEntry.getValue());
serializer.endTag(mapEntry.getKey().getNamespaceURI(), OPFTags.meta);
}
}
// write coverimage
if (book.getCoverImage() != null) { // write the cover image
serializer.startTag(NAMESPACE_OPF, OPFTags.meta);
serializer
.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.name,
OPFValues.meta_cover);
serializer
.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.content,
book.getCoverImage().getId());
serializer.endTag(NAMESPACE_OPF, OPFTags.meta);
}
// write generator
serializer.startTag(NAMESPACE_OPF, OPFTags.meta);
serializer.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.name,
OPFValues.generator);
serializer
.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.content,
Constants.EPUB_GENERATOR_NAME);
serializer.endTag(NAMESPACE_OPF, OPFTags.meta);
// write duokan
serializer.startTag(NAMESPACE_OPF, OPFTags.meta);
serializer.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.name,
OPFValues.duokan);
serializer
.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, OPFAttributes.content,
Constants.EPUB_DUOKAN_NAME);
serializer.endTag(NAMESPACE_OPF, OPFTags.meta);
serializer.endTag(NAMESPACE_OPF, OPFTags.metadata);
}
private static void writeSimpleMetdataElements(String tagName,
List<String> values, XmlSerializer serializer)
throws IllegalArgumentException, IllegalStateException, IOException {
for (String value : values) {
if (StringUtil.isBlank(value)) {
continue;
}
serializer.startTag(NAMESPACE_DUBLIN_CORE, tagName);
serializer.text(value);
serializer.endTag(NAMESPACE_DUBLIN_CORE, tagName);
}
}
/**
* Writes out the complete list of Identifiers to the package document.
* The first identifier for which the bookId is true is made the bookId identifier.
* If no identifier has bookId == true then the first bookId identifier is written as the primary.
*
* @param identifiers identifiers
* @param serializer serializer
* @throws IllegalStateException e
* @throws IllegalArgumentException e
* @
*/
private static void writeIdentifiers(List<Identifier> identifiers,
XmlSerializer serializer)
throws IllegalArgumentException, IllegalStateException, IOException {
Identifier bookIdIdentifier = Identifier.getBookIdIdentifier(identifiers);
if (bookIdIdentifier == null) {
return;
}
serializer.startTag(NAMESPACE_DUBLIN_CORE, DCTags.identifier);
serializer.attribute(EpubWriter.EMPTY_NAMESPACE_PREFIX, DCAttributes.id,
BOOK_ID_ID);
serializer.attribute(NAMESPACE_OPF, OPFAttributes.scheme,
bookIdIdentifier.getScheme());
serializer.text(bookIdIdentifier.getValue());
serializer.endTag(NAMESPACE_DUBLIN_CORE, DCTags.identifier);
for (Identifier identifier : identifiers.subList(1, identifiers.size())) {
if (identifier == bookIdIdentifier) {
continue;
}
serializer.startTag(NAMESPACE_DUBLIN_CORE, DCTags.identifier);
serializer.attribute(NAMESPACE_OPF, "scheme", identifier.getScheme());
serializer.text(identifier.getValue());
serializer.endTag(NAMESPACE_DUBLIN_CORE, DCTags.identifier);
}
}
}
@@ -1,71 +0,0 @@
package me.ag2s.epublib.util;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
public class CollectionUtil {
/**
* Wraps an Enumeration around an Iterator
* @author paul.siegmann
*
* @param <T>
*/
private static class IteratorEnumerationAdapter<T> implements Enumeration<T> {
private final Iterator<T> iterator;
public IteratorEnumerationAdapter(Iterator<T> iter) {
this.iterator = iter;
}
@Override
public boolean hasMoreElements() {
return iterator.hasNext();
}
@Override
public T nextElement() {
return iterator.next();
}
}
/**
* Creates an Enumeration out of the given Iterator.
* @param <T> g
* @param it g
* @return an Enumeration created out of the given Iterator.
*/
@SuppressWarnings("unused")
public static <T> Enumeration<T> createEnumerationFromIterator(
Iterator<T> it) {
return new IteratorEnumerationAdapter<>(it);
}
/**
* Returns the first element of the list, null if the list is null or empty.
*
* @param <T> f
* @param list f
* @return the first element of the list, null if the list is null or empty.
*/
public static <T> T first(List<T> list) {
if (list == null || list.isEmpty()) {
return null;
}
return list.get(0);
}
/**
* Whether the given collection is null or has no elements.
*
* @param collection g
* @return Whether the given collection is null or has no elements.
*/
public static boolean isEmpty(Collection<?> collection) {
return collection == null || collection.isEmpty();
}
}
@@ -1,363 +0,0 @@
package me.ag2s.epublib.util.zip;
import java.util.Calendar;
import java.util.Date;
import java.util.zip.ZipOutputStream;
/**
* This class represents a member of a zip archive. ZipFile and
* ZipInputStream will give you instances of this class as information
* about the members in an archive. On the other hand ZipOutputStream
* needs an instance of this class to create a new member.
*
* @author Jochen Hoenicke
*/
public class AndroidZipEntry implements ZipConstants, Cloneable {
private static final int KNOWN_SIZE = 1;
private static final int KNOWN_CSIZE = 2;
private static final int KNOWN_CRC = 4;
private static final int KNOWN_TIME = 8;
private static Calendar cal;
private final String name;
private final int nameLen;
private int size;
private int compressedSize;
private int crc;
private int dostime;
private short known = 0;
private short method = -1;
private byte[] extra = null;
private String comment = null;
int flags; /* used by ZipOutputStream */
int offset; /* used by ZipFile and ZipOutputStream */
/**
* Compression method. This method doesn't compress at all.
*/
public final static int STORED = 0;
/**
* Compression method. This method uses the Deflater.
*/
public final static int DEFLATED = 8;
/**
* Creates a zip entry with the given name.
*
* @param name the name. May include directory components separated
* by '/'.
* @throws NullPointerException when name is null.
* @throws IllegalArgumentException when name is bigger then 65535 chars.
*/
public AndroidZipEntry(String name, int nameLen) {
//int length = name.length();
this.nameLen = nameLen;
if (nameLen > 65535)
throw new IllegalArgumentException("name length is " + nameLen);
this.name = name;
}
/**
* Creates a copy of the given zip entry.
*
* @param e the entry to copy.
*/
public AndroidZipEntry(AndroidZipEntry e) {
name = e.name;
nameLen = e.nameLen;
known = e.known;
size = e.size;
compressedSize = e.compressedSize;
crc = e.crc;
dostime = e.dostime;
method = e.method;
extra = e.extra;
comment = e.comment;
}
final void setDOSTime(int dostime) {
this.dostime = dostime;
known |= KNOWN_TIME;
}
final int getDOSTime() {
if ((known & KNOWN_TIME) == 0)
return 0;
else
return dostime;
}
/**
* Creates a copy of this zip entry.
*/
/**
* Clones the entry.
*/
public Object clone() {
try {
// The JCL says that the `extra' field is also copied.
AndroidZipEntry clone = (AndroidZipEntry) super.clone();
if (extra != null)
clone.extra = (byte[]) extra.clone();
return clone;
} catch (CloneNotSupportedException ex) {
throw new InternalError();
}
}
/**
* Returns the entry name. The path components in the entry are
* always separated by slashes ('/').
*/
public String getName() {
return name;
}
public int getNameLen() {
return nameLen;
}
/**
* Sets the time of last modification of the entry.
*
* @time the time of last modification of the entry.
*/
public void setTime(long time) {
Calendar cal = getCalendar();
synchronized (cal) {
cal.setTime(new Date(time * 1000L));
dostime = (cal.get(Calendar.YEAR) - 1980 & 0x7f) << 25
| (cal.get(Calendar.MONTH) + 1) << 21
| (cal.get(Calendar.DAY_OF_MONTH)) << 16
| (cal.get(Calendar.HOUR_OF_DAY)) << 11
| (cal.get(Calendar.MINUTE)) << 5
| (cal.get(Calendar.SECOND)) >> 1;
}
dostime = (int) (dostime / 1000L);
this.known |= KNOWN_TIME;
}
/**
* Gets the time of last modification of the entry.
*
* @return the time of last modification of the entry, or -1 if unknown.
*/
public long getTime() {
if ((known & KNOWN_TIME) == 0)
return -1;
int sec = 2 * (dostime & 0x1f);
int min = (dostime >> 5) & 0x3f;
int hrs = (dostime >> 11) & 0x1f;
int day = (dostime >> 16) & 0x1f;
int mon = ((dostime >> 21) & 0xf) - 1;
int year = ((dostime >> 25) & 0x7f) + 1980; /* since 1900 */
try {
cal = getCalendar();
synchronized (cal) {
cal.set(year, mon, day, hrs, min, sec);
return cal.getTime().getTime();
}
} catch (RuntimeException ex) {
/* Ignore illegal time stamp */
known &= ~KNOWN_TIME;
return -1;
}
}
private static synchronized Calendar getCalendar() {
if (cal == null)
cal = Calendar.getInstance();
return cal;
}
/**
* Sets the size of the uncompressed data.
*
* @throws IllegalArgumentException if size is not in 0..0xffffffffL
*/
public void setSize(long size) {
if ((size & 0xffffffff00000000L) != 0)
throw new IllegalArgumentException();
this.size = (int) size;
this.known |= KNOWN_SIZE;
}
/**
* Gets the size of the uncompressed data.
*
* @return the size or -1 if unknown.
*/
public long getSize() {
return (known & KNOWN_SIZE) != 0 ? size & 0xffffffffL : -1L;
}
/**
* Sets the size of the compressed data.
*
* @throws IllegalArgumentException if size is not in 0..0xffffffffL
*/
public void setCompressedSize(long csize) {
if ((csize & 0xffffffff00000000L) != 0)
throw new IllegalArgumentException();
this.compressedSize = (int) csize;
this.known |= KNOWN_CSIZE;
}
/**
* Gets the size of the compressed data.
*
* @return the size or -1 if unknown.
*/
public long getCompressedSize() {
return (known & KNOWN_CSIZE) != 0 ? compressedSize & 0xffffffffL : -1L;
}
/**
* Sets the crc of the uncompressed data.
*
* @throws IllegalArgumentException if crc is not in 0..0xffffffffL
*/
public void setCrc(long crc) {
if ((crc & 0xffffffff00000000L) != 0)
throw new IllegalArgumentException();
this.crc = (int) crc;
this.known |= KNOWN_CRC;
}
/**
* Gets the crc of the uncompressed data.
*
* @return the crc or -1 if unknown.
*/
public long getCrc() {
return (known & KNOWN_CRC) != 0 ? crc & 0xffffffffL : -1L;
}
/**
* Sets the compression method. Only DEFLATED and STORED are
* supported.
*
* @throws IllegalArgumentException if method is not supported.
* @see ZipOutputStream#DEFLATED
* @see ZipOutputStream#STORED
*/
public void setMethod(int method) {
if (method != ZipOutputStream.STORED
&& method != ZipOutputStream.DEFLATED)
throw new IllegalArgumentException();
this.method = (short) method;
}
/**
* Gets the compression method.
*
* @return the compression method or -1 if unknown.
*/
public int getMethod() {
return method;
}
/**
* Sets the extra data.
*
* @throws IllegalArgumentException if extra is longer than 0xffff bytes.
*/
public void setExtra(byte[] extra) {
if (extra == null) {
this.extra = null;
return;
}
if (extra.length > 0xffff)
throw new IllegalArgumentException();
this.extra = extra;
try {
int pos = 0;
while (pos < extra.length) {
int sig = (extra[pos++] & 0xff)
| (extra[pos++] & 0xff) << 8;
int len = (extra[pos++] & 0xff)
| (extra[pos++] & 0xff) << 8;
if (sig == 0x5455) {
/* extended time stamp */
int flags = extra[pos];
if ((flags & 1) != 0) {
long time = ((extra[pos + 1] & 0xff)
| (extra[pos + 2] & 0xff) << 8
| (extra[pos + 3] & 0xff) << 16
| (extra[pos + 4] & 0xff) << 24);
setTime(time);
}
}
pos += len;
}
} catch (ArrayIndexOutOfBoundsException ex) {
/* be lenient */
return;
}
}
/**
* Gets the extra data.
*
* @return the extra data or null if not set.
*/
public byte[] getExtra() {
return extra;
}
/**
* Sets the entry comment.
*
* @throws IllegalArgumentException if comment is longer than 0xffff.
*/
public void setComment(String comment) {
if (comment != null && comment.length() > 0xffff)
throw new IllegalArgumentException();
this.comment = comment;
}
/**
* Gets the comment.
*
* @return the comment or null if not set.
*/
public String getComment() {
return comment;
}
/**
* Gets true, if the entry is a directory. This is solely
* determined by the name, a trailing slash '/' marks a directory.
*/
public boolean isDirectory() {
int nlen = name.length();
return nlen > 0 && name.charAt(nlen - 1) == '/';
}
/**
* Gets the string representation of this AndroidZipEntry. This is just
* the name as returned by getName().
*/
public String toString() {
return name;
}
/**
* Gets the hashCode of this AndroidZipEntry. This is just the hashCode
* of the name. Note that the equals method isn't changed, though.
*/
public int hashCode() {
return name.hashCode();
}
}
@@ -1,61 +0,0 @@
package me.ag2s.epublib.util.zip;
interface ZipConstants {
/* The local file header */
int LOCHDR = 30;
int LOCSIG = 'P' | ('K' << 8) | (3 << 16) | (4 << 24);
int LOCVER = 4;
int LOCFLG = 6;
int LOCHOW = 8;
int LOCTIM = 10;
int LOCCRC = 14;
int LOCSIZ = 18;
int LOCLEN = 22;
int LOCNAM = 26;
int LOCEXT = 28;
/* The Data descriptor */
int EXTSIG = 'P' | ('K' << 8) | (7 << 16) | (8 << 24);
int EXTHDR = 16;
int EXTCRC = 4;
int EXTSIZ = 8;
int EXTLEN = 12;
/* The central directory file header */
int CENSIG = 'P' | ('K' << 8) | (1 << 16) | (2 << 24);
int CENHDR = 46;
int CENVEM = 4;
int CENVER = 6;
int CENFLG = 8;
int CENHOW = 10;
int CENTIM = 12;
int CENCRC = 16;
int CENSIZ = 20;
int CENLEN = 24;
int CENNAM = 28;
int CENEXT = 30;
int CENCOM = 32;
int CENDSK = 34;
int CENATT = 36;
int CENATX = 38;
int CENOFF = 42;
/* The entries in the end of central directory */
int ENDSIG = 'P' | ('K' << 8) | (5 << 16) | (6 << 24);
int ENDHDR = 22;
/* The following two fields are missing in SUN JDK */
int ENDNRD = 4;
int ENDDCD = 6;
int ENDSUB = 8;
int ENDTOT = 10;
int ENDSIZ = 12;
int ENDOFF = 16;
int ENDCOM = 20;
}
@@ -1,207 +0,0 @@
package me.ag2s.umdlib.domain;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.zip.DeflaterOutputStream;
import me.ag2s.umdlib.tool.UmdUtils;
import me.ag2s.umdlib.tool.WrapOutputStream;
/**
* It includes all titles and contents of each chapter in the UMD file.
* And the content has been compressed by zlib.
*
* @author Ray Liang (liangguanhui@qq.com)
* 2009-12-20
*/
public class UmdChapters {
private static final int DEFAULT_CHUNK_INIT_SIZE = 32768;
private int TotalContentLen;
public List<byte[]> getTitles() {
return titles;
}
private final List<byte[]> titles = new ArrayList<>();
public List<Integer> contentLengths = new ArrayList<>();
public ByteArrayOutputStream contents = new ByteArrayOutputStream();
public void addTitle(String s){
titles.add(UmdUtils.stringToUnicodeBytes(s));
}
public void addTitle(byte[] s){
titles.add(s);
}
public void addContentLength(Integer integer){
contentLengths.add(integer);
}
public int getContentLength(int index){
return contentLengths.get(index);
}
public byte[] getContent(int index) {
int st=contentLengths.get(index);
byte[] b=contents.toByteArray();
int end=index+1<contentLengths.size()?contentLengths.get(index+1): getTotalContentLen();
System.out.println("总长度:"+contents.size());
System.out.println("起始值:"+st);
System.out.println("结束值:"+end);
byte[] bAr=new byte[end-st];
System.arraycopy(b,st,bAr,0,bAr.length);
return bAr;
}
public String getContentString(int index) {
return UmdUtils.unicodeBytesToString(getContent(index)).replace((char) 0x2029, '\n');
}
public String getTitle(int index){
return UmdUtils.unicodeBytesToString(titles.get(index));
}
public void buildChapters(WrapOutputStream wos) throws IOException {
writeChaptersHead(wos);
writeChaptersContentOffset(wos);
writeChaptersTitles(wos);
writeChaptersChunks(wos);
}
private void writeChaptersHead(WrapOutputStream wos) throws IOException {
wos.writeBytes('#', 0x0b, 0, 0, 0x09);
wos.writeInt(contents.size());
}
private void writeChaptersContentOffset(WrapOutputStream wos) throws IOException {
wos.writeBytes('#', 0x83, 0, 0, 0x09);
byte[] rb = UmdUtils.genRandomBytes(4);
wos.writeBytes(rb); //random numbers
wos.write('$');
wos.writeBytes(rb); //random numbers
wos.writeInt(contentLengths.size() * 4 + 9); // about the count of chapters
int offset = 0;
for (Integer n : contentLengths) {
wos.writeInt(offset);
offset += n;
}
}
private void writeChaptersTitles(WrapOutputStream wos) throws IOException {
wos.writeBytes('#', 0x84, 0, 0x01, 0x09);
byte[] rb = UmdUtils.genRandomBytes(4);
wos.writeBytes(rb); //random numbers
wos.write('$');
wos.writeBytes(rb); //random numbers
int totalTitlesLen = 0;
for (byte[] t : titles) {
totalTitlesLen += t.length;
}
// about the length of the titles
wos.writeInt(totalTitlesLen + titles.size() + 9);
for (byte[] t : titles) {
wos.writeByte(t.length);
wos.write(t);
}
}
private void writeChaptersChunks(WrapOutputStream wos) throws IOException {
byte[] allContents = contents.toByteArray();
byte[] zero16 = new byte[16];
Arrays.fill(zero16, 0, zero16.length, (byte) 0);
// write each package of content
int startPos = 0;
int len = 0;
int left = 0;
int chunkCnt = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream(DEFAULT_CHUNK_INIT_SIZE + 256);
List<byte[]> chunkRbList = new ArrayList<>();
while(startPos < allContents.length) {
left = allContents.length - startPos;
len = Math.min(DEFAULT_CHUNK_INIT_SIZE, left);
bos.reset();
DeflaterOutputStream zos = new DeflaterOutputStream(bos);
zos.write(allContents, startPos, len);
zos.close();
byte[] chunk = bos.toByteArray();
byte[] rb = UmdUtils.genRandomBytes(4);
wos.writeByte('$');
wos.writeBytes(rb); // 4 random
chunkRbList.add(rb);
wos.writeInt(chunk.length + 9);
wos.write(chunk);
// end of each chunk
wos.writeBytes('#', 0xF1, 0, 0, 0x15);
wos.write(zero16);
startPos += len;
chunkCnt++;
}
// end of all chunks
wos.writeBytes('#', 0x81, 0, 0x01, 0x09);
wos.writeBytes(0, 0, 0, 0); //random numbers
wos.write('$');
wos.writeBytes(0, 0, 0, 0); //random numbers
wos.writeInt(chunkCnt * 4 + 9);
for (int i = chunkCnt - 1; i >= 0; i--) {
// random. They are as the same as random numbers in the begin of each chunk
// use desc order to output these random
wos.writeBytes(chunkRbList.get(i));
}
}
public void addChapter(String title, String content) {
titles.add(UmdUtils.stringToUnicodeBytes(title));
byte[] b = UmdUtils.stringToUnicodeBytes(content);
contentLengths.add(b.length);
try {
contents.write(b);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public void addFile(File f, String title) throws IOException {
byte[] temp = UmdUtils.readFile(f);
String s = new String(temp);
addChapter(title, s);
}
public void addFile(File f) throws IOException {
String s = f.getName();
int idx = s.lastIndexOf('.');
if (idx >= 0) {
s = s.substring(0, idx);
}
addFile(f, s);
}
public void clearChapters() {
titles.clear();
contentLengths.clear();
contents.reset();
}
public int getTotalContentLen() {
return TotalContentLen;
}
public void setTotalContentLen(int totalContentLen) {
TotalContentLen = totalContentLen;
}
}
@@ -1,165 +0,0 @@
package me.ag2s.umdlib.domain;
import androidx.annotation.NonNull;
import java.io.IOException;
import me.ag2s.umdlib.tool.UmdUtils;
import me.ag2s.umdlib.tool.WrapOutputStream;
/**
* Header of UMD file.
* It includes a lot of properties of header.
* All the properties are String type.
*
* @author Ray Liang (liangguanhui@qq.com)
* 2009-12-20
*/
public class UmdHeader {
public byte getUmdType() {
return umdType;
}
public void setUmdType(byte umdType) {
this.umdType = umdType;
}
private byte umdType;
private String title;
private String author;
private String year;
private String month;
private String day;
private String bookType;
private String bookMan;
private String shopKeeper;
private final static byte B_type_umd = (byte) 0x01;
private final static byte B_type_title = (byte) 0x02;
private final static byte B_type_author = (byte) 0x03;
private final static byte B_type_year = (byte) 0x04;
private final static byte B_type_month = (byte) 0x05;
private final static byte B_type_day = (byte) 0x06;
private final static byte B_type_bookType = (byte) 0x07;
private final static byte B_type_bookMan = (byte) 0x08;
private final static byte B_type_shopKeeper = (byte) 0x09;
public void buildHeader(WrapOutputStream wos) throws IOException {
wos.writeBytes(0x89, 0x9b, 0x9a, 0xde); // UMD file type flags
wos.writeByte('#');
wos.writeBytes(0x01, 0x00, 0x00, 0x08); // Unknown
wos.writeByte(0x01); //0x01 is text type; while 0x02 is Image type.
wos.writeBytes(UmdUtils.genRandomBytes(2)); //random number
// start properties output
buildType(wos, B_type_title, getTitle());
buildType(wos, B_type_author, getAuthor());
buildType(wos, B_type_year, getYear());
buildType(wos, B_type_month, getMonth());
buildType(wos, B_type_day, getDay());
buildType(wos, B_type_bookType, getBookType());
buildType(wos, B_type_bookMan, getBookMan());
buildType(wos, B_type_shopKeeper, getShopKeeper());
}
public void buildType(WrapOutputStream wos, byte type, String content) throws IOException {
if (content == null || content.length() == 0) {
return;
}
wos.writeBytes('#', type, 0, 0);
byte[] temp = UmdUtils.stringToUnicodeBytes(content);
wos.writeByte(temp.length + 5);
wos.write(temp);
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getBookMan() {
return bookMan;
}
public void setBookMan(String bookMan) {
this.bookMan = bookMan;
}
public String getShopKeeper() {
return shopKeeper;
}
public void setShopKeeper(String shopKeeper) {
this.shopKeeper = shopKeeper;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getMonth() {
return month;
}
public void setMonth(String month) {
this.month = month;
}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
public String getBookType() {
return bookType;
}
public void setBookType(String bookType) {
this.bookType = bookType;
}
@Override
@NonNull
public String toString() {
return "UmdHeader{" +
"umdType=" + umdType +
", title='" + title + '\'' +
", author='" + author + '\'' +
", year='" + year + '\'' +
", month='" + month + '\'' +
", day='" + day + '\'' +
", bookType='" + bookType + '\'' +
", bookMan='" + bookMan + '\'' +
", shopKeeper='" + shopKeeper + '\'' +
'}';
}
}
@@ -1,153 +0,0 @@
package me.ag2s.umdlib.tool;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
import java.util.zip.InflaterInputStream;
public class UmdUtils {
private static final int EOF = -1;
private static final int BUFFER_SIZE = 8 * 1024;
/**
* 将字符串编码成Unicode形式的byte[]
* @param s 要编码的字符串
* @return 编码好的byte[]
*/
public static byte[] stringToUnicodeBytes(String s) {
if (s == null) {
throw new NullPointerException();
}
int len = s.length();
byte[] ret = new byte[len * 2];
int a, b, c;
for (int i = 0; i < len; i++) {
c = s.charAt(i);
a = c >> 8;
b = c & 0xFF;
if (a < 0) {
a += 0xFF;
}
if (b < 0) {
b += 0xFF;
}
ret[i * 2] = (byte) b;
ret[i * 2 + 1] = (byte) a;
}
return ret;
}
/**
* 将编码成Unicode形式的byte[]解码成原始字符串
* @param bytes 编码成Unicode形式的byte[]
* @return 原始字符串
*/
public static String unicodeBytesToString(byte[] bytes){
char[] s=new char[bytes.length/2];
StringBuilder sb=new StringBuilder();
int a,b,c;
for(int i=0;i<s.length;i++){
a=bytes[i*2+1];
b=bytes[i*2];
c=(a&0xff)<<8|(b&0xff);
if(c<0){
c+=0xffff;
}
char[] c1=Character.toChars(c);
sb.append(c1);
}
return sb.toString();
}
/**
* 将byte[]转化成Hex形式
* @param bArr byte[]
* @return 目标HEX字符串
*/
public static String toHex(byte[] bArr){
StringBuilder sb = new StringBuilder(bArr.length);
String sTmp;
for (int i = 0; i < bArr.length; i++) {
sTmp = Integer.toHexString(0xFF & bArr[i]);
if (sTmp.length() < 2)
sb.append(0);
sb.append(sTmp.toUpperCase());
}
return sb.toString();
}
/**
* 解压缩zip的byte[]
* @param compress zippered byte[]
* @return decompressed byte[]
* @throws Exception 解码时失败时
*/
public static byte[] decompress(byte[] compress) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(compress);
InflaterInputStream iis = new InflaterInputStream(bais);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int c = 0;
byte[] buf = new byte[BUFFER_SIZE];
while (true) {
c = iis.read(buf);
if (c == EOF)
break;
baos.write(buf, 0, c);
}
baos.flush();
return baos.toByteArray();
}
public static void saveFile(File f, byte[] content) throws IOException {
try (FileOutputStream fos = new FileOutputStream(f)) {
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(content);
bos.flush();
}
}
public static byte[] readFile(File f) throws IOException {
try (FileInputStream fis = new FileInputStream(f)) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedInputStream bis = new BufferedInputStream(fis);
int ch;
while ((ch = bis.read()) >= 0) {
baos.write(ch);
}
baos.flush();
return baos.toByteArray();
}
}
private static final Random random = new Random();
public static byte[] genRandomBytes(int len) {
if (len <= 0) {
throw new IllegalArgumentException("Length must > 0: " + len);
}
byte[] ret = new byte[len];
for (int i = 0; i < ret.length; i++) {
ret[i] = (byte) random.nextInt(256);
}
return ret;
}
}
@@ -1,91 +0,0 @@
package me.ag2s.umdlib.tool;
import java.io.IOException;
import java.io.OutputStream;
public class WrapOutputStream extends OutputStream {
private final OutputStream os;
private int written;
public WrapOutputStream(OutputStream os) {
this.os = os;
}
private void incCount(int value) {
int temp = written + value;
if (temp < 0) {
temp = Integer.MAX_VALUE;
}
written = temp;
}
// it is different from the writeInt of DataOutputStream
public void writeInt(int v) throws IOException {
os.write((v >>> 0) & 0xFF);
os.write((v >>> 8) & 0xFF);
os.write((v >>> 16) & 0xFF);
os.write((v >>> 24) & 0xFF);
incCount(4);
}
public void writeByte(byte b) throws IOException {
write(b);
}
public void writeByte(int n) throws IOException {
write(n);
}
public void writeBytes(byte ... bytes) throws IOException {
write(bytes);
}
public void writeBytes(int ... vals) throws IOException {
for (int v : vals) {
write(v);
}
}
public void write(byte[] b, int off, int len) throws IOException {
os.write(b, off, len);
incCount(len);
}
public void write(byte[] b) throws IOException {
os.write(b);
incCount(b.length);
}
public void write(int b) throws IOException {
os.write(b);
incCount(1);
}
/////////////////////////////////////////////////
public void close() throws IOException {
os.close();
}
public void flush() throws IOException {
os.flush();
}
public boolean equals(Object obj) {
return os.equals(obj);
}
public int hashCode() {
return os.hashCode();
}
public String toString() {
return os.toString();
}
public int getWritten() {
return written;
}
}
@@ -1,390 +0,0 @@
<!--
Title:
The Package Document Type Definition (DTD) for the Open
eBook Publication Structure Version 1.2
Version:
1.2
Revision:
20020930-x (supercedes 20020605-x)
Revision History Note:
This revision, 20020930-x, which supercedes the prior revision
20020605-x, solely updates the email addresses within this
comment prologue. No changes whatsover were made to the parsed
content of this DTD.
Previous Released Version:
1.0.1 (Revision of 01-February-2001, "Document Type
Definition for the Open eBook package version
1.0.1")
Authors:
Version 1.0; 1.0.1
Steve DeRose <sjd@stg.brown.edu>
Gunter Hille <hille@abc.de>
Ben Trafford <ben@legendary.org>
Garret Wilson <garret@globalmentor.com>
This Version 1.2 updated and edited by:
Jon Noring <jon@noring.name>
Benjamin Jung <benjamin.jung@deepx.com>
Usage:
<?xml version="1.0"?>
<!DOCTYPE package
PUBLIC "+//ISBN 0-9673008-1-9//DTD OEB 1.2 Package//EN"
"http://openebook.org/dtds/oeb-1.2/oebpkg12.dtd">
<package unique-identifier="foo">
metadata
manifest
spine
tours
guide
</package>
Summary Description:
This is the Package Document Type Definition (DTD) for
the Open eBook Publication Structure version 1.2.
Changes to this DTD from version 1.0.1 include:
a. Upgrading the <dc-metadata> content model to
fully conform with the OEBPS 1.2 specification
requirements. Specifically, <dc:Language> is
now required, while in OEBPS 1.0.1 it was
optional.
b. Updating the mnemonic character entity
declaration to refer to version 1.2.
c. Updating the xmlns:dc namespace to refer to
version 1.1 of the Dublin Core Metadata
Initiative.
d. Editing and updating the various non-parsed
comments.
e. Revising the layout (e.g., white space
alteration) to aid in readability.
-->
<!-- *************************************************** -->
<!-- XHTML MNEMONIC CHARACTER ENTITIES ................. -->
<!ENTITY % OEBEntities
PUBLIC "+//ISBN 0-9673008-1-9//DTD OEB 1.2 Entities//EN"
"http://openebook.org/dtds/oeb-1.2/oeb12.ent">
%OEBEntities;
<!-- *************************************************** -->
<!-- DATATYPE ENTITIES ................................. -->
<!-- Uniform Resource Identifier (URI), per [RFC2396] -->
<!ENTITY % URI "CDATA">
<!-- Language code, per [RFC3066] -->
<!ENTITY % LanguageCode "NMTOKEN">
<!-- *************************************************** -->
<!-- NAMESPACE ENTITIES ................................ -->
<!ENTITY % dc.xmlns
"'http://purl.org/dc/elements/1.1/'">
<!ENTITY % oebpk.xmlns
"'http://openebook.org/namespaces/oeb-package/1.0/'">
<!-- *************************************************** -->
<!-- ELEMENT ENTITIES .................................. -->
<!-- The entity 'DCMetadataOpt' includes the 12 optional
<dc:Xxx> children elements of <dc-metadata>. It will
be used in the <dc-metadata> content model. -->
<!ENTITY % DCMetadataOpt
"dc:Contributor |
dc:Coverage |
dc:Creator |
dc:Date |
dc:Description |
dc:Format |
dc:Publisher |
dc:Relation |
dc:Rights |
dc:Source |
dc:Subject |
dc:Type ">
<!-- *************************************************** -->
<!-- ATTRIBUTE ENTITIES ................................ -->
<!ENTITY % CoreAttributes
"id ID #IMPLIED">
<!ENTITY % InternationalAttributes
"xml:lang %LanguageCode; #IMPLIED">
<!ENTITY % CommonAttributes
"%CoreAttributes;
%InternationalAttributes;">
<!-- 'DCNamespaceAttribute' is an attribute entity declaring
the Dublin Core namespace. Used on each <dc:Xxx> element
to accommodate XML parsers which unnecessarily require
this. -->
<!ENTITY % DCNamespaceAttribute
"xmlns:dc %URI; #FIXED %dc.xmlns;">
<!-- *************************************************** -->
<!-- ELEMENTS AND ATTRIBUTES ........................... -->
<!-- <package> must have as children elements, in this order:
<metadata>, <manifest>, and <spine>, and optionally may
include <tours> and/or <guide>. The 'unique-identifier'
attribute is required for <package> (see comment for
<dc:Identifier>.) -->
<!ELEMENT package (metadata, manifest, spine, tours?, guide?)>
<!ATTLIST package
%CommonAttributes;
unique-identifier IDREF #REQUIRED
xmlns %URI; #FIXED %oebpk.xmlns;>
<!-- <metadata> must contain one <dc-metadata>, and
optionally contain one <x-metadata>. There are no
attributes for <metadata>. -->
<!ELEMENT metadata (dc-metadata, x-metadata?)>
<!-- <dc-metadata> must contain at least one <dc:Title>,
one <dc:Identifier>, and one <dc:Language>, and may
contain one or more of each of the other twelve
optional <dc:XXX> elements, all in any order. -->
<!ELEMENT dc-metadata
( (%DCMetadataOpt;)*,
( (dc:Title, (%DCMetadataOpt; | dc:Title)*,
( (dc:Identifier, (%DCMetadataOpt; | dc:Title | dc:Identifier)*,
dc:Language) |
(dc:Language, (%DCMetadataOpt; | dc:Title | dc:Language)*,
dc:Identifier) ) ) |
(dc:Identifier, (%DCMetadataOpt; | dc:Identifier)*,
( (dc:Title, (%DCMetadataOpt; | dc:Identifier | dc:Title)*,
dc:Language) |
(dc:Language, (%DCMetadataOpt; | dc:Identifier | dc:Language)*,
dc:Title) ) ) |
(dc:Language, (%DCMetadataOpt; | dc:Language)*,
( (dc:Identifier, (%DCMetadataOpt; | dc:Language | dc:Identifier)*,
dc:Title) |
(dc:Title, (%DCMetadataOpt; | dc:Language | dc:Title)*,
dc:Identifier) ) ) ),
(%DCMetadataOpt; | dc:Title | dc:Identifier | dc:Language)* )>
<!ATTLIST dc-metadata
%CommonAttributes;
%DCNamespaceAttribute;
xmlns:oebpackage %URI; #FIXED %oebpk.xmlns;>
<!-- Required elements for <dc-metadata>. -->
<!ELEMENT dc:Title (#PCDATA)>
<!ATTLIST dc:Title
%CommonAttributes;
%DCNamespaceAttribute;>
<!-- One <dc:Identifier> must specify an 'id' identical to
the value of the required <package> 'unique-identifier'
attribute. -->
<!ELEMENT dc:Identifier (#PCDATA)>
<!ATTLIST dc:Identifier
%CommonAttributes;
%DCNamespaceAttribute;
scheme NMTOKEN #IMPLIED>
<!ELEMENT dc:Language (#PCDATA)>
<!ATTLIST dc:Language
%CommonAttributes;
%DCNamespaceAttribute;>
<!-- Optional elements for <dc-metadata>. -->
<!ELEMENT dc:Contributor (#PCDATA)>
<!ATTLIST dc:Contributor
%CommonAttributes;
%DCNamespaceAttribute;
file-as CDATA #IMPLIED
role NMTOKEN #IMPLIED>
<!ELEMENT dc:Coverage (#PCDATA)>
<!ATTLIST dc:Coverage
%CommonAttributes;
%DCNamespaceAttribute;>
<!ELEMENT dc:Creator (#PCDATA)>
<!ATTLIST dc:Creator
%CommonAttributes;
%DCNamespaceAttribute;
file-as CDATA #IMPLIED
role NMTOKEN #IMPLIED>
<!ELEMENT dc:Date (#PCDATA)>
<!ATTLIST dc:Date
%CommonAttributes;
%DCNamespaceAttribute;
event NMTOKEN #IMPLIED>
<!ELEMENT dc:Description (#PCDATA)>
<!ATTLIST dc:Description
%CommonAttributes;
%DCNamespaceAttribute;>
<!ELEMENT dc:Format (#PCDATA)>
<!ATTLIST dc:Format
%CommonAttributes;
%DCNamespaceAttribute;>
<!ELEMENT dc:Publisher (#PCDATA)>
<!ATTLIST dc:Publisher
%CommonAttributes;
%DCNamespaceAttribute;>
<!ELEMENT dc:Relation (#PCDATA)>
<!ATTLIST dc:Relation
%CommonAttributes;
%DCNamespaceAttribute;>
<!ELEMENT dc:Rights (#PCDATA)>
<!ATTLIST dc:Rights
%CommonAttributes;
%DCNamespaceAttribute;>
<!ELEMENT dc:Source (#PCDATA)>
<!ATTLIST dc:Source
%CommonAttributes;
%DCNamespaceAttribute;>
<!ELEMENT dc:Subject (#PCDATA)>
<!ATTLIST dc:Subject
%CommonAttributes;
%DCNamespaceAttribute;>
<!ELEMENT dc:Type (#PCDATA)>
<!ATTLIST dc:Type
%CommonAttributes;
%DCNamespaceAttribute;>
<!-- <x-metadata> must contain at least one <meta>. -->
<!ELEMENT x-metadata (meta+)>
<!ATTLIST x-metadata %CommonAttributes;>
<!-- Note that 'content' and 'name' are required attributes
for <meta>. -->
<!ELEMENT meta EMPTY>
<!ATTLIST meta
%CommonAttributes;
content CDATA #REQUIRED
name NMTOKEN #REQUIRED
scheme CDATA #IMPLIED>
<!-- <manifest> must contain at least one <item>. -->
<!ELEMENT manifest (item+)>
<!ATTLIST manifest %CommonAttributes;>
<!-- Note that 'href', 'id' and 'media-type' are required
attributes for <item>. -->
<!ELEMENT item EMPTY>
<!ATTLIST item
%InternationalAttributes;
fallback IDREF #IMPLIED
href %URI; #REQUIRED
id ID #REQUIRED
media-type CDATA #REQUIRED>
<!-- <spine> must contain at least one <itemref>. -->
<!ELEMENT spine (itemref+)>
<!ATTLIST spine %CommonAttributes;>
<!-- Note that 'idref' is a required attribute for
<itemref>. -->
<!ELEMENT itemref EMPTY>
<!ATTLIST itemref
%CommonAttributes;
idref IDREF #REQUIRED>
<!-- <tours> must contain at least one <tour>. -->
<!ELEMENT tours (tour+)>
<!ATTLIST tours %CommonAttributes;>
<!-- <tour> must contain at least one <site>. Note that
'title' is a required attribute for <tour>. -->
<!ELEMENT tour (site+)>
<!ATTLIST tour
%CommonAttributes;
title CDATA #REQUIRED>
<!-- Note that 'href' and 'title' are required attributes
for <site>. -->
<!ELEMENT site EMPTY>
<!ATTLIST site
%CommonAttributes;
href %URI; #REQUIRED
title CDATA #REQUIRED>
<!-- <guide> must contain at least one <reference>. -->
<!ELEMENT guide (reference+)>
<!ATTLIST guide %CommonAttributes;>
<!-- Note that 'href', 'title' and 'type' are required
attributes for <reference>. -->
<!ELEMENT reference EMPTY>
<!ATTLIST reference
%CommonAttributes;
href %URI; #REQUIRED
title CDATA #REQUIRED
type NMTOKEN #REQUIRED>
@@ -1,269 +0,0 @@
<!-- NCX 2005-1 DTD 2005-06-26
file: ncx-2005-1.dtd
Authors: Mark Hakkinen, George Kerscher, Tom McLaughlin, James Pritchett, and Michael Moodie
Change list:
2002-02-12 M. Moodie. Changed content model of navLabel element to eliminate ambiguity.
2002-02-27 M. Moodie. Grammatical changes suggested by editor.
2004-03-31 J. Pritchett. Various changes per the 2004 change list:
- Changed internal version numbers from 1.1.0 to 1.2.0
- Made audio clipBegin/clipEnd mandatory (change #10)
- Dropped value attribute from navPoint (change #11)
- Replaced lang attribute with xml:lang (change #12)
- Added <pageList> and <pageTarget> elements (change #48)
- Dropped onFocus and onBlur attributes from navPoint and navTarget (change #49)
- Added <img> to content models of docTitle and docAuthor (change #50)
- Removed reference to pages in description of navList (change #52)
- Added <navInfo> element (change #53)
- Added default namespace attribute to description of <ncx> (change #L8)
- Removed pageRef and mapRef attributes
2004-04-05 J. Pritchett. Changes after feedback from MM and MG to 2004-03-31 version
- Changed internal version numbers from 1.2.0 to 1.1.2 (per MM e-mail of 3/31)
- Changed system identifier to use z3986/2004 as path instead of z3986/v100 (per 3/31 con call)
- Added class attribute to both pageTarget and pageList (per MG e-mail of 4/1)
- Added comment text describing value attribute for pageTarget and navTarget (per MM e-mail of 3/31)
- Changed declaration of type attribute on pageTarget to enumerate allowed values
- Added playOrder attribute to navPoint, navTarget, and pageTarget (per Lloyd's proposal)
2004-04-05 T. McLaughlin. In description of smilCustomTest, added id and defaultState are to be copied.
Version update to 1.1.3.
2004-05-14 T. McLaughlin. Reinstated override attribute to be copied also. Added bookStruct attribute
and enum list to smilCustomTest. Update to 1.1.4.
Revised, 4/5/2004: Changed version to 1.1.2
Revised, 4/5/2004: Changed system identifier to use '2004' path
Revised, 4/5/2004: TM, Changed version to 1.1.3
Revised, 5/14/2004: TM, Changed version to 1.1.4
2004-07-07 M. Moodie Updated version to 1.2.0 everywhere but at top, where version was set to 1.1.5.
2004-09-15 M. Moodie. Changed uri to URI throughout. Set version to 1.1.6.
2004-09-16 M. Moodie. Changed version to 1.2.0
2005-06-26 M. Gylling. Changed pid, sid, ns uri, and filename for Z3986-2005
Description:
NCX (Navigation Control for XML applications) is a generalized navigation definition DTD for application
to Digital Talking Books, eBooks, and general web content models.
This DTD is an XML application that layers navigation functionality on top of SMIL 2.0 content.
The NCX defines a navigation path/model that may be applied upon existing publications,
without modification of the existing publication source, so long as the navigation targets within
the source publication can be directly referenced via a URI.
The following identifiers apply to this DTD:
"-//NISO//DTD ncx 2005-1//EN"
"http://www.daisy.org/z3986/2005/ncx-2005-1.dtd"
-->
<!-- Basic Entities -->
<!ENTITY % i18n
"xml:lang NMTOKEN #IMPLIED
dir (ltr|rtl) #IMPLIED" >
<!ENTITY % SMILtimeVal "CDATA" >
<!ENTITY % URI "CDATA" >
<!ENTITY % script "CDATA" >
<!-- ELEMENTS -->
<!-- Top Level NCX Container. -->
<!-- Revised, 3/31/2004: Added pageList to content model -->
<!ELEMENT ncx (head, docTitle, docAuthor*, navMap, pageList?, navList*)>
<!-- Revised, 4/5/2004: Changed version to 1.1.2 -->
<!-- Revised 3/29/2004: Added xmlns -->
<!-- Revised, 4/5/2004: TM, Changed version to 1.1.3 -->
<!-- Revised, 5/14/2004: TM, Changed version to 1.1.4 -->
<!-- Revised, 7/7/2004: MM, Changed version to 1.2.0 -->
<!ATTLIST ncx
version CDATA #FIXED "2005-1"
xmlns %URI; #FIXED "http://www.daisy.org/z3986/2005/ncx/"
%i18n;
>
<!-- Document Head - Contains all NCX metadata.
-->
<!ELEMENT head (smilCustomTest | meta)+>
<!-- 2004-04-05 TM - only id and defaultState are copied -->
<!-- 2004-05-14 TM - revert to override copied too; added bookStruct attribute -->
<!-- smilCustomTest - Duplicates customTest data found in SMIL files. Each unique customTest
element that appears in one or more SMIL files must have its id, defaultState and override
attributes duplicated in a smilCustomTest element in the NCX. The NCX thus gathers in one
place all customTest elements used in the SMIL files, for presentation to the user.
-->
<!ELEMENT smilCustomTest EMPTY>
<!ATTLIST smilCustomTest
id ID #REQUIRED
defaultState (true|false) 'false'
override (visible|hidden) 'hidden'
bookStruct (PAGE_NUMBER|NOTE|NOTE_REFERENCE|ANNOTATION|LINE_NUMBER|OPTIONAL_SIDEBAR|OPTIONAL_PRODUCER_NOTE) #IMPLIED
>
<!-- Meta Element - metadata about this NCX -->
<!ELEMENT meta EMPTY>
<!ATTLIST meta
name CDATA #REQUIRED
content CDATA #REQUIRED
scheme CDATA #IMPLIED
>
<!-- DocTitle - the title of the document, required and must immediately follow head.
-->
<!-- Revised, 3/31/2004: Added img to content model -->
<!ELEMENT docTitle (text, audio?, img?)>
<!ATTLIST docTitle
id ID #IMPLIED
%i18n;
>
<!-- DocAuthor - the author of the document, immediately follows docTitle.
-->
<!-- Revised, 3/31/2004: Added img to content model -->
<!ELEMENT docAuthor (text, audio?, img?)>
<!ATTLIST docAuthor
id ID #IMPLIED
%i18n;
>
<!-- Navigation Structure - container for all of the NCX objects that are part of the
hierarchical structure of the document.
-->
<!-- Revised, 3/31/2004: Added navInfo to content model -->
<!ELEMENT navMap (navInfo*, navLabel*, navPoint+)>
<!ATTLIST navMap
id ID #IMPLIED
>
<!-- Navigation Point - contains description(s) of target, as well as a pointer to
entire content of target.
Hierarchy is represented by nesting navPoints. "class" attribute describes the kind
of structural unit this object represents (e.g., "chapter", "section").
-->
<!ELEMENT navPoint (navLabel+, content, navPoint*)>
<!-- Revised, 3/29/2004: Removed onFocus/onBlur -->
<!-- Revised, 3/29/2004: Removed value -->
<!-- Revised, 3/31/2004: Removed pageRef -->
<!-- Revised, 4/5/2004: Added playOrder -->
<!ATTLIST navPoint
id ID #REQUIRED
class CDATA #IMPLIED
playOrder CDATA #REQUIRED
>
<!-- Revised, 3/31/2004: Added pageList element -->
<!-- Page List - Container for pagination information.
-->
<!ELEMENT pageList (navInfo*, navLabel*, pageTarget+)>
<!-- Revised, 4/5/2004: Added class attribute -->
<!ATTLIST pageList
id ID #IMPLIED
class CDATA #IMPLIED
>
<!-- Revised, 3/31/2004: Added pageTarget element -->
<!-- Revised, 4/5/2004: Added description of value attribute to comment -->
<!-- Page Target - Container for
text, audio, image, and content elements containing navigational
information for pages. The "value" attribute is a positive integer representing
the numeric value associated with a page. Combination of values of type and
value attributes must be unique, when value attribute is present.
-->
<!ELEMENT pageTarget (navLabel+, content)>
<!-- Revised, 4/5/2004: Added class attribute -->
<!-- Revised, 4/5/2004: Changed declaration of type attribute to enumerate values -->
<!-- Revised, 4/5/2004: Added playOrder -->
<!ATTLIST pageTarget
id ID #IMPLIED
value CDATA #IMPLIED
type (front | normal | special) #REQUIRED
class CDATA #IMPLIED
playOrder CDATA #REQUIRED
>
<!-- Navigation List - container for distinct, flat sets of navigable elements, e.g.
notes, figures, tables, etc. Essentially a flat version of navMap. The "class" attribute
describes the type of object contained in this navList, using dtbook element names, e.g., note.
-->
<!-- Revised, 3/31/2004: Added navInfo to content model -->
<!ELEMENT navList (navInfo*, navLabel+, navTarget+) >
<!ATTLIST navList
id ID #IMPLIED
class CDATA #IMPLIED
>
<!-- Revised, 4/5/2004: Added description of value attribute to comment -->
<!-- Navigation Target - contains description(s) of target, as well as a pointer to
entire content of target.
navTargets are the equivalent of navPoints for use in navLists. "class" attribute
describes the kind of structure this target represents, using its dtbook element
name, e.g., note. The "value" attribute is a positive integer representing the
numeric value associated with the navTarget.
-->
<!ELEMENT navTarget (navLabel+, content) >
<!-- Revised, 3/29/2004: Removed onFocus/onBlur -->
<!-- Revised, 3/31/2004: Removed mapRef -->
<!-- Revised, 4/5/2004: Added playOrder -->
<!ATTLIST navTarget
id ID #REQUIRED
class CDATA #IMPLIED
value CDATA #IMPLIED
playOrder CDATA #REQUIRED
>
<!-- Revised, 3/31/2004: Added navInfo element -->
<!-- Navigation Information - Contains an informative comment
about a navMap, pageList, or navList in various media for presentation to the user.
-->
<!ELEMENT navInfo (((text, audio?) | audio), img?)>
<!ATTLIST navInfo
%i18n;
>
<!-- Navigation Label - Contains a description of a given <navMap>, <navPoint>,
<navList>, or <navTarget> in various media for presentation to the user. Can be
repeated so descriptions can be provided in multiple languages. -->
<!ELEMENT navLabel (((text, audio?) | audio), img?)>
<!ATTLIST navLabel
%i18n;
>
<!-- Content Element - pointer into SMIL to beginning of navPoint. -->
<!ELEMENT content EMPTY>
<!ATTLIST content
id ID #IMPLIED
src %URI; #REQUIRED
>
<!-- Text Element - Contains text of docTitle, navPoint heading, navTarget (e.g., page number),
or label for navMap or navList. -->
<!ELEMENT text (#PCDATA)>
<!ATTLIST text
id ID #IMPLIED
class CDATA #IMPLIED
>
<!-- Audio Element - audio clip of navPoint heading. -->
<!ELEMENT audio EMPTY>
<!-- Revised, 3/29/2004: clipBegin/clipEnd now REQUIRED -->
<!ATTLIST audio
id ID #IMPLIED
class CDATA #IMPLIED
src %URI; #REQUIRED
clipBegin %SMILtimeVal; #REQUIRED
clipEnd %SMILtimeVal; #REQUIRED
>
<!-- Image Element - image that may accompany heading. -->
<!ELEMENT img EMPTY>
<!ATTLIST img
id ID #IMPLIED
class CDATA #IMPLIED
src %URI; #REQUIRED
>
@@ -1,242 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Ruby Module .................................................... -->
<!-- file: xhtml-ruby-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1999-2001 W3C (MIT, INRIA, Keio), All Rights Reserved.
Revision: $Id: xhtml-ruby-1.mod,v 4.0 2001/04/03 23:14:33 altheim Exp $
This module is based on the W3C Ruby Annotation Specification:
http://www.w3.org/TR/ruby
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Ruby 1.0//EN"
SYSTEM "http://www.w3.org/TR/ruby/xhtml-ruby-1.mod"
...................................................................... -->
<!-- Ruby Elements
ruby, rbc, rtc, rb, rt, rp
This module declares the elements and their attributes used to
support ruby annotation markup.
-->
<!-- declare qualified element type names:
-->
<!ENTITY % ruby.qname "ruby" >
<!ENTITY % rbc.qname "rbc" >
<!ENTITY % rtc.qname "rtc" >
<!ENTITY % rb.qname "rb" >
<!ENTITY % rt.qname "rt" >
<!ENTITY % rp.qname "rp" >
<!-- rp fallback is included by default.
-->
<!ENTITY % Ruby.fallback "INCLUDE" >
<!ENTITY % Ruby.fallback.mandatory "IGNORE" >
<!-- Complex ruby is included by default; it may be
overridden by other modules to ignore it.
-->
<!ENTITY % Ruby.complex "INCLUDE" >
<!-- Fragments for the content model of the ruby element -->
<![%Ruby.fallback;[
<![%Ruby.fallback.mandatory;[
<!ENTITY % Ruby.content.simple
"( %rb.qname;, %rp.qname;, %rt.qname;, %rp.qname; )"
>
]]>
<!ENTITY % Ruby.content.simple
"( %rb.qname;, ( %rt.qname; | ( %rp.qname;, %rt.qname;, %rp.qname; ) ) )"
>
]]>
<!ENTITY % Ruby.content.simple "( %rb.qname;, %rt.qname; )" >
<![%Ruby.complex;[
<!ENTITY % Ruby.content.complex
"| ( %rbc.qname;, %rtc.qname;, %rtc.qname;? )"
>
]]>
<!ENTITY % Ruby.content.complex "" >
<!-- Content models of the rb and the rt elements are intended to
allow other inline-level elements of its parent markup language,
but it should not include ruby descendent elements. The following
parameter entity %NoRuby.content; can be used to redefine
those content models with minimum effort. It's defined as
'( #PCDATA )' by default.
-->
<!ENTITY % NoRuby.content "( #PCDATA )" >
<!-- one or more digits (NUMBER) -->
<!ENTITY % Number.datatype "CDATA" >
<!-- ruby element ...................................... -->
<!ENTITY % ruby.element "INCLUDE" >
<![%ruby.element;[
<!ENTITY % ruby.content
"( %Ruby.content.simple; %Ruby.content.complex; )"
>
<!ELEMENT %ruby.qname; %ruby.content; >
<!-- end of ruby.element -->]]>
<![%Ruby.complex;[
<!-- rbc (ruby base component) element ................. -->
<!ENTITY % rbc.element "INCLUDE" >
<![%rbc.element;[
<!ENTITY % rbc.content
"(%rb.qname;)+"
>
<!ELEMENT %rbc.qname; %rbc.content; >
<!-- end of rbc.element -->]]>
<!-- rtc (ruby text component) element ................. -->
<!ENTITY % rtc.element "INCLUDE" >
<![%rtc.element;[
<!ENTITY % rtc.content
"(%rt.qname;)+"
>
<!ELEMENT %rtc.qname; %rtc.content; >
<!-- end of rtc.element -->]]>
]]>
<!-- rb (ruby base) element ............................ -->
<!ENTITY % rb.element "INCLUDE" >
<![%rb.element;[
<!-- %rb.content; uses %NoRuby.content; as its content model,
which is '( #PCDATA )' by default. It may be overridden
by other modules to allow other inline-level elements
of its parent markup language, but it should not include
ruby descendent elements.
-->
<!ENTITY % rb.content "%NoRuby.content;" >
<!ELEMENT %rb.qname; %rb.content; >
<!-- end of rb.element -->]]>
<!-- rt (ruby text) element ............................ -->
<!ENTITY % rt.element "INCLUDE" >
<![%rt.element;[
<!-- %rt.content; uses %NoRuby.content; as its content model,
which is '( #PCDATA )' by default. It may be overridden
by other modules to allow other inline-level elements
of its parent markup language, but it should not include
ruby descendent elements.
-->
<!ENTITY % rt.content "%NoRuby.content;" >
<!ELEMENT %rt.qname; %rt.content; >
<!-- end of rt.element -->]]>
<!-- rbspan attribute is used for complex ruby only ...... -->
<![%Ruby.complex;[
<!ENTITY % rt.attlist "INCLUDE" >
<![%rt.attlist;[
<!ATTLIST %rt.qname;
rbspan %Number.datatype; "1"
>
<!-- end of rt.attlist -->]]>
]]>
<!-- rp (ruby parenthesis) element ..................... -->
<![%Ruby.fallback;[
<!ENTITY % rp.element "INCLUDE" >
<![%rp.element;[
<!ENTITY % rp.content
"( #PCDATA )"
>
<!ELEMENT %rp.qname; %rp.content; >
<!-- end of rp.element -->]]>
]]>
<!-- Ruby Common Attributes
The following optional ATTLIST declarations provide an easy way
to define common attributes for ruby elements. These declarations
are ignored by default.
Ruby elements are intended to have common attributes of its
parent markup language. For example, if a markup language defines
common attributes as a parameter entity %attrs;, you may add
those attributes by just declaring the following parameter entities
<!ENTITY % Ruby.common.attlists "INCLUDE" >
<!ENTITY % Ruby.common.attrib "%attrs;" >
before including the Ruby module.
-->
<!ENTITY % Ruby.common.attlists "IGNORE" >
<![%Ruby.common.attlists;[
<!ENTITY % Ruby.common.attrib "" >
<!-- common attributes for ruby ........................ -->
<!ENTITY % Ruby.common.attlist "INCLUDE" >
<![%Ruby.common.attlist;[
<!ATTLIST %ruby.qname;
%Ruby.common.attrib;
>
<!-- end of Ruby.common.attlist -->]]>
<![%Ruby.complex;[
<!-- common attributes for rbc ......................... -->
<!ENTITY % Rbc.common.attlist "INCLUDE" >
<![%Rbc.common.attlist;[
<!ATTLIST %rbc.qname;
%Ruby.common.attrib;
>
<!-- end of Rbc.common.attlist -->]]>
<!-- common attributes for rtc ......................... -->
<!ENTITY % Rtc.common.attlist "INCLUDE" >
<![%Rtc.common.attlist;[
<!ATTLIST %rtc.qname;
%Ruby.common.attrib;
>
<!-- end of Rtc.common.attlist -->]]>
]]>
<!-- common attributes for rb .......................... -->
<!ENTITY % Rb.common.attlist "INCLUDE" >
<![%Rb.common.attlist;[
<!ATTLIST %rb.qname;
%Ruby.common.attrib;
>
<!-- end of Rb.common.attlist -->]]>
<!-- common attributes for rt .......................... -->
<!ENTITY % Rt.common.attlist "INCLUDE" >
<![%Rt.common.attlist;[
<!ATTLIST %rt.qname;
%Ruby.common.attrib;
>
<!-- end of Rt.common.attlist -->]]>
<![%Ruby.fallback;[
<!-- common attributes for rp .......................... -->
<!ENTITY % Rp.common.attlist "INCLUDE" >
<![%Rp.common.attlist;[
<!ATTLIST %rp.qname;
%Ruby.common.attrib;
>
<!-- end of Rp.common.attlist -->]]>
]]>
]]>
<!-- end of xhtml-ruby-1.mod -->
@@ -1,51 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Base Architecture Module ...................................... -->
<!-- file: xhtml-arch-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-arch-1.mod,v 1.1 2010/07/29 13:42:46 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Base Architecture 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-arch-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- This optional module includes declarations that enable XHTML to be used
as a base architecture according to the 'Architectural Forms Definition
Requirements' (Annex A.3, ISO/IEC 10744, 2nd edition). For more information
on use of architectural forms, see the HyTime web site at:
http://www.hytime.org/
-->
<?IS10744 ArcBase xhtml ?>
<!NOTATION xhtml PUBLIC "-//W3C//NOTATION AFDR ARCBASE XHTML 1.1//EN" >
<!-- Entity declaration for associated Architectural DTD
-->
<!ENTITY xhtml-arch.dtd
PUBLIC "-//W3C//DTD XHTML Architecture 1.1//EN"
"xhtml11-arch.dtd" >
<?IS10744:arch xhtml
public-id = "-//W3C//NOTATION AFDR ARCBASE XHTML 1.1//EN"
dtd-public-id = "-//W3C//DTD XHTML 1.1//EN"
dtd-system-id = "xhtml11.dtd"
doc-elem-form = "html"
form-att = "html"
renamer-att = "htnames"
suppressor-att = "htsupp"
data-ignore-att = "htign"
auto = "ArcAuto"
options = "HtModReq HtModOpt"
HtModReq = "Framework Text Hypertext Lists Structure"
HtModOpt = "Standard"
?>
<!-- end of xhtml-arch-1.mod -->
@@ -1,142 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Common Attributes Module ...................................... -->
<!-- file: xhtml-attribs-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-attribs-1.mod,v 1.1 2010/07/29 13:42:46 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ENTITIES XHTML Common Attributes 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-attribs-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Common Attributes
This module declares many of the common attributes for the XHTML DTD.
%NS.decl.attrib; is declared in the XHTML Qname module.
Note that this file was extended in XHTML Modularization 1.1 to
include declarations of "global" versions of the attribute collections.
The global versions of the attributes are for use on elements in other
namespaces. The global version of "common" includes the xmlns declaration
for the prefixed version of the xhtml namespace. If you are only using a
specific attribute or an individual attribute collection, you must also
include the XHTML.xmlns.attrib.prefixed PE on your elements.
-->
<!ENTITY % id.attrib
"id ID #IMPLIED"
>
<![%XHTML.global.attrs.prefixed;[
<!ENTITY % XHTML.global.id.attrib
"%XHTML.prefix;:id ID #IMPLIED"
>
]]>
<!ENTITY % class.attrib
"class CDATA #IMPLIED"
>
<![%XHTML.global.attrs.prefixed;[
<!ENTITY % XHTML.global.class.attrib
"%XHTML.prefix;:class CDATA #IMPLIED"
>
]]>
<!ENTITY % title.attrib
"title %Text.datatype; #IMPLIED"
>
<![%XHTML.global.attrs.prefixed;[
<!ENTITY % XHTML.global.title.attrib
"%XHTML.prefix;:title %Text.datatype; #IMPLIED"
>
]]>
<!ENTITY % Core.extra.attrib "" >
<!ENTITY % Core.attrib
"%XHTML.xmlns.attrib;
%id.attrib;
%class.attrib;
%title.attrib;
xml:space ( preserve ) #FIXED 'preserve'
%Core.extra.attrib;"
>
<!ENTITY % XHTML.global.core.extra.attrib "" >
<![%XHTML.global.attrs.prefixed;[
<!ENTITY % XHTML.global.core.attrib
"%XHTML.global.id.attrib;
%XHTML.global.class.attrib;
%XHTML.global.title.attrib;
%XHTML.global.core.extra.attrib;"
>
]]>
<!ENTITY % XHTML.global.core.attrib "" >
<!ENTITY % lang.attrib
"xml:lang %LanguageCode.datatype; #IMPLIED"
>
<![%XHTML.bidi;[
<!ENTITY % dir.attrib
"dir ( ltr | rtl ) #IMPLIED"
>
<!ENTITY % I18n.attrib
"%dir.attrib;
%lang.attrib;"
>
<![%XHTML.global.attrs.prefixed;[
<!ENTITY XHTML.global.i18n.attrib
"%XHTML.prefix;:dir ( ltr | rtl ) #IMPLIED
%lang.attrib;"
>
]]>
<!ENTITY XHTML.global.i18n.attrib "" >
]]>
<!ENTITY % I18n.attrib
"%lang.attrib;"
>
<!ENTITY % XHTML.global.i18n.attrib
"%lang.attrib;"
>
<!ENTITY % Common.extra.attrib "" >
<!ENTITY % XHTML.global.common.extra.attrib "" >
<!-- intrinsic event attributes declared previously
-->
<!ENTITY % Events.attrib "" >
<!ENTITY % XHTML.global.events.attrib "" >
<!ENTITY % Common.attrib
"%Core.attrib;
%I18n.attrib;
%Events.attrib;
%Common.extra.attrib;"
>
<!ENTITY % XHTML.global.common.attrib
"%XHTML.xmlns.attrib.prefixed;
%XHTML.global.core.attrib;
%XHTML.global.i18n.attrib;
%XHTML.global.events.attrib;
%XHTML.global.common.extra.attrib;"
>
<!-- end of xhtml-attribs-1.mod -->
@@ -1,53 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Base Element Module ........................................... -->
<!-- file: xhtml-base-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-base-1.mod,v 1.1 2010/07/29 13:42:46 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Base Element 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-base-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Base element
base
This module declares the base element type and its attributes,
used to define a base URI against which relative URIs in the
document will be resolved.
Note that this module also redeclares the content model for
the head element to include the base element.
-->
<!-- base: Document Base URI ........................... -->
<!ENTITY % base.element "INCLUDE" >
<![%base.element;[
<!ENTITY % base.content "EMPTY" >
<!ENTITY % base.qname "base" >
<!ELEMENT %base.qname; %base.content; >
<!-- end of base.element -->]]>
<!ENTITY % base.attlist "INCLUDE" >
<![%base.attlist;[
<!ATTLIST %base.qname;
%XHTML.xmlns.attrib;
href %URI.datatype; #REQUIRED
>
<!-- end of base.attlist -->]]>
<!ENTITY % head.content
"( %HeadOpts.mix;,
( ( %title.qname;, %HeadOpts.mix;, ( %base.qname;, %HeadOpts.mix; )? )
| ( %base.qname;, %HeadOpts.mix;, ( %title.qname;, %HeadOpts.mix; ))))"
>
<!-- end of xhtml-base-1.mod -->
@@ -1,47 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML BDO Element Module ............................................. -->
<!-- file: xhtml-bdo-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-bdo-1.mod,v 1.1 2010/07/29 13:42:46 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML BDO Element 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-bdo-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Bidirectional Override (bdo) Element
This modules declares the element 'bdo', used to override the
Unicode bidirectional algorithm for selected fragments of text.
DEPENDENCIES:
Relies on the conditional section keyword %XHTML.bidi; declared
as "INCLUDE". Bidirectional text support includes both the bdo
element and the 'dir' attribute.
-->
<!ENTITY % bdo.element "INCLUDE" >
<![%bdo.element;[
<!ENTITY % bdo.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % bdo.qname "bdo" >
<!ELEMENT %bdo.qname; %bdo.content; >
<!-- end of bdo.element -->]]>
<!ENTITY % bdo.attlist "INCLUDE" >
<![%bdo.attlist;[
<!ATTLIST %bdo.qname;
%Core.attrib;
%lang.attrib;
dir ( ltr | rtl ) #REQUIRED
>
]]>
<!-- end of xhtml-bdo-1.mod -->
@@ -1,164 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Block Phrasal Module .......................................... -->
<!-- file: xhtml-blkphras-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-blkphras-1.mod,v 1.1 2010/07/29 13:42:46 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Block Phrasal 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-blkphras-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Block Phrasal
address, blockquote, pre, h1, h2, h3, h4, h5, h6
This module declares the elements and their attributes used to
support block-level phrasal markup.
-->
<!ENTITY % address.element "INCLUDE" >
<![%address.element;[
<!ENTITY % address.content
"( #PCDATA | %Inline.mix; )*" >
<!ENTITY % address.qname "address" >
<!ELEMENT %address.qname; %address.content; >
<!-- end of address.element -->]]>
<!ENTITY % address.attlist "INCLUDE" >
<![%address.attlist;[
<!ATTLIST %address.qname;
%Common.attrib;
>
<!-- end of address.attlist -->]]>
<!ENTITY % blockquote.element "INCLUDE" >
<![%blockquote.element;[
<!ENTITY % blockquote.content
"( %Block.mix; )*"
>
<!ENTITY % blockquote.qname "blockquote" >
<!ELEMENT %blockquote.qname; %blockquote.content; >
<!-- end of blockquote.element -->]]>
<!ENTITY % blockquote.attlist "INCLUDE" >
<![%blockquote.attlist;[
<!ATTLIST %blockquote.qname;
%Common.attrib;
cite %URI.datatype; #IMPLIED
>
<!-- end of blockquote.attlist -->]]>
<!ENTITY % pre.element "INCLUDE" >
<![%pre.element;[
<!ENTITY % pre.content
"( #PCDATA
| %InlStruct.class;
%InlPhras.class;
| %tt.qname; | %i.qname; | %b.qname;
%I18n.class;
%Anchor.class;
| %map.qname;
%Misc.class;
%Inline.extra; )*"
>
<!ENTITY % pre.qname "pre" >
<!ELEMENT %pre.qname; %pre.content; >
<!-- end of pre.element -->]]>
<!ENTITY % pre.attlist "INCLUDE" >
<![%pre.attlist;[
<!ATTLIST %pre.qname;
%Common.attrib;
>
<!-- end of pre.attlist -->]]>
<!-- ................... Heading Elements ................... -->
<!ENTITY % Heading.content "( #PCDATA | %Inline.mix; )*" >
<!ENTITY % h1.element "INCLUDE" >
<![%h1.element;[
<!ENTITY % h1.qname "h1" >
<!ELEMENT %h1.qname; %Heading.content; >
<!-- end of h1.element -->]]>
<!ENTITY % h1.attlist "INCLUDE" >
<![%h1.attlist;[
<!ATTLIST %h1.qname;
%Common.attrib;
>
<!-- end of h1.attlist -->]]>
<!ENTITY % h2.element "INCLUDE" >
<![%h2.element;[
<!ENTITY % h2.qname "h2" >
<!ELEMENT %h2.qname; %Heading.content; >
<!-- end of h2.element -->]]>
<!ENTITY % h2.attlist "INCLUDE" >
<![%h2.attlist;[
<!ATTLIST %h2.qname;
%Common.attrib;
>
<!-- end of h2.attlist -->]]>
<!ENTITY % h3.element "INCLUDE" >
<![%h3.element;[
<!ENTITY % h3.qname "h3" >
<!ELEMENT %h3.qname; %Heading.content; >
<!-- end of h3.element -->]]>
<!ENTITY % h3.attlist "INCLUDE" >
<![%h3.attlist;[
<!ATTLIST %h3.qname;
%Common.attrib;
>
<!-- end of h3.attlist -->]]>
<!ENTITY % h4.element "INCLUDE" >
<![%h4.element;[
<!ENTITY % h4.qname "h4" >
<!ELEMENT %h4.qname; %Heading.content; >
<!-- end of h4.element -->]]>
<!ENTITY % h4.attlist "INCLUDE" >
<![%h4.attlist;[
<!ATTLIST %h4.qname;
%Common.attrib;
>
<!-- end of h4.attlist -->]]>
<!ENTITY % h5.element "INCLUDE" >
<![%h5.element;[
<!ENTITY % h5.qname "h5" >
<!ELEMENT %h5.qname; %Heading.content; >
<!-- end of h5.element -->]]>
<!ENTITY % h5.attlist "INCLUDE" >
<![%h5.attlist;[
<!ATTLIST %h5.qname;
%Common.attrib;
>
<!-- end of h5.attlist -->]]>
<!ENTITY % h6.element "INCLUDE" >
<![%h6.element;[
<!ENTITY % h6.qname "h6" >
<!ELEMENT %h6.qname; %Heading.content; >
<!-- end of h6.element -->]]>
<!ENTITY % h6.attlist "INCLUDE" >
<![%h6.attlist;[
<!ATTLIST %h6.qname;
%Common.attrib;
>
<!-- end of h6.attlist -->]]>
<!-- end of xhtml-blkphras-1.mod -->
@@ -1,40 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Block Presentation Module ..................................... -->
<!-- file: xhtml-blkpres-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-blkpres-1.mod,v 1.1 2010/07/29 13:42:46 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Block Presentation 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-blkpres-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Block Presentational Elements
hr
This module declares the elements and their attributes used to
support block-level presentational markup.
-->
<!ENTITY % hr.element "INCLUDE" >
<![%hr.element;[
<!ENTITY % hr.content "EMPTY" >
<!ENTITY % hr.qname "hr" >
<!ELEMENT %hr.qname; %hr.content; >
<!-- end of hr.element -->]]>
<!ENTITY % hr.attlist "INCLUDE" >
<![%hr.attlist;[
<!ATTLIST %hr.qname;
%Common.attrib;
>
<!-- end of hr.attlist -->]]>
<!-- end of xhtml-blkpres-1.mod -->
@@ -1,57 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Block Structural Module ....................................... -->
<!-- file: xhtml-blkstruct-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-blkstruct-1.mod,v 1.1 2010/07/29 13:42:46 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Block Structural 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-blkstruct-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Block Structural
div, p
This module declares the elements and their attributes used to
support block-level structural markup.
-->
<!ENTITY % div.element "INCLUDE" >
<![%div.element;[
<!ENTITY % div.content
"( #PCDATA | %Flow.mix; )*"
>
<!ENTITY % div.qname "div" >
<!ELEMENT %div.qname; %div.content; >
<!-- end of div.element -->]]>
<!ENTITY % div.attlist "INCLUDE" >
<![%div.attlist;[
<!ATTLIST %div.qname;
%Common.attrib;
>
<!-- end of div.attlist -->]]>
<!ENTITY % p.element "INCLUDE" >
<![%p.element;[
<!ENTITY % p.content
"( #PCDATA | %Inline.mix; )*" >
<!ENTITY % p.qname "p" >
<!ELEMENT %p.qname; %p.content; >
<!-- end of p.element -->]]>
<!ENTITY % p.attlist "INCLUDE" >
<![%p.attlist;[
<!ATTLIST %p.qname;
%Common.attrib;
>
<!-- end of p.attlist -->]]>
<!-- end of xhtml-blkstruct-1.mod -->
@@ -1,39 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Character Entities Module ......................................... -->
<!-- file: xhtml-charent-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-charent-1.mod,v 1.1 2010/07/29 13:42:46 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ENTITIES XHTML Character Entities 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-charent-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Character Entities for XHTML
This module declares the set of character entities for XHTML,
including the Latin 1, Symbol and Special character collections.
-->
<!ENTITY % xhtml-lat1
PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN"
"xhtml-lat1.ent" >
%xhtml-lat1;
<!ENTITY % xhtml-symbol
PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN"
"xhtml-symbol.ent" >
%xhtml-symbol;
<!ENTITY % xhtml-special
PUBLIC "-//W3C//ENTITIES Special for XHTML//EN"
"xhtml-special.ent" >
%xhtml-special;
<!-- end of xhtml-charent-1.mod -->
@@ -1,114 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Client-side Image Map Module .................................. -->
<!-- file: xhtml-csismap-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-csismap-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Client-side Image Maps 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-csismap-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Client-side Image Maps
area, map
This module declares elements and attributes to support client-side
image maps. This requires that the Image Module (or a module
declaring the img element type) be included in the DTD.
These can be placed in the same document or grouped in a
separate document, although the latter isn't widely supported
-->
<!ENTITY % area.element "INCLUDE" >
<![%area.element;[
<!ENTITY % area.content "EMPTY" >
<!ENTITY % area.qname "area" >
<!ELEMENT %area.qname; %area.content; >
<!-- end of area.element -->]]>
<!ENTITY % Shape.datatype "( rect | circle | poly | default )">
<!ENTITY % Coords.datatype "CDATA" >
<!ENTITY % area.attlist "INCLUDE" >
<![%area.attlist;[
<!ATTLIST %area.qname;
%Common.attrib;
href %URI.datatype; #IMPLIED
shape %Shape.datatype; 'rect'
coords %Coords.datatype; #IMPLIED
nohref ( nohref ) #IMPLIED
alt %Text.datatype; #REQUIRED
tabindex %Number.datatype; #IMPLIED
accesskey %Character.datatype; #IMPLIED
>
<!-- end of area.attlist -->]]>
<!-- modify anchor attribute definition list
to allow for client-side image maps
-->
<!ATTLIST %a.qname;
shape %Shape.datatype; 'rect'
coords %Coords.datatype; #IMPLIED
>
<!-- modify img attribute definition list
to allow for client-side image maps
-->
<!ATTLIST %img.qname;
usemap %URIREF.datatype; #IMPLIED
>
<!-- modify form input attribute definition list
to allow for client-side image maps
-->
<!ATTLIST %input.qname;
usemap %URIREF.datatype; #IMPLIED
>
<!-- modify object attribute definition list
to allow for client-side image maps
-->
<!ATTLIST %object.qname;
usemap %URIREF.datatype; #IMPLIED
>
<!-- 'usemap' points to the 'id' attribute of a <map> element,
which must be in the same document; support for external
document maps was not widely supported in HTML and is
eliminated in XHTML.
It is considered an error for the element pointed to by
a usemap URIREF to occur in anything but a <map> element.
-->
<!ENTITY % map.element "INCLUDE" >
<![%map.element;[
<!ENTITY % map.content
"(( %Block.mix; ) | %area.qname; )+"
>
<!ENTITY % map.qname "map" >
<!ELEMENT %map.qname; %map.content; >
<!-- end of map.element -->]]>
<!ENTITY % map.attlist "INCLUDE" >
<![%map.attlist;[
<!ATTLIST %map.qname;
%XHTML.xmlns.attrib;
id ID #REQUIRED
%class.attrib;
%title.attrib;
%Core.extra.attrib;
%I18n.attrib;
%Events.attrib;
>
<!-- end of map.attlist -->]]>
<!-- end of xhtml-csismap-1.mod -->
@@ -1,103 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Datatypes Module .............................................. -->
<!-- file: xhtml-datatypes-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-datatypes-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ENTITIES XHTML Datatypes 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-datatypes-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Datatypes
defines containers for the following datatypes, many of
these imported from other specifications and standards.
-->
<!-- Length defined for cellpadding/cellspacing -->
<!-- nn for pixels or nn% for percentage length -->
<!ENTITY % Length.datatype "CDATA" >
<!-- space-separated list of link types -->
<!ENTITY % LinkTypes.datatype "NMTOKENS" >
<!-- single or comma-separated list of media descriptors -->
<!ENTITY % MediaDesc.datatype "CDATA" >
<!-- pixel, percentage, or relative -->
<!ENTITY % MultiLength.datatype "CDATA" >
<!-- one or more digits (NUMBER) -->
<!ENTITY % Number.datatype "CDATA" >
<!-- integer representing length in pixels -->
<!ENTITY % Pixels.datatype "CDATA" >
<!-- script expression -->
<!ENTITY % Script.datatype "CDATA" >
<!-- textual content -->
<!ENTITY % Text.datatype "CDATA" >
<!-- Placeholder Compact URI-related types -->
<!ENTITY % CURIE.datatype "CDATA" >
<!ENTITY % CURIEs.datatype "CDATA" >
<!ENTITY % SafeCURIE.datatype "CDATA" >
<!ENTITY % SafeCURIEs.datatype "CDATA" >
<!ENTITY % URIorSafeCURIE.datatype "CDATA" >
<!ENTITY % URIorSafeCURIEs.datatype "CDATA" >
<!-- Imported Datatypes ................................ -->
<!-- a single character from [ISO10646] -->
<!ENTITY % Character.datatype "CDATA" >
<!-- a character encoding, as per [RFC2045] -->
<!ENTITY % Charset.datatype "CDATA" >
<!-- a space separated list of character encodings, as per [RFC2045] -->
<!ENTITY % Charsets.datatype "CDATA" >
<!-- Color specification using color name or sRGB (#RRGGBB) values -->
<!ENTITY % Color.datatype "CDATA" >
<!-- media type, as per [RFC2045] -->
<!ENTITY % ContentType.datatype "CDATA" >
<!-- comma-separated list of media types, as per [RFC2045] -->
<!ENTITY % ContentTypes.datatype "CDATA" >
<!-- date and time information. ISO date format -->
<!ENTITY % Datetime.datatype "CDATA" >
<!-- formal public identifier, as per [ISO8879] -->
<!ENTITY % FPI.datatype "CDATA" >
<!-- a language code, as per [RFC3066] or its successor -->
<!ENTITY % LanguageCode.datatype "CDATA" >
<!-- a comma separated list of language code ranges -->
<!ENTITY % LanguageCodes.datatype "CDATA" >
<!-- a qualified name , as per [XMLNS] or its successor -->
<!ENTITY % QName.datatype "CDATA" >
<!ENTITY % QNames.datatype "CDATA" >
<!-- a Uniform Resource Identifier, see [URI] -->
<!ENTITY % URI.datatype "CDATA" >
<!-- a space-separated list of Uniform Resource Identifiers, see [URI] -->
<!ENTITY % URIs.datatype "CDATA" >
<!-- a relative URI reference consisting of an initial '#' and a fragment ID -->
<!ENTITY % URIREF.datatype "CDATA" >
<!-- end of xhtml-datatypes-1.mod -->
@@ -1,66 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Editing Elements Module ....................................... -->
<!-- file: xhtml-edit-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-edit-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Editing Markup 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-edit-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Editing Elements
ins, del
This module declares element types and attributes used to indicate
inserted and deleted content while editing a document.
-->
<!-- ins: Inserted Text ............................... -->
<!ENTITY % ins.element "INCLUDE" >
<![%ins.element;[
<!ENTITY % ins.content
"( #PCDATA | %Flow.mix; )*"
>
<!ENTITY % ins.qname "ins" >
<!ELEMENT %ins.qname; %ins.content; >
<!-- end of ins.element -->]]>
<!ENTITY % ins.attlist "INCLUDE" >
<![%ins.attlist;[
<!ATTLIST %ins.qname;
%Common.attrib;
cite %URI.datatype; #IMPLIED
datetime %Datetime.datatype; #IMPLIED
>
<!-- end of ins.attlist -->]]>
<!-- del: Deleted Text ................................ -->
<!ENTITY % del.element "INCLUDE" >
<![%del.element;[
<!ENTITY % del.content
"( #PCDATA | %Flow.mix; )*"
>
<!ENTITY % del.qname "del" >
<!ELEMENT %del.qname; %del.content; >
<!-- end of del.element -->]]>
<!ENTITY % del.attlist "INCLUDE" >
<![%del.attlist;[
<!ATTLIST %del.qname;
%Common.attrib;
cite %URI.datatype; #IMPLIED
datetime %Datetime.datatype; #IMPLIED
>
<!-- end of del.attlist -->]]>
<!-- end of xhtml-edit-1.mod -->
@@ -1,135 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Intrinsic Events Module ....................................... -->
<!-- file: xhtml-events-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-events-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ENTITIES XHTML Intrinsic Events 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-events-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Intrinsic Event Attributes
These are the event attributes defined in HTML 4,
Section 18.2.3 "Intrinsic Events". This module must be
instantiated prior to the Attributes Module but after
the Datatype Module in the Modular Framework module.
"Note: Authors of HTML documents are advised that changes
are likely to occur in the realm of intrinsic events
(e.g., how scripts are bound to events). Research in
this realm is carried on by members of the W3C Document
Object Model Working Group (see the W3C Web site at
http://www.w3.org/ for more information)."
-->
<!-- NOTE: Because the ATTLIST declarations in this module occur
before their respective ELEMENT declarations in other
modules, there may be a dependency on this module that
should be considered if any of the parameter entities used
for element type names (eg., %a.qname;) are redeclared.
-->
<!ENTITY % Events.attrib
"onclick %Script.datatype; #IMPLIED
ondblclick %Script.datatype; #IMPLIED
onmousedown %Script.datatype; #IMPLIED
onmouseup %Script.datatype; #IMPLIED
onmouseover %Script.datatype; #IMPLIED
onmousemove %Script.datatype; #IMPLIED
onmouseout %Script.datatype; #IMPLIED
onkeypress %Script.datatype; #IMPLIED
onkeydown %Script.datatype; #IMPLIED
onkeyup %Script.datatype; #IMPLIED"
>
<![%XHTML.global.attrs.prefixed;[
<!ENTITY % XHTML.global.events.attrib
"%XHTML.prefix;:onclick %Script.datatype; #IMPLIED
%XHTML.prefix;:ondblclick %Script.datatype; #IMPLIED
%XHTML.prefix;:onmousedown %Script.datatype; #IMPLIED
%XHTML.prefix;:onmouseup %Script.datatype; #IMPLIED
%XHTML.prefix;:onmouseover %Script.datatype; #IMPLIED
%XHTML.prefix;:onmousemove %Script.datatype; #IMPLIED
%XHTML.prefix;:onmouseout %Script.datatype; #IMPLIED
%XHTML.prefix;:onkeypress %Script.datatype; #IMPLIED
%XHTML.prefix;:onkeydown %Script.datatype; #IMPLIED
%XHTML.prefix;:onkeyup %Script.datatype; #IMPLIED"
>
]]>
<!-- additional attributes on anchor element
-->
<!ATTLIST %a.qname;
onfocus %Script.datatype; #IMPLIED
onblur %Script.datatype; #IMPLIED
>
<!-- additional attributes on form element
-->
<!ATTLIST %form.qname;
onsubmit %Script.datatype; #IMPLIED
onreset %Script.datatype; #IMPLIED
>
<!-- additional attributes on label element
-->
<!ATTLIST %label.qname;
onfocus %Script.datatype; #IMPLIED
onblur %Script.datatype; #IMPLIED
>
<!-- additional attributes on input element
-->
<!ATTLIST %input.qname;
onfocus %Script.datatype; #IMPLIED
onblur %Script.datatype; #IMPLIED
onselect %Script.datatype; #IMPLIED
onchange %Script.datatype; #IMPLIED
>
<!-- additional attributes on select element
-->
<!ATTLIST %select.qname;
onfocus %Script.datatype; #IMPLIED
onblur %Script.datatype; #IMPLIED
onchange %Script.datatype; #IMPLIED
>
<!-- additional attributes on textarea element
-->
<!ATTLIST %textarea.qname;
onfocus %Script.datatype; #IMPLIED
onblur %Script.datatype; #IMPLIED
onselect %Script.datatype; #IMPLIED
onchange %Script.datatype; #IMPLIED
>
<!-- additional attributes on button element
-->
<!ATTLIST %button.qname;
onfocus %Script.datatype; #IMPLIED
onblur %Script.datatype; #IMPLIED
>
<!-- additional attributes on body element
-->
<!ATTLIST %body.qname;
onload %Script.datatype; #IMPLIED
onunload %Script.datatype; #IMPLIED
>
<!-- additional attributes on area element
-->
<!ATTLIST %area.qname;
onfocus %Script.datatype; #IMPLIED
onblur %Script.datatype; #IMPLIED
>
<!-- end of xhtml-events-1.mod -->
@@ -1,292 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Forms Module .................................................. -->
<!-- file: xhtml-form-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-form-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Forms 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-form-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Forms
form, label, input, select, optgroup, option,
textarea, fieldset, legend, button
This module declares markup to provide support for online
forms, based on the features found in HTML 4 forms.
-->
<!-- declare qualified element type names:
-->
<!ENTITY % form.qname "form" >
<!ENTITY % label.qname "label" >
<!ENTITY % input.qname "input" >
<!ENTITY % select.qname "select" >
<!ENTITY % optgroup.qname "optgroup" >
<!ENTITY % option.qname "option" >
<!ENTITY % textarea.qname "textarea" >
<!ENTITY % fieldset.qname "fieldset" >
<!ENTITY % legend.qname "legend" >
<!ENTITY % button.qname "button" >
<!-- %BlkNoForm.mix; includes all non-form block elements,
plus %Misc.class;
-->
<!ENTITY % BlkNoForm.mix
"%Heading.class;
| %List.class;
| %BlkStruct.class;
%BlkPhras.class;
%BlkPres.class;
%Table.class;
%Block.extra;
%Misc.class;"
>
<!-- form: Form Element ................................ -->
<!ENTITY % form.element "INCLUDE" >
<![%form.element;[
<!ENTITY % form.content
"( %BlkNoForm.mix;
| %fieldset.qname; )+"
>
<!ELEMENT %form.qname; %form.content; >
<!-- end of form.element -->]]>
<!ENTITY % form.attlist "INCLUDE" >
<![%form.attlist;[
<!ATTLIST %form.qname;
%Common.attrib;
action %URI.datatype; #REQUIRED
method ( get | post ) 'get'
name CDATA #IMPLIED
enctype %ContentType.datatype; 'application/x-www-form-urlencoded'
accept-charset %Charsets.datatype; #IMPLIED
accept %ContentTypes.datatype; #IMPLIED
>
<!-- end of form.attlist -->]]>
<!-- label: Form Field Label Text ...................... -->
<!-- Each label must not contain more than ONE field
-->
<!ENTITY % label.element "INCLUDE" >
<![%label.element;[
<!ENTITY % label.content
"( #PCDATA
| %input.qname; | %select.qname; | %textarea.qname; | %button.qname;
| %InlStruct.class;
%InlPhras.class;
%I18n.class;
%InlPres.class;
%Anchor.class;
%InlSpecial.class;
%Inline.extra;
%Misc.class; )*"
>
<!ELEMENT %label.qname; %label.content; >
<!-- end of label.element -->]]>
<!ENTITY % label.attlist "INCLUDE" >
<![%label.attlist;[
<!ATTLIST %label.qname;
%Common.attrib;
for IDREF #IMPLIED
accesskey %Character.datatype; #IMPLIED
>
<!-- end of label.attlist -->]]>
<!-- input: Form Control ............................... -->
<!ENTITY % input.element "INCLUDE" >
<![%input.element;[
<!ENTITY % input.content "EMPTY" >
<!ELEMENT %input.qname; %input.content; >
<!-- end of input.element -->]]>
<!ENTITY % input.attlist "INCLUDE" >
<![%input.attlist;[
<!ENTITY % InputType.class
"( text | password | checkbox | radio | submit
| reset | file | hidden | image | button )"
>
<!-- attribute 'name' required for all but submit & reset
-->
<!ATTLIST %input.qname;
%Common.attrib;
type %InputType.class; 'text'
name CDATA #IMPLIED
value CDATA #IMPLIED
checked ( checked ) #IMPLIED
disabled ( disabled ) #IMPLIED
readonly ( readonly ) #IMPLIED
size %Number.datatype; #IMPLIED
maxlength %Number.datatype; #IMPLIED
src %URI.datatype; #IMPLIED
alt %Text.datatype; #IMPLIED
tabindex %Number.datatype; #IMPLIED
accesskey %Character.datatype; #IMPLIED
accept %ContentTypes.datatype; #IMPLIED
>
<!-- end of input.attlist -->]]>
<!-- select: Option Selector ........................... -->
<!ENTITY % select.element "INCLUDE" >
<![%select.element;[
<!ENTITY % select.content
"( %optgroup.qname; | %option.qname; )+"
>
<!ELEMENT %select.qname; %select.content; >
<!-- end of select.element -->]]>
<!ENTITY % select.attlist "INCLUDE" >
<![%select.attlist;[
<!ATTLIST %select.qname;
%Common.attrib;
name CDATA #IMPLIED
size %Number.datatype; #IMPLIED
multiple ( multiple ) #IMPLIED
disabled ( disabled ) #IMPLIED
tabindex %Number.datatype; #IMPLIED
>
<!-- end of select.attlist -->]]>
<!-- optgroup: Option Group ............................ -->
<!ENTITY % optgroup.element "INCLUDE" >
<![%optgroup.element;[
<!ENTITY % optgroup.content "( %option.qname; )+" >
<!ELEMENT %optgroup.qname; %optgroup.content; >
<!-- end of optgroup.element -->]]>
<!ENTITY % optgroup.attlist "INCLUDE" >
<![%optgroup.attlist;[
<!ATTLIST %optgroup.qname;
%Common.attrib;
disabled ( disabled ) #IMPLIED
label %Text.datatype; #REQUIRED
>
<!-- end of optgroup.attlist -->]]>
<!-- option: Selectable Choice ......................... -->
<!ENTITY % option.element "INCLUDE" >
<![%option.element;[
<!ENTITY % option.content "( #PCDATA )" >
<!ELEMENT %option.qname; %option.content; >
<!-- end of option.element -->]]>
<!ENTITY % option.attlist "INCLUDE" >
<![%option.attlist;[
<!ATTLIST %option.qname;
%Common.attrib;
selected ( selected ) #IMPLIED
disabled ( disabled ) #IMPLIED
label %Text.datatype; #IMPLIED
value CDATA #IMPLIED
>
<!-- end of option.attlist -->]]>
<!-- textarea: Multi-Line Text Field ................... -->
<!ENTITY % textarea.element "INCLUDE" >
<![%textarea.element;[
<!ENTITY % textarea.content "( #PCDATA )" >
<!ELEMENT %textarea.qname; %textarea.content; >
<!-- end of textarea.element -->]]>
<!ENTITY % textarea.attlist "INCLUDE" >
<![%textarea.attlist;[
<!ATTLIST %textarea.qname;
%Common.attrib;
name CDATA #IMPLIED
rows %Number.datatype; #REQUIRED
cols %Number.datatype; #REQUIRED
disabled ( disabled ) #IMPLIED
readonly ( readonly ) #IMPLIED
tabindex %Number.datatype; #IMPLIED
accesskey %Character.datatype; #IMPLIED
>
<!-- end of textarea.attlist -->]]>
<!-- fieldset: Form Control Group ...................... -->
<!-- #PCDATA is to solve the mixed content problem,
per specification only whitespace is allowed
-->
<!ENTITY % fieldset.element "INCLUDE" >
<![%fieldset.element;[
<!ENTITY % fieldset.content
"( #PCDATA | %legend.qname; | %Flow.mix; )*"
>
<!ELEMENT %fieldset.qname; %fieldset.content; >
<!-- end of fieldset.element -->]]>
<!ENTITY % fieldset.attlist "INCLUDE" >
<![%fieldset.attlist;[
<!ATTLIST %fieldset.qname;
%Common.attrib;
>
<!-- end of fieldset.attlist -->]]>
<!-- legend: Fieldset Legend ........................... -->
<!ENTITY % legend.element "INCLUDE" >
<![%legend.element;[
<!ENTITY % legend.content
"( #PCDATA | %Inline.mix; )*"
>
<!ELEMENT %legend.qname; %legend.content; >
<!-- end of legend.element -->]]>
<!ENTITY % legend.attlist "INCLUDE" >
<![%legend.attlist;[
<!ATTLIST %legend.qname;
%Common.attrib;
accesskey %Character.datatype; #IMPLIED
>
<!-- end of legend.attlist -->]]>
<!-- button: Push Button ............................... -->
<!ENTITY % button.element "INCLUDE" >
<![%button.element;[
<!ENTITY % button.content
"( #PCDATA
| %BlkNoForm.mix;
| %InlStruct.class;
%InlPhras.class;
%InlPres.class;
%I18n.class;
%InlSpecial.class;
%Inline.extra; )*"
>
<!ELEMENT %button.qname; %button.content; >
<!-- end of button.element -->]]>
<!ENTITY % button.attlist "INCLUDE" >
<![%button.attlist;[
<!ATTLIST %button.qname;
%Common.attrib;
name CDATA #IMPLIED
value CDATA #IMPLIED
type ( button | submit | reset ) 'submit'
disabled ( disabled ) #IMPLIED
tabindex %Number.datatype; #IMPLIED
accesskey %Character.datatype; #IMPLIED
>
<!-- end of button.attlist -->]]>
<!-- end of xhtml-form-1.mod -->
@@ -1,97 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Modular Framework Module ...................................... -->
<!-- file: xhtml-framework-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-framework-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ENTITIES XHTML Modular Framework 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-framework-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Modular Framework
This required module instantiates the modules needed
to support the XHTML modularization model, including:
+ datatypes
+ namespace-qualified names
+ common attributes
+ document model
+ character entities
The Intrinsic Events module is ignored by default but
occurs in this module because it must be instantiated
prior to Attributes but after Datatypes.
-->
<!ENTITY % xhtml-arch.module "IGNORE" >
<![%xhtml-arch.module;[
<!ENTITY % xhtml-arch.mod
PUBLIC "-//W3C//ELEMENTS XHTML Base Architecture 1.0//EN"
"xhtml-arch-1.mod" >
%xhtml-arch.mod;]]>
<!ENTITY % xhtml-notations.module "IGNORE" >
<![%xhtml-notations.module;[
<!ENTITY % xhtml-notations.mod
PUBLIC "-//W3C//NOTATIONS XHTML Notations 1.0//EN"
"xhtml-notations-1.mod" >
%xhtml-notations.mod;]]>
<!ENTITY % xhtml-datatypes.module "INCLUDE" >
<![%xhtml-datatypes.module;[
<!ENTITY % xhtml-datatypes.mod
PUBLIC "-//W3C//ENTITIES XHTML Datatypes 1.0//EN"
"xhtml-datatypes-1.mod" >
%xhtml-datatypes.mod;]]>
<!-- placeholder for XLink support module -->
<!ENTITY % xhtml-xlink.mod "" >
%xhtml-xlink.mod;
<!ENTITY % xhtml-qname.module "INCLUDE" >
<![%xhtml-qname.module;[
<!ENTITY % xhtml-qname.mod
PUBLIC "-//W3C//ENTITIES XHTML Qualified Names 1.0//EN"
"xhtml-qname-1.mod" >
%xhtml-qname.mod;]]>
<!ENTITY % xhtml-events.module "IGNORE" >
<![%xhtml-events.module;[
<!ENTITY % xhtml-events.mod
PUBLIC "-//W3C//ENTITIES XHTML Intrinsic Events 1.0//EN"
"xhtml-events-1.mod" >
%xhtml-events.mod;]]>
<!ENTITY % xhtml-attribs.module "INCLUDE" >
<![%xhtml-attribs.module;[
<!ENTITY % xhtml-attribs.mod
PUBLIC "-//W3C//ENTITIES XHTML Common Attributes 1.0//EN"
"xhtml-attribs-1.mod" >
%xhtml-attribs.mod;]]>
<!-- placeholder for content model redeclarations -->
<!ENTITY % xhtml-model.redecl "" >
%xhtml-model.redecl;
<!ENTITY % xhtml-model.module "INCLUDE" >
<![%xhtml-model.module;[
<!-- instantiate the Document Model module declared in the DTD driver
-->
%xhtml-model.mod;]]>
<!ENTITY % xhtml-charent.module "INCLUDE" >
<![%xhtml-charent.module;[
<!ENTITY % xhtml-charent.mod
PUBLIC "-//W3C//ENTITIES XHTML Character Entities 1.0//EN"
"xhtml-charent-1.mod" >
%xhtml-charent.mod;]]>
<!-- end of xhtml-framework-1.mod -->
@@ -1,54 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Hypertext Module .............................................. -->
<!-- file: xhtml-hypertext-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-hypertext-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Hypertext 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-hypertext-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Hypertext
a
This module declares the anchor ('a') element type, which
defines the source of a hypertext link. The destination
(or link 'target') is identified via its 'id' attribute
rather than the 'name' attribute as was used in HTML.
-->
<!-- ............ Anchor Element ............ -->
<!ENTITY % a.element "INCLUDE" >
<![%a.element;[
<!ENTITY % a.content
"( #PCDATA | %InlNoAnchor.mix; )*"
>
<!ENTITY % a.qname "a" >
<!ELEMENT %a.qname; %a.content; >
<!-- end of a.element -->]]>
<!ENTITY % a.attlist "INCLUDE" >
<![%a.attlist;[
<!ATTLIST %a.qname;
%Common.attrib;
href %URI.datatype; #IMPLIED
charset %Charset.datatype; #IMPLIED
type %ContentType.datatype; #IMPLIED
hreflang %LanguageCode.datatype; #IMPLIED
rel %LinkTypes.datatype; #IMPLIED
rev %LinkTypes.datatype; #IMPLIED
accesskey %Character.datatype; #IMPLIED
tabindex %Number.datatype; #IMPLIED
>
<!-- end of a.attlist -->]]>
<!-- end of xhtml-hypertext-1.mod -->
@@ -1,51 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Images Module ................................................. -->
<!-- file: xhtml-image-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Rovision: $Id: xhtml-image-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Images 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-image-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Images
img
This module provides markup to support basic image embedding.
-->
<!-- To avoid problems with text-only UAs as well as to make
image content understandable and navigable to users of
non-visual UAs, you need to provide a description with
the 'alt' attribute, and avoid server-side image maps.
-->
<!ENTITY % img.element "INCLUDE" >
<![%img.element;[
<!ENTITY % img.content "EMPTY" >
<!ENTITY % img.qname "img" >
<!ELEMENT %img.qname; %img.content; >
<!-- end of img.element -->]]>
<!ENTITY % img.attlist "INCLUDE" >
<![%img.attlist;[
<!ATTLIST %img.qname;
%Common.attrib;
src %URI.datatype; #REQUIRED
alt %Text.datatype; #REQUIRED
longdesc %URI.datatype; #IMPLIED
name CDATA #IMPLIED
height %Length.datatype; #IMPLIED
width %Length.datatype; #IMPLIED
>
<!-- end of img.attlist -->]]>
<!-- end of xhtml-image-1.mod -->
@@ -1,203 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Inline Phrasal Module ......................................... -->
<!-- file: xhtml-inlphras-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-inlphras-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Inline Phrasal 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-inlphras-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Inline Phrasal
abbr, acronym, cite, code, dfn, em, kbd, q, samp, strong, var
This module declares the elements and their attributes used to
support inline-level phrasal markup.
-->
<!ENTITY % abbr.element "INCLUDE" >
<![%abbr.element;[
<!ENTITY % abbr.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % abbr.qname "abbr" >
<!ELEMENT %abbr.qname; %abbr.content; >
<!-- end of abbr.element -->]]>
<!ENTITY % abbr.attlist "INCLUDE" >
<![%abbr.attlist;[
<!ATTLIST %abbr.qname;
%Common.attrib;
>
<!-- end of abbr.attlist -->]]>
<!ENTITY % acronym.element "INCLUDE" >
<![%acronym.element;[
<!ENTITY % acronym.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % acronym.qname "acronym" >
<!ELEMENT %acronym.qname; %acronym.content; >
<!-- end of acronym.element -->]]>
<!ENTITY % acronym.attlist "INCLUDE" >
<![%acronym.attlist;[
<!ATTLIST %acronym.qname;
%Common.attrib;
>
<!-- end of acronym.attlist -->]]>
<!ENTITY % cite.element "INCLUDE" >
<![%cite.element;[
<!ENTITY % cite.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % cite.qname "cite" >
<!ELEMENT %cite.qname; %cite.content; >
<!-- end of cite.element -->]]>
<!ENTITY % cite.attlist "INCLUDE" >
<![%cite.attlist;[
<!ATTLIST %cite.qname;
%Common.attrib;
>
<!-- end of cite.attlist -->]]>
<!ENTITY % code.element "INCLUDE" >
<![%code.element;[
<!ENTITY % code.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % code.qname "code" >
<!ELEMENT %code.qname; %code.content; >
<!-- end of code.element -->]]>
<!ENTITY % code.attlist "INCLUDE" >
<![%code.attlist;[
<!ATTLIST %code.qname;
%Common.attrib;
>
<!-- end of code.attlist -->]]>
<!ENTITY % dfn.element "INCLUDE" >
<![%dfn.element;[
<!ENTITY % dfn.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % dfn.qname "dfn" >
<!ELEMENT %dfn.qname; %dfn.content; >
<!-- end of dfn.element -->]]>
<!ENTITY % dfn.attlist "INCLUDE" >
<![%dfn.attlist;[
<!ATTLIST %dfn.qname;
%Common.attrib;
>
<!-- end of dfn.attlist -->]]>
<!ENTITY % em.element "INCLUDE" >
<![%em.element;[
<!ENTITY % em.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % em.qname "em" >
<!ELEMENT %em.qname; %em.content; >
<!-- end of em.element -->]]>
<!ENTITY % em.attlist "INCLUDE" >
<![%em.attlist;[
<!ATTLIST %em.qname;
%Common.attrib;
>
<!-- end of em.attlist -->]]>
<!ENTITY % kbd.element "INCLUDE" >
<![%kbd.element;[
<!ENTITY % kbd.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % kbd.qname "kbd" >
<!ELEMENT %kbd.qname; %kbd.content; >
<!-- end of kbd.element -->]]>
<!ENTITY % kbd.attlist "INCLUDE" >
<![%kbd.attlist;[
<!ATTLIST %kbd.qname;
%Common.attrib;
>
<!-- end of kbd.attlist -->]]>
<!ENTITY % q.element "INCLUDE" >
<![%q.element;[
<!ENTITY % q.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % q.qname "q" >
<!ELEMENT %q.qname; %q.content; >
<!-- end of q.element -->]]>
<!ENTITY % q.attlist "INCLUDE" >
<![%q.attlist;[
<!ATTLIST %q.qname;
%Common.attrib;
cite %URI.datatype; #IMPLIED
>
<!-- end of q.attlist -->]]>
<!ENTITY % samp.element "INCLUDE" >
<![%samp.element;[
<!ENTITY % samp.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % samp.qname "samp" >
<!ELEMENT %samp.qname; %samp.content; >
<!-- end of samp.element -->]]>
<!ENTITY % samp.attlist "INCLUDE" >
<![%samp.attlist;[
<!ATTLIST %samp.qname;
%Common.attrib;
>
<!-- end of samp.attlist -->]]>
<!ENTITY % strong.element "INCLUDE" >
<![%strong.element;[
<!ENTITY % strong.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % strong.qname "strong" >
<!ELEMENT %strong.qname; %strong.content; >
<!-- end of strong.element -->]]>
<!ENTITY % strong.attlist "INCLUDE" >
<![%strong.attlist;[
<!ATTLIST %strong.qname;
%Common.attrib;
>
<!-- end of strong.attlist -->]]>
<!ENTITY % var.element "INCLUDE" >
<![%var.element;[
<!ENTITY % var.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % var.qname "var" >
<!ELEMENT %var.qname; %var.content; >
<!-- end of var.element -->]]>
<!ENTITY % var.attlist "INCLUDE" >
<![%var.attlist;[
<!ATTLIST %var.qname;
%Common.attrib;
>
<!-- end of var.attlist -->]]>
<!-- end of xhtml-inlphras-1.mod -->
@@ -1,138 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Inline Presentation Module .................................... -->
<!-- file: xhtml-inlpres-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-inlpres-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Inline Presentation 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-inlpres-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Inline Presentational Elements
b, big, i, small, sub, sup, tt
This module declares the elements and their attributes used to
support inline-level presentational markup.
-->
<!ENTITY % b.element "INCLUDE" >
<![%b.element;[
<!ENTITY % b.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % b.qname "b" >
<!ELEMENT %b.qname; %b.content; >
<!-- end of b.element -->]]>
<!ENTITY % b.attlist "INCLUDE" >
<![%b.attlist;[
<!ATTLIST %b.qname;
%Common.attrib;
>
<!-- end of b.attlist -->]]>
<!ENTITY % big.element "INCLUDE" >
<![%big.element;[
<!ENTITY % big.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % big.qname "big" >
<!ELEMENT %big.qname; %big.content; >
<!-- end of big.element -->]]>
<!ENTITY % big.attlist "INCLUDE" >
<![%big.attlist;[
<!ATTLIST %big.qname;
%Common.attrib;
>
<!-- end of big.attlist -->]]>
<!ENTITY % i.element "INCLUDE" >
<![%i.element;[
<!ENTITY % i.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % i.qname "i" >
<!ELEMENT %i.qname; %i.content; >
<!-- end of i.element -->]]>
<!ENTITY % i.attlist "INCLUDE" >
<![%i.attlist;[
<!ATTLIST %i.qname;
%Common.attrib;
>
<!-- end of i.attlist -->]]>
<!ENTITY % small.element "INCLUDE" >
<![%small.element;[
<!ENTITY % small.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % small.qname "small" >
<!ELEMENT %small.qname; %small.content; >
<!-- end of small.element -->]]>
<!ENTITY % small.attlist "INCLUDE" >
<![%small.attlist;[
<!ATTLIST %small.qname;
%Common.attrib;
>
<!-- end of small.attlist -->]]>
<!ENTITY % sub.element "INCLUDE" >
<![%sub.element;[
<!ENTITY % sub.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % sub.qname "sub" >
<!ELEMENT %sub.qname; %sub.content; >
<!-- end of sub.element -->]]>
<!ENTITY % sub.attlist "INCLUDE" >
<![%sub.attlist;[
<!ATTLIST %sub.qname;
%Common.attrib;
>
<!-- end of sub.attlist -->]]>
<!ENTITY % sup.element "INCLUDE" >
<![%sup.element;[
<!ENTITY % sup.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % sup.qname "sup" >
<!ELEMENT %sup.qname; %sup.content; >
<!-- end of sup.element -->]]>
<!ENTITY % sup.attlist "INCLUDE" >
<![%sup.attlist;[
<!ATTLIST %sup.qname;
%Common.attrib;
>
<!-- end of sup.attlist -->]]>
<!ENTITY % tt.element "INCLUDE" >
<![%tt.element;[
<!ENTITY % tt.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % tt.qname "tt" >
<!ELEMENT %tt.qname; %tt.content; >
<!-- end of tt.element -->]]>
<!ENTITY % tt.attlist "INCLUDE" >
<![%tt.attlist;[
<!ATTLIST %tt.qname;
%Common.attrib;
>
<!-- end of tt.attlist -->]]>
<!-- end of xhtml-inlpres-1.mod -->
@@ -1,62 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Inline Structural Module ...................................... -->
<!-- file: xhtml-inlstruct-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-inlstruct-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Inline Structural 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-inlstruct-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Inline Structural
br, span
This module declares the elements and their attributes
used to support inline-level structural markup.
-->
<!-- br: forced line break ............................. -->
<!ENTITY % br.element "INCLUDE" >
<![%br.element;[
<!ENTITY % br.content "EMPTY" >
<!ENTITY % br.qname "br" >
<!ELEMENT %br.qname; %br.content; >
<!-- end of br.element -->]]>
<!ENTITY % br.attlist "INCLUDE" >
<![%br.attlist;[
<!ATTLIST %br.qname;
%Core.attrib;
>
<!-- end of br.attlist -->]]>
<!-- span: generic inline container .................... -->
<!ENTITY % span.element "INCLUDE" >
<![%span.element;[
<!ENTITY % span.content
"( #PCDATA | %Inline.mix; )*"
>
<!ENTITY % span.qname "span" >
<!ELEMENT %span.qname; %span.content; >
<!-- end of span.element -->]]>
<!ENTITY % span.attlist "INCLUDE" >
<![%span.attlist;[
<!ATTLIST %span.qname;
%Common.attrib;
>
<!-- end of span.attlist -->]]>
<!-- end of xhtml-inlstruct-1.mod -->
@@ -1,34 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Inline Style Module ........................................... -->
<!-- file: xhtml-inlstyle-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-inlstyle-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ENTITIES XHTML Inline Style 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-inlstyle-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Inline Style
This module declares the 'style' attribute, used to support inline
style markup. This module must be instantiated prior to the XHTML
Common Attributes module in order to be included in %Core.attrib;.
-->
<!ENTITY % style.attrib
"style CDATA #IMPLIED"
>
<!ENTITY % Core.extra.attrib
"%style.attrib;"
>
<!-- end of xhtml-inlstyle-1.mod -->
@@ -1,196 +0,0 @@
<!-- Portions (C) International Organization for Standardization 1986
Permission to copy in any form is granted for use with
conforming SGML systems and applications as defined in
ISO 8879, provided this notice is included in all copies.
-->
<!-- Character entity set. Typical invocation:
<!ENTITY % HTMLlat1 PUBLIC
"-//W3C//ENTITIES Latin 1 for XHTML//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
%HTMLlat1;
-->
<!ENTITY nbsp "&#160;"> <!-- no-break space = non-breaking space,
U+00A0 ISOnum -->
<!ENTITY iexcl "&#161;"> <!-- inverted exclamation mark, U+00A1 ISOnum -->
<!ENTITY cent "&#162;"> <!-- cent sign, U+00A2 ISOnum -->
<!ENTITY pound "&#163;"> <!-- pound sign, U+00A3 ISOnum -->
<!ENTITY curren "&#164;"> <!-- currency sign, U+00A4 ISOnum -->
<!ENTITY yen "&#165;"> <!-- yen sign = yuan sign, U+00A5 ISOnum -->
<!ENTITY brvbar "&#166;"> <!-- broken bar = broken vertical bar,
U+00A6 ISOnum -->
<!ENTITY sect "&#167;"> <!-- section sign, U+00A7 ISOnum -->
<!ENTITY uml "&#168;"> <!-- diaeresis = spacing diaeresis,
U+00A8 ISOdia -->
<!ENTITY copy "&#169;"> <!-- copyright sign, U+00A9 ISOnum -->
<!ENTITY ordf "&#170;"> <!-- feminine ordinal indicator, U+00AA ISOnum -->
<!ENTITY laquo "&#171;"> <!-- left-pointing double angle quotation mark
= left pointing guillemet, U+00AB ISOnum -->
<!ENTITY not "&#172;"> <!-- not sign = angled dash,
U+00AC ISOnum -->
<!ENTITY shy "&#173;"> <!-- soft hyphen = discretionary hyphen,
U+00AD ISOnum -->
<!ENTITY reg "&#174;"> <!-- registered sign = registered trade mark sign,
U+00AE ISOnum -->
<!ENTITY macr "&#175;"> <!-- macron = spacing macron = overline
= APL overbar, U+00AF ISOdia -->
<!ENTITY deg "&#176;"> <!-- degree sign, U+00B0 ISOnum -->
<!ENTITY plusmn "&#177;"> <!-- plus-minus sign = plus-or-minus sign,
U+00B1 ISOnum -->
<!ENTITY sup2 "&#178;"> <!-- superscript two = superscript digit two
= squared, U+00B2 ISOnum -->
<!ENTITY sup3 "&#179;"> <!-- superscript three = superscript digit three
= cubed, U+00B3 ISOnum -->
<!ENTITY acute "&#180;"> <!-- acute accent = spacing acute,
U+00B4 ISOdia -->
<!ENTITY micro "&#181;"> <!-- micro sign, U+00B5 ISOnum -->
<!ENTITY para "&#182;"> <!-- pilcrow sign = paragraph sign,
U+00B6 ISOnum -->
<!ENTITY middot "&#183;"> <!-- middle dot = Georgian comma
= Greek middle dot, U+00B7 ISOnum -->
<!ENTITY cedil "&#184;"> <!-- cedilla = spacing cedilla, U+00B8 ISOdia -->
<!ENTITY sup1 "&#185;"> <!-- superscript one = superscript digit one,
U+00B9 ISOnum -->
<!ENTITY ordm "&#186;"> <!-- masculine ordinal indicator,
U+00BA ISOnum -->
<!ENTITY raquo "&#187;"> <!-- right-pointing double angle quotation mark
= right pointing guillemet, U+00BB ISOnum -->
<!ENTITY frac14 "&#188;"> <!-- vulgar fraction one quarter
= fraction one quarter, U+00BC ISOnum -->
<!ENTITY frac12 "&#189;"> <!-- vulgar fraction one half
= fraction one half, U+00BD ISOnum -->
<!ENTITY frac34 "&#190;"> <!-- vulgar fraction three quarters
= fraction three quarters, U+00BE ISOnum -->
<!ENTITY iquest "&#191;"> <!-- inverted question mark
= turned question mark, U+00BF ISOnum -->
<!ENTITY Agrave "&#192;"> <!-- latin capital letter A with grave
= latin capital letter A grave,
U+00C0 ISOlat1 -->
<!ENTITY Aacute "&#193;"> <!-- latin capital letter A with acute,
U+00C1 ISOlat1 -->
<!ENTITY Acirc "&#194;"> <!-- latin capital letter A with circumflex,
U+00C2 ISOlat1 -->
<!ENTITY Atilde "&#195;"> <!-- latin capital letter A with tilde,
U+00C3 ISOlat1 -->
<!ENTITY Auml "&#196;"> <!-- latin capital letter A with diaeresis,
U+00C4 ISOlat1 -->
<!ENTITY Aring "&#197;"> <!-- latin capital letter A with ring above
= latin capital letter A ring,
U+00C5 ISOlat1 -->
<!ENTITY AElig "&#198;"> <!-- latin capital letter AE
= latin capital ligature AE,
U+00C6 ISOlat1 -->
<!ENTITY Ccedil "&#199;"> <!-- latin capital letter C with cedilla,
U+00C7 ISOlat1 -->
<!ENTITY Egrave "&#200;"> <!-- latin capital letter E with grave,
U+00C8 ISOlat1 -->
<!ENTITY Eacute "&#201;"> <!-- latin capital letter E with acute,
U+00C9 ISOlat1 -->
<!ENTITY Ecirc "&#202;"> <!-- latin capital letter E with circumflex,
U+00CA ISOlat1 -->
<!ENTITY Euml "&#203;"> <!-- latin capital letter E with diaeresis,
U+00CB ISOlat1 -->
<!ENTITY Igrave "&#204;"> <!-- latin capital letter I with grave,
U+00CC ISOlat1 -->
<!ENTITY Iacute "&#205;"> <!-- latin capital letter I with acute,
U+00CD ISOlat1 -->
<!ENTITY Icirc "&#206;"> <!-- latin capital letter I with circumflex,
U+00CE ISOlat1 -->
<!ENTITY Iuml "&#207;"> <!-- latin capital letter I with diaeresis,
U+00CF ISOlat1 -->
<!ENTITY ETH "&#208;"> <!-- latin capital letter ETH, U+00D0 ISOlat1 -->
<!ENTITY Ntilde "&#209;"> <!-- latin capital letter N with tilde,
U+00D1 ISOlat1 -->
<!ENTITY Ograve "&#210;"> <!-- latin capital letter O with grave,
U+00D2 ISOlat1 -->
<!ENTITY Oacute "&#211;"> <!-- latin capital letter O with acute,
U+00D3 ISOlat1 -->
<!ENTITY Ocirc "&#212;"> <!-- latin capital letter O with circumflex,
U+00D4 ISOlat1 -->
<!ENTITY Otilde "&#213;"> <!-- latin capital letter O with tilde,
U+00D5 ISOlat1 -->
<!ENTITY Ouml "&#214;"> <!-- latin capital letter O with diaeresis,
U+00D6 ISOlat1 -->
<!ENTITY times "&#215;"> <!-- multiplication sign, U+00D7 ISOnum -->
<!ENTITY Oslash "&#216;"> <!-- latin capital letter O with stroke
= latin capital letter O slash,
U+00D8 ISOlat1 -->
<!ENTITY Ugrave "&#217;"> <!-- latin capital letter U with grave,
U+00D9 ISOlat1 -->
<!ENTITY Uacute "&#218;"> <!-- latin capital letter U with acute,
U+00DA ISOlat1 -->
<!ENTITY Ucirc "&#219;"> <!-- latin capital letter U with circumflex,
U+00DB ISOlat1 -->
<!ENTITY Uuml "&#220;"> <!-- latin capital letter U with diaeresis,
U+00DC ISOlat1 -->
<!ENTITY Yacute "&#221;"> <!-- latin capital letter Y with acute,
U+00DD ISOlat1 -->
<!ENTITY THORN "&#222;"> <!-- latin capital letter THORN,
U+00DE ISOlat1 -->
<!ENTITY szlig "&#223;"> <!-- latin small letter sharp s = ess-zed,
U+00DF ISOlat1 -->
<!ENTITY agrave "&#224;"> <!-- latin small letter a with grave
= latin small letter a grave,
U+00E0 ISOlat1 -->
<!ENTITY aacute "&#225;"> <!-- latin small letter a with acute,
U+00E1 ISOlat1 -->
<!ENTITY acirc "&#226;"> <!-- latin small letter a with circumflex,
U+00E2 ISOlat1 -->
<!ENTITY atilde "&#227;"> <!-- latin small letter a with tilde,
U+00E3 ISOlat1 -->
<!ENTITY auml "&#228;"> <!-- latin small letter a with diaeresis,
U+00E4 ISOlat1 -->
<!ENTITY aring "&#229;"> <!-- latin small letter a with ring above
= latin small letter a ring,
U+00E5 ISOlat1 -->
<!ENTITY aelig "&#230;"> <!-- latin small letter ae
= latin small ligature ae, U+00E6 ISOlat1 -->
<!ENTITY ccedil "&#231;"> <!-- latin small letter c with cedilla,
U+00E7 ISOlat1 -->
<!ENTITY egrave "&#232;"> <!-- latin small letter e with grave,
U+00E8 ISOlat1 -->
<!ENTITY eacute "&#233;"> <!-- latin small letter e with acute,
U+00E9 ISOlat1 -->
<!ENTITY ecirc "&#234;"> <!-- latin small letter e with circumflex,
U+00EA ISOlat1 -->
<!ENTITY euml "&#235;"> <!-- latin small letter e with diaeresis,
U+00EB ISOlat1 -->
<!ENTITY igrave "&#236;"> <!-- latin small letter i with grave,
U+00EC ISOlat1 -->
<!ENTITY iacute "&#237;"> <!-- latin small letter i with acute,
U+00ED ISOlat1 -->
<!ENTITY icirc "&#238;"> <!-- latin small letter i with circumflex,
U+00EE ISOlat1 -->
<!ENTITY iuml "&#239;"> <!-- latin small letter i with diaeresis,
U+00EF ISOlat1 -->
<!ENTITY eth "&#240;"> <!-- latin small letter eth, U+00F0 ISOlat1 -->
<!ENTITY ntilde "&#241;"> <!-- latin small letter n with tilde,
U+00F1 ISOlat1 -->
<!ENTITY ograve "&#242;"> <!-- latin small letter o with grave,
U+00F2 ISOlat1 -->
<!ENTITY oacute "&#243;"> <!-- latin small letter o with acute,
U+00F3 ISOlat1 -->
<!ENTITY ocirc "&#244;"> <!-- latin small letter o with circumflex,
U+00F4 ISOlat1 -->
<!ENTITY otilde "&#245;"> <!-- latin small letter o with tilde,
U+00F5 ISOlat1 -->
<!ENTITY ouml "&#246;"> <!-- latin small letter o with diaeresis,
U+00F6 ISOlat1 -->
<!ENTITY divide "&#247;"> <!-- division sign, U+00F7 ISOnum -->
<!ENTITY oslash "&#248;"> <!-- latin small letter o with stroke,
= latin small letter o slash,
U+00F8 ISOlat1 -->
<!ENTITY ugrave "&#249;"> <!-- latin small letter u with grave,
U+00F9 ISOlat1 -->
<!ENTITY uacute "&#250;"> <!-- latin small letter u with acute,
U+00FA ISOlat1 -->
<!ENTITY ucirc "&#251;"> <!-- latin small letter u with circumflex,
U+00FB ISOlat1 -->
<!ENTITY uuml "&#252;"> <!-- latin small letter u with diaeresis,
U+00FC ISOlat1 -->
<!ENTITY yacute "&#253;"> <!-- latin small letter y with acute,
U+00FD ISOlat1 -->
<!ENTITY thorn "&#254;"> <!-- latin small letter thorn,
U+00FE ISOlat1 -->
<!ENTITY yuml "&#255;"> <!-- latin small letter y with diaeresis,
U+00FF ISOlat1 -->
@@ -1,59 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Link Element Module ........................................... -->
<!-- file: xhtml-link-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-link-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Link Element 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-link-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Link element
link
This module declares the link element type and its attributes,
which could (in principle) be used to define document-level links
to external resources such as:
a) for document specific toolbars/menus, e.g. start, contents,
previous, next, index, end, help
b) to link to a separate style sheet (rel="stylesheet")
c) to make a link to a script (rel="script")
d) by style sheets to control how collections of html nodes are
rendered into printed documents
e) to make a link to a printable version of this document
e.g. a postscript or pdf version (rel="alternate" media="print")
-->
<!-- link: Media-Independent Link ...................... -->
<!ENTITY % link.element "INCLUDE" >
<![%link.element;[
<!ENTITY % link.content "EMPTY" >
<!ENTITY % link.qname "link" >
<!ELEMENT %link.qname; %link.content; >
<!-- end of link.element -->]]>
<!ENTITY % link.attlist "INCLUDE" >
<![%link.attlist;[
<!ATTLIST %link.qname;
%Common.attrib;
charset %Charset.datatype; #IMPLIED
href %URI.datatype; #IMPLIED
hreflang %LanguageCode.datatype; #IMPLIED
type %ContentType.datatype; #IMPLIED
rel %LinkTypes.datatype; #IMPLIED
rev %LinkTypes.datatype; #IMPLIED
media %MediaDesc.datatype; #IMPLIED
>
<!-- end of link.attlist -->]]>
<!-- end of xhtml-link-1.mod -->
@@ -1,129 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Lists Module .................................................. -->
<!-- file: xhtml-list-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-list-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Lists 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-list-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Lists
dl, dt, dd, ol, ul, li
This module declares the list-oriented element types
and their attributes.
-->
<!ENTITY % dl.qname "dl" >
<!ENTITY % dt.qname "dt" >
<!ENTITY % dd.qname "dd" >
<!ENTITY % ol.qname "ol" >
<!ENTITY % ul.qname "ul" >
<!ENTITY % li.qname "li" >
<!-- dl: Definition List ............................... -->
<!ENTITY % dl.element "INCLUDE" >
<![%dl.element;[
<!ENTITY % dl.content "( %dt.qname; | %dd.qname; )+" >
<!ELEMENT %dl.qname; %dl.content; >
<!-- end of dl.element -->]]>
<!ENTITY % dl.attlist "INCLUDE" >
<![%dl.attlist;[
<!ATTLIST %dl.qname;
%Common.attrib;
>
<!-- end of dl.attlist -->]]>
<!-- dt: Definition Term ............................... -->
<!ENTITY % dt.element "INCLUDE" >
<![%dt.element;[
<!ENTITY % dt.content
"( #PCDATA | %Inline.mix; )*"
>
<!ELEMENT %dt.qname; %dt.content; >
<!-- end of dt.element -->]]>
<!ENTITY % dt.attlist "INCLUDE" >
<![%dt.attlist;[
<!ATTLIST %dt.qname;
%Common.attrib;
>
<!-- end of dt.attlist -->]]>
<!-- dd: Definition Description ........................ -->
<!ENTITY % dd.element "INCLUDE" >
<![%dd.element;[
<!ENTITY % dd.content
"( #PCDATA | %Flow.mix; )*"
>
<!ELEMENT %dd.qname; %dd.content; >
<!-- end of dd.element -->]]>
<!ENTITY % dd.attlist "INCLUDE" >
<![%dd.attlist;[
<!ATTLIST %dd.qname;
%Common.attrib;
>
<!-- end of dd.attlist -->]]>
<!-- ol: Ordered List (numbered styles) ................ -->
<!ENTITY % ol.element "INCLUDE" >
<![%ol.element;[
<!ENTITY % ol.content "( %li.qname; )+" >
<!ELEMENT %ol.qname; %ol.content; >
<!-- end of ol.element -->]]>
<!ENTITY % ol.attlist "INCLUDE" >
<![%ol.attlist;[
<!ATTLIST %ol.qname;
%Common.attrib;
>
<!-- end of ol.attlist -->]]>
<!-- ul: Unordered List (bullet styles) ................ -->
<!ENTITY % ul.element "INCLUDE" >
<![%ul.element;[
<!ENTITY % ul.content "( %li.qname; )+" >
<!ELEMENT %ul.qname; %ul.content; >
<!-- end of ul.element -->]]>
<!ENTITY % ul.attlist "INCLUDE" >
<![%ul.attlist;[
<!ATTLIST %ul.qname;
%Common.attrib;
>
<!-- end of ul.attlist -->]]>
<!-- li: List Item ..................................... -->
<!ENTITY % li.element "INCLUDE" >
<![%li.element;[
<!ENTITY % li.content
"( #PCDATA | %Flow.mix; )*"
>
<!ELEMENT %li.qname; %li.content; >
<!-- end of li.element -->]]>
<!ENTITY % li.attlist "INCLUDE" >
<![%li.attlist;[
<!ATTLIST %li.qname;
%Common.attrib;
>
<!-- end of li.attlist -->]]>
<!-- end of xhtml-list-1.mod -->
@@ -1,47 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Document Metainformation Module ............................... -->
<!-- file: xhtml-meta-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-meta-1.mod,v 1.1 2010/07/29 13:42:47 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Metainformation 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-meta-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Meta Information
meta
This module declares the meta element type and its attributes,
used to provide declarative document metainformation.
-->
<!-- meta: Generic Metainformation ..................... -->
<!ENTITY % meta.element "INCLUDE" >
<![%meta.element;[
<!ENTITY % meta.content "EMPTY" >
<!ENTITY % meta.qname "meta" >
<!ELEMENT %meta.qname; %meta.content; >
<!-- end of meta.element -->]]>
<!ENTITY % meta.attlist "INCLUDE" >
<![%meta.attlist;[
<!ATTLIST %meta.qname;
%XHTML.xmlns.attrib;
%I18n.attrib;
http-equiv NMTOKEN #IMPLIED
name NMTOKEN #IMPLIED
content CDATA #REQUIRED
scheme CDATA #IMPLIED
>
<!-- end of meta.attlist -->]]>
<!-- end of xhtml-meta-1.mod -->
@@ -1,114 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Notations Module .............................................. -->
<!-- file: xhtml-notations-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-notations-1.mod,v 1.1 2010/07/29 13:42:48 bertails Exp $
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//NOTATIONS XHTML Notations 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-notations-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Notations
defines the following notations, many of these imported from
other specifications and standards. When an existing FPI is
known, it is incorporated here.
-->
<!-- XML Notations ..................................... -->
<!-- SGML and XML Notations ............................ -->
<!-- W3C XML 1.0 Recommendation -->
<!NOTATION w3c-xml
PUBLIC "ISO 8879//NOTATION Extensible Markup Language (XML) 1.0//EN" >
<!-- XML 1.0 CDATA -->
<!NOTATION cdata
PUBLIC "-//W3C//NOTATION XML 1.0: CDATA//EN" >
<!-- SGML Formal Public Identifiers -->
<!NOTATION fpi
PUBLIC "ISO 8879:1986//NOTATION Formal Public Identifier//EN" >
<!-- XHTML Notations ................................... -->
<!-- Length defined for cellpadding/cellspacing -->
<!-- nn for pixels or nn% for percentage length -->
<!NOTATION length
PUBLIC "-//W3C//NOTATION XHTML Datatype: Length//EN" >
<!-- space-separated list of link types -->
<!NOTATION linkTypes
PUBLIC "-//W3C//NOTATION XHTML Datatype: LinkTypes//EN" >
<!-- single or comma-separated list of media descriptors -->
<!NOTATION mediaDesc
PUBLIC "-//W3C//NOTATION XHTML Datatype: MediaDesc//EN" >
<!-- pixel, percentage, or relative -->
<!NOTATION multiLength
PUBLIC "-//W3C//NOTATION XHTML Datatype: MultiLength//EN" >
<!-- one or more digits (NUMBER) -->
<!NOTATION number
PUBLIC "-//W3C//NOTATION XHTML Datatype: Number//EN" >
<!-- integer representing length in pixels -->
<!NOTATION pixels
PUBLIC "-//W3C//NOTATION XHTML Datatype: Pixels//EN" >
<!-- script expression -->
<!NOTATION script
PUBLIC "-//W3C//NOTATION XHTML Datatype: Script//EN" >
<!-- textual content -->
<!NOTATION text
PUBLIC "-//W3C//NOTATION XHTML Datatype: Text//EN" >
<!-- Imported Notations ................................ -->
<!-- a single character from [ISO10646] -->
<!NOTATION character
PUBLIC "-//W3C//NOTATION XHTML Datatype: Character//EN" >
<!-- a character encoding, as per [RFC2045] -->
<!NOTATION charset
PUBLIC "-//W3C//NOTATION XHTML Datatype: Charset//EN" >
<!-- a space separated list of character encodings, as per [RFC2045] -->
<!NOTATION charsets
PUBLIC "-//W3C//NOTATION XHTML Datatype: Charsets//EN" >
<!-- media type, as per [RFC2045] -->
<!NOTATION contentType
PUBLIC "-//W3C//NOTATION XHTML Datatype: ContentType//EN" >
<!-- comma-separated list of media types, as per [RFC2045] -->
<!NOTATION contentTypes
PUBLIC "-//W3C//NOTATION XHTML Datatype: ContentTypes//EN" >
<!-- date and time information. ISO date format -->
<!NOTATION datetime
PUBLIC "-//W3C//NOTATION XHTML Datatype: Datetime//EN" >
<!-- a language code, as per [RFC3066] -->
<!NOTATION languageCode
PUBLIC "-//W3C//NOTATION XHTML Datatype: LanguageCode//EN" >
<!-- a Uniform Resource Identifier, see [URI] -->
<!NOTATION uri
PUBLIC "-//W3C//NOTATION XHTML Datatype: URI//EN" >
<!-- a space-separated list of Uniform Resource Identifiers, see [URI] -->
<!NOTATION uris
PUBLIC "-//W3C//NOTATION XHTML Datatype: URIs//EN" >
<!-- end of xhtml-notations-1.mod -->
@@ -1,60 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Embedded Object Module ........................................ -->
<!-- file: xhtml-object-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-object-1.mod,v 1.1 2010/07/29 13:42:48 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Embedded Object 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-object-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Embedded Objects
object
This module declares the object element type and its attributes, used
to embed external objects as part of XHTML pages. In the document,
place param elements prior to other content within the object element.
Note that use of this module requires instantiation of the Param
Element Module.
-->
<!-- object: Generic Embedded Object ................... -->
<!ENTITY % object.element "INCLUDE" >
<![%object.element;[
<!ENTITY % object.content
"( #PCDATA | %Flow.mix; | %param.qname; )*"
>
<!ENTITY % object.qname "object" >
<!ELEMENT %object.qname; %object.content; >
<!-- end of object.element -->]]>
<!ENTITY % object.attlist "INCLUDE" >
<![%object.attlist;[
<!ATTLIST %object.qname;
%Common.attrib;
declare ( declare ) #IMPLIED
classid %URI.datatype; #IMPLIED
codebase %URI.datatype; #IMPLIED
data %URI.datatype; #IMPLIED
type %ContentType.datatype; #IMPLIED
codetype %ContentType.datatype; #IMPLIED
archive %URIs.datatype; #IMPLIED
standby %Text.datatype; #IMPLIED
height %Length.datatype; #IMPLIED
width %Length.datatype; #IMPLIED
name CDATA #IMPLIED
tabindex %Number.datatype; #IMPLIED
>
<!-- end of object.attlist -->]]>
<!-- end of xhtml-object-1.mod -->
@@ -1,48 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Param Element Module ..................................... -->
<!-- file: xhtml-param-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-param-1.mod,v 1.1 2010/07/29 13:42:48 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Param Element 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-param-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Parameters for Java Applets and Embedded Objects
param
This module provides declarations for the param element,
used to provide named property values for the applet
and object elements.
-->
<!-- param: Named Property Value ....................... -->
<!ENTITY % param.element "INCLUDE" >
<![%param.element;[
<!ENTITY % param.content "EMPTY" >
<!ENTITY % param.qname "param" >
<!ELEMENT %param.qname; %param.content; >
<!-- end of param.element -->]]>
<!ENTITY % param.attlist "INCLUDE" >
<![%param.attlist;[
<!ATTLIST %param.qname;
%XHTML.xmlns.attrib;
%id.attrib;
name CDATA #REQUIRED
value CDATA #IMPLIED
valuetype ( data | ref | object ) 'data'
type %ContentType.datatype; #IMPLIED
>
<!-- end of param.attlist -->]]>
<!-- end of xhtml-param-1.mod -->
@@ -1,38 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Presentation Module ............................................ -->
<!-- file: xhtml-pres-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-pres-1.mod,v 1.1 2010/07/29 13:42:48 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Presentation 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-pres-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Presentational Elements
This module defines elements and their attributes for
simple presentation-related markup.
-->
<!ENTITY % xhtml-inlpres.module "INCLUDE" >
<![%xhtml-inlpres.module;[
<!ENTITY % xhtml-inlpres.mod
PUBLIC "-//W3C//ELEMENTS XHTML Inline Presentation 1.0//EN"
"xhtml-inlpres-1.mod" >
%xhtml-inlpres.mod;]]>
<!ENTITY % xhtml-blkpres.module "INCLUDE" >
<![%xhtml-blkpres.module;[
<!ENTITY % xhtml-blkpres.mod
PUBLIC "-//W3C//ELEMENTS XHTML Block Presentation 1.0//EN"
"xhtml-blkpres-1.mod" >
%xhtml-blkpres.mod;]]>
<!-- end of xhtml-pres-1.mod -->
@@ -1,318 +0,0 @@
<!-- ....................................................................... -->
<!-- XHTML Qname Module ................................................... -->
<!-- file: xhtml-qname-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-qname-1.mod,v 1.1 2010/07/29 13:42:48 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ENTITIES XHTML Qualified Names 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-qname-1.mod"
Revisions:
#2000-10-22: added qname declarations for ruby elements
....................................................................... -->
<!-- XHTML Qname (Qualified Name) Module
This module is contained in two parts, labeled Section 'A' and 'B':
Section A declares parameter entities to support namespace-
qualified names, namespace declarations, and name prefixing
for XHTML and extensions.
Section B declares parameter entities used to provide
namespace-qualified names for all XHTML element types:
%applet.qname; the xmlns-qualified name for <applet>
%base.qname; the xmlns-qualified name for <base>
...
XHTML extensions would create a module similar to this one.
Included in the XHTML distribution is a template module
('template-qname-1.mod') suitable for this purpose.
-->
<!-- Section A: XHTML XML Namespace Framework :::::::::::::::::::: -->
<!-- 1. Declare a %XHTML.prefixed; conditional section keyword, used
to activate namespace prefixing. The default value should
inherit '%NS.prefixed;' from the DTD driver, so that unless
overridden, the default behaviour follows the overall DTD
prefixing scheme.
-->
<!ENTITY % NS.prefixed "IGNORE" >
<!ENTITY % XHTML.prefixed "%NS.prefixed;" >
<!-- By default, we always permit XHTML attribute collections to have
namespace-qualified prefixes as well.
-->
<!ENTITY % XHTML.global.attrs.prefixed "INCLUDE" >
<!-- By default, we allow the XML Schema attributes on the root
element.
-->
<!ENTITY % XHTML.xsi.attrs "INCLUDE" >
<!-- 2. Declare a parameter entity (eg., %XHTML.xmlns;) containing
the URI reference used to identify the XHTML namespace:
-->
<!ENTITY % XHTML.xmlns "http://www.w3.org/1999/xhtml" >
<!-- 3. Declare parameter entities (eg., %XHTML.prefix;) containing
the default namespace prefix string(s) to use when prefixing
is enabled. This may be overridden in the DTD driver or the
internal subset of an document instance. If no default prefix
is desired, this may be declared as an empty string.
NOTE: As specified in [XMLNAMES], the namespace prefix serves
as a proxy for the URI reference, and is not in itself significant.
-->
<!ENTITY % XHTML.prefix "xhtml" >
<!-- 4. Declare parameter entities (eg., %XHTML.pfx;) containing the
colonized prefix(es) (eg., '%XHTML.prefix;:') used when
prefixing is active, an empty string when it is not.
-->
<![%XHTML.prefixed;[
<!ENTITY % XHTML.pfx "%XHTML.prefix;:" >
]]>
<!ENTITY % XHTML.pfx "" >
<!-- declare qualified name extensions here ............ -->
<!ENTITY % xhtml-qname-extra.mod "" >
%xhtml-qname-extra.mod;
<!-- 5. The parameter entity %XHTML.xmlns.extra.attrib; may be
redeclared to contain any non-XHTML namespace declaration
attributes for namespaces embedded in XHTML. The default
is an empty string. XLink should be included here if used
in the DTD.
-->
<!ENTITY % XHTML.xmlns.extra.attrib "" >
<!-- The remainder of Section A is only followed in XHTML, not extensions. -->
<!-- Declare a parameter entity %NS.decl.attrib; containing
all XML Namespace declarations used in the DTD, plus the
xmlns declaration for XHTML, its form dependent on whether
prefixing is active.
-->
<!ENTITY % XHTML.xmlns.attrib.prefixed
"xmlns:%XHTML.prefix; %URI.datatype; #FIXED '%XHTML.xmlns;'"
>
<![%XHTML.prefixed;[
<!ENTITY % NS.decl.attrib
"%XHTML.xmlns.attrib.prefixed;
%XHTML.xmlns.extra.attrib;"
>
]]>
<!ENTITY % NS.decl.attrib
"%XHTML.xmlns.extra.attrib;"
>
<!-- Declare a parameter entity %XSI.prefix as a prefix to use for XML
Schema Instance attributes.
-->
<!ENTITY % XSI.prefix "xsi" >
<!ENTITY % XSI.xmlns "http://www.w3.org/2001/XMLSchema-instance" >
<!-- Declare a parameter entity %XSI.xmlns.attrib as support for the
schemaLocation attribute, since this is legal throughout the DTD.
-->
<!ENTITY % XSI.xmlns.attrib
"xmlns:%XSI.prefix; %URI.datatype; #FIXED '%XSI.xmlns;'" >
<!-- This is a placeholder for future XLink support.
-->
<!ENTITY % XLINK.xmlns.attrib "" >
<!-- This is the attribute for the XML Schema namespace - XHTML
Modularization is also expressed in XML Schema, and it needs to
be legal to declare the XML Schema namespace and the
schemaLocation attribute on the root element of XHTML family
documents.
-->
<![%XHTML.xsi.attrs;[
<!ENTITY % XSI.prefix "xsi" >
<!ENTITY % XSI.pfx "%XSI.prefix;:" >
<!ENTITY % XSI.xmlns "http://www.w3.org/2001/XMLSchema-instance" >
<!ENTITY % XSI.xmlns.attrib
"xmlns:%XSI.prefix; %URI.datatype; #FIXED '%XSI.xmlns;'"
>
]]>
<!ENTITY % XSI.prefix "" >
<!ENTITY % XSI.pfx "" >
<!ENTITY % XSI.xmlns.attrib "" >
<!-- Declare a parameter entity %NS.decl.attrib; containing all
XML namespace declaration attributes used by XHTML, including
a default xmlns attribute when prefixing is inactive.
-->
<![%XHTML.prefixed;[
<!ENTITY % XHTML.xmlns.attrib
"%NS.decl.attrib;
%XSI.xmlns.attrib;
%XLINK.xmlns.attrib;"
>
]]>
<!ENTITY % XHTML.xmlns.attrib
"xmlns %URI.datatype; #FIXED '%XHTML.xmlns;'
%NS.decl.attrib;
%XSI.xmlns.attrib;
%XLINK.xmlns.attrib;"
>
<!-- placeholder for qualified name redeclarations -->
<!ENTITY % xhtml-qname.redecl "" >
%xhtml-qname.redecl;
<!-- Section B: XHTML Qualified Names ::::::::::::::::::::::::::::: -->
<!-- 6. This section declares parameter entities used to provide
namespace-qualified names for all XHTML element types.
-->
<!-- module: xhtml-applet-1.mod -->
<!ENTITY % applet.qname "%XHTML.pfx;applet" >
<!-- module: xhtml-base-1.mod -->
<!ENTITY % base.qname "%XHTML.pfx;base" >
<!-- module: xhtml-bdo-1.mod -->
<!ENTITY % bdo.qname "%XHTML.pfx;bdo" >
<!-- module: xhtml-blkphras-1.mod -->
<!ENTITY % address.qname "%XHTML.pfx;address" >
<!ENTITY % blockquote.qname "%XHTML.pfx;blockquote" >
<!ENTITY % pre.qname "%XHTML.pfx;pre" >
<!ENTITY % h1.qname "%XHTML.pfx;h1" >
<!ENTITY % h2.qname "%XHTML.pfx;h2" >
<!ENTITY % h3.qname "%XHTML.pfx;h3" >
<!ENTITY % h4.qname "%XHTML.pfx;h4" >
<!ENTITY % h5.qname "%XHTML.pfx;h5" >
<!ENTITY % h6.qname "%XHTML.pfx;h6" >
<!-- module: xhtml-blkpres-1.mod -->
<!ENTITY % hr.qname "%XHTML.pfx;hr" >
<!-- module: xhtml-blkstruct-1.mod -->
<!ENTITY % div.qname "%XHTML.pfx;div" >
<!ENTITY % p.qname "%XHTML.pfx;p" >
<!-- module: xhtml-edit-1.mod -->
<!ENTITY % ins.qname "%XHTML.pfx;ins" >
<!ENTITY % del.qname "%XHTML.pfx;del" >
<!-- module: xhtml-form-1.mod -->
<!ENTITY % form.qname "%XHTML.pfx;form" >
<!ENTITY % label.qname "%XHTML.pfx;label" >
<!ENTITY % input.qname "%XHTML.pfx;input" >
<!ENTITY % select.qname "%XHTML.pfx;select" >
<!ENTITY % optgroup.qname "%XHTML.pfx;optgroup" >
<!ENTITY % option.qname "%XHTML.pfx;option" >
<!ENTITY % textarea.qname "%XHTML.pfx;textarea" >
<!ENTITY % fieldset.qname "%XHTML.pfx;fieldset" >
<!ENTITY % legend.qname "%XHTML.pfx;legend" >
<!ENTITY % button.qname "%XHTML.pfx;button" >
<!-- module: xhtml-hypertext-1.mod -->
<!ENTITY % a.qname "%XHTML.pfx;a" >
<!-- module: xhtml-image-1.mod -->
<!ENTITY % img.qname "%XHTML.pfx;img" >
<!-- module: xhtml-inlphras-1.mod -->
<!ENTITY % abbr.qname "%XHTML.pfx;abbr" >
<!ENTITY % acronym.qname "%XHTML.pfx;acronym" >
<!ENTITY % cite.qname "%XHTML.pfx;cite" >
<!ENTITY % code.qname "%XHTML.pfx;code" >
<!ENTITY % dfn.qname "%XHTML.pfx;dfn" >
<!ENTITY % em.qname "%XHTML.pfx;em" >
<!ENTITY % kbd.qname "%XHTML.pfx;kbd" >
<!ENTITY % q.qname "%XHTML.pfx;q" >
<!ENTITY % samp.qname "%XHTML.pfx;samp" >
<!ENTITY % strong.qname "%XHTML.pfx;strong" >
<!ENTITY % var.qname "%XHTML.pfx;var" >
<!-- module: xhtml-inlpres-1.mod -->
<!ENTITY % b.qname "%XHTML.pfx;b" >
<!ENTITY % big.qname "%XHTML.pfx;big" >
<!ENTITY % i.qname "%XHTML.pfx;i" >
<!ENTITY % small.qname "%XHTML.pfx;small" >
<!ENTITY % sub.qname "%XHTML.pfx;sub" >
<!ENTITY % sup.qname "%XHTML.pfx;sup" >
<!ENTITY % tt.qname "%XHTML.pfx;tt" >
<!-- module: xhtml-inlstruct-1.mod -->
<!ENTITY % br.qname "%XHTML.pfx;br" >
<!ENTITY % span.qname "%XHTML.pfx;span" >
<!-- module: xhtml-ismap-1.mod (also csismap, ssismap) -->
<!ENTITY % map.qname "%XHTML.pfx;map" >
<!ENTITY % area.qname "%XHTML.pfx;area" >
<!-- module: xhtml-link-1.mod -->
<!ENTITY % link.qname "%XHTML.pfx;link" >
<!-- module: xhtml-list-1.mod -->
<!ENTITY % dl.qname "%XHTML.pfx;dl" >
<!ENTITY % dt.qname "%XHTML.pfx;dt" >
<!ENTITY % dd.qname "%XHTML.pfx;dd" >
<!ENTITY % ol.qname "%XHTML.pfx;ol" >
<!ENTITY % ul.qname "%XHTML.pfx;ul" >
<!ENTITY % li.qname "%XHTML.pfx;li" >
<!-- module: xhtml-meta-1.mod -->
<!ENTITY % meta.qname "%XHTML.pfx;meta" >
<!-- module: xhtml-param-1.mod -->
<!ENTITY % param.qname "%XHTML.pfx;param" >
<!-- module: xhtml-object-1.mod -->
<!ENTITY % object.qname "%XHTML.pfx;object" >
<!-- module: xhtml-script-1.mod -->
<!ENTITY % script.qname "%XHTML.pfx;script" >
<!ENTITY % noscript.qname "%XHTML.pfx;noscript" >
<!-- module: xhtml-struct-1.mod -->
<!ENTITY % html.qname "%XHTML.pfx;html" >
<!ENTITY % head.qname "%XHTML.pfx;head" >
<!ENTITY % title.qname "%XHTML.pfx;title" >
<!ENTITY % body.qname "%XHTML.pfx;body" >
<!-- module: xhtml-style-1.mod -->
<!ENTITY % style.qname "%XHTML.pfx;style" >
<!-- module: xhtml-table-1.mod -->
<!ENTITY % table.qname "%XHTML.pfx;table" >
<!ENTITY % caption.qname "%XHTML.pfx;caption" >
<!ENTITY % thead.qname "%XHTML.pfx;thead" >
<!ENTITY % tfoot.qname "%XHTML.pfx;tfoot" >
<!ENTITY % tbody.qname "%XHTML.pfx;tbody" >
<!ENTITY % colgroup.qname "%XHTML.pfx;colgroup" >
<!ENTITY % col.qname "%XHTML.pfx;col" >
<!ENTITY % tr.qname "%XHTML.pfx;tr" >
<!ENTITY % th.qname "%XHTML.pfx;th" >
<!ENTITY % td.qname "%XHTML.pfx;td" >
<!-- module: xhtml-ruby-1.mod -->
<!ENTITY % ruby.qname "%XHTML.pfx;ruby" >
<!ENTITY % rbc.qname "%XHTML.pfx;rbc" >
<!ENTITY % rtc.qname "%XHTML.pfx;rtc" >
<!ENTITY % rb.qname "%XHTML.pfx;rb" >
<!ENTITY % rt.qname "%XHTML.pfx;rt" >
<!ENTITY % rp.qname "%XHTML.pfx;rp" >
<!-- Provisional XHTML 2.0 Qualified Names ...................... -->
<!-- module: xhtml-image-2.mod -->
<!ENTITY % alt.qname "%XHTML.pfx;alt" >
<!-- end of xhtml-qname-1.mod -->
@@ -1,67 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Document Scripting Module ..................................... -->
<!-- file: xhtml-script-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-script-1.mod,v 1.1 2010/07/29 13:42:48 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Scripting 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-script-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Scripting
script, noscript
This module declares element types and attributes used to provide
support for executable scripts as well as an alternate content
container where scripts are not supported.
-->
<!-- script: Scripting Statement ....................... -->
<!ENTITY % script.element "INCLUDE" >
<![%script.element;[
<!ENTITY % script.content "( #PCDATA )" >
<!ENTITY % script.qname "script" >
<!ELEMENT %script.qname; %script.content; >
<!-- end of script.element -->]]>
<!ENTITY % script.attlist "INCLUDE" >
<![%script.attlist;[
<!ATTLIST %script.qname;
%XHTML.xmlns.attrib;
%id.attrib;
xml:space ( preserve ) #FIXED 'preserve'
charset %Charset.datatype; #IMPLIED
type %ContentType.datatype; #REQUIRED
src %URI.datatype; #IMPLIED
defer ( defer ) #IMPLIED
>
<!-- end of script.attlist -->]]>
<!-- noscript: No-Script Alternate Content ............. -->
<!ENTITY % noscript.element "INCLUDE" >
<![%noscript.element;[
<!ENTITY % noscript.content
"( %Block.mix; )+"
>
<!ENTITY % noscript.qname "noscript" >
<!ELEMENT %noscript.qname; %noscript.content; >
<!-- end of noscript.element -->]]>
<!ENTITY % noscript.attlist "INCLUDE" >
<![%noscript.attlist;[
<!ATTLIST %noscript.qname;
%Common.attrib;
>
<!-- end of noscript.attlist -->]]>
<!-- end of xhtml-script-1.mod -->
@@ -1,80 +0,0 @@
<!-- Special characters for XHTML -->
<!-- Character entity set. Typical invocation:
<!ENTITY % HTMLspecial PUBLIC
"-//W3C//ENTITIES Special for XHTML//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent">
%HTMLspecial;
-->
<!-- Portions (C) International Organization for Standardization 1986:
Permission to copy in any form is granted for use with
conforming SGML systems and applications as defined in
ISO 8879, provided this notice is included in all copies.
-->
<!-- Relevant ISO entity set is given unless names are newly introduced.
New names (i.e., not in ISO 8879 list) do not clash with any
existing ISO 8879 entity names. ISO 10646 character numbers
are given for each character, in hex. values are decimal
conversions of the ISO 10646 values and refer to the document
character set. Names are Unicode names.
-->
<!-- C0 Controls and Basic Latin -->
<!ENTITY quot "&#34;"> <!-- quotation mark, U+0022 ISOnum -->
<!ENTITY amp "&#38;#38;"> <!-- ampersand, U+0026 ISOnum -->
<!ENTITY lt "&#38;#60;"> <!-- less-than sign, U+003C ISOnum -->
<!ENTITY gt "&#62;"> <!-- greater-than sign, U+003E ISOnum -->
<!ENTITY apos "&#39;"> <!-- apostrophe = APL quote, U+0027 ISOnum -->
<!-- Latin Extended-A -->
<!ENTITY OElig "&#338;"> <!-- latin capital ligature OE,
U+0152 ISOlat2 -->
<!ENTITY oelig "&#339;"> <!-- latin small ligature oe, U+0153 ISOlat2 -->
<!-- ligature is a misnomer, this is a separate character in some languages -->
<!ENTITY Scaron "&#352;"> <!-- latin capital letter S with caron,
U+0160 ISOlat2 -->
<!ENTITY scaron "&#353;"> <!-- latin small letter s with caron,
U+0161 ISOlat2 -->
<!ENTITY Yuml "&#376;"> <!-- latin capital letter Y with diaeresis,
U+0178 ISOlat2 -->
<!-- Spacing Modifier Letters -->
<!ENTITY circ "&#710;"> <!-- modifier letter circumflex accent,
U+02C6 ISOpub -->
<!ENTITY tilde "&#732;"> <!-- small tilde, U+02DC ISOdia -->
<!-- General Punctuation -->
<!ENTITY ensp "&#8194;"> <!-- en space, U+2002 ISOpub -->
<!ENTITY emsp "&#8195;"> <!-- em space, U+2003 ISOpub -->
<!ENTITY thinsp "&#8201;"> <!-- thin space, U+2009 ISOpub -->
<!ENTITY zwnj "&#8204;"> <!-- zero width non-joiner,
U+200C NEW RFC 2070 -->
<!ENTITY zwj "&#8205;"> <!-- zero width joiner, U+200D NEW RFC 2070 -->
<!ENTITY lrm "&#8206;"> <!-- left-to-right mark, U+200E NEW RFC 2070 -->
<!ENTITY rlm "&#8207;"> <!-- right-to-left mark, U+200F NEW RFC 2070 -->
<!ENTITY ndash "&#8211;"> <!-- en dash, U+2013 ISOpub -->
<!ENTITY mdash "&#8212;"> <!-- em dash, U+2014 ISOpub -->
<!ENTITY lsquo "&#8216;"> <!-- left single quotation mark,
U+2018 ISOnum -->
<!ENTITY rsquo "&#8217;"> <!-- right single quotation mark,
U+2019 ISOnum -->
<!ENTITY sbquo "&#8218;"> <!-- single low-9 quotation mark, U+201A NEW -->
<!ENTITY ldquo "&#8220;"> <!-- left double quotation mark,
U+201C ISOnum -->
<!ENTITY rdquo "&#8221;"> <!-- right double quotation mark,
U+201D ISOnum -->
<!ENTITY bdquo "&#8222;"> <!-- double low-9 quotation mark, U+201E NEW -->
<!ENTITY dagger "&#8224;"> <!-- dagger, U+2020 ISOpub -->
<!ENTITY Dagger "&#8225;"> <!-- double dagger, U+2021 ISOpub -->
<!ENTITY permil "&#8240;"> <!-- per mille sign, U+2030 ISOtech -->
<!ENTITY lsaquo "&#8249;"> <!-- single left-pointing angle quotation mark,
U+2039 ISO proposed -->
<!-- lsaquo is proposed but not yet ISO standardized -->
<!ENTITY rsaquo "&#8250;"> <!-- single right-pointing angle quotation mark,
U+203A ISO proposed -->
<!-- rsaquo is proposed but not yet ISO standardized -->
<!-- Currency Symbols -->
<!ENTITY euro "&#8364;"> <!-- euro sign, U+20AC NEW -->
@@ -1,32 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Server-side Image Map Module .................................. -->
<!-- file: xhtml-ssismap-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-ssismap-1.mod,v 1.1 2010/07/29 13:42:48 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Server-side Image Maps 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-ssismap-1.mod"
Revisions:
#2000-10-22: added declaration for 'ismap' on <input>
....................................................................... -->
<!-- Server-side Image Maps
This adds the 'ismap' attribute to the img and input elements
to support server-side processing of a user selection.
-->
<!ATTLIST %img.qname;
ismap ( ismap ) #IMPLIED
>
<!ATTLIST %input.qname;
ismap ( ismap ) #IMPLIED
>
<!-- end of xhtml-ssismap-1.mod -->
@@ -1,136 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Structure Module .............................................. -->
<!-- file: xhtml-struct-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-struct-1.mod,v 1.1 2010/07/29 13:42:48 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Document Structure 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-struct-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Document Structure
title, head, body, html
The Structure Module defines the major structural elements and
their attributes.
Note that the content model of the head element type is redeclared
when the Base Module is included in the DTD.
The parameter entity containing the XML namespace URI value used
for XHTML is '%XHTML.xmlns;', defined in the Qualified Names module.
-->
<!-- title: Document Title ............................. -->
<!-- The title element is not considered part of the flow of text.
It should be displayed, for example as the page header or
window title. Exactly one title is required per document.
-->
<!ENTITY % title.element "INCLUDE" >
<![%title.element;[
<!ENTITY % title.content "( #PCDATA )" >
<!ENTITY % title.qname "title" >
<!ELEMENT %title.qname; %title.content; >
<!-- end of title.element -->]]>
<!ENTITY % title.attlist "INCLUDE" >
<![%title.attlist;[
<!ATTLIST %title.qname;
%XHTML.xmlns.attrib;
%I18n.attrib;
>
<!-- end of title.attlist -->]]>
<!-- head: Document Head ............................... -->
<!ENTITY % head.element "INCLUDE" >
<![%head.element;[
<!ENTITY % head.content
"( %HeadOpts.mix;, %title.qname;, %HeadOpts.mix; )"
>
<!ENTITY % head.qname "head" >
<!ELEMENT %head.qname; %head.content; >
<!-- end of head.element -->]]>
<!ENTITY % head.attlist "INCLUDE" >
<![%head.attlist;[
<!-- reserved for future use with document profiles
-->
<!ENTITY % profile.attrib
"profile %URIs.datatype; #IMPLIED"
>
<!ATTLIST %head.qname;
%XHTML.xmlns.attrib;
%I18n.attrib;
%profile.attrib;
%id.attrib;
>
<!-- end of head.attlist -->]]>
<!-- body: Document Body ............................... -->
<!ENTITY % body.element "INCLUDE" >
<![%body.element;[
<!ENTITY % body.content
"( %Block.mix; )*"
>
<!ENTITY % body.qname "body" >
<!ELEMENT %body.qname; %body.content; >
<!-- end of body.element -->]]>
<!ENTITY % body.attlist "INCLUDE" >
<![%body.attlist;[
<!ATTLIST %body.qname;
%Common.attrib;
>
<!-- end of body.attlist -->]]>
<!-- html: XHTML Document Element ...................... -->
<!ENTITY % html.element "INCLUDE" >
<![%html.element;[
<!ENTITY % html.content "( %head.qname;, %body.qname; )" >
<!ENTITY % html.qname "html" >
<!ELEMENT %html.qname; %html.content; >
<!-- end of html.element -->]]>
<![%XHTML.xsi.attrs;[
<!-- define a parameter for the XSI schemaLocation attribute -->
<!ENTITY % XSI.schemaLocation.attrib
"%XSI.pfx;schemaLocation %URIs.datatype; #IMPLIED"
>
]]>
<!ENTITY % XSI.schemaLocation.attrib "">
<!ENTITY % html.attlist "INCLUDE" >
<![%html.attlist;[
<!-- version attribute value defined in driver
-->
<!ENTITY % XHTML.version.attrib
"version CDATA #FIXED '%XHTML.version;'"
>
<!-- see the Qualified Names module for information
on how to extend XHTML using XML namespaces
-->
<!ATTLIST %html.qname;
%XHTML.xmlns.attrib;
%XSI.schemaLocation.attrib;
%XHTML.version.attrib;
%I18n.attrib;
%id.attrib;
>
<!-- end of html.attlist -->]]>
<!-- end of xhtml-struct-1.mod -->
@@ -1,48 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Document Style Sheet Module ................................... -->
<!-- file: xhtml-style-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-style-1.mod,v 1.1 2010/07/29 13:42:48 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//DTD XHTML Style Sheets 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-style-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Style Sheets
style
This module declares the style element type and its attributes,
used to embed style sheet information in the document head element.
-->
<!-- style: Style Sheet Information .................... -->
<!ENTITY % style.element "INCLUDE" >
<![%style.element;[
<!ENTITY % style.content "( #PCDATA )" >
<!ENTITY % style.qname "style" >
<!ELEMENT %style.qname; %style.content; >
<!-- end of style.element -->]]>
<!ENTITY % style.attlist "INCLUDE" >
<![%style.attlist;[
<!ATTLIST %style.qname;
%XHTML.xmlns.attrib;
%id.attrib;
%title.attrib;
%I18n.attrib;
xml:space ( preserve ) #FIXED 'preserve'
type %ContentType.datatype; #REQUIRED
media %MediaDesc.datatype; #IMPLIED
>
<!-- end of style.attlist -->]]>
<!-- end of xhtml-style-1.mod -->
@@ -1,237 +0,0 @@
<!-- Mathematical, Greek and Symbolic characters for XHTML -->
<!-- Character entity set. Typical invocation:
<!ENTITY % HTMLsymbol PUBLIC
"-//W3C//ENTITIES Symbols for XHTML//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent">
%HTMLsymbol;
-->
<!-- Portions (C) International Organization for Standardization 1986:
Permission to copy in any form is granted for use with
conforming SGML systems and applications as defined in
ISO 8879, provided this notice is included in all copies.
-->
<!-- Relevant ISO entity set is given unless names are newly introduced.
New names (i.e., not in ISO 8879 list) do not clash with any
existing ISO 8879 entity names. ISO 10646 character numbers
are given for each character, in hex. values are decimal
conversions of the ISO 10646 values and refer to the document
character set. Names are Unicode names.
-->
<!-- Latin Extended-B -->
<!ENTITY fnof "&#402;"> <!-- latin small letter f with hook = function
= florin, U+0192 ISOtech -->
<!-- Greek -->
<!ENTITY Alpha "&#913;"> <!-- greek capital letter alpha, U+0391 -->
<!ENTITY Beta "&#914;"> <!-- greek capital letter beta, U+0392 -->
<!ENTITY Gamma "&#915;"> <!-- greek capital letter gamma,
U+0393 ISOgrk3 -->
<!ENTITY Delta "&#916;"> <!-- greek capital letter delta,
U+0394 ISOgrk3 -->
<!ENTITY Epsilon "&#917;"> <!-- greek capital letter epsilon, U+0395 -->
<!ENTITY Zeta "&#918;"> <!-- greek capital letter zeta, U+0396 -->
<!ENTITY Eta "&#919;"> <!-- greek capital letter eta, U+0397 -->
<!ENTITY Theta "&#920;"> <!-- greek capital letter theta,
U+0398 ISOgrk3 -->
<!ENTITY Iota "&#921;"> <!-- greek capital letter iota, U+0399 -->
<!ENTITY Kappa "&#922;"> <!-- greek capital letter kappa, U+039A -->
<!ENTITY Lambda "&#923;"> <!-- greek capital letter lamda,
U+039B ISOgrk3 -->
<!ENTITY Mu "&#924;"> <!-- greek capital letter mu, U+039C -->
<!ENTITY Nu "&#925;"> <!-- greek capital letter nu, U+039D -->
<!ENTITY Xi "&#926;"> <!-- greek capital letter xi, U+039E ISOgrk3 -->
<!ENTITY Omicron "&#927;"> <!-- greek capital letter omicron, U+039F -->
<!ENTITY Pi "&#928;"> <!-- greek capital letter pi, U+03A0 ISOgrk3 -->
<!ENTITY Rho "&#929;"> <!-- greek capital letter rho, U+03A1 -->
<!-- there is no Sigmaf, and no U+03A2 character either -->
<!ENTITY Sigma "&#931;"> <!-- greek capital letter sigma,
U+03A3 ISOgrk3 -->
<!ENTITY Tau "&#932;"> <!-- greek capital letter tau, U+03A4 -->
<!ENTITY Upsilon "&#933;"> <!-- greek capital letter upsilon,
U+03A5 ISOgrk3 -->
<!ENTITY Phi "&#934;"> <!-- greek capital letter phi,
U+03A6 ISOgrk3 -->
<!ENTITY Chi "&#935;"> <!-- greek capital letter chi, U+03A7 -->
<!ENTITY Psi "&#936;"> <!-- greek capital letter psi,
U+03A8 ISOgrk3 -->
<!ENTITY Omega "&#937;"> <!-- greek capital letter omega,
U+03A9 ISOgrk3 -->
<!ENTITY alpha "&#945;"> <!-- greek small letter alpha,
U+03B1 ISOgrk3 -->
<!ENTITY beta "&#946;"> <!-- greek small letter beta, U+03B2 ISOgrk3 -->
<!ENTITY gamma "&#947;"> <!-- greek small letter gamma,
U+03B3 ISOgrk3 -->
<!ENTITY delta "&#948;"> <!-- greek small letter delta,
U+03B4 ISOgrk3 -->
<!ENTITY epsilon "&#949;"> <!-- greek small letter epsilon,
U+03B5 ISOgrk3 -->
<!ENTITY zeta "&#950;"> <!-- greek small letter zeta, U+03B6 ISOgrk3 -->
<!ENTITY eta "&#951;"> <!-- greek small letter eta, U+03B7 ISOgrk3 -->
<!ENTITY theta "&#952;"> <!-- greek small letter theta,
U+03B8 ISOgrk3 -->
<!ENTITY iota "&#953;"> <!-- greek small letter iota, U+03B9 ISOgrk3 -->
<!ENTITY kappa "&#954;"> <!-- greek small letter kappa,
U+03BA ISOgrk3 -->
<!ENTITY lambda "&#955;"> <!-- greek small letter lamda,
U+03BB ISOgrk3 -->
<!ENTITY mu "&#956;"> <!-- greek small letter mu, U+03BC ISOgrk3 -->
<!ENTITY nu "&#957;"> <!-- greek small letter nu, U+03BD ISOgrk3 -->
<!ENTITY xi "&#958;"> <!-- greek small letter xi, U+03BE ISOgrk3 -->
<!ENTITY omicron "&#959;"> <!-- greek small letter omicron, U+03BF NEW -->
<!ENTITY pi "&#960;"> <!-- greek small letter pi, U+03C0 ISOgrk3 -->
<!ENTITY rho "&#961;"> <!-- greek small letter rho, U+03C1 ISOgrk3 -->
<!ENTITY sigmaf "&#962;"> <!-- greek small letter final sigma,
U+03C2 ISOgrk3 -->
<!ENTITY sigma "&#963;"> <!-- greek small letter sigma,
U+03C3 ISOgrk3 -->
<!ENTITY tau "&#964;"> <!-- greek small letter tau, U+03C4 ISOgrk3 -->
<!ENTITY upsilon "&#965;"> <!-- greek small letter upsilon,
U+03C5 ISOgrk3 -->
<!ENTITY phi "&#966;"> <!-- greek small letter phi, U+03C6 ISOgrk3 -->
<!ENTITY chi "&#967;"> <!-- greek small letter chi, U+03C7 ISOgrk3 -->
<!ENTITY psi "&#968;"> <!-- greek small letter psi, U+03C8 ISOgrk3 -->
<!ENTITY omega "&#969;"> <!-- greek small letter omega,
U+03C9 ISOgrk3 -->
<!ENTITY thetasym "&#977;"> <!-- greek theta symbol,
U+03D1 NEW -->
<!ENTITY upsih "&#978;"> <!-- greek upsilon with hook symbol,
U+03D2 NEW -->
<!ENTITY piv "&#982;"> <!-- greek pi symbol, U+03D6 ISOgrk3 -->
<!-- General Punctuation -->
<!ENTITY bull "&#8226;"> <!-- bullet = black small circle,
U+2022 ISOpub -->
<!-- bullet is NOT the same as bullet operator, U+2219 -->
<!ENTITY hellip "&#8230;"> <!-- horizontal ellipsis = three dot leader,
U+2026 ISOpub -->
<!ENTITY prime "&#8242;"> <!-- prime = minutes = feet, U+2032 ISOtech -->
<!ENTITY Prime "&#8243;"> <!-- double prime = seconds = inches,
U+2033 ISOtech -->
<!ENTITY oline "&#8254;"> <!-- overline = spacing overscore,
U+203E NEW -->
<!ENTITY frasl "&#8260;"> <!-- fraction slash, U+2044 NEW -->
<!-- Letterlike Symbols -->
<!ENTITY weierp "&#8472;"> <!-- script capital P = power set
= Weierstrass p, U+2118 ISOamso -->
<!ENTITY image "&#8465;"> <!-- black-letter capital I = imaginary part,
U+2111 ISOamso -->
<!ENTITY real "&#8476;"> <!-- black-letter capital R = real part symbol,
U+211C ISOamso -->
<!ENTITY trade "&#8482;"> <!-- trade mark sign, U+2122 ISOnum -->
<!ENTITY alefsym "&#8501;"> <!-- alef symbol = first transfinite cardinal,
U+2135 NEW -->
<!-- alef symbol is NOT the same as hebrew letter alef,
U+05D0 although the same glyph could be used to depict both characters -->
<!-- Arrows -->
<!ENTITY larr "&#8592;"> <!-- leftwards arrow, U+2190 ISOnum -->
<!ENTITY uarr "&#8593;"> <!-- upwards arrow, U+2191 ISOnum-->
<!ENTITY rarr "&#8594;"> <!-- rightwards arrow, U+2192 ISOnum -->
<!ENTITY darr "&#8595;"> <!-- downwards arrow, U+2193 ISOnum -->
<!ENTITY harr "&#8596;"> <!-- left right arrow, U+2194 ISOamsa -->
<!ENTITY crarr "&#8629;"> <!-- downwards arrow with corner leftwards
= carriage return, U+21B5 NEW -->
<!ENTITY lArr "&#8656;"> <!-- leftwards double arrow, U+21D0 ISOtech -->
<!-- Unicode does not say that lArr is the same as the 'is implied by' arrow
but also does not have any other character for that function. So lArr can
be used for 'is implied by' as ISOtech suggests -->
<!ENTITY uArr "&#8657;"> <!-- upwards double arrow, U+21D1 ISOamsa -->
<!ENTITY rArr "&#8658;"> <!-- rightwards double arrow,
U+21D2 ISOtech -->
<!-- Unicode does not say this is the 'implies' character but does not have
another character with this function so rArr can be used for 'implies'
as ISOtech suggests -->
<!ENTITY dArr "&#8659;"> <!-- downwards double arrow, U+21D3 ISOamsa -->
<!ENTITY hArr "&#8660;"> <!-- left right double arrow,
U+21D4 ISOamsa -->
<!-- Mathematical Operators -->
<!ENTITY forall "&#8704;"> <!-- for all, U+2200 ISOtech -->
<!ENTITY part "&#8706;"> <!-- partial differential, U+2202 ISOtech -->
<!ENTITY exist "&#8707;"> <!-- there exists, U+2203 ISOtech -->
<!ENTITY empty "&#8709;"> <!-- empty set = null set, U+2205 ISOamso -->
<!ENTITY nabla "&#8711;"> <!-- nabla = backward difference,
U+2207 ISOtech -->
<!ENTITY isin "&#8712;"> <!-- element of, U+2208 ISOtech -->
<!ENTITY notin "&#8713;"> <!-- not an element of, U+2209 ISOtech -->
<!ENTITY ni "&#8715;"> <!-- contains as member, U+220B ISOtech -->
<!ENTITY prod "&#8719;"> <!-- n-ary product = product sign,
U+220F ISOamsb -->
<!-- prod is NOT the same character as U+03A0 'greek capital letter pi' though
the same glyph might be used for both -->
<!ENTITY sum "&#8721;"> <!-- n-ary summation, U+2211 ISOamsb -->
<!-- sum is NOT the same character as U+03A3 'greek capital letter sigma'
though the same glyph might be used for both -->
<!ENTITY minus "&#8722;"> <!-- minus sign, U+2212 ISOtech -->
<!ENTITY lowast "&#8727;"> <!-- asterisk operator, U+2217 ISOtech -->
<!ENTITY radic "&#8730;"> <!-- square root = radical sign,
U+221A ISOtech -->
<!ENTITY prop "&#8733;"> <!-- proportional to, U+221D ISOtech -->
<!ENTITY infin "&#8734;"> <!-- infinity, U+221E ISOtech -->
<!ENTITY ang "&#8736;"> <!-- angle, U+2220 ISOamso -->
<!ENTITY and "&#8743;"> <!-- logical and = wedge, U+2227 ISOtech -->
<!ENTITY or "&#8744;"> <!-- logical or = vee, U+2228 ISOtech -->
<!ENTITY cap "&#8745;"> <!-- intersection = cap, U+2229 ISOtech -->
<!ENTITY cup "&#8746;"> <!-- union = cup, U+222A ISOtech -->
<!ENTITY int "&#8747;"> <!-- integral, U+222B ISOtech -->
<!ENTITY there4 "&#8756;"> <!-- therefore, U+2234 ISOtech -->
<!ENTITY sim "&#8764;"> <!-- tilde operator = varies with = similar to,
U+223C ISOtech -->
<!-- tilde operator is NOT the same character as the tilde, U+007E,
although the same glyph might be used to represent both -->
<!ENTITY cong "&#8773;"> <!-- approximately equal to, U+2245 ISOtech -->
<!ENTITY asymp "&#8776;"> <!-- almost equal to = asymptotic to,
U+2248 ISOamsr -->
<!ENTITY ne "&#8800;"> <!-- not equal to, U+2260 ISOtech -->
<!ENTITY equiv "&#8801;"> <!-- identical to, U+2261 ISOtech -->
<!ENTITY le "&#8804;"> <!-- less-than or equal to, U+2264 ISOtech -->
<!ENTITY ge "&#8805;"> <!-- greater-than or equal to,
U+2265 ISOtech -->
<!ENTITY sub "&#8834;"> <!-- subset of, U+2282 ISOtech -->
<!ENTITY sup "&#8835;"> <!-- superset of, U+2283 ISOtech -->
<!ENTITY nsub "&#8836;"> <!-- not a subset of, U+2284 ISOamsn -->
<!ENTITY sube "&#8838;"> <!-- subset of or equal to, U+2286 ISOtech -->
<!ENTITY supe "&#8839;"> <!-- superset of or equal to,
U+2287 ISOtech -->
<!ENTITY oplus "&#8853;"> <!-- circled plus = direct sum,
U+2295 ISOamsb -->
<!ENTITY otimes "&#8855;"> <!-- circled times = vector product,
U+2297 ISOamsb -->
<!ENTITY perp "&#8869;"> <!-- up tack = orthogonal to = perpendicular,
U+22A5 ISOtech -->
<!ENTITY sdot "&#8901;"> <!-- dot operator, U+22C5 ISOamsb -->
<!-- dot operator is NOT the same character as U+00B7 middle dot -->
<!-- Miscellaneous Technical -->
<!ENTITY lceil "&#8968;"> <!-- left ceiling = APL upstile,
U+2308 ISOamsc -->
<!ENTITY rceil "&#8969;"> <!-- right ceiling, U+2309 ISOamsc -->
<!ENTITY lfloor "&#8970;"> <!-- left floor = APL downstile,
U+230A ISOamsc -->
<!ENTITY rfloor "&#8971;"> <!-- right floor, U+230B ISOamsc -->
<!ENTITY lang "&#9001;"> <!-- left-pointing angle bracket = bra,
U+2329 ISOtech -->
<!-- lang is NOT the same character as U+003C 'less than sign'
or U+2039 'single left-pointing angle quotation mark' -->
<!ENTITY rang "&#9002;"> <!-- right-pointing angle bracket = ket,
U+232A ISOtech -->
<!-- rang is NOT the same character as U+003E 'greater than sign'
or U+203A 'single right-pointing angle quotation mark' -->
<!-- Geometric Shapes -->
<!ENTITY loz "&#9674;"> <!-- lozenge, U+25CA ISOpub -->
<!-- Miscellaneous Symbols -->
<!ENTITY spades "&#9824;"> <!-- black spade suit, U+2660 ISOpub -->
<!-- black here seems to mean filled as opposed to hollow -->
<!ENTITY clubs "&#9827;"> <!-- black club suit = shamrock,
U+2663 ISOpub -->
<!ENTITY hearts "&#9829;"> <!-- black heart suit = valentine,
U+2665 ISOpub -->
<!ENTITY diams "&#9830;"> <!-- black diamond suit, U+2666 ISOpub -->
@@ -1,333 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Table Module .................................................. -->
<!-- file: xhtml-table-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-table-1.mod,v 1.1 2010/07/29 13:42:48 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Tables 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-table-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Tables
table, caption, thead, tfoot, tbody, colgroup, col, tr, th, td
This module declares element types and attributes used to provide
table markup similar to HTML 4, including features that enable
better accessibility for non-visual user agents.
-->
<!-- declare qualified element type names:
-->
<!ENTITY % table.qname "table" >
<!ENTITY % caption.qname "caption" >
<!ENTITY % thead.qname "thead" >
<!ENTITY % tfoot.qname "tfoot" >
<!ENTITY % tbody.qname "tbody" >
<!ENTITY % colgroup.qname "colgroup" >
<!ENTITY % col.qname "col" >
<!ENTITY % tr.qname "tr" >
<!ENTITY % th.qname "th" >
<!ENTITY % td.qname "td" >
<!-- The frame attribute specifies which parts of the frame around
the table should be rendered. The values are not the same as
CALS to avoid a name clash with the valign attribute.
-->
<!ENTITY % frame.attrib
"frame ( void
| above
| below
| hsides
| lhs
| rhs
| vsides
| box
| border ) #IMPLIED"
>
<!-- The rules attribute defines which rules to draw between cells:
If rules is absent then assume:
"none" if border is absent or border="0" otherwise "all"
-->
<!ENTITY % rules.attrib
"rules ( none
| groups
| rows
| cols
| all ) #IMPLIED"
>
<!-- horizontal alignment attributes for cell contents
-->
<!ENTITY % CellHAlign.attrib
"align ( left
| center
| right
| justify
| char ) #IMPLIED
char %Character.datatype; #IMPLIED
charoff %Length.datatype; #IMPLIED"
>
<!-- vertical alignment attribute for cell contents
-->
<!ENTITY % CellVAlign.attrib
"valign ( top
| middle
| bottom
| baseline ) #IMPLIED"
>
<!-- scope is simpler than axes attribute for common tables
-->
<!ENTITY % scope.attrib
"scope ( row
| col
| rowgroup
| colgroup ) #IMPLIED"
>
<!-- table: Table Element .............................. -->
<!ENTITY % table.element "INCLUDE" >
<![%table.element;[
<!ENTITY % table.content
"( %caption.qname;?, ( %col.qname;* | %colgroup.qname;* ),
(( %thead.qname;?, %tfoot.qname;?, %tbody.qname;+ ) | ( %tr.qname;+ )))"
>
<!ELEMENT %table.qname; %table.content; >
<!-- end of table.element -->]]>
<!ENTITY % table.attlist "INCLUDE" >
<![%table.attlist;[
<!ATTLIST %table.qname;
%Common.attrib;
summary %Text.datatype; #IMPLIED
width %Length.datatype; #IMPLIED
border %Pixels.datatype; #IMPLIED
%frame.attrib;
%rules.attrib;
cellspacing %Length.datatype; #IMPLIED
cellpadding %Length.datatype; #IMPLIED
>
<!-- end of table.attlist -->]]>
<!-- caption: Table Caption ............................ -->
<!ENTITY % caption.element "INCLUDE" >
<![%caption.element;[
<!ENTITY % caption.content
"( #PCDATA | %Inline.mix; )*"
>
<!ELEMENT %caption.qname; %caption.content; >
<!-- end of caption.element -->]]>
<!ENTITY % caption.attlist "INCLUDE" >
<![%caption.attlist;[
<!ATTLIST %caption.qname;
%Common.attrib;
>
<!-- end of caption.attlist -->]]>
<!-- thead: Table Header ............................... -->
<!-- Use thead to duplicate headers when breaking table
across page boundaries, or for static headers when
tbody sections are rendered in scrolling panel.
-->
<!ENTITY % thead.element "INCLUDE" >
<![%thead.element;[
<!ENTITY % thead.content "( %tr.qname; )+" >
<!ELEMENT %thead.qname; %thead.content; >
<!-- end of thead.element -->]]>
<!ENTITY % thead.attlist "INCLUDE" >
<![%thead.attlist;[
<!ATTLIST %thead.qname;
%Common.attrib;
%CellHAlign.attrib;
%CellVAlign.attrib;
>
<!-- end of thead.attlist -->]]>
<!-- tfoot: Table Footer ............................... -->
<!-- Use tfoot to duplicate footers when breaking table
across page boundaries, or for static footers when
tbody sections are rendered in scrolling panel.
-->
<!ENTITY % tfoot.element "INCLUDE" >
<![%tfoot.element;[
<!ENTITY % tfoot.content "( %tr.qname; )+" >
<!ELEMENT %tfoot.qname; %tfoot.content; >
<!-- end of tfoot.element -->]]>
<!ENTITY % tfoot.attlist "INCLUDE" >
<![%tfoot.attlist;[
<!ATTLIST %tfoot.qname;
%Common.attrib;
%CellHAlign.attrib;
%CellVAlign.attrib;
>
<!-- end of tfoot.attlist -->]]>
<!-- tbody: Table Body ................................. -->
<!-- Use multiple tbody sections when rules are needed
between groups of table rows.
-->
<!ENTITY % tbody.element "INCLUDE" >
<![%tbody.element;[
<!ENTITY % tbody.content "( %tr.qname; )+" >
<!ELEMENT %tbody.qname; %tbody.content; >
<!-- end of tbody.element -->]]>
<!ENTITY % tbody.attlist "INCLUDE" >
<![%tbody.attlist;[
<!ATTLIST %tbody.qname;
%Common.attrib;
%CellHAlign.attrib;
%CellVAlign.attrib;
>
<!-- end of tbody.attlist -->]]>
<!-- colgroup: Table Column Group ...................... -->
<!-- colgroup groups a set of col elements. It allows you
to group several semantically-related columns together.
-->
<!ENTITY % colgroup.element "INCLUDE" >
<![%colgroup.element;[
<!ENTITY % colgroup.content "( %col.qname; )*" >
<!ELEMENT %colgroup.qname; %colgroup.content; >
<!-- end of colgroup.element -->]]>
<!ENTITY % colgroup.attlist "INCLUDE" >
<![%colgroup.attlist;[
<!ATTLIST %colgroup.qname;
%Common.attrib;
span %Number.datatype; '1'
width %MultiLength.datatype; #IMPLIED
%CellHAlign.attrib;
%CellVAlign.attrib;
>
<!-- end of colgroup.attlist -->]]>
<!-- col: Table Column ................................. -->
<!-- col elements define the alignment properties for
cells in one or more columns.
The width attribute specifies the width of the
columns, e.g.
width="64" width in screen pixels
width="0.5*" relative width of 0.5
The span attribute causes the attributes of one
col element to apply to more than one column.
-->
<!ENTITY % col.element "INCLUDE" >
<![%col.element;[
<!ENTITY % col.content "EMPTY" >
<!ELEMENT %col.qname; %col.content; >
<!-- end of col.element -->]]>
<!ENTITY % col.attlist "INCLUDE" >
<![%col.attlist;[
<!ATTLIST %col.qname;
%Common.attrib;
span %Number.datatype; '1'
width %MultiLength.datatype; #IMPLIED
%CellHAlign.attrib;
%CellVAlign.attrib;
>
<!-- end of col.attlist -->]]>
<!-- tr: Table Row ..................................... -->
<!ENTITY % tr.element "INCLUDE" >
<![%tr.element;[
<!ENTITY % tr.content "( %th.qname; | %td.qname; )+" >
<!ELEMENT %tr.qname; %tr.content; >
<!-- end of tr.element -->]]>
<!ENTITY % tr.attlist "INCLUDE" >
<![%tr.attlist;[
<!ATTLIST %tr.qname;
%Common.attrib;
%CellHAlign.attrib;
%CellVAlign.attrib;
>
<!-- end of tr.attlist -->]]>
<!-- th: Table Header Cell ............................. -->
<!-- th is for header cells, td for data,
but for cells acting as both use td
-->
<!ENTITY % th.element "INCLUDE" >
<![%th.element;[
<!ENTITY % th.content
"( #PCDATA | %Flow.mix; )*"
>
<!ELEMENT %th.qname; %th.content; >
<!-- end of th.element -->]]>
<!ENTITY % th.attlist "INCLUDE" >
<![%th.attlist;[
<!ATTLIST %th.qname;
%Common.attrib;
abbr %Text.datatype; #IMPLIED
axis CDATA #IMPLIED
headers IDREFS #IMPLIED
%scope.attrib;
rowspan %Number.datatype; '1'
colspan %Number.datatype; '1'
%CellHAlign.attrib;
%CellVAlign.attrib;
>
<!-- end of th.attlist -->]]>
<!-- td: Table Data Cell ............................... -->
<!ENTITY % td.element "INCLUDE" >
<![%td.element;[
<!ENTITY % td.content
"( #PCDATA | %Flow.mix; )*"
>
<!ELEMENT %td.qname; %td.content; >
<!-- end of td.element -->]]>
<!ENTITY % td.attlist "INCLUDE" >
<![%td.attlist;[
<!ATTLIST %td.qname;
%Common.attrib;
abbr %Text.datatype; #IMPLIED
axis CDATA #IMPLIED
headers IDREFS #IMPLIED
%scope.attrib;
rowspan %Number.datatype; '1'
colspan %Number.datatype; '1'
%CellHAlign.attrib;
%CellVAlign.attrib;
>
<!-- end of td.attlist -->]]>
<!-- end of xhtml-table-1.mod -->
@@ -1,52 +0,0 @@
<!-- ...................................................................... -->
<!-- XHTML Text Module ................................................... -->
<!-- file: xhtml-text-1.mod
This is XHTML, a reformulation of HTML as a modular XML application.
Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
Revision: $Id: xhtml-text-1.mod,v 1.1 2010/07/29 13:42:48 bertails Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ELEMENTS XHTML Text 1.0//EN"
SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-text-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- Textual Content
The Text module includes declarations for all core
text container elements and their attributes.
-->
<!ENTITY % xhtml-inlstruct.module "INCLUDE" >
<![%xhtml-inlstruct.module;[
<!ENTITY % xhtml-inlstruct.mod
PUBLIC "-//W3C//ELEMENTS XHTML Inline Structural 1.0//EN"
"xhtml-inlstruct-1.mod" >
%xhtml-inlstruct.mod;]]>
<!ENTITY % xhtml-inlphras.module "INCLUDE" >
<![%xhtml-inlphras.module;[
<!ENTITY % xhtml-inlphras.mod
PUBLIC "-//W3C//ELEMENTS XHTML Inline Phrasal 1.0//EN"
"xhtml-inlphras-1.mod" >
%xhtml-inlphras.mod;]]>
<!ENTITY % xhtml-blkstruct.module "INCLUDE" >
<![%xhtml-blkstruct.module;[
<!ENTITY % xhtml-blkstruct.mod
PUBLIC "-//W3C//ELEMENTS XHTML Block Structural 1.0//EN"
"xhtml-blkstruct-1.mod" >
%xhtml-blkstruct.mod;]]>
<!ENTITY % xhtml-blkphras.module "INCLUDE" >
<![%xhtml-blkphras.module;[
<!ENTITY % xhtml-blkphras.mod
PUBLIC "-//W3C//ELEMENTS XHTML Block Phrasal 1.0//EN"
"xhtml-blkphras-1.mod" >
%xhtml-blkphras.mod;]]>
<!-- end of xhtml-text-1.mod -->
@@ -1,252 +0,0 @@
<!-- ....................................................................... -->
<!-- XHTML 1.1 Document Model Module ...................................... -->
<!-- file: xhtml11-model-1.mod
This is XHTML 1.1, a reformulation of HTML as a modular XML application.
Copyright 1998-2001 W3C (MIT, INRIA, Keio), All Rights Reserved.
Revision: $Id: xhtml11-model-1.mod,v 1.13 2001/05/29 16:37:01 ahby Exp $ SMI
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//ENTITIES XHTML 1.1 Document Model 1.0//EN"
SYSTEM "http://www.w3.org/TR/xhtml11/DTD/xhtml11-model-1.mod"
Revisions:
(none)
....................................................................... -->
<!-- XHTML 1.1 Document Model
This module describes the groupings of elements that make up
common content models for XHTML elements.
XHTML has three basic content models:
%Inline.mix; character-level elements
%Block.mix; block-like elements, eg., paragraphs and lists
%Flow.mix; any block or inline elements
Any parameter entities declared in this module may be used
to create element content models, but the above three are
considered 'global' (insofar as that term applies here).
The reserved word '#PCDATA' (indicating a text string) is now
included explicitly with each element declaration that is
declared as mixed content, as XML requires that this token
occur first in a content model specification.
-->
<!-- Extending the Model
While in some cases this module may need to be rewritten to
accommodate changes to the document model, minor extensions
may be accomplished by redeclaring any of the three *.extra;
parameter entities to contain extension element types as follows:
%Misc.extra; whose parent may be any block or
inline element.
%Inline.extra; whose parent may be any inline element.
%Block.extra; whose parent may be any block element.
If used, these parameter entities must be an OR-separated
list beginning with an OR separator ("|"), eg., "| a | b | c"
All block and inline *.class parameter entities not part
of the *struct.class classes begin with "| " to allow for
exclusion from mixes.
-->
<!-- .............. Optional Elements in head .................. -->
<!ENTITY % HeadOpts.mix
"( %script.qname; | %style.qname; | %meta.qname;
| %link.qname; | %object.qname; )*"
>
<!-- ................. Miscellaneous Elements .................. -->
<!-- ins and del are used to denote editing changes
-->
<!ENTITY % Edit.class "| %ins.qname; | %del.qname;" >
<!-- script and noscript are used to contain scripts
and alternative content
-->
<!ENTITY % Script.class "| %script.qname; | %noscript.qname;" >
<!ENTITY % Misc.extra "" >
<!-- These elements are neither block nor inline, and can
essentially be used anywhere in the document body.
-->
<!ENTITY % Misc.class
"%Edit.class;
%Script.class;
%Misc.extra;"
>
<!-- .................... Inline Elements ...................... -->
<!ENTITY % InlStruct.class "%br.qname; | %span.qname;" >
<!ENTITY % InlPhras.class
"| %em.qname; | %strong.qname; | %dfn.qname; | %code.qname;
| %samp.qname; | %kbd.qname; | %var.qname; | %cite.qname;
| %abbr.qname; | %acronym.qname; | %q.qname;" >
<!ENTITY % InlPres.class
"| %tt.qname; | %i.qname; | %b.qname; | %big.qname;
| %small.qname; | %sub.qname; | %sup.qname;" >
<!ENTITY % I18n.class "| %bdo.qname;" >
<!ENTITY % Anchor.class "| %a.qname;" >
<!ENTITY % InlSpecial.class
"| %img.qname; | %map.qname;
| %object.qname;" >
<!ENTITY % InlForm.class
"| %input.qname; | %select.qname; | %textarea.qname;
| %label.qname; | %button.qname;" >
<!ENTITY % Inline.extra "" >
<!ENTITY % Ruby.class "| %ruby.qname;" >
<!-- %Inline.class; includes all inline elements,
used as a component in mixes
-->
<!ENTITY % Inline.class
"%InlStruct.class;
%InlPhras.class;
%InlPres.class;
%I18n.class;
%Anchor.class;
%InlSpecial.class;
%InlForm.class;
%Ruby.class;
%Inline.extra;"
>
<!-- %InlNoRuby.class; includes all inline elements
except ruby, used as a component in mixes
-->
<!ENTITY % InlNoRuby.class
"%InlStruct.class;
%InlPhras.class;
%InlPres.class;
%I18n.class;
%Anchor.class;
%InlSpecial.class;
%InlForm.class;
%Inline.extra;"
>
<!-- %NoRuby.content; includes all inlines except ruby
-->
<!ENTITY % NoRuby.content
"( #PCDATA
| %InlNoRuby.class;
%Misc.class; )*"
>
<!-- %InlNoAnchor.class; includes all non-anchor inlines,
used as a component in mixes
-->
<!ENTITY % InlNoAnchor.class
"%InlStruct.class;
%InlPhras.class;
%InlPres.class;
%I18n.class;
%InlSpecial.class;
%InlForm.class;
%Ruby.class;
%Inline.extra;"
>
<!-- %InlNoAnchor.mix; includes all non-anchor inlines
-->
<!ENTITY % InlNoAnchor.mix
"%InlNoAnchor.class;
%Misc.class;"
>
<!-- %Inline.mix; includes all inline elements, including %Misc.class;
-->
<!ENTITY % Inline.mix
"%Inline.class;
%Misc.class;"
>
<!-- ..................... Block Elements ...................... -->
<!-- In the HTML 4.0 DTD, heading and list elements were included
in the %block; parameter entity. The %Heading.class; and
%List.class; parameter entities must now be included explicitly
on element declarations where desired.
-->
<!ENTITY % Heading.class
"%h1.qname; | %h2.qname; | %h3.qname;
| %h4.qname; | %h5.qname; | %h6.qname;" >
<!ENTITY % List.class "%ul.qname; | %ol.qname; | %dl.qname;" >
<!ENTITY % Table.class "| %table.qname;" >
<!ENTITY % Form.class "| %form.qname;" >
<!ENTITY % Fieldset.class "| %fieldset.qname;" >
<!ENTITY % BlkStruct.class "%p.qname; | %div.qname;" >
<!ENTITY % BlkPhras.class
"| %pre.qname; | %blockquote.qname; | %address.qname;" >
<!ENTITY % BlkPres.class "| %hr.qname;" >
<!ENTITY % BlkSpecial.class
"%Table.class;
%Form.class;
%Fieldset.class;"
>
<!ENTITY % Block.extra "" >
<!-- %Block.class; includes all block elements,
used as an component in mixes
-->
<!ENTITY % Block.class
"%BlkStruct.class;
%BlkPhras.class;
%BlkPres.class;
%BlkSpecial.class;
%Block.extra;"
>
<!-- %Block.mix; includes all block elements plus %Misc.class;
-->
<!ENTITY % Block.mix
"%Heading.class;
| %List.class;
| %Block.class;
%Misc.class;"
>
<!-- ................ All Content Elements .................. -->
<!-- %Flow.mix; includes all text content, block and inline
-->
<!ENTITY % Flow.mix
"%Heading.class;
| %List.class;
| %Block.class;
| %Inline.class;
%Misc.class;"
>
<!-- end of xhtml11-model-1.mod -->
@@ -1,196 +0,0 @@
<!-- Portions (C) International Organization for Standardization 1986
Permission to copy in any form is granted for use with
conforming SGML systems and applications as defined in
ISO 8879, provided this notice is included in all copies.
-->
<!-- Character entity set. Typical invocation:
<!ENTITY % HTMLlat1 PUBLIC
"-//W3C//ENTITIES Latin 1 for XHTML//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
%HTMLlat1;
-->
<!ENTITY nbsp "&#160;"> <!-- no-break space = non-breaking space,
U+00A0 ISOnum -->
<!ENTITY iexcl "&#161;"> <!-- inverted exclamation mark, U+00A1 ISOnum -->
<!ENTITY cent "&#162;"> <!-- cent sign, U+00A2 ISOnum -->
<!ENTITY pound "&#163;"> <!-- pound sign, U+00A3 ISOnum -->
<!ENTITY curren "&#164;"> <!-- currency sign, U+00A4 ISOnum -->
<!ENTITY yen "&#165;"> <!-- yen sign = yuan sign, U+00A5 ISOnum -->
<!ENTITY brvbar "&#166;"> <!-- broken bar = broken vertical bar,
U+00A6 ISOnum -->
<!ENTITY sect "&#167;"> <!-- section sign, U+00A7 ISOnum -->
<!ENTITY uml "&#168;"> <!-- diaeresis = spacing diaeresis,
U+00A8 ISOdia -->
<!ENTITY copy "&#169;"> <!-- copyright sign, U+00A9 ISOnum -->
<!ENTITY ordf "&#170;"> <!-- feminine ordinal indicator, U+00AA ISOnum -->
<!ENTITY laquo "&#171;"> <!-- left-pointing double angle quotation mark
= left pointing guillemet, U+00AB ISOnum -->
<!ENTITY not "&#172;"> <!-- not sign = angled dash,
U+00AC ISOnum -->
<!ENTITY shy "&#173;"> <!-- soft hyphen = discretionary hyphen,
U+00AD ISOnum -->
<!ENTITY reg "&#174;"> <!-- registered sign = registered trade mark sign,
U+00AE ISOnum -->
<!ENTITY macr "&#175;"> <!-- macron = spacing macron = overline
= APL overbar, U+00AF ISOdia -->
<!ENTITY deg "&#176;"> <!-- degree sign, U+00B0 ISOnum -->
<!ENTITY plusmn "&#177;"> <!-- plus-minus sign = plus-or-minus sign,
U+00B1 ISOnum -->
<!ENTITY sup2 "&#178;"> <!-- superscript two = superscript digit two
= squared, U+00B2 ISOnum -->
<!ENTITY sup3 "&#179;"> <!-- superscript three = superscript digit three
= cubed, U+00B3 ISOnum -->
<!ENTITY acute "&#180;"> <!-- acute accent = spacing acute,
U+00B4 ISOdia -->
<!ENTITY micro "&#181;"> <!-- micro sign, U+00B5 ISOnum -->
<!ENTITY para "&#182;"> <!-- pilcrow sign = paragraph sign,
U+00B6 ISOnum -->
<!ENTITY middot "&#183;"> <!-- middle dot = Georgian comma
= Greek middle dot, U+00B7 ISOnum -->
<!ENTITY cedil "&#184;"> <!-- cedilla = spacing cedilla, U+00B8 ISOdia -->
<!ENTITY sup1 "&#185;"> <!-- superscript one = superscript digit one,
U+00B9 ISOnum -->
<!ENTITY ordm "&#186;"> <!-- masculine ordinal indicator,
U+00BA ISOnum -->
<!ENTITY raquo "&#187;"> <!-- right-pointing double angle quotation mark
= right pointing guillemet, U+00BB ISOnum -->
<!ENTITY frac14 "&#188;"> <!-- vulgar fraction one quarter
= fraction one quarter, U+00BC ISOnum -->
<!ENTITY frac12 "&#189;"> <!-- vulgar fraction one half
= fraction one half, U+00BD ISOnum -->
<!ENTITY frac34 "&#190;"> <!-- vulgar fraction three quarters
= fraction three quarters, U+00BE ISOnum -->
<!ENTITY iquest "&#191;"> <!-- inverted question mark
= turned question mark, U+00BF ISOnum -->
<!ENTITY Agrave "&#192;"> <!-- latin capital letter A with grave
= latin capital letter A grave,
U+00C0 ISOlat1 -->
<!ENTITY Aacute "&#193;"> <!-- latin capital letter A with acute,
U+00C1 ISOlat1 -->
<!ENTITY Acirc "&#194;"> <!-- latin capital letter A with circumflex,
U+00C2 ISOlat1 -->
<!ENTITY Atilde "&#195;"> <!-- latin capital letter A with tilde,
U+00C3 ISOlat1 -->
<!ENTITY Auml "&#196;"> <!-- latin capital letter A with diaeresis,
U+00C4 ISOlat1 -->
<!ENTITY Aring "&#197;"> <!-- latin capital letter A with ring above
= latin capital letter A ring,
U+00C5 ISOlat1 -->
<!ENTITY AElig "&#198;"> <!-- latin capital letter AE
= latin capital ligature AE,
U+00C6 ISOlat1 -->
<!ENTITY Ccedil "&#199;"> <!-- latin capital letter C with cedilla,
U+00C7 ISOlat1 -->
<!ENTITY Egrave "&#200;"> <!-- latin capital letter E with grave,
U+00C8 ISOlat1 -->
<!ENTITY Eacute "&#201;"> <!-- latin capital letter E with acute,
U+00C9 ISOlat1 -->
<!ENTITY Ecirc "&#202;"> <!-- latin capital letter E with circumflex,
U+00CA ISOlat1 -->
<!ENTITY Euml "&#203;"> <!-- latin capital letter E with diaeresis,
U+00CB ISOlat1 -->
<!ENTITY Igrave "&#204;"> <!-- latin capital letter I with grave,
U+00CC ISOlat1 -->
<!ENTITY Iacute "&#205;"> <!-- latin capital letter I with acute,
U+00CD ISOlat1 -->
<!ENTITY Icirc "&#206;"> <!-- latin capital letter I with circumflex,
U+00CE ISOlat1 -->
<!ENTITY Iuml "&#207;"> <!-- latin capital letter I with diaeresis,
U+00CF ISOlat1 -->
<!ENTITY ETH "&#208;"> <!-- latin capital letter ETH, U+00D0 ISOlat1 -->
<!ENTITY Ntilde "&#209;"> <!-- latin capital letter N with tilde,
U+00D1 ISOlat1 -->
<!ENTITY Ograve "&#210;"> <!-- latin capital letter O with grave,
U+00D2 ISOlat1 -->
<!ENTITY Oacute "&#211;"> <!-- latin capital letter O with acute,
U+00D3 ISOlat1 -->
<!ENTITY Ocirc "&#212;"> <!-- latin capital letter O with circumflex,
U+00D4 ISOlat1 -->
<!ENTITY Otilde "&#213;"> <!-- latin capital letter O with tilde,
U+00D5 ISOlat1 -->
<!ENTITY Ouml "&#214;"> <!-- latin capital letter O with diaeresis,
U+00D6 ISOlat1 -->
<!ENTITY times "&#215;"> <!-- multiplication sign, U+00D7 ISOnum -->
<!ENTITY Oslash "&#216;"> <!-- latin capital letter O with stroke
= latin capital letter O slash,
U+00D8 ISOlat1 -->
<!ENTITY Ugrave "&#217;"> <!-- latin capital letter U with grave,
U+00D9 ISOlat1 -->
<!ENTITY Uacute "&#218;"> <!-- latin capital letter U with acute,
U+00DA ISOlat1 -->
<!ENTITY Ucirc "&#219;"> <!-- latin capital letter U with circumflex,
U+00DB ISOlat1 -->
<!ENTITY Uuml "&#220;"> <!-- latin capital letter U with diaeresis,
U+00DC ISOlat1 -->
<!ENTITY Yacute "&#221;"> <!-- latin capital letter Y with acute,
U+00DD ISOlat1 -->
<!ENTITY THORN "&#222;"> <!-- latin capital letter THORN,
U+00DE ISOlat1 -->
<!ENTITY szlig "&#223;"> <!-- latin small letter sharp s = ess-zed,
U+00DF ISOlat1 -->
<!ENTITY agrave "&#224;"> <!-- latin small letter a with grave
= latin small letter a grave,
U+00E0 ISOlat1 -->
<!ENTITY aacute "&#225;"> <!-- latin small letter a with acute,
U+00E1 ISOlat1 -->
<!ENTITY acirc "&#226;"> <!-- latin small letter a with circumflex,
U+00E2 ISOlat1 -->
<!ENTITY atilde "&#227;"> <!-- latin small letter a with tilde,
U+00E3 ISOlat1 -->
<!ENTITY auml "&#228;"> <!-- latin small letter a with diaeresis,
U+00E4 ISOlat1 -->
<!ENTITY aring "&#229;"> <!-- latin small letter a with ring above
= latin small letter a ring,
U+00E5 ISOlat1 -->
<!ENTITY aelig "&#230;"> <!-- latin small letter ae
= latin small ligature ae, U+00E6 ISOlat1 -->
<!ENTITY ccedil "&#231;"> <!-- latin small letter c with cedilla,
U+00E7 ISOlat1 -->
<!ENTITY egrave "&#232;"> <!-- latin small letter e with grave,
U+00E8 ISOlat1 -->
<!ENTITY eacute "&#233;"> <!-- latin small letter e with acute,
U+00E9 ISOlat1 -->
<!ENTITY ecirc "&#234;"> <!-- latin small letter e with circumflex,
U+00EA ISOlat1 -->
<!ENTITY euml "&#235;"> <!-- latin small letter e with diaeresis,
U+00EB ISOlat1 -->
<!ENTITY igrave "&#236;"> <!-- latin small letter i with grave,
U+00EC ISOlat1 -->
<!ENTITY iacute "&#237;"> <!-- latin small letter i with acute,
U+00ED ISOlat1 -->
<!ENTITY icirc "&#238;"> <!-- latin small letter i with circumflex,
U+00EE ISOlat1 -->
<!ENTITY iuml "&#239;"> <!-- latin small letter i with diaeresis,
U+00EF ISOlat1 -->
<!ENTITY eth "&#240;"> <!-- latin small letter eth, U+00F0 ISOlat1 -->
<!ENTITY ntilde "&#241;"> <!-- latin small letter n with tilde,
U+00F1 ISOlat1 -->
<!ENTITY ograve "&#242;"> <!-- latin small letter o with grave,
U+00F2 ISOlat1 -->
<!ENTITY oacute "&#243;"> <!-- latin small letter o with acute,
U+00F3 ISOlat1 -->
<!ENTITY ocirc "&#244;"> <!-- latin small letter o with circumflex,
U+00F4 ISOlat1 -->
<!ENTITY otilde "&#245;"> <!-- latin small letter o with tilde,
U+00F5 ISOlat1 -->
<!ENTITY ouml "&#246;"> <!-- latin small letter o with diaeresis,
U+00F6 ISOlat1 -->
<!ENTITY divide "&#247;"> <!-- division sign, U+00F7 ISOnum -->
<!ENTITY oslash "&#248;"> <!-- latin small letter o with stroke,
= latin small letter o slash,
U+00F8 ISOlat1 -->
<!ENTITY ugrave "&#249;"> <!-- latin small letter u with grave,
U+00F9 ISOlat1 -->
<!ENTITY uacute "&#250;"> <!-- latin small letter u with acute,
U+00FA ISOlat1 -->
<!ENTITY ucirc "&#251;"> <!-- latin small letter u with circumflex,
U+00FB ISOlat1 -->
<!ENTITY uuml "&#252;"> <!-- latin small letter u with diaeresis,
U+00FC ISOlat1 -->
<!ENTITY yacute "&#253;"> <!-- latin small letter y with acute,
U+00FD ISOlat1 -->
<!ENTITY thorn "&#254;"> <!-- latin small letter thorn,
U+00FE ISOlat1 -->
<!ENTITY yuml "&#255;"> <!-- latin small letter y with diaeresis,
U+00FF ISOlat1 -->
@@ -1,80 +0,0 @@
<!-- Special characters for XHTML -->
<!-- Character entity set. Typical invocation:
<!ENTITY % HTMLspecial PUBLIC
"-//W3C//ENTITIES Special for XHTML//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent">
%HTMLspecial;
-->
<!-- Portions (C) International Organization for Standardization 1986:
Permission to copy in any form is granted for use with
conforming SGML systems and applications as defined in
ISO 8879, provided this notice is included in all copies.
-->
<!-- Relevant ISO entity set is given unless names are newly introduced.
New names (i.e., not in ISO 8879 list) do not clash with any
existing ISO 8879 entity names. ISO 10646 character numbers
are given for each character, in hex. values are decimal
conversions of the ISO 10646 values and refer to the document
character set. Names are Unicode names.
-->
<!-- C0 Controls and Basic Latin -->
<!ENTITY quot "&#34;"> <!-- quotation mark, U+0022 ISOnum -->
<!ENTITY amp "&#38;#38;"> <!-- ampersand, U+0026 ISOnum -->
<!ENTITY lt "&#38;#60;"> <!-- less-than sign, U+003C ISOnum -->
<!ENTITY gt "&#62;"> <!-- greater-than sign, U+003E ISOnum -->
<!ENTITY apos "&#39;"> <!-- apostrophe = APL quote, U+0027 ISOnum -->
<!-- Latin Extended-A -->
<!ENTITY OElig "&#338;"> <!-- latin capital ligature OE,
U+0152 ISOlat2 -->
<!ENTITY oelig "&#339;"> <!-- latin small ligature oe, U+0153 ISOlat2 -->
<!-- ligature is a misnomer, this is a separate character in some languages -->
<!ENTITY Scaron "&#352;"> <!-- latin capital letter S with caron,
U+0160 ISOlat2 -->
<!ENTITY scaron "&#353;"> <!-- latin small letter s with caron,
U+0161 ISOlat2 -->
<!ENTITY Yuml "&#376;"> <!-- latin capital letter Y with diaeresis,
U+0178 ISOlat2 -->
<!-- Spacing Modifier Letters -->
<!ENTITY circ "&#710;"> <!-- modifier letter circumflex accent,
U+02C6 ISOpub -->
<!ENTITY tilde "&#732;"> <!-- small tilde, U+02DC ISOdia -->
<!-- General Punctuation -->
<!ENTITY ensp "&#8194;"> <!-- en space, U+2002 ISOpub -->
<!ENTITY emsp "&#8195;"> <!-- em space, U+2003 ISOpub -->
<!ENTITY thinsp "&#8201;"> <!-- thin space, U+2009 ISOpub -->
<!ENTITY zwnj "&#8204;"> <!-- zero width non-joiner,
U+200C NEW RFC 2070 -->
<!ENTITY zwj "&#8205;"> <!-- zero width joiner, U+200D NEW RFC 2070 -->
<!ENTITY lrm "&#8206;"> <!-- left-to-right mark, U+200E NEW RFC 2070 -->
<!ENTITY rlm "&#8207;"> <!-- right-to-left mark, U+200F NEW RFC 2070 -->
<!ENTITY ndash "&#8211;"> <!-- en dash, U+2013 ISOpub -->
<!ENTITY mdash "&#8212;"> <!-- em dash, U+2014 ISOpub -->
<!ENTITY lsquo "&#8216;"> <!-- left single quotation mark,
U+2018 ISOnum -->
<!ENTITY rsquo "&#8217;"> <!-- right single quotation mark,
U+2019 ISOnum -->
<!ENTITY sbquo "&#8218;"> <!-- single low-9 quotation mark, U+201A NEW -->
<!ENTITY ldquo "&#8220;"> <!-- left double quotation mark,
U+201C ISOnum -->
<!ENTITY rdquo "&#8221;"> <!-- right double quotation mark,
U+201D ISOnum -->
<!ENTITY bdquo "&#8222;"> <!-- double low-9 quotation mark, U+201E NEW -->
<!ENTITY dagger "&#8224;"> <!-- dagger, U+2020 ISOpub -->
<!ENTITY Dagger "&#8225;"> <!-- double dagger, U+2021 ISOpub -->
<!ENTITY permil "&#8240;"> <!-- per mille sign, U+2030 ISOtech -->
<!ENTITY lsaquo "&#8249;"> <!-- single left-pointing angle quotation mark,
U+2039 ISO proposed -->
<!-- lsaquo is proposed but not yet ISO standardized -->
<!ENTITY rsaquo "&#8250;"> <!-- single right-pointing angle quotation mark,
U+203A ISO proposed -->
<!-- rsaquo is proposed but not yet ISO standardized -->
<!-- Currency Symbols -->
<!ENTITY euro "&#8364;"> <!-- euro sign, U+20AC NEW -->
@@ -1,237 +0,0 @@
<!-- Mathematical, Greek and Symbolic characters for XHTML -->
<!-- Character entity set. Typical invocation:
<!ENTITY % HTMLsymbol PUBLIC
"-//W3C//ENTITIES Symbols for XHTML//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent">
%HTMLsymbol;
-->
<!-- Portions (C) International Organization for Standardization 1986:
Permission to copy in any form is granted for use with
conforming SGML systems and applications as defined in
ISO 8879, provided this notice is included in all copies.
-->
<!-- Relevant ISO entity set is given unless names are newly introduced.
New names (i.e., not in ISO 8879 list) do not clash with any
existing ISO 8879 entity names. ISO 10646 character numbers
are given for each character, in hex. values are decimal
conversions of the ISO 10646 values and refer to the document
character set. Names are Unicode names.
-->
<!-- Latin Extended-B -->
<!ENTITY fnof "&#402;"> <!-- latin small letter f with hook = function
= florin, U+0192 ISOtech -->
<!-- Greek -->
<!ENTITY Alpha "&#913;"> <!-- greek capital letter alpha, U+0391 -->
<!ENTITY Beta "&#914;"> <!-- greek capital letter beta, U+0392 -->
<!ENTITY Gamma "&#915;"> <!-- greek capital letter gamma,
U+0393 ISOgrk3 -->
<!ENTITY Delta "&#916;"> <!-- greek capital letter delta,
U+0394 ISOgrk3 -->
<!ENTITY Epsilon "&#917;"> <!-- greek capital letter epsilon, U+0395 -->
<!ENTITY Zeta "&#918;"> <!-- greek capital letter zeta, U+0396 -->
<!ENTITY Eta "&#919;"> <!-- greek capital letter eta, U+0397 -->
<!ENTITY Theta "&#920;"> <!-- greek capital letter theta,
U+0398 ISOgrk3 -->
<!ENTITY Iota "&#921;"> <!-- greek capital letter iota, U+0399 -->
<!ENTITY Kappa "&#922;"> <!-- greek capital letter kappa, U+039A -->
<!ENTITY Lambda "&#923;"> <!-- greek capital letter lamda,
U+039B ISOgrk3 -->
<!ENTITY Mu "&#924;"> <!-- greek capital letter mu, U+039C -->
<!ENTITY Nu "&#925;"> <!-- greek capital letter nu, U+039D -->
<!ENTITY Xi "&#926;"> <!-- greek capital letter xi, U+039E ISOgrk3 -->
<!ENTITY Omicron "&#927;"> <!-- greek capital letter omicron, U+039F -->
<!ENTITY Pi "&#928;"> <!-- greek capital letter pi, U+03A0 ISOgrk3 -->
<!ENTITY Rho "&#929;"> <!-- greek capital letter rho, U+03A1 -->
<!-- there is no Sigmaf, and no U+03A2 character either -->
<!ENTITY Sigma "&#931;"> <!-- greek capital letter sigma,
U+03A3 ISOgrk3 -->
<!ENTITY Tau "&#932;"> <!-- greek capital letter tau, U+03A4 -->
<!ENTITY Upsilon "&#933;"> <!-- greek capital letter upsilon,
U+03A5 ISOgrk3 -->
<!ENTITY Phi "&#934;"> <!-- greek capital letter phi,
U+03A6 ISOgrk3 -->
<!ENTITY Chi "&#935;"> <!-- greek capital letter chi, U+03A7 -->
<!ENTITY Psi "&#936;"> <!-- greek capital letter psi,
U+03A8 ISOgrk3 -->
<!ENTITY Omega "&#937;"> <!-- greek capital letter omega,
U+03A9 ISOgrk3 -->
<!ENTITY alpha "&#945;"> <!-- greek small letter alpha,
U+03B1 ISOgrk3 -->
<!ENTITY beta "&#946;"> <!-- greek small letter beta, U+03B2 ISOgrk3 -->
<!ENTITY gamma "&#947;"> <!-- greek small letter gamma,
U+03B3 ISOgrk3 -->
<!ENTITY delta "&#948;"> <!-- greek small letter delta,
U+03B4 ISOgrk3 -->
<!ENTITY epsilon "&#949;"> <!-- greek small letter epsilon,
U+03B5 ISOgrk3 -->
<!ENTITY zeta "&#950;"> <!-- greek small letter zeta, U+03B6 ISOgrk3 -->
<!ENTITY eta "&#951;"> <!-- greek small letter eta, U+03B7 ISOgrk3 -->
<!ENTITY theta "&#952;"> <!-- greek small letter theta,
U+03B8 ISOgrk3 -->
<!ENTITY iota "&#953;"> <!-- greek small letter iota, U+03B9 ISOgrk3 -->
<!ENTITY kappa "&#954;"> <!-- greek small letter kappa,
U+03BA ISOgrk3 -->
<!ENTITY lambda "&#955;"> <!-- greek small letter lamda,
U+03BB ISOgrk3 -->
<!ENTITY mu "&#956;"> <!-- greek small letter mu, U+03BC ISOgrk3 -->
<!ENTITY nu "&#957;"> <!-- greek small letter nu, U+03BD ISOgrk3 -->
<!ENTITY xi "&#958;"> <!-- greek small letter xi, U+03BE ISOgrk3 -->
<!ENTITY omicron "&#959;"> <!-- greek small letter omicron, U+03BF NEW -->
<!ENTITY pi "&#960;"> <!-- greek small letter pi, U+03C0 ISOgrk3 -->
<!ENTITY rho "&#961;"> <!-- greek small letter rho, U+03C1 ISOgrk3 -->
<!ENTITY sigmaf "&#962;"> <!-- greek small letter final sigma,
U+03C2 ISOgrk3 -->
<!ENTITY sigma "&#963;"> <!-- greek small letter sigma,
U+03C3 ISOgrk3 -->
<!ENTITY tau "&#964;"> <!-- greek small letter tau, U+03C4 ISOgrk3 -->
<!ENTITY upsilon "&#965;"> <!-- greek small letter upsilon,
U+03C5 ISOgrk3 -->
<!ENTITY phi "&#966;"> <!-- greek small letter phi, U+03C6 ISOgrk3 -->
<!ENTITY chi "&#967;"> <!-- greek small letter chi, U+03C7 ISOgrk3 -->
<!ENTITY psi "&#968;"> <!-- greek small letter psi, U+03C8 ISOgrk3 -->
<!ENTITY omega "&#969;"> <!-- greek small letter omega,
U+03C9 ISOgrk3 -->
<!ENTITY thetasym "&#977;"> <!-- greek theta symbol,
U+03D1 NEW -->
<!ENTITY upsih "&#978;"> <!-- greek upsilon with hook symbol,
U+03D2 NEW -->
<!ENTITY piv "&#982;"> <!-- greek pi symbol, U+03D6 ISOgrk3 -->
<!-- General Punctuation -->
<!ENTITY bull "&#8226;"> <!-- bullet = black small circle,
U+2022 ISOpub -->
<!-- bullet is NOT the same as bullet operator, U+2219 -->
<!ENTITY hellip "&#8230;"> <!-- horizontal ellipsis = three dot leader,
U+2026 ISOpub -->
<!ENTITY prime "&#8242;"> <!-- prime = minutes = feet, U+2032 ISOtech -->
<!ENTITY Prime "&#8243;"> <!-- double prime = seconds = inches,
U+2033 ISOtech -->
<!ENTITY oline "&#8254;"> <!-- overline = spacing overscore,
U+203E NEW -->
<!ENTITY frasl "&#8260;"> <!-- fraction slash, U+2044 NEW -->
<!-- Letterlike Symbols -->
<!ENTITY weierp "&#8472;"> <!-- script capital P = power set
= Weierstrass p, U+2118 ISOamso -->
<!ENTITY image "&#8465;"> <!-- black-letter capital I = imaginary part,
U+2111 ISOamso -->
<!ENTITY real "&#8476;"> <!-- black-letter capital R = real part symbol,
U+211C ISOamso -->
<!ENTITY trade "&#8482;"> <!-- trade mark sign, U+2122 ISOnum -->
<!ENTITY alefsym "&#8501;"> <!-- alef symbol = first transfinite cardinal,
U+2135 NEW -->
<!-- alef symbol is NOT the same as hebrew letter alef,
U+05D0 although the same glyph could be used to depict both characters -->
<!-- Arrows -->
<!ENTITY larr "&#8592;"> <!-- leftwards arrow, U+2190 ISOnum -->
<!ENTITY uarr "&#8593;"> <!-- upwards arrow, U+2191 ISOnum-->
<!ENTITY rarr "&#8594;"> <!-- rightwards arrow, U+2192 ISOnum -->
<!ENTITY darr "&#8595;"> <!-- downwards arrow, U+2193 ISOnum -->
<!ENTITY harr "&#8596;"> <!-- left right arrow, U+2194 ISOamsa -->
<!ENTITY crarr "&#8629;"> <!-- downwards arrow with corner leftwards
= carriage return, U+21B5 NEW -->
<!ENTITY lArr "&#8656;"> <!-- leftwards double arrow, U+21D0 ISOtech -->
<!-- Unicode does not say that lArr is the same as the 'is implied by' arrow
but also does not have any other character for that function. So lArr can
be used for 'is implied by' as ISOtech suggests -->
<!ENTITY uArr "&#8657;"> <!-- upwards double arrow, U+21D1 ISOamsa -->
<!ENTITY rArr "&#8658;"> <!-- rightwards double arrow,
U+21D2 ISOtech -->
<!-- Unicode does not say this is the 'implies' character but does not have
another character with this function so rArr can be used for 'implies'
as ISOtech suggests -->
<!ENTITY dArr "&#8659;"> <!-- downwards double arrow, U+21D3 ISOamsa -->
<!ENTITY hArr "&#8660;"> <!-- left right double arrow,
U+21D4 ISOamsa -->
<!-- Mathematical Operators -->
<!ENTITY forall "&#8704;"> <!-- for all, U+2200 ISOtech -->
<!ENTITY part "&#8706;"> <!-- partial differential, U+2202 ISOtech -->
<!ENTITY exist "&#8707;"> <!-- there exists, U+2203 ISOtech -->
<!ENTITY empty "&#8709;"> <!-- empty set = null set, U+2205 ISOamso -->
<!ENTITY nabla "&#8711;"> <!-- nabla = backward difference,
U+2207 ISOtech -->
<!ENTITY isin "&#8712;"> <!-- element of, U+2208 ISOtech -->
<!ENTITY notin "&#8713;"> <!-- not an element of, U+2209 ISOtech -->
<!ENTITY ni "&#8715;"> <!-- contains as member, U+220B ISOtech -->
<!ENTITY prod "&#8719;"> <!-- n-ary product = product sign,
U+220F ISOamsb -->
<!-- prod is NOT the same character as U+03A0 'greek capital letter pi' though
the same glyph might be used for both -->
<!ENTITY sum "&#8721;"> <!-- n-ary summation, U+2211 ISOamsb -->
<!-- sum is NOT the same character as U+03A3 'greek capital letter sigma'
though the same glyph might be used for both -->
<!ENTITY minus "&#8722;"> <!-- minus sign, U+2212 ISOtech -->
<!ENTITY lowast "&#8727;"> <!-- asterisk operator, U+2217 ISOtech -->
<!ENTITY radic "&#8730;"> <!-- square root = radical sign,
U+221A ISOtech -->
<!ENTITY prop "&#8733;"> <!-- proportional to, U+221D ISOtech -->
<!ENTITY infin "&#8734;"> <!-- infinity, U+221E ISOtech -->
<!ENTITY ang "&#8736;"> <!-- angle, U+2220 ISOamso -->
<!ENTITY and "&#8743;"> <!-- logical and = wedge, U+2227 ISOtech -->
<!ENTITY or "&#8744;"> <!-- logical or = vee, U+2228 ISOtech -->
<!ENTITY cap "&#8745;"> <!-- intersection = cap, U+2229 ISOtech -->
<!ENTITY cup "&#8746;"> <!-- union = cup, U+222A ISOtech -->
<!ENTITY int "&#8747;"> <!-- integral, U+222B ISOtech -->
<!ENTITY there4 "&#8756;"> <!-- therefore, U+2234 ISOtech -->
<!ENTITY sim "&#8764;"> <!-- tilde operator = varies with = similar to,
U+223C ISOtech -->
<!-- tilde operator is NOT the same character as the tilde, U+007E,
although the same glyph might be used to represent both -->
<!ENTITY cong "&#8773;"> <!-- approximately equal to, U+2245 ISOtech -->
<!ENTITY asymp "&#8776;"> <!-- almost equal to = asymptotic to,
U+2248 ISOamsr -->
<!ENTITY ne "&#8800;"> <!-- not equal to, U+2260 ISOtech -->
<!ENTITY equiv "&#8801;"> <!-- identical to, U+2261 ISOtech -->
<!ENTITY le "&#8804;"> <!-- less-than or equal to, U+2264 ISOtech -->
<!ENTITY ge "&#8805;"> <!-- greater-than or equal to,
U+2265 ISOtech -->
<!ENTITY sub "&#8834;"> <!-- subset of, U+2282 ISOtech -->
<!ENTITY sup "&#8835;"> <!-- superset of, U+2283 ISOtech -->
<!ENTITY nsub "&#8836;"> <!-- not a subset of, U+2284 ISOamsn -->
<!ENTITY sube "&#8838;"> <!-- subset of or equal to, U+2286 ISOtech -->
<!ENTITY supe "&#8839;"> <!-- superset of or equal to,
U+2287 ISOtech -->
<!ENTITY oplus "&#8853;"> <!-- circled plus = direct sum,
U+2295 ISOamsb -->
<!ENTITY otimes "&#8855;"> <!-- circled times = vector product,
U+2297 ISOamsb -->
<!ENTITY perp "&#8869;"> <!-- up tack = orthogonal to = perpendicular,
U+22A5 ISOtech -->
<!ENTITY sdot "&#8901;"> <!-- dot operator, U+22C5 ISOamsb -->
<!-- dot operator is NOT the same character as U+00B7 middle dot -->
<!-- Miscellaneous Technical -->
<!ENTITY lceil "&#8968;"> <!-- left ceiling = APL upstile,
U+2308 ISOamsc -->
<!ENTITY rceil "&#8969;"> <!-- right ceiling, U+2309 ISOamsc -->
<!ENTITY lfloor "&#8970;"> <!-- left floor = APL downstile,
U+230A ISOamsc -->
<!ENTITY rfloor "&#8971;"> <!-- right floor, U+230B ISOamsc -->
<!ENTITY lang "&#9001;"> <!-- left-pointing angle bracket = bra,
U+2329 ISOtech -->
<!-- lang is NOT the same character as U+003C 'less than sign'
or U+2039 'single left-pointing angle quotation mark' -->
<!ENTITY rang "&#9002;"> <!-- right-pointing angle bracket = ket,
U+232A ISOtech -->
<!-- rang is NOT the same character as U+003E 'greater than sign'
or U+203A 'single right-pointing angle quotation mark' -->
<!-- Geometric Shapes -->
<!ENTITY loz "&#9674;"> <!-- lozenge, U+25CA ISOpub -->
<!-- Miscellaneous Symbols -->
<!ENTITY spades "&#9824;"> <!-- black spade suit, U+2660 ISOpub -->
<!-- black here seems to mean filled as opposed to hollow -->
<!ENTITY clubs "&#9827;"> <!-- black club suit = shamrock,
U+2663 ISOpub -->
<!ENTITY hearts "&#9829;"> <!-- black heart suit = valentine,
U+2665 ISOpub -->
<!ENTITY diams "&#9830;"> <!-- black diamond suit, U+2666 ISOpub -->
@@ -1,978 +0,0 @@
<!--
Extensible HTML version 1.0 Strict DTD
This is the same as HTML 4 Strict except for
changes due to the differences between XML and SGML.
Namespace = http://www.w3.org/1999/xhtml
For further information, see: http://www.w3.org/TR/xhtml1
Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio),
All Rights Reserved.
This DTD module is identified by the PUBLIC and SYSTEM identifiers:
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
$Revision: 1.1 $
$Date: 2002/08/01 13:56:03 $
-->
<!--================ Character mnemonic entities =========================-->
<!ENTITY % HTMLlat1 PUBLIC
"-//W3C//ENTITIES Latin 1 for XHTML//EN"
"xhtml-lat1.ent">
%HTMLlat1;
<!ENTITY % HTMLsymbol PUBLIC
"-//W3C//ENTITIES Symbols for XHTML//EN"
"xhtml-symbol.ent">
%HTMLsymbol;
<!ENTITY % HTMLspecial PUBLIC
"-//W3C//ENTITIES Special for XHTML//EN"
"xhtml-special.ent">
%HTMLspecial;
<!--================== Imported Names ====================================-->
<!ENTITY % ContentType "CDATA">
<!-- media type, as per [RFC2045] -->
<!ENTITY % ContentTypes "CDATA">
<!-- comma-separated list of media types, as per [RFC2045] -->
<!ENTITY % Charset "CDATA">
<!-- a character encoding, as per [RFC2045] -->
<!ENTITY % Charsets "CDATA">
<!-- a space separated list of character encodings, as per [RFC2045] -->
<!ENTITY % LanguageCode "NMTOKEN">
<!-- a language code, as per [RFC3066] -->
<!ENTITY % Character "CDATA">
<!-- a single character, as per section 2.2 of [XML] -->
<!ENTITY % Number "CDATA">
<!-- one or more digits -->
<!ENTITY % LinkTypes "CDATA">
<!-- space-separated list of link types -->
<!ENTITY % MediaDesc "CDATA">
<!-- single or comma-separated list of media descriptors -->
<!ENTITY % URI "CDATA">
<!-- a Uniform Resource Identifier, see [RFC2396] -->
<!ENTITY % UriList "CDATA">
<!-- a space separated list of Uniform Resource Identifiers -->
<!ENTITY % Datetime "CDATA">
<!-- date and time information. ISO date format -->
<!ENTITY % Script "CDATA">
<!-- script expression -->
<!ENTITY % StyleSheet "CDATA">
<!-- style sheet data -->
<!ENTITY % Text "CDATA">
<!-- used for titles etc. -->
<!ENTITY % Length "CDATA">
<!-- nn for pixels or nn% for percentage length -->
<!ENTITY % MultiLength "CDATA">
<!-- pixel, percentage, or relative -->
<!ENTITY % Pixels "CDATA">
<!-- integer representing length in pixels -->
<!-- these are used for image maps -->
<!ENTITY % Shape "(rect|circle|poly|default)">
<!ENTITY % Coords "CDATA">
<!-- comma separated list of lengths -->
<!--=================== Generic Attributes ===============================-->
<!-- core attributes common to most elements
id document-wide unique id
class space separated list of classes
style associated style info
title advisory title/amplification
-->
<!ENTITY % coreattrs
"id ID #IMPLIED
class CDATA #IMPLIED
style %StyleSheet; #IMPLIED
title %Text; #IMPLIED"
>
<!-- internationalization attributes
lang language code (backwards compatible)
xml:lang language code (as per XML 1.0 spec)
dir direction for weak/neutral text
-->
<!ENTITY % i18n
"lang %LanguageCode; #IMPLIED
xml:lang %LanguageCode; #IMPLIED
dir (ltr|rtl) #IMPLIED"
>
<!-- attributes for common UI events
onclick a pointer button was clicked
ondblclick a pointer button was double clicked
onmousedown a pointer button was pressed down
onmouseup a pointer button was released
onmousemove a pointer was moved onto the element
onmouseout a pointer was moved away from the element
onkeypress a key was pressed and released
onkeydown a key was pressed down
onkeyup a key was released
-->
<!ENTITY % events
"onclick %Script; #IMPLIED
ondblclick %Script; #IMPLIED
onmousedown %Script; #IMPLIED
onmouseup %Script; #IMPLIED
onmouseover %Script; #IMPLIED
onmousemove %Script; #IMPLIED
onmouseout %Script; #IMPLIED
onkeypress %Script; #IMPLIED
onkeydown %Script; #IMPLIED
onkeyup %Script; #IMPLIED"
>
<!-- attributes for elements that can get the focus
accesskey accessibility key character
tabindex position in tabbing order
onfocus the element got the focus
onblur the element lost the focus
-->
<!ENTITY % focus
"accesskey %Character; #IMPLIED
tabindex %Number; #IMPLIED
onfocus %Script; #IMPLIED
onblur %Script; #IMPLIED"
>
<!ENTITY % attrs "%coreattrs; %i18n; %events;">
<!--=================== Text Elements ====================================-->
<!ENTITY % special.pre
"br | span | bdo | map">
<!ENTITY % special
"%special.pre; | object | img ">
<!ENTITY % fontstyle "tt | i | b | big | small ">
<!ENTITY % phrase "em | strong | dfn | code | q |
samp | kbd | var | cite | abbr | acronym | sub | sup ">
<!ENTITY % inline.forms "input | select | textarea | label | button">
<!-- these can occur at block or inline level -->
<!ENTITY % misc.inline "ins | del | script">
<!-- these can only occur at block level -->
<!ENTITY % misc "noscript | %misc.inline;">
<!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;">
<!-- %Inline; covers inline or "text-level" elements -->
<!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*">
<!--================== Block level elements ==============================-->
<!ENTITY % heading "h1|h2|h3|h4|h5|h6">
<!ENTITY % lists "ul | ol | dl">
<!ENTITY % blocktext "pre | hr | blockquote | address">
<!ENTITY % block
"p | %heading; | div | %lists; | %blocktext; | fieldset | table">
<!ENTITY % Block "(%block; | form | %misc;)*">
<!-- %Flow; mixes block and inline and is used for list items etc. -->
<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">
<!--================== Content models for exclusions =====================-->
<!-- a elements use %Inline; excluding a -->
<!ENTITY % a.content
"(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc.inline;)*">
<!-- pre uses %Inline excluding big, small, sup or sup -->
<!ENTITY % pre.content
"(#PCDATA | a | %fontstyle; | %phrase; | %special.pre; | %misc.inline;
| %inline.forms;)*">
<!-- form uses %Block; excluding form -->
<!ENTITY % form.content "(%block; | %misc;)*">
<!-- button uses %Flow; but excludes a, form and form controls -->
<!ENTITY % button.content
"(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
table | %special; | %fontstyle; | %phrase; | %misc;)*">
<!--================ Document Structure ==================================-->
<!-- the namespace URI designates the document profile -->
<!ELEMENT html (head, body)>
<!ATTLIST html
%i18n;
id ID #IMPLIED
xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml'
>
<!--================ Document Head =======================================-->
<!ENTITY % head.misc "(script|style|meta|link|object)*">
<!-- content model is %head.misc; combined with a single
title and an optional base element in any order -->
<!ELEMENT head (%head.misc;,
((title, %head.misc;, (base, %head.misc;)?) |
(base, %head.misc;, (title, %head.misc;))))>
<!ATTLIST head
%i18n;
id ID #IMPLIED
profile %URI; #IMPLIED
>
<!-- The title element is not considered part of the flow of text.
It should be displayed, for example as the page header or
window title. Exactly one title is required per document.
-->
<!ELEMENT title (#PCDATA)>
<!ATTLIST title
%i18n;
id ID #IMPLIED
>
<!-- document base URI -->
<!ELEMENT base EMPTY>
<!ATTLIST base
href %URI; #REQUIRED
id ID #IMPLIED
>
<!-- generic metainformation -->
<!ELEMENT meta EMPTY>
<!ATTLIST meta
%i18n;
id ID #IMPLIED
http-equiv CDATA #IMPLIED
name CDATA #IMPLIED
content CDATA #REQUIRED
scheme CDATA #IMPLIED
>
<!--
Relationship values can be used in principle:
a) for document specific toolbars/menus when used
with the link element in document head e.g.
start, contents, previous, next, index, end, help
b) to link to a separate style sheet (rel="stylesheet")
c) to make a link to a script (rel="script")
d) by stylesheets to control how collections of
html nodes are rendered into printed documents
e) to make a link to a printable version of this document
e.g. a PostScript or PDF version (rel="alternate" media="print")
-->
<!ELEMENT link EMPTY>
<!ATTLIST link
%attrs;
charset %Charset; #IMPLIED
href %URI; #IMPLIED
hreflang %LanguageCode; #IMPLIED
type %ContentType; #IMPLIED
rel %LinkTypes; #IMPLIED
rev %LinkTypes; #IMPLIED
media %MediaDesc; #IMPLIED
>
<!-- style info, which may include CDATA sections -->
<!ELEMENT style (#PCDATA)>
<!ATTLIST style
%i18n;
id ID #IMPLIED
type %ContentType; #REQUIRED
media %MediaDesc; #IMPLIED
title %Text; #IMPLIED
xml:space (preserve) #FIXED 'preserve'
>
<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
<!ATTLIST script
id ID #IMPLIED
charset %Charset; #IMPLIED
type %ContentType; #REQUIRED
src %URI; #IMPLIED
defer (defer) #IMPLIED
xml:space (preserve) #FIXED 'preserve'
>
<!-- alternate content container for non script-based rendering -->
<!ELEMENT noscript %Block;>
<!ATTLIST noscript
%attrs;
>
<!--=================== Document Body ====================================-->
<!ELEMENT body %Block;>
<!ATTLIST body
%attrs;
onload %Script; #IMPLIED
onunload %Script; #IMPLIED
>
<!ELEMENT div %Flow;> <!-- generic language/style container -->
<!ATTLIST div
%attrs;
>
<!--=================== Paragraphs =======================================-->
<!ELEMENT p %Inline;>
<!ATTLIST p
%attrs;
>
<!--=================== Headings =========================================-->
<!--
There are six levels of headings from h1 (the most important)
to h6 (the least important).
-->
<!ELEMENT h1 %Inline;>
<!ATTLIST h1
%attrs;
>
<!ELEMENT h2 %Inline;>
<!ATTLIST h2
%attrs;
>
<!ELEMENT h3 %Inline;>
<!ATTLIST h3
%attrs;
>
<!ELEMENT h4 %Inline;>
<!ATTLIST h4
%attrs;
>
<!ELEMENT h5 %Inline;>
<!ATTLIST h5
%attrs;
>
<!ELEMENT h6 %Inline;>
<!ATTLIST h6
%attrs;
>
<!--=================== Lists ============================================-->
<!-- Unordered list -->
<!ELEMENT ul (li)+>
<!ATTLIST ul
%attrs;
>
<!-- Ordered (numbered) list -->
<!ELEMENT ol (li)+>
<!ATTLIST ol
%attrs;
>
<!-- list item -->
<!ELEMENT li %Flow;>
<!ATTLIST li
%attrs;
>
<!-- definition lists - dt for term, dd for its definition -->
<!ELEMENT dl (dt|dd)+>
<!ATTLIST dl
%attrs;
>
<!ELEMENT dt %Inline;>
<!ATTLIST dt
%attrs;
>
<!ELEMENT dd %Flow;>
<!ATTLIST dd
%attrs;
>
<!--=================== Address ==========================================-->
<!-- information on author -->
<!ELEMENT address %Inline;>
<!ATTLIST address
%attrs;
>
<!--=================== Horizontal Rule ==================================-->
<!ELEMENT hr EMPTY>
<!ATTLIST hr
%attrs;
>
<!--=================== Preformatted Text ================================-->
<!-- content is %Inline; excluding "img|object|big|small|sub|sup" -->
<!ELEMENT pre %pre.content;>
<!ATTLIST pre
%attrs;
xml:space (preserve) #FIXED 'preserve'
>
<!--=================== Block-like Quotes ================================-->
<!ELEMENT blockquote %Block;>
<!ATTLIST blockquote
%attrs;
cite %URI; #IMPLIED
>
<!--=================== Inserted/Deleted Text ============================-->
<!--
ins/del are allowed in block and inline content, but its
inappropriate to include block content within an ins element
occurring in inline content.
-->
<!ELEMENT ins %Flow;>
<!ATTLIST ins
%attrs;
cite %URI; #IMPLIED
datetime %Datetime; #IMPLIED
>
<!ELEMENT del %Flow;>
<!ATTLIST del
%attrs;
cite %URI; #IMPLIED
datetime %Datetime; #IMPLIED
>
<!--================== The Anchor Element ================================-->
<!-- content is %Inline; except that anchors shouldn't be nested -->
<!ELEMENT a %a.content;>
<!ATTLIST a
%attrs;
%focus;
charset %Charset; #IMPLIED
type %ContentType; #IMPLIED
name NMTOKEN #IMPLIED
href %URI; #IMPLIED
hreflang %LanguageCode; #IMPLIED
rel %LinkTypes; #IMPLIED
rev %LinkTypes; #IMPLIED
shape %Shape; "rect"
coords %Coords; #IMPLIED
>
<!--===================== Inline Elements ================================-->
<!ELEMENT span %Inline;> <!-- generic language/style container -->
<!ATTLIST span
%attrs;
>
<!ELEMENT bdo %Inline;> <!-- I18N BiDi over-ride -->
<!ATTLIST bdo
%coreattrs;
%events;
lang %LanguageCode; #IMPLIED
xml:lang %LanguageCode; #IMPLIED
dir (ltr|rtl) #REQUIRED
>
<!ELEMENT br EMPTY> <!-- forced line break -->
<!ATTLIST br
%coreattrs;
>
<!ELEMENT em %Inline;> <!-- emphasis -->
<!ATTLIST em %attrs;>
<!ELEMENT strong %Inline;> <!-- strong emphasis -->
<!ATTLIST strong %attrs;>
<!ELEMENT dfn %Inline;> <!-- definitional -->
<!ATTLIST dfn %attrs;>
<!ELEMENT code %Inline;> <!-- program code -->
<!ATTLIST code %attrs;>
<!ELEMENT samp %Inline;> <!-- sample -->
<!ATTLIST samp %attrs;>
<!ELEMENT kbd %Inline;> <!-- something user would type -->
<!ATTLIST kbd %attrs;>
<!ELEMENT var %Inline;> <!-- variable -->
<!ATTLIST var %attrs;>
<!ELEMENT cite %Inline;> <!-- citation -->
<!ATTLIST cite %attrs;>
<!ELEMENT abbr %Inline;> <!-- abbreviation -->
<!ATTLIST abbr %attrs;>
<!ELEMENT acronym %Inline;> <!-- acronym -->
<!ATTLIST acronym %attrs;>
<!ELEMENT q %Inline;> <!-- inlined quote -->
<!ATTLIST q
%attrs;
cite %URI; #IMPLIED
>
<!ELEMENT sub %Inline;> <!-- subscript -->
<!ATTLIST sub %attrs;>
<!ELEMENT sup %Inline;> <!-- superscript -->
<!ATTLIST sup %attrs;>
<!ELEMENT tt %Inline;> <!-- fixed pitch font -->
<!ATTLIST tt %attrs;>
<!ELEMENT i %Inline;> <!-- italic font -->
<!ATTLIST i %attrs;>
<!ELEMENT b %Inline;> <!-- bold font -->
<!ATTLIST b %attrs;>
<!ELEMENT big %Inline;> <!-- bigger font -->
<!ATTLIST big %attrs;>
<!ELEMENT small %Inline;> <!-- smaller font -->
<!ATTLIST small %attrs;>
<!--==================== Object ======================================-->
<!--
object is used to embed objects as part of HTML pages.
param elements should precede other content. Parameters
can also be expressed as attribute/value pairs on the
object element itself when brevity is desired.
-->
<!ELEMENT object (#PCDATA | param | %block; | form | %inline; | %misc;)*>
<!ATTLIST object
%attrs;
declare (declare) #IMPLIED
classid %URI; #IMPLIED
codebase %URI; #IMPLIED
data %URI; #IMPLIED
type %ContentType; #IMPLIED
codetype %ContentType; #IMPLIED
archive %UriList; #IMPLIED
standby %Text; #IMPLIED
height %Length; #IMPLIED
width %Length; #IMPLIED
usemap %URI; #IMPLIED
name NMTOKEN #IMPLIED
tabindex %Number; #IMPLIED
>
<!--
param is used to supply a named property value.
In XML it would seem natural to follow RDF and support an
abbreviated syntax where the param elements are replaced
by attribute value pairs on the object start tag.
-->
<!ELEMENT param EMPTY>
<!ATTLIST param
id ID #IMPLIED
name CDATA #IMPLIED
value CDATA #IMPLIED
valuetype (data|ref|object) "data"
type %ContentType; #IMPLIED
>
<!--=================== Images ===========================================-->
<!--
To avoid accessibility problems for people who aren't
able to see the image, you should provide a text
description using the alt and longdesc attributes.
In addition, avoid the use of server-side image maps.
Note that in this DTD there is no name attribute. That
is only available in the transitional and frameset DTD.
-->
<!ELEMENT img EMPTY>
<!ATTLIST img
%attrs;
src %URI; #REQUIRED
alt %Text; #REQUIRED
longdesc %URI; #IMPLIED
height %Length; #IMPLIED
width %Length; #IMPLIED
usemap %URI; #IMPLIED
ismap (ismap) #IMPLIED
>
<!-- usemap points to a map element which may be in this document
or an external document, although the latter is not widely supported -->
<!--================== Client-side image maps ============================-->
<!-- These can be placed in the same document or grouped in a
separate document although this isn't yet widely supported -->
<!ELEMENT map ((%block; | form | %misc;)+ | area+)>
<!ATTLIST map
%i18n;
%events;
id ID #REQUIRED
class CDATA #IMPLIED
style %StyleSheet; #IMPLIED
title %Text; #IMPLIED
name NMTOKEN #IMPLIED
>
<!ELEMENT area EMPTY>
<!ATTLIST area
%attrs;
%focus;
shape %Shape; "rect"
coords %Coords; #IMPLIED
href %URI; #IMPLIED
nohref (nohref) #IMPLIED
alt %Text; #REQUIRED
>
<!--================ Forms ===============================================-->
<!ELEMENT form %form.content;> <!-- forms shouldn't be nested -->
<!ATTLIST form
%attrs;
action %URI; #REQUIRED
method (get|post) "get"
enctype %ContentType; "application/x-www-form-urlencoded"
onsubmit %Script; #IMPLIED
onreset %Script; #IMPLIED
accept %ContentTypes; #IMPLIED
accept-charset %Charsets; #IMPLIED
>
<!--
Each label must not contain more than ONE field
Label elements shouldn't be nested.
-->
<!ELEMENT label %Inline;>
<!ATTLIST label
%attrs;
for IDREF #IMPLIED
accesskey %Character; #IMPLIED
onfocus %Script; #IMPLIED
onblur %Script; #IMPLIED
>
<!ENTITY % InputType
"(text | password | checkbox |
radio | submit | reset |
file | hidden | image | button)"
>
<!-- the name attribute is required for all but submit & reset -->
<!ELEMENT input EMPTY> <!-- form control -->
<!ATTLIST input
%attrs;
%focus;
type %InputType; "text"
name CDATA #IMPLIED
value CDATA #IMPLIED
checked (checked) #IMPLIED
disabled (disabled) #IMPLIED
readonly (readonly) #IMPLIED
size CDATA #IMPLIED
maxlength %Number; #IMPLIED
src %URI; #IMPLIED
alt CDATA #IMPLIED
usemap %URI; #IMPLIED
onselect %Script; #IMPLIED
onchange %Script; #IMPLIED
accept %ContentTypes; #IMPLIED
>
<!ELEMENT select (optgroup|option)+> <!-- option selector -->
<!ATTLIST select
%attrs;
name CDATA #IMPLIED
size %Number; #IMPLIED
multiple (multiple) #IMPLIED
disabled (disabled) #IMPLIED
tabindex %Number; #IMPLIED
onfocus %Script; #IMPLIED
onblur %Script; #IMPLIED
onchange %Script; #IMPLIED
>
<!ELEMENT optgroup (option)+> <!-- option group -->
<!ATTLIST optgroup
%attrs;
disabled (disabled) #IMPLIED
label %Text; #REQUIRED
>
<!ELEMENT option (#PCDATA)> <!-- selectable choice -->
<!ATTLIST option
%attrs;
selected (selected) #IMPLIED
disabled (disabled) #IMPLIED
label %Text; #IMPLIED
value CDATA #IMPLIED
>
<!ELEMENT textarea (#PCDATA)> <!-- multi-line text field -->
<!ATTLIST textarea
%attrs;
%focus;
name CDATA #IMPLIED
rows %Number; #REQUIRED
cols %Number; #REQUIRED
disabled (disabled) #IMPLIED
readonly (readonly) #IMPLIED
onselect %Script; #IMPLIED
onchange %Script; #IMPLIED
>
<!--
The fieldset element is used to group form fields.
Only one legend element should occur in the content
and if present should only be preceded by whitespace.
-->
<!ELEMENT fieldset (#PCDATA | legend | %block; | form | %inline; | %misc;)*>
<!ATTLIST fieldset
%attrs;
>
<!ELEMENT legend %Inline;> <!-- fieldset label -->
<!ATTLIST legend
%attrs;
accesskey %Character; #IMPLIED
>
<!--
Content is %Flow; excluding a, form and form controls
-->
<!ELEMENT button %button.content;> <!-- push button -->
<!ATTLIST button
%attrs;
%focus;
name CDATA #IMPLIED
value CDATA #IMPLIED
type (button|submit|reset) "submit"
disabled (disabled) #IMPLIED
>
<!--======================= Tables =======================================-->
<!-- Derived from IETF HTML table standard, see [RFC1942] -->
<!--
The border attribute sets the thickness of the frame around the
table. The default units are screen pixels.
The frame attribute specifies which parts of the frame around
the table should be rendered. The values are not the same as
CALS to avoid a name clash with the valign attribute.
-->
<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
<!--
The rules attribute defines which rules to draw between cells:
If rules is absent then assume:
"none" if border is absent or border="0" otherwise "all"
-->
<!ENTITY % TRules "(none | groups | rows | cols | all)">
<!-- horizontal alignment attributes for cell contents
char alignment char, e.g. char=':'
charoff offset for alignment char
-->
<!ENTITY % cellhalign
"align (left|center|right|justify|char) #IMPLIED
char %Character; #IMPLIED
charoff %Length; #IMPLIED"
>
<!-- vertical alignment attributes for cell contents -->
<!ENTITY % cellvalign
"valign (top|middle|bottom|baseline) #IMPLIED"
>
<!ELEMENT table
(caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
<!ELEMENT caption %Inline;>
<!ELEMENT thead (tr)+>
<!ELEMENT tfoot (tr)+>
<!ELEMENT tbody (tr)+>
<!ELEMENT colgroup (col)*>
<!ELEMENT col EMPTY>
<!ELEMENT tr (th|td)+>
<!ELEMENT th %Flow;>
<!ELEMENT td %Flow;>
<!ATTLIST table
%attrs;
summary %Text; #IMPLIED
width %Length; #IMPLIED
border %Pixels; #IMPLIED
frame %TFrame; #IMPLIED
rules %TRules; #IMPLIED
cellspacing %Length; #IMPLIED
cellpadding %Length; #IMPLIED
>
<!ATTLIST caption
%attrs;
>
<!--
colgroup groups a set of col elements. It allows you to group
several semantically related columns together.
-->
<!ATTLIST colgroup
%attrs;
span %Number; "1"
width %MultiLength; #IMPLIED
%cellhalign;
%cellvalign;
>
<!--
col elements define the alignment properties for cells in
one or more columns.
The width attribute specifies the width of the columns, e.g.
width=64 width in screen pixels
width=0.5* relative width of 0.5
The span attribute causes the attributes of one
col element to apply to more than one column.
-->
<!ATTLIST col
%attrs;
span %Number; "1"
width %MultiLength; #IMPLIED
%cellhalign;
%cellvalign;
>
<!--
Use thead to duplicate headers when breaking table
across page boundaries, or for static headers when
tbody sections are rendered in scrolling panel.
Use tfoot to duplicate footers when breaking table
across page boundaries, or for static footers when
tbody sections are rendered in scrolling panel.
Use multiple tbody sections when rules are needed
between groups of table rows.
-->
<!ATTLIST thead
%attrs;
%cellhalign;
%cellvalign;
>
<!ATTLIST tfoot
%attrs;
%cellhalign;
%cellvalign;
>
<!ATTLIST tbody
%attrs;
%cellhalign;
%cellvalign;
>
<!ATTLIST tr
%attrs;
%cellhalign;
%cellvalign;
>
<!-- Scope is simpler than headers attribute for common tables -->
<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
<!-- th is for headers, td for data and for cells acting as both -->
<!ATTLIST th
%attrs;
abbr %Text; #IMPLIED
axis CDATA #IMPLIED
headers IDREFS #IMPLIED
scope %Scope; #IMPLIED
rowspan %Number; "1"
colspan %Number; "1"
%cellhalign;
%cellvalign;
>
<!ATTLIST td
%attrs;
abbr %Text; #IMPLIED
axis CDATA #IMPLIED
headers IDREFS #IMPLIED
scope %Scope; #IMPLIED
rowspan %Number; "1"
colspan %Number; "1"
%cellhalign;
%cellvalign;
>
File diff suppressed because it is too large Load Diff
@@ -1,294 +0,0 @@
<!-- ....................................................................... -->
<!-- XHTML 1.1 DTD ........................................................ -->
<!-- file: xhtml11.dtd
-->
<!-- XHTML 1.1 DTD
This is XHTML, a reformulation of HTML as a modular XML application.
The Extensible HyperText Markup Language (XHTML)
Copyright 1998-2001 World Wide Web Consortium
(Massachusetts Institute of Technology, Institut National de
Recherche en Informatique et en Automatique, Keio University).
All Rights Reserved.
Permission to use, copy, modify and distribute the XHTML DTD and its
accompanying documentation for any purpose and without fee is hereby
granted in perpetuity, provided that the above copyright notice and
this paragraph appear in all copies. The copyright holders make no
representation about the suitability of the DTD for any purpose.
It is provided "as is" without expressed or implied warranty.
Author: Murray M. Altheim <altheim@eng.sun.com>
Revision: $Id: xhtml11.dtd,v 1.21 2001/05/29 16:37:01 ahby Exp $
-->
<!-- This is the driver file for version 1.1 of the XHTML DTD.
Please use this formal public identifier to identify it:
"-//W3C//DTD XHTML 1.1//EN"
-->
<!ENTITY % XHTML.version "-//W3C//DTD XHTML 1.1//EN" >
<!-- Use this URI to identify the default namespace:
"http://www.w3.org/1999/xhtml"
See the Qualified Names module for information
on the use of namespace prefixes in the DTD.
-->
<!ENTITY % NS.prefixed "IGNORE" >
<!ENTITY % XHTML.prefix "" >
<!-- Reserved for use with the XLink namespace:
-->
<!ENTITY % XLINK.xmlns "" >
<!ENTITY % XLINK.xmlns.attrib "" >
<!-- For example, if you are using XHTML 1.1 directly, use the FPI
in the DOCTYPE declaration, with the xmlns attribute on the
document element to identify the default namespace:
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xml:lang="en">
...
</html>
Revisions:
(none)
-->
<!-- reserved for future use with document profiles -->
<!ENTITY % XHTML.profile "" >
<!-- Bidirectional Text features
This feature-test entity is used to declare elements
and attributes used for bidirectional text support.
-->
<!ENTITY % XHTML.bidi "INCLUDE" >
<?doc type="doctype" role="title" { XHTML 1.1 } ?>
<!-- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -->
<!-- Pre-Framework Redeclaration placeholder .................... -->
<!-- this serves as a location to insert markup declarations
into the DTD prior to the framework declarations.
-->
<!ENTITY % xhtml-prefw-redecl.module "IGNORE" >
<![%xhtml-prefw-redecl.module;[
%xhtml-prefw-redecl.mod;
<!-- end of xhtml-prefw-redecl.module -->]]>
<!ENTITY % xhtml-events.module "INCLUDE" >
<!-- Inline Style Module ........................................ -->
<!ENTITY % xhtml-inlstyle.module "INCLUDE" >
<![%xhtml-inlstyle.module;[
<!ENTITY % xhtml-inlstyle.mod
PUBLIC "-//W3C//ELEMENTS XHTML Inline Style 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-inlstyle-1.mod" >
%xhtml-inlstyle.mod;]]>
<!-- declare Document Model module instantiated in framework
-->
<!ENTITY % xhtml-model.mod
PUBLIC "-//W3C//ENTITIES XHTML 1.1 Document Model 1.0//EN"
"xhtml11-model-1.mod" >
<!-- Modular Framework Module (required) ......................... -->
<!ENTITY % xhtml-framework.module "INCLUDE" >
<![%xhtml-framework.module;[
<!ENTITY % xhtml-framework.mod
PUBLIC "-//W3C//ENTITIES XHTML Modular Framework 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-framework-1.mod" >
%xhtml-framework.mod;]]>
<!-- Post-Framework Redeclaration placeholder ................... -->
<!-- this serves as a location to insert markup declarations
into the DTD following the framework declarations.
-->
<!ENTITY % xhtml-postfw-redecl.module "IGNORE" >
<![%xhtml-postfw-redecl.module;[
%xhtml-postfw-redecl.mod;
<!-- end of xhtml-postfw-redecl.module -->]]>
<!-- Text Module (Required) ..................................... -->
<!ENTITY % xhtml-text.module "INCLUDE" >
<![%xhtml-text.module;[
<!ENTITY % xhtml-text.mod
PUBLIC "-//W3C//ELEMENTS XHTML Text 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-text-1.mod" >
%xhtml-text.mod;]]>
<!-- Hypertext Module (required) ................................. -->
<!ENTITY % xhtml-hypertext.module "INCLUDE" >
<![%xhtml-hypertext.module;[
<!ENTITY % xhtml-hypertext.mod
PUBLIC "-//W3C//ELEMENTS XHTML Hypertext 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-hypertext-1.mod" >
%xhtml-hypertext.mod;]]>
<!-- Lists Module (required) .................................... -->
<!ENTITY % xhtml-list.module "INCLUDE" >
<![%xhtml-list.module;[
<!ENTITY % xhtml-list.mod
PUBLIC "-//W3C//ELEMENTS XHTML Lists 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-list-1.mod" >
%xhtml-list.mod;]]>
<!-- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -->
<!-- Edit Module ................................................ -->
<!ENTITY % xhtml-edit.module "INCLUDE" >
<![%xhtml-edit.module;[
<!ENTITY % xhtml-edit.mod
PUBLIC "-//W3C//ELEMENTS XHTML Editing Elements 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-edit-1.mod" >
%xhtml-edit.mod;]]>
<!-- BIDI Override Module ....................................... -->
<!ENTITY % xhtml-bdo.module "%XHTML.bidi;" >
<![%xhtml-bdo.module;[
<!ENTITY % xhtml-bdo.mod
PUBLIC "-//W3C//ELEMENTS XHTML BIDI Override Element 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-bdo-1.mod" >
%xhtml-bdo.mod;]]>
<!-- Ruby Module ................................................ -->
<!ENTITY % Ruby.common.attlists "INCLUDE" >
<!ENTITY % Ruby.common.attrib "%Common.attrib;" >
<!ENTITY % xhtml-ruby.module "INCLUDE" >
<![%xhtml-ruby.module;[
<!ENTITY % xhtml-ruby.mod
PUBLIC "-//W3C//ELEMENTS XHTML Ruby 1.0//EN"
"http://www.w3.org/TR/ruby/xhtml-ruby-1.mod" >
%xhtml-ruby.mod;]]>
<!-- Presentation Module ........................................ -->
<!ENTITY % xhtml-pres.module "INCLUDE" >
<![%xhtml-pres.module;[
<!ENTITY % xhtml-pres.mod
PUBLIC "-//W3C//ELEMENTS XHTML Presentation 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-pres-1.mod" >
%xhtml-pres.mod;]]>
<!-- Link Element Module ........................................ -->
<!ENTITY % xhtml-link.module "INCLUDE" >
<![%xhtml-link.module;[
<!ENTITY % xhtml-link.mod
PUBLIC "-//W3C//ELEMENTS XHTML Link Element 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-link-1.mod" >
%xhtml-link.mod;]]>
<!-- Document Metainformation Module ............................ -->
<!ENTITY % xhtml-meta.module "INCLUDE" >
<![%xhtml-meta.module;[
<!ENTITY % xhtml-meta.mod
PUBLIC "-//W3C//ELEMENTS XHTML Metainformation 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-meta-1.mod" >
%xhtml-meta.mod;]]>
<!-- Base Element Module ........................................ -->
<!ENTITY % xhtml-base.module "INCLUDE" >
<![%xhtml-base.module;[
<!ENTITY % xhtml-base.mod
PUBLIC "-//W3C//ELEMENTS XHTML Base Element 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-base-1.mod" >
%xhtml-base.mod;]]>
<!-- Scripting Module ........................................... -->
<!ENTITY % xhtml-script.module "INCLUDE" >
<![%xhtml-script.module;[
<!ENTITY % xhtml-script.mod
PUBLIC "-//W3C//ELEMENTS XHTML Scripting 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-script-1.mod" >
%xhtml-script.mod;]]>
<!-- Style Sheets Module ......................................... -->
<!ENTITY % xhtml-style.module "INCLUDE" >
<![%xhtml-style.module;[
<!ENTITY % xhtml-style.mod
PUBLIC "-//W3C//ELEMENTS XHTML Style Sheets 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-style-1.mod" >
%xhtml-style.mod;]]>
<!-- Image Module ............................................... -->
<!ENTITY % xhtml-image.module "INCLUDE" >
<![%xhtml-image.module;[
<!ENTITY % xhtml-image.mod
PUBLIC "-//W3C//ELEMENTS XHTML Images 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-image-1.mod" >
%xhtml-image.mod;]]>
<!-- Client-side Image Map Module ............................... -->
<!ENTITY % xhtml-csismap.module "INCLUDE" >
<![%xhtml-csismap.module;[
<!ENTITY % xhtml-csismap.mod
PUBLIC "-//W3C//ELEMENTS XHTML Client-side Image Maps 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-csismap-1.mod" >
%xhtml-csismap.mod;]]>
<!-- Server-side Image Map Module ............................... -->
<!ENTITY % xhtml-ssismap.module "INCLUDE" >
<![%xhtml-ssismap.module;[
<!ENTITY % xhtml-ssismap.mod
PUBLIC "-//W3C//ELEMENTS XHTML Server-side Image Maps 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-ssismap-1.mod" >
%xhtml-ssismap.mod;]]>
<!-- Param Element Module ....................................... -->
<!ENTITY % xhtml-param.module "INCLUDE" >
<![%xhtml-param.module;[
<!ENTITY % xhtml-param.mod
PUBLIC "-//W3C//ELEMENTS XHTML Param Element 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-param-1.mod" >
%xhtml-param.mod;]]>
<!-- Embedded Object Module ..................................... -->
<!ENTITY % xhtml-object.module "INCLUDE" >
<![%xhtml-object.module;[
<!ENTITY % xhtml-object.mod
PUBLIC "-//W3C//ELEMENTS XHTML Embedded Object 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-object-1.mod" >
%xhtml-object.mod;]]>
<!-- Tables Module ............................................... -->
<!ENTITY % xhtml-table.module "INCLUDE" >
<![%xhtml-table.module;[
<!ENTITY % xhtml-table.mod
PUBLIC "-//W3C//ELEMENTS XHTML Tables 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-table-1.mod" >
%xhtml-table.mod;]]>
<!-- Forms Module ............................................... -->
<!ENTITY % xhtml-form.module "INCLUDE" >
<![%xhtml-form.module;[
<!ENTITY % xhtml-form.mod
PUBLIC "-//W3C//ELEMENTS XHTML Forms 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-form-1.mod" >
%xhtml-form.mod;]]>
<!-- Legacy Markup ............................................... -->
<!ENTITY % xhtml-legacy.module "IGNORE" >
<![%xhtml-legacy.module;[
<!ENTITY % xhtml-legacy.mod
PUBLIC "-//W3C//ELEMENTS XHTML Legacy Markup 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-legacy-1.mod" >
%xhtml-legacy.mod;]]>
<!-- Document Structure Module (required) ....................... -->
<!ENTITY % xhtml-struct.module "INCLUDE" >
<![%xhtml-struct.module;[
<!ENTITY % xhtml-struct.mod
PUBLIC "-//W3C//ELEMENTS XHTML Document Structure 1.0//EN"
"http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-struct-1.mod" >
%xhtml-struct.mod;]]>
<!-- end of XHTML 1.1 DTD ................................................. -->
<!-- ....................................................................... -->
@@ -15,13 +15,6 @@ android {
consumerProguardFiles "consumer-rules.pro" consumerProguardFiles "consumer-rules.pro"
} }
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_11 sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11
@@ -9,8 +9,7 @@ public class ThrowableUtils {
public static @NonNull public static @NonNull
IOException rethrowAsIOException(Throwable throwable) throws IOException { IOException rethrowAsIOException(Throwable throwable) throws IOException {
IOException newException = new IOException(throwable.getMessage()); IOException newException = new IOException(throwable.getMessage(), throwable);
newException.initCause(throwable);
throw newException; throw newException;
} }
} }
@@ -0,0 +1,13 @@
package me.ag2s.epublib;
public interface Constants {
String CHARACTER_ENCODING = "UTF-8";
String DOCTYPE_XHTML = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">";
String NAMESPACE_XHTML = "http://www.w3.org/1999/xhtml";
String EPUB_GENERATOR_NAME = "Ag2S EpubLib";
String EPUB_DUOKAN_NAME = "DK-SONGTI";
char FRAGMENT_SEPARATOR_CHAR = '#';
String DEFAULT_TOC_ID = "toc";
}
@@ -0,0 +1,157 @@
package me.ag2s.epublib.browsersupport;
import java.util.EventObject;
import me.ag2s.epublib.domain.EpubBook;
import me.ag2s.epublib.domain.Resource;
import me.ag2s.epublib.util.StringUtil;
/**
* Used to tell NavigationEventListener just what kind of navigation action
* the user just did.
*
* @author paul
*/
@SuppressWarnings("unused")
public class NavigationEvent extends EventObject {
private static final long serialVersionUID = -6346750144308952762L;
private Resource oldResource;
private int oldSpinePos;
private Navigator navigator;
private EpubBook oldBook;
private int oldSectionPos;
private String oldFragmentId;
public NavigationEvent(Object source) {
super(source);
}
public NavigationEvent(Object source, Navigator navigator) {
super(source);
this.navigator = navigator;
this.oldBook = navigator.getBook();
this.oldFragmentId = navigator.getCurrentFragmentId();
this.oldSectionPos = navigator.getCurrentSectionPos();
this.oldResource = navigator.getCurrentResource();
this.oldSpinePos = navigator.getCurrentSpinePos();
}
/**
* The previous position within the section.
*
* @return The previous position within the section.
*/
public int getOldSectionPos() {
return oldSectionPos;
}
public Navigator getNavigator() {
return navigator;
}
public String getOldFragmentId() {
return oldFragmentId;
}
// package
void setOldFragmentId(String oldFragmentId) {
this.oldFragmentId = oldFragmentId;
}
public EpubBook getOldBook() {
return oldBook;
}
// package
void setOldPagePos(int oldPagePos) {
this.oldSectionPos = oldPagePos;
}
public int getCurrentSectionPos() {
return navigator.getCurrentSectionPos();
}
public int getOldSpinePos() {
return oldSpinePos;
}
public int getCurrentSpinePos() {
return navigator.getCurrentSpinePos();
}
public String getCurrentFragmentId() {
return navigator.getCurrentFragmentId();
}
public boolean isBookChanged() {
if (oldBook == null) {
return true;
}
return oldBook != navigator.getBook();
}
public boolean isSpinePosChanged() {
return getOldSpinePos() != getCurrentSpinePos();
}
public boolean isFragmentChanged() {
return StringUtil.equals(getOldFragmentId(), getCurrentFragmentId());
}
public Resource getOldResource() {
return oldResource;
}
public Resource getCurrentResource() {
return navigator.getCurrentResource();
}
public void setOldResource(Resource oldResource) {
this.oldResource = oldResource;
}
public void setOldSpinePos(int oldSpinePos) {
this.oldSpinePos = oldSpinePos;
}
public void setNavigator(Navigator navigator) {
this.navigator = navigator;
}
public void setOldBook(EpubBook oldBook) {
this.oldBook = oldBook;
}
public EpubBook getCurrentBook() {
return getNavigator().getBook();
}
public boolean isResourceChanged() {
return oldResource != getCurrentResource();
}
@SuppressWarnings("NullableProblems")
public String toString() {
return StringUtil.toString(
"oldSectionPos", oldSectionPos,
"oldResource", oldResource,
"oldBook", oldBook,
"oldFragmentId", oldFragmentId,
"oldSpinePos", oldSpinePos,
"currentPagePos", getCurrentSectionPos(),
"currentResource", getCurrentResource(),
"currentBook", getCurrentBook(),
"currentFragmentId", getCurrentFragmentId(),
"currentSpinePos", getCurrentSpinePos()
);
}
public boolean isSectionPosChanged() {
return oldSectionPos != getCurrentSectionPos();
}
}
@@ -5,14 +5,13 @@ package me.ag2s.epublib.browsersupport;
* another location in the book. * another location in the book.
* *
* @author paul * @author paul
*
*/ */
public interface NavigationEventListener { public interface NavigationEventListener {
/** /**
* Called whenever the user navigates to another position in the book. * Called whenever the user navigates to another position in the book.
* *
* @param navigationEvent f * @param navigationEvent f
*/ */
void navigationPerformed(NavigationEvent navigationEvent); void navigationPerformed(NavigationEvent navigationEvent);
} }
@@ -0,0 +1,207 @@
package me.ag2s.epublib.browsersupport;
import java.util.ArrayList;
import java.util.List;
import me.ag2s.epublib.domain.EpubBook;
import me.ag2s.epublib.domain.Resource;
/**
* A history of the user's locations with the epub.
*
* @author paul.siegmann
*/
public class NavigationHistory implements NavigationEventListener {
public static final int DEFAULT_MAX_HISTORY_SIZE = 1000;
private static final long DEFAULT_HISTORY_WAIT_TIME = 1000;
private static class Location {
private String href;
public Location(String href) {
super();
this.href = href;
}
@SuppressWarnings("unused")
public void setHref(String href) {
this.href = href;
}
public String getHref() {
return href;
}
}
private long lastUpdateTime = 0;
private List<Location> locations = new ArrayList<>();
private final Navigator navigator;
private int currentPos = -1;
private int currentSize = 0;
private int maxHistorySize = DEFAULT_MAX_HISTORY_SIZE;
private long historyWaitTime = DEFAULT_HISTORY_WAIT_TIME;
public NavigationHistory(Navigator navigator) {
this.navigator = navigator;
navigator.addNavigationEventListener(this);
initBook(navigator.getBook());
}
public int getCurrentPos() {
return currentPos;
}
public int getCurrentSize() {
return currentSize;
}
public void initBook(EpubBook book) {
if (book == null) {
return;
}
locations = new ArrayList<>();
currentPos = -1;
currentSize = 0;
if (navigator.getCurrentResource() != null) {
addLocation(navigator.getCurrentResource().getHref());
}
}
/**
* If the time between a navigation event is less than the historyWaitTime
* then the new location is not added to the history.
* <p>
* When a user is rapidly viewing many pages using the slider we do not
* want all of them to be added to the history.
*
* @return the time we wait before adding the page to the history
*/
public long getHistoryWaitTime() {
return historyWaitTime;
}
public void setHistoryWaitTime(long historyWaitTime) {
this.historyWaitTime = historyWaitTime;
}
public void addLocation(Resource resource) {
if (resource == null) {
return;
}
addLocation(resource.getHref());
}
/**
* Adds the location after the current position.
* If the currentposition is not the end of the list then the elements
* between the current element and the end of the list will be discarded.
* <p>
* Does nothing if the new location matches the current location.
* <br/>
* If this nr of locations becomes larger then the historySize then the
* first item(s) will be removed.
* v
*
* @param location d
*/
public void addLocation(Location location) {
// do nothing if the new location matches the current location
if (!(locations.isEmpty()) &&
location.getHref().equals(locations.get(currentPos).getHref())) {
return;
}
currentPos++;
if (currentPos != currentSize) {
locations.set(currentPos, location);
} else {
locations.add(location);
checkHistorySize();
}
currentSize = currentPos + 1;
}
/**
* Removes all elements that are too much for the maxHistorySize
* out of the history.
*/
private void checkHistorySize() {
while (locations.size() > maxHistorySize) {
locations.remove(0);
currentSize--;
currentPos--;
}
}
public void addLocation(String href) {
addLocation(new Location(href));
}
private String getLocationHref(int pos) {
if (pos < 0 || pos >= locations.size()) {
return null;
}
return locations.get(currentPos).getHref();
}
/**
* Moves the current positions delta positions.
* <p>
* move(-1) to go one position back in history.<br/>
* move(1) to go one position forward.<br/>发
*
* @param delta f
* @return Whether we actually moved. If the requested value is illegal
* it will return false, true otherwise.
*/
public boolean move(int delta) {
if (((currentPos + delta) < 0)
|| ((currentPos + delta) >= currentSize)) {
return false;
}
currentPos += delta;
navigator.gotoResource(getLocationHref(currentPos), this);
return true;
}
/**
* If this is not the source of the navigationEvent then the addLocation
* will be called with the href of the currentResource in the navigationEvent.
*/
@Override
public void navigationPerformed(NavigationEvent navigationEvent) {
if (this == navigationEvent.getSource()) {
return;
}
if (navigationEvent.getCurrentResource() == null) {
return;
}
if ((System.currentTimeMillis() - this.lastUpdateTime) > historyWaitTime) {
// if the user scrolled rapidly through the pages then the last page
// will not be added to the history. We fix that here:
addLocation(navigationEvent.getOldResource());
addLocation(navigationEvent.getCurrentResource().getHref());
}
lastUpdateTime = System.currentTimeMillis();
}
public String getCurrentHref() {
if (currentPos < 0 || currentPos >= locations.size()) {
return null;
}
return locations.get(currentPos).getHref();
}
public void setMaxHistorySize(int maxHistorySize) {
this.maxHistorySize = maxHistorySize;
}
public int getMaxHistorySize() {
return maxHistorySize;
}
}
@@ -0,0 +1,219 @@
package me.ag2s.epublib.browsersupport;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import me.ag2s.epublib.domain.EpubBook;
import me.ag2s.epublib.domain.Resource;
/**
* A helper class for epub browser applications.
* <p>
* It helps moving from one resource to the other, from one resource
* to the other and keeping other elements of the application up-to-date
* by calling the NavigationEventListeners.
*
* @author paul
*/
public class Navigator implements Serializable {
private static final long serialVersionUID = 1076126986424925474L;
private EpubBook book;
private int currentSpinePos;
private Resource currentResource;
private int currentPagePos;
private String currentFragmentId;
private final List<NavigationEventListener> eventListeners = new ArrayList<>();
public Navigator() {
this(null);
}
public Navigator(EpubBook book) {
this.book = book;
this.currentSpinePos = 0;
if (book != null) {
this.currentResource = book.getCoverPage();
}
this.currentPagePos = 0;
}
private synchronized void handleEventListeners(
NavigationEvent navigationEvent) {
for (int i = 0; i < eventListeners.size(); i++) {
NavigationEventListener navigationEventListener = eventListeners.get(i);
navigationEventListener.navigationPerformed(navigationEvent);
}
}
public boolean addNavigationEventListener(
NavigationEventListener navigationEventListener) {
return this.eventListeners.add(navigationEventListener);
}
public boolean removeNavigationEventListener(
NavigationEventListener navigationEventListener) {
return this.eventListeners.remove(navigationEventListener);
}
public int gotoFirstSpineSection(Object source) {
return gotoSpineSection(0, source);
}
public int gotoPreviousSpineSection(Object source) {
return gotoPreviousSpineSection(0, source);
}
public int gotoPreviousSpineSection(int pagePos, Object source) {
if (currentSpinePos < 0) {
return gotoSpineSection(0, pagePos, source);
} else {
return gotoSpineSection(currentSpinePos - 1, pagePos, source);
}
}
public boolean hasNextSpineSection() {
return (currentSpinePos < (book.getSpine().size() - 1));
}
public boolean hasPreviousSpineSection() {
return (currentSpinePos > 0);
}
public int gotoNextSpineSection(Object source) {
if (currentSpinePos < 0) {
return gotoSpineSection(0, source);
} else {
return gotoSpineSection(currentSpinePos + 1, source);
}
}
public int gotoResource(String resourceHref, Object source) {
Resource resource = book.getResources().getByHref(resourceHref);
return gotoResource(resource, source);
}
public int gotoResource(Resource resource, Object source) {
return gotoResource(resource, 0, null, source);
}
public int gotoResource(Resource resource, String fragmentId, Object source) {
return gotoResource(resource, 0, fragmentId, source);
}
public int gotoResource(Resource resource, int pagePos, Object source) {
return gotoResource(resource, pagePos, null, source);
}
public int gotoResource(Resource resource, int pagePos, String fragmentId,
Object source) {
if (resource == null) {
return -1;
}
NavigationEvent navigationEvent = new NavigationEvent(source, this);
this.currentResource = resource;
this.currentSpinePos = book.getSpine().getResourceIndex(currentResource);
this.currentPagePos = pagePos;
this.currentFragmentId = fragmentId;
handleEventListeners(navigationEvent);
return currentSpinePos;
}
public int gotoResourceId(String resourceId, Object source) {
return gotoSpineSection(book.getSpine().findFirstResourceById(resourceId),
source);
}
public int gotoSpineSection(int newSpinePos, Object source) {
return gotoSpineSection(newSpinePos, 0, source);
}
/**
* Go to a specific section.
* Illegal spine positions are silently ignored.
*
* @param newSpinePos f
* @param source f
* @return The current position within the spine
*/
public int gotoSpineSection(int newSpinePos, int newPagePos, Object source) {
if (newSpinePos == currentSpinePos) {
return currentSpinePos;
}
if (newSpinePos < 0 || newSpinePos >= book.getSpine().size()) {
return currentSpinePos;
}
NavigationEvent navigationEvent = new NavigationEvent(source, this);
currentSpinePos = newSpinePos;
currentPagePos = newPagePos;
currentResource = book.getSpine().getResource(currentSpinePos);
handleEventListeners(navigationEvent);
return currentSpinePos;
}
public int gotoLastSpineSection(Object source) {
return gotoSpineSection(book.getSpine().size() - 1, source);
}
public void gotoBook(EpubBook book, Object source) {
NavigationEvent navigationEvent = new NavigationEvent(source, this);
this.book = book;
this.currentFragmentId = null;
this.currentPagePos = 0;
this.currentResource = null;
this.currentSpinePos = book.getSpine().getResourceIndex(currentResource);
handleEventListeners(navigationEvent);
}
/**
* The current position within the spine.
*
* @return something &lt; 0 if the current position is not within the spine.
*/
public int getCurrentSpinePos() {
return currentSpinePos;
}
public Resource getCurrentResource() {
return currentResource;
}
/**
* Sets the current index and resource without calling the eventlisteners.
* <p>
* If you want the eventListeners called use gotoSection(index);
*
* @param currentIndex f
*/
public void setCurrentSpinePos(int currentIndex) {
this.currentSpinePos = currentIndex;
this.currentResource = book.getSpine().getResource(currentIndex);
}
public EpubBook getBook() {
return book;
}
/**
* Sets the current index and resource without calling the eventlisteners.
* <p>
* If you want the eventListeners called use gotoSection(index);
*/
public int setCurrentResource(Resource currentResource) {
this.currentSpinePos = book.getSpine().getResourceIndex(currentResource);
this.currentResource = currentResource;
return currentSpinePos;
}
public String getCurrentFragmentId() {
return currentFragmentId;
}
public int getCurrentSectionPos() {
return currentPagePos;
}
}
@@ -1,6 +1,6 @@
/** /**
* Provides classes that help make an epub reader application. * Provides classes that help make an epub reader application.
* * <p>
* These classes have no dependencies on graphic toolkits, they're purely * These classes have no dependencies on graphic toolkits, they're purely
* to help with the browsing/navigation logic. * to help with the browsing/navigation logic.
*/ */
@@ -0,0 +1,37 @@
package me.ag2s.epublib.domain;
import androidx.annotation.NonNull;
import java.io.IOException;
import java.io.InputStream;
import me.ag2s.epublib.util.zip.ZipEntryWrapper;
import me.ag2s.epublib.util.zip.ZipFileWrapper;
/**
* @author jake
*/
public class EpubResourceProvider implements LazyResourceProvider {
private final ZipFileWrapper zipFileWrapper;
public EpubResourceProvider(ZipFileWrapper zipFileWrapper) {
this.zipFileWrapper = zipFileWrapper;
}
@Override
public InputStream getResourceStream(@NonNull String href) throws IOException {
//ZipFile zipFile = new ZipFile(epubFilename);
ZipEntryWrapper zipEntry = zipFileWrapper.getEntry(href);
if (zipEntry == null) {
//zipFile.close();
throw new IllegalStateException(
"Cannot find entry " + href + " in epub file " + zipFileWrapper);
}
return new ResourceInputStream(zipFileWrapper.getInputStream(zipEntry));
}
}
@@ -7,7 +7,6 @@ import java.io.InputStream;
/** /**
* 用于创建epub添加大文件如大量图片时容易OOM使用LazyResource避免OOM. * 用于创建epub添加大文件如大量图片时容易OOM使用LazyResource避免OOM.
*
*/ */
public class FileResourceProvider implements LazyResourceProvider { public class FileResourceProvider implements LazyResourceProvider {
@@ -16,6 +15,7 @@ public class FileResourceProvider implements LazyResourceProvider {
/** /**
* 创建一个文件夹里面文件夹的LazyResourceProvider用于LazyResource * 创建一个文件夹里面文件夹的LazyResourceProvider用于LazyResource
*
* @param parentDir 文件的目录 * @param parentDir 文件的目录
*/ */
public FileResourceProvider(String parentDir) { public FileResourceProvider(String parentDir) {
@@ -24,6 +24,7 @@ public class FileResourceProvider implements LazyResourceProvider {
/** /**
* 创建一个文件夹里面文件夹的LazyResourceProvider用于LazyResource * 创建一个文件夹里面文件夹的LazyResourceProvider用于LazyResource
*
* @param parentFile 文件夹 * @param parentFile 文件夹
*/ */
@SuppressWarnings("unused") @SuppressWarnings("unused")
@@ -33,6 +34,7 @@ public class FileResourceProvider implements LazyResourceProvider {
/** /**
* 根据子文件名href,再父目录下读取文件获取FileInputStream * 根据子文件名href,再父目录下读取文件获取FileInputStream
*
* @param href 子文件名href * @param href 子文件名href
* @return 对应href的FileInputStream * @return 对应href的FileInputStream
* @throws IOException 抛出IOException * @throws IOException 抛出IOException
@@ -0,0 +1,128 @@
package me.ag2s.epublib.domain;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* The guide is a selection of special pages of the book.
* Examples of these are the cover, list of illustrations, etc.
* <p>
* It is an optional part of an epub, and support for the various types
* of references varies by reader.
* <p>
* The only part of this that is heavily used is the cover page.
*
* @author paul
*/
public class Guide implements Serializable {
/**
*
*/
private static final long serialVersionUID = -6256645339915751189L;
public static final String DEFAULT_COVER_TITLE = GuideReference.COVER;
private List<GuideReference> references = new ArrayList<>();
private static final int COVERPAGE_NOT_FOUND = -1;
private static final int COVERPAGE_UNITIALIZED = -2;
private int coverPageIndex = -1;
public List<GuideReference> getReferences() {
return references;
}
public void setReferences(List<GuideReference> references) {
this.references = references;
uncheckCoverPage();
}
private void uncheckCoverPage() {
coverPageIndex = COVERPAGE_UNITIALIZED;
}
public GuideReference getCoverReference() {
checkCoverPage();
if (coverPageIndex >= 0) {
return references.get(coverPageIndex);
}
return null;
}
@SuppressWarnings("UnusedReturnValue")
public int setCoverReference(GuideReference guideReference) {
if (coverPageIndex >= 0) {
references.set(coverPageIndex, guideReference);
} else {
references.add(0, guideReference);
coverPageIndex = 0;
}
return coverPageIndex;
}
private void checkCoverPage() {
if (coverPageIndex == COVERPAGE_UNITIALIZED) {
initCoverPage();
}
}
private void initCoverPage() {
int result = COVERPAGE_NOT_FOUND;
for (int i = 0; i < references.size(); i++) {
GuideReference guideReference = references.get(i);
if (guideReference.getType().equals(GuideReference.COVER)) {
result = i;
break;
}
}
coverPageIndex = result;
}
/**
* The coverpage of the book.
*
* @return The coverpage of the book.
*/
public Resource getCoverPage() {
GuideReference guideReference = getCoverReference();
if (guideReference == null) {
return null;
}
return guideReference.getResource();
}
public void setCoverPage(Resource coverPage) {
GuideReference coverpageGuideReference = new GuideReference(coverPage,
GuideReference.COVER, DEFAULT_COVER_TITLE);
setCoverReference(coverpageGuideReference);
}
@SuppressWarnings("UnusedReturnValue")
public ResourceReference addReference(GuideReference reference) {
this.references.add(reference);
uncheckCoverPage();
return reference;
}
/**
* A list of all GuideReferences that have the given
* referenceTypeName (ignoring case).
*
* @param referenceTypeName referenceTypeName
* @return A list of all GuideReferences that have the given
* referenceTypeName (ignoring case).
*/
public List<GuideReference> getGuideReferencesByType(
String referenceTypeName) {
List<GuideReference> result = new ArrayList<>();
for (GuideReference guideReference : references) {
if (referenceTypeName.equalsIgnoreCase(guideReference.getType())) {
result.add(guideReference);
}
}
return result;
}
}
@@ -0,0 +1,100 @@
package me.ag2s.epublib.domain;
import java.io.Serializable;
import me.ag2s.epublib.util.StringUtil;
/**
* These are references to elements of the book's guide.
*
* @author paul
* @see Guide
*/
public class GuideReference extends TitledResourceReference
implements Serializable {
private static final long serialVersionUID = -316179702440631834L;
/**
* the book cover(s), jacket information, etc.
*/
public static final String COVER = "cover";
/**
* human-readable page with title, author, publisher, and other metadata
*/
public static String TITLE_PAGE = "title-page";
/**
* Human-readable table of contents.
* Not to be confused the epub file table of contents
*/
public static String TOC = "toc";
/**
* back-of-book style index
*/
public static String INDEX = "index";
public static String GLOSSARY = "glossary";
public static String ACKNOWLEDGEMENTS = "acknowledgements";
public static String BIBLIOGRAPHY = "bibliography";
public static String COLOPHON = "colophon";
public static String COPYRIGHT_PAGE = "copyright-page";
public static String DEDICATION = "dedication";
/**
* an epigraph is a phrase, quotation, or poem that is set at the
* beginning of a document or component.
* <p>
* source: http://en.wikipedia.org/wiki/Epigraph_%28literature%29
*/
public static String EPIGRAPH = "epigraph";
public static String FOREWORD = "foreword";
/**
* list of illustrations
*/
public static String LOI = "loi";
/**
* list of tables
*/
public static String LOT = "lot";
public static String NOTES = "notes";
public static String PREFACE = "preface";
/**
* A page of content (e.g. "Chapter 1")
*/
public static String TEXT = "text";
private String type;
public GuideReference(Resource resource) {
this(resource, null);
}
public GuideReference(Resource resource, String title) {
super(resource, title);
}
public GuideReference(Resource resource, String type, String title) {
this(resource, type, title, null);
}
public GuideReference(Resource resource, String type, String title,
String fragmentId) {
super(resource, title, fragmentId);
this.type = StringUtil.isNotBlank(type) ? type.toLowerCase() : null;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
@@ -0,0 +1,133 @@
package me.ag2s.epublib.domain;
import java.io.Serializable;
import java.util.List;
import java.util.UUID;
import me.ag2s.epublib.util.StringUtil;
/**
* A Book's identifier.
* <p>
* Defaults to a random UUID and scheme "UUID"
*
* @author paul
*/
public class Identifier implements Serializable {
private static final long serialVersionUID = 955949951416391810L;
@SuppressWarnings("unused")
public interface Scheme {
String UUID = "UUID";
String ISBN = "ISBN";
String URL = "URL";
String URI = "URI";
}
private boolean bookId = false;
private String scheme;
private String value;
/**
* Creates an Identifier with as value a random UUID and scheme "UUID"
*/
public Identifier() {
this(Scheme.UUID, UUID.randomUUID().toString());
}
public Identifier(String scheme, String value) {
this.scheme = scheme;
this.value = value;
}
/**
* The first identifier for which the bookId is true is made the
* bookId identifier.
* <p>
* If no identifier has bookId == true then the first bookId identifier
* is written as the primary.
*
* @param identifiers i
* @return The first identifier for which the bookId is true is made
* the bookId identifier.
*/
public static Identifier getBookIdIdentifier(List<Identifier> identifiers) {
if (identifiers == null || identifiers.isEmpty()) {
return null;
}
Identifier result = null;
for (Identifier identifier : identifiers) {
if (identifier.isBookId()) {
result = identifier;
break;
}
}
if (result == null) {
result = identifiers.get(0);
}
return result;
}
public String getScheme() {
return scheme;
}
public void setScheme(String scheme) {
this.scheme = scheme;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public void setBookId(boolean bookId) {
this.bookId = bookId;
}
/**
* This bookId property allows the book creator to add multiple ids and
* tell the epubwriter which one to write out as the bookId.
* <p>
* The Dublin Core metadata spec allows multiple identifiers for a Book.
* The epub spec requires exactly one identifier to be marked as the book id.
*
* @return whether this is the unique book id.
*/
public boolean isBookId() {
return bookId;
}
public int hashCode() {
return StringUtil.defaultIfNull(scheme).hashCode() ^ StringUtil
.defaultIfNull(value).hashCode();
}
public boolean equals(Object otherIdentifier) {
if (!(otherIdentifier instanceof Identifier)) {
return false;
}
return StringUtil.equals(scheme, ((Identifier) otherIdentifier).scheme)
&& StringUtil.equals(value, ((Identifier) otherIdentifier).value);
}
@SuppressWarnings("NullableProblems")
@Override
public String toString() {
if (StringUtil.isBlank(scheme)) {
return "" + value;
}
return "" + scheme + ":" + value;
}
}
@@ -0,0 +1,145 @@
package me.ag2s.epublib.domain;
import android.util.Log;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import me.ag2s.epublib.util.IOUtil;
/**
* A Resource that loads its data only on-demand from a EPUB book file.
* This way larger books can fit into memory and can be opened faster.
*/
public class LazyResource extends Resource {
private static final long serialVersionUID = 5089400472352002866L;
private final String TAG = getClass().getName();
private final LazyResourceProvider resourceProvider;
private final long cachedSize;
/**
* Creates a lazy resource, when the size is unknown.
*
* @param resourceProvider The resource provider loads data on demand.
* @param href The resource's href within the epub.
*/
public LazyResource(LazyResourceProvider resourceProvider, String href) {
this(resourceProvider, -1, href);
}
public LazyResource(LazyResourceProvider resourceProvider, String href, String originalHref) {
this(resourceProvider, -1, href, originalHref);
}
/**
* Creates a Lazy resource, by not actually loading the data for this entry.
* <p>
* The data will be loaded on the first call to getData()
*
* @param resourceProvider The resource provider loads data on demand.
* @param size The size of this resource.
* @param href The resource's href within the epub.
*/
public LazyResource(
LazyResourceProvider resourceProvider, long size, String href) {
super(null, null, href, MediaTypes.determineMediaType(href));
this.resourceProvider = resourceProvider;
this.cachedSize = size;
}
public LazyResource(
LazyResourceProvider resourceProvider, long size, String href, String originalHref) {
super(null, null, href, originalHref, MediaTypes.determineMediaType(href));
this.resourceProvider = resourceProvider;
this.cachedSize = size;
}
/**
* Gets the contents of the Resource as an InputStream.
*
* @return The contents of the Resource.
* @throws IOException IOException
*/
public InputStream getInputStream() throws IOException {
if (isInitialized()) {
return new ByteArrayInputStream(getData());
} else {
return resourceProvider.getResourceStream(this.originalHref);
}
}
/**
* Initializes the resource by loading its data into memory.
*
* @throws IOException IOException
*/
public void initialize() throws IOException {
getData();
}
/**
* The contents of the resource as a byte[]
* <p>
* If this resource was lazy-loaded and the data was not yet loaded,
* it will be loaded into memory at this point.
* This included opening the zip file, so expect a first load to be slow.
*
* @return The contents of the resource
*/
public byte[] getData() throws IOException {
if (data == null) {
Log.d(TAG, "Initializing lazy resource: " + this.getHref());
InputStream in = resourceProvider.getResourceStream(this.originalHref);
byte[] readData = IOUtil.toByteArray(in, (int) this.cachedSize);
if (readData == null) {
throw new IOException(
"Could not load the contents of resource: " + this.getHref());
} else {
this.data = readData;
}
in.close();
}
return data;
}
/**
* Tells this resource to release its cached data.
* <p>
* If this resource was not lazy-loaded, this is a no-op.
*/
public void close() {
if (this.resourceProvider != null) {
this.data = null;
}
}
/**
* Returns if the data for this resource has been loaded into memory.
*
* @return true if data was loaded.
*/
public boolean isInitialized() {
return data != null;
}
/**
* Returns the size of this resource in bytes.
*
* @return the size.
*/
public long getSize() {
if (data != null) {
return data.length;
}
return cachedSize;
}
}
@@ -8,5 +8,5 @@ import java.io.InputStream;
*/ */
public interface LazyResourceProvider { public interface LazyResourceProvider {
InputStream getResourceStream(String href) throws IOException; InputStream getResourceStream(String href) throws IOException;
} }
@@ -0,0 +1,22 @@
package me.ag2s.epublib.domain;
@SuppressWarnings("unused")
public enum ManifestItemProperties implements ManifestProperties {
COVER_IMAGE("cover-image"),
MATHML("mathml"),
NAV("nav"),
REMOTE_RESOURCES("remote-resources"),
SCRIPTED("scripted"),
SVG("svg"),
SWITCH("switch");
private final String name;
ManifestItemProperties(String name) {
this.name = name;
}
public String getName() {
return name;
}
}

Some files were not shown because too many files have changed in this diff Show More