mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Merge branch 'master' of git@git.labs.intellij.net:idea/community
This commit is contained in:
@@ -20,6 +20,7 @@ import com.intellij.openapi.editor.markup.EffectType;
|
||||
import com.intellij.openapi.editor.markup.TextAttributes;
|
||||
import com.intellij.util.ui.UIUtil;
|
||||
import gnu.trove.TIntObjectHashMap;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
@@ -347,6 +348,29 @@ public class HighlightableComponent extends JComponent {
|
||||
return myIcon.getIconWidth() + myIconTextGap;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public HighlightedRegion findRegionByX(int x) {
|
||||
FontMetrics defFontMetrics = getFontMetrics(getFont());
|
||||
|
||||
int width = getTextOffset();
|
||||
if (width > x) return null;
|
||||
|
||||
if (myText.length() != 0 && myHighlightedRegions.size() != 0) {
|
||||
int endIndex = 0;
|
||||
for (HighlightedRegion hRegion : myHighlightedRegions) {
|
||||
width += defFontMetrics.stringWidth(myText.substring(endIndex, hRegion.startOffset));
|
||||
endIndex = hRegion.endOffset;
|
||||
if (width > x) return null;
|
||||
|
||||
String text = getRegionText(hRegion);
|
||||
FontMetrics fontMetrics = myFontMetrics.get(hRegion.textAttributes.getFontType());
|
||||
width += fontMetrics.stringWidth(text);
|
||||
if (width > x) return hRegion;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Dimension getPreferredSize() {
|
||||
FontMetrics defFontMetrics = getFontMetrics(getFont());
|
||||
|
||||
@@ -359,24 +383,10 @@ public class HighlightableComponent extends JComponent {
|
||||
else{
|
||||
int endIndex = 0;
|
||||
for (HighlightedRegion hRegion : myHighlightedRegions) {
|
||||
|
||||
String text = myText.substring(endIndex, hRegion.startOffset);
|
||||
width += defFontMetrics.stringWidth(myText.substring(endIndex, hRegion.startOffset));
|
||||
endIndex = hRegion.endOffset;
|
||||
|
||||
width += defFontMetrics.stringWidth(text);
|
||||
|
||||
if (hRegion.endOffset > myText.length()) {
|
||||
if (hRegion.startOffset < myText.length()) {
|
||||
text = myText.substring(hRegion.startOffset);
|
||||
}
|
||||
else {
|
||||
text = "";
|
||||
}
|
||||
}
|
||||
else {
|
||||
text = myText.substring(hRegion.startOffset, hRegion.endOffset);
|
||||
}
|
||||
|
||||
String text = getRegionText(hRegion);
|
||||
FontMetrics fontMetrics = myFontMetrics.get(hRegion.textAttributes.getFontType());
|
||||
width += fontMetrics.stringWidth(text);
|
||||
}
|
||||
@@ -392,4 +402,20 @@ public class HighlightableComponent extends JComponent {
|
||||
|
||||
return new Dimension(width + 2, height);
|
||||
}
|
||||
|
||||
private String getRegionText(HighlightedRegion hRegion) {
|
||||
String text;
|
||||
if (hRegion.endOffset > myText.length()) {
|
||||
if (hRegion.startOffset < myText.length()) {
|
||||
text = myText.substring(hRegion.startOffset);
|
||||
}
|
||||
else {
|
||||
text = "";
|
||||
}
|
||||
}
|
||||
else {
|
||||
text = myText.substring(hRegion.startOffset, hRegion.endOffset);
|
||||
}
|
||||
return text;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ public class HyperlinkLabel extends HighlightableComponent {
|
||||
myTextEffectColor = textEffectColor;
|
||||
enforceBackgroundOutsideText(textBackgroundColor);
|
||||
setHyperlinkText(text);
|
||||
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
|
||||
enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
|
||||
}
|
||||
|
||||
public void addNotify() {
|
||||
@@ -60,7 +60,11 @@ public class HyperlinkLabel extends HighlightableComponent {
|
||||
}
|
||||
|
||||
public void setHyperlinkText(String text) {
|
||||
prepareText(text, myTextForegroundColor, myTextBackgroundColor, myTextEffectColor);
|
||||
setHyperlinkText("", text, "");
|
||||
}
|
||||
|
||||
public void setHyperlinkText(String beforeLinkText, String linkText, String afterLinkText) {
|
||||
prepareText(beforeLinkText, linkText, afterLinkText);
|
||||
revalidate();
|
||||
adjustSize();
|
||||
}
|
||||
@@ -72,24 +76,34 @@ public class HyperlinkLabel extends HighlightableComponent {
|
||||
|
||||
|
||||
protected void processMouseEvent(MouseEvent e) {
|
||||
if (e.getID() == MouseEvent.MOUSE_ENTERED) {
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
|
||||
}
|
||||
else if (e.getID() == MouseEvent.MOUSE_EXITED) {
|
||||
if (e.getID() == MouseEvent.MOUSE_EXITED) {
|
||||
setCursor(Cursor.getDefaultCursor());
|
||||
}
|
||||
else if (UIUtil.isActionClick(e, MouseEvent.MOUSE_PRESSED)) {
|
||||
else if (UIUtil.isActionClick(e, MouseEvent.MOUSE_PRESSED) && isOnLink(e.getX())) {
|
||||
fireHyperlinkEvent();
|
||||
}
|
||||
super.processMouseEvent(e);
|
||||
}
|
||||
|
||||
private void prepareText(String text, final Color textForegroundColor, final Color textBackgroundColor, final Color textEffectColor) {
|
||||
@Override
|
||||
protected void processMouseMotionEvent(MouseEvent e) {
|
||||
if (e.getID() == MouseEvent.MOUSE_MOVED) {
|
||||
setCursor(isOnLink(e.getX()) ? Cursor.getPredefinedCursor(Cursor.HAND_CURSOR) : Cursor.getDefaultCursor());
|
||||
}
|
||||
super.processMouseMotionEvent(e);
|
||||
}
|
||||
|
||||
private boolean isOnLink(int x) {
|
||||
return findRegionByX(x) != null;
|
||||
}
|
||||
|
||||
private void prepareText(String beforeLinkText, String linkText, String afterLinkText) {
|
||||
setFont(UIUtil.getLabelFont());
|
||||
myHighlightedText = new HighlightedText();
|
||||
myHighlightedText.appendText(text, new TextAttributes(
|
||||
textForegroundColor, textBackgroundColor, textEffectColor, EffectType.LINE_UNDERSCORE, Font.PLAIN
|
||||
));
|
||||
myHighlightedText.appendText(beforeLinkText, null);
|
||||
myHighlightedText.appendText(linkText, new TextAttributes(myTextForegroundColor, myTextBackgroundColor, myTextEffectColor,
|
||||
EffectType.LINE_UNDERSCORE, Font.PLAIN));
|
||||
myHighlightedText.appendText(afterLinkText, null);
|
||||
myHighlightedText.applyToComponent(this);
|
||||
adjustSize();
|
||||
}
|
||||
|
||||
+1
-1
@@ -38,7 +38,7 @@ public class PathMacrosCollector extends PathMacroMap {
|
||||
private final Matcher myMatcher;
|
||||
|
||||
private static final Set<String> ourSystemMacroNames = new HashSet<String>(
|
||||
Arrays.asList(PathMacrosImpl.APPLICATION_HOME_MACRO_NAME, PathMacrosImpl.MODULE_DIR_MACRO_NAME, PathMacrosImpl.PROJECT_DIR_MACRO_NAME));
|
||||
Arrays.asList(PathMacrosImpl.APPLICATION_HOME_MACRO_NAME, PathMacrosImpl.MODULE_DIR_MACRO_NAME, PathMacrosImpl.PROJECT_DIR_MACRO_NAME, PathMacrosImpl.USER_HOME_MACRO_NAME));
|
||||
private static final String FILE_PROTOCOL = "file:";
|
||||
private static final String JAR_PROTOCOL = "jar:";
|
||||
|
||||
|
||||
@@ -24,6 +24,8 @@ import com.intellij.openapi.util.InvalidDataException;
|
||||
import com.intellij.openapi.util.NamedJDOMExternalizable;
|
||||
import com.intellij.openapi.util.RoamingTypeDisabled;
|
||||
import com.intellij.openapi.util.WriteExternalException;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.util.SystemProperties;
|
||||
import com.intellij.util.concurrency.JBReentrantReadWriteLock;
|
||||
import com.intellij.util.concurrency.LockFactory;
|
||||
import com.intellij.util.containers.HashMap;
|
||||
@@ -60,6 +62,8 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent,
|
||||
public static final String PROJECT_DIR_MACRO_NAME = "PROJECT_DIR";
|
||||
@NonNls
|
||||
public static final String MODULE_DIR_MACRO_NAME = "MODULE_DIR";
|
||||
@NonNls
|
||||
public static final String USER_HOME_MACRO_NAME = "USER_HOME";
|
||||
|
||||
private static final Set<String> ourSystemMacroNames = new HashSet<String>();
|
||||
@NonNls public static final String EXT_FILE_NAME = "path.macros";
|
||||
@@ -68,6 +72,7 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent,
|
||||
ourSystemMacroNames.add(APPLICATION_HOME_MACRO_NAME);
|
||||
ourSystemMacroNames.add(PROJECT_DIR_MACRO_NAME);
|
||||
ourSystemMacroNames.add(MODULE_DIR_MACRO_NAME);
|
||||
ourSystemMacroNames.add(USER_HOME_MACRO_NAME);
|
||||
}
|
||||
|
||||
private static final Set<String> ourToolsMacros = new HashSet<String>();
|
||||
@@ -112,6 +117,10 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent,
|
||||
ourToolsMacros.add("Sourcepath");
|
||||
}
|
||||
|
||||
public PathMacrosImpl() {
|
||||
setMacro(USER_HOME_MACRO_NAME, FileUtil.toSystemIndependentName(SystemProperties.getUserHome()));
|
||||
}
|
||||
|
||||
public static PathMacrosImpl getInstanceEx() {
|
||||
return (PathMacrosImpl)ApplicationManager.getApplication().getComponent(PathMacros.class);
|
||||
}
|
||||
|
||||
+1
-1
@@ -254,8 +254,8 @@ public class FileBasedStorage extends XmlElementStorage {
|
||||
|
||||
private Document processReadException(final Exception e) {
|
||||
myBlockSavingTheContent = isProjectOrModuleFile();
|
||||
LOG.warn(e);
|
||||
if (!ApplicationManager.getApplication().isUnitTestMode() && !ApplicationManager.getApplication().isHeadlessEnvironment()) {
|
||||
LOG.warn(e);
|
||||
SwingUtilities.invokeLater(new Runnable(){
|
||||
public void run() {
|
||||
JOptionPane.showMessageDialog(JOptionPane.getRootFrame(),
|
||||
|
||||
@@ -1264,4 +1264,8 @@ public class FSRecords implements Disposable, Forceable {
|
||||
dataInputStream.close();
|
||||
}
|
||||
}
|
||||
|
||||
public static RuntimeException handleError(Throwable e) {
|
||||
return DbConnection.handleError(e);
|
||||
}
|
||||
}
|
||||
|
||||
+6
-1
@@ -432,7 +432,12 @@ public class PersistentFS extends ManagingFS implements ApplicationComponent {
|
||||
return content;
|
||||
}
|
||||
else {
|
||||
return FileUtil.loadBytes(contentStream, (int)file.getLength());
|
||||
try {
|
||||
return FileUtil.loadBytes(contentStream, (int)file.getLength());
|
||||
}
|
||||
catch (IOException e) {
|
||||
throw FSRecords.handleError(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* Copyright 2000-2010 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.intellij.plugins.relaxNG;
|
||||
|
||||
import com.intellij.javaee.ExternalResourceManagerEx;
|
||||
|
||||
/**
|
||||
* @author Eugene.Kudelevsky
|
||||
*/
|
||||
@SuppressWarnings({"JUnitTestClassNamingConvention"})
|
||||
public class RngHtml5CompletionTest extends HighlightingTestBase {
|
||||
|
||||
@Override
|
||||
public String getTestDataPath() {
|
||||
return "completion";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
super.init();
|
||||
|
||||
final ExternalResourceManagerEx m = ExternalResourceManagerEx.getInstanceEx();
|
||||
m.addResource("http://www.w3.org/1999/xhtml/html5", toAbsolutePath("/highlighting/html5/html5.rnc"));
|
||||
}
|
||||
|
||||
public void testHtml5_1() throws Throwable {
|
||||
doTestCompletion("html5_1");
|
||||
}
|
||||
|
||||
public void testHtml5_2() throws Throwable {
|
||||
doTestCompletion("html5_2");
|
||||
}
|
||||
|
||||
public void testHtml5_3() throws Throwable {
|
||||
doTestCompletion("html5_3");
|
||||
}
|
||||
|
||||
public void testHtml5_4() throws Throwable {
|
||||
doTestCompletion("html5_4");
|
||||
}
|
||||
|
||||
public void testHtml5_5() throws Throwable {
|
||||
doTestCompletion("html5_5");
|
||||
}
|
||||
|
||||
public void testHtml5_6() throws Throwable {
|
||||
doTestCompletion("html5_6");
|
||||
}
|
||||
|
||||
public void testHtml5_7() throws Throwable {
|
||||
doTestCompletion("html5_7");
|
||||
}
|
||||
|
||||
public void testHtml5_8() throws Throwable {
|
||||
doTestCompletion("html5_8");
|
||||
}
|
||||
|
||||
public void testHtml5_9() throws Throwable {
|
||||
doTestCompletion("html5_9");
|
||||
}
|
||||
|
||||
public void testHtml5_10() throws Throwable {
|
||||
doTestCompletion("html5_10");
|
||||
}
|
||||
|
||||
public void testHtml5_11() throws Throwable {
|
||||
doTestCompletion("html5_11");
|
||||
}
|
||||
|
||||
public void testHtml5_12() throws Throwable {
|
||||
doTestCompletion("html5_12");
|
||||
}
|
||||
|
||||
public void testHtml5_13() throws Throwable {
|
||||
doTestCompletion("html5_13");
|
||||
}
|
||||
|
||||
public void testHtml5_14() throws Throwable {
|
||||
doTestCompletion("html5_14");
|
||||
}
|
||||
|
||||
public void testHtml5_15() throws Throwable {
|
||||
doTestCompletion("html5_15");
|
||||
}
|
||||
|
||||
public void testHtml5_16() throws Throwable {
|
||||
doTestCompletion("html5_16");
|
||||
}
|
||||
|
||||
public void testHtml5_17() throws Throwable {
|
||||
doTestCompletion("html5_17");
|
||||
}
|
||||
}
|
||||
@@ -43,6 +43,7 @@ public class RngXmlHighlightingTest extends HighlightingTestBase {
|
||||
m.addResource("http://www.w3.org/1999/XSL/Format", toAbsolutePath("highlighting/rnc/fo/main.rnc"));
|
||||
m.addResource("http://docbook.org/ns/docbook", toAbsolutePath("highlighting/docbook.rng"));
|
||||
m.addResource("urn:intelliForm:AttachmentFilter", toAbsolutePath("highlighting/attachment-filter.rng"));
|
||||
m.addResource("http://www.w3.org/1999/xhtml/html5", toAbsolutePath("highlighting/html5/xhtml5.rnc"));
|
||||
|
||||
m.addIgnoredResource("urn:intelliForm:Spaces");
|
||||
m.addIgnoredResource("http://www.w3.org/1999/xlink");
|
||||
@@ -163,4 +164,12 @@ public class RngXmlHighlightingTest extends HighlightingTestBase {
|
||||
public void testDocBookSchema() throws Throwable {
|
||||
doHighlightingTest("docbook.rng");
|
||||
}
|
||||
|
||||
public void testHtml5() throws Throwable {
|
||||
doHighlightingTest("Html5.xml");
|
||||
}
|
||||
|
||||
public void testHtml5_2() throws Throwable {
|
||||
doHighlightingTest("Html5_2.xml");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta conten<caret>>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<canv<caret>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<canvas
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
<script typ<caret>>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
<script type="">
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
<script asy<caret>>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
<script async="">
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<input checke<caret>>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<input checked="<caret>">
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<input patte<caret>>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<input pattern="">
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<input disa<caret>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<input disabled="<caret>"
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<input type="dat<caret>"
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<input type="date<caret>"
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<command radiogr<caret>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<command radiogroup=""
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta content<caret>>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta http-eq<caret>>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta http-equiv="">
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta charse<caret>>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta charset="">
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta styl<caret>>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,8 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta style="">
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<a>
|
||||
<addre<caret>
|
||||
</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<a>
|
||||
<address
|
||||
</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<a>
|
||||
<stro<caret>
|
||||
</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<a>
|
||||
<strong
|
||||
</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<ins>
|
||||
<stro<caret>
|
||||
</ins>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<ins>
|
||||
<strong
|
||||
</ins>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<output>
|
||||
<obj<caret>
|
||||
</output>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<output>
|
||||
<object
|
||||
</output>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<canvas>
|
||||
<sect<caret>
|
||||
</canvas>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<canvas>
|
||||
<section
|
||||
</canvas>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,100 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
|
||||
|
||||
<meta charset="utf-8"/>
|
||||
<meta name="viewport" content="width=620"/>
|
||||
<title>HTML5 Demo: Video</title>
|
||||
<!--<link rel="stylesheet" href="/css/html5demos.css" type="text/css">-->
|
||||
<!--<script src="/js/h5utils.js"></script>--></head><body>
|
||||
<section id="wrapper">
|
||||
<header>
|
||||
<h1>Video ©</h1>
|
||||
</header>
|
||||
<article>
|
||||
<video tabindex="0">
|
||||
<source src="assets/dizzy.mp4"/>
|
||||
<source src="assets/dizzy.ogv"/>
|
||||
</video>
|
||||
<p id="controls">
|
||||
<input id="play" value="play" type="button"/>
|
||||
<span id="position">00:00</span> / <span id="duration">loading...</span>
|
||||
</p>
|
||||
<p>Note that (at time of writing) <a href="http://webkit.org/" title="The WebKit Open Source Project">Webkit nightly</a> supports full screen mode, which will add a button above.</p>
|
||||
</article>
|
||||
<script>
|
||||
var video = document.querySelector('video'),
|
||||
togglePlay = document.querySelector('#play'),
|
||||
position = document.querySelector('#position'),
|
||||
ready = false,
|
||||
controls = document.querySelector('#controls'),
|
||||
fullscreen = null;
|
||||
|
||||
addEvent(togglePlay, 'click', function () {
|
||||
if (ready) {
|
||||
video.playbackRate = 0.5;
|
||||
if (video.paused) {
|
||||
if (video.ended) video.currentTime = 0;
|
||||
video.play();
|
||||
this.value = "pause";
|
||||
} else {
|
||||
video.pause();
|
||||
this.value = "play";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
addEvent(video, 'timeupdate', function () {
|
||||
position.innerHTML = asTime(this.currentTime);
|
||||
});
|
||||
|
||||
addEvent(video, 'ended', function () {
|
||||
togglePlay.value = "play";
|
||||
});
|
||||
|
||||
addEvent(video, 'canplay', function () {
|
||||
video.muted = true;
|
||||
ready = true;
|
||||
document.querySelector('#duration').innerHTML = asTime(this.duration);
|
||||
|
||||
// note: .webkitSupportsFullscreen is false while the video is loading, so we bind in to the canplay event
|
||||
if (video.webkitSupportsFullscreen) {
|
||||
fullscreen = document.createElement('input');
|
||||
fullscreen.setAttribute('type', 'button');
|
||||
fullscreen.setAttribute('value', 'fullscreen');
|
||||
controls.insertBefore(fullscreen, controls.firstChild);
|
||||
addEvent(fullscreen, 'click', function () {
|
||||
video.webkitEnterFullScreen();
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
function asTime(t) {
|
||||
t = Math.round(t);
|
||||
var s = t % 60;
|
||||
var m = Math.round(t / 60);
|
||||
|
||||
return two(m) + ':' + two(s);
|
||||
}
|
||||
|
||||
function two(s) {
|
||||
s += "";
|
||||
if (s.length == 2) s = "0" + s;
|
||||
return s;
|
||||
}
|
||||
</script>
|
||||
<footer><a href="/">HTML5 demos</a>/<a id="built" href="http://twitter.com/rem">@rem built this</a>/</footer>
|
||||
</section>
|
||||
<a href="http://github.com/remy/html5demos"><img style="position: absolute; top: 0pt; left: 0pt; border: 0pt none;" src="http://s3.amazonaws.com/github/ribbons/forkme_left_darkblue_121621.png" alt="Fork me on GitHub"/></a>
|
||||
<script>
|
||||
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
||||
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
||||
</script><script src="http://www.google-analytics.com/ga.js" type="text/javascript"></script>
|
||||
<script>
|
||||
try {
|
||||
var pageTracker = _gat._getTracker("UA-1656750-18");
|
||||
pageTracker._trackPageview();
|
||||
} catch(err) {}</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,90 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml/html5">
|
||||
<head>
|
||||
|
||||
|
||||
<meta charset="utf-8"/>
|
||||
<meta name="viewport" content="width=620"/>
|
||||
<title>HTML5 Demo: Canvas</title>
|
||||
<!--<link rel="stylesheet" href="/css/html5demos.css" type="text/css">-->
|
||||
</head><body>
|
||||
<section id="wrapper">
|
||||
<header>
|
||||
<h1>Canvas</h1>
|
||||
</header>
|
||||
<article><canvas width="300" height="100"></canvas></article>
|
||||
<script>
|
||||
|
||||
buildSpinner({ x : 50, y : 50, size : 20, degrees : 30 });
|
||||
|
||||
function buildSpinner(data) {
|
||||
|
||||
var canvas = document.createElement('canvas');
|
||||
canvas.height = 100;
|
||||
canvas.width = 300;
|
||||
document.getElementsByTagName('article')[0].appendChild(canvas);
|
||||
var ctx = canvas.getContext("2d"),
|
||||
i = 0, degrees = data.degrees, loops = 0, degreesList = [];
|
||||
|
||||
for (i = 0; i == degrees; i++) {
|
||||
degreesList.push(i);
|
||||
}
|
||||
|
||||
// reset
|
||||
i = 0;
|
||||
|
||||
// so I can kill it later
|
||||
window.canvasTimer = setInterval(draw, 1000/degrees);
|
||||
|
||||
function reset() {
|
||||
ctx.clearRect(0,0,100,100); // clear canvas
|
||||
|
||||
var left = degreesList.slice(0, 1);
|
||||
var right = degreesList.slice(1, degreesList.length);
|
||||
degreesList = right.concat(left);
|
||||
}
|
||||
|
||||
function draw() {
|
||||
var c, s, e;
|
||||
|
||||
var d = 0;
|
||||
|
||||
if (i == 0) {
|
||||
reset();
|
||||
}
|
||||
|
||||
ctx.save();
|
||||
|
||||
d = degreesList[i];
|
||||
c = Math.floor(255/degrees*i);
|
||||
ctx.strokeStyle = 'rgb(' + c + ', ' + c + ', ' + c + ')';
|
||||
ctx.lineWidth = data.size;
|
||||
ctx.beginPath();
|
||||
s = Math.floor(360/degrees*(d));
|
||||
e = Math.floor(360/degrees*(d+1)) - 1;
|
||||
|
||||
ctx.arc(data.x, data.y, data.size, (Math.PI/180)*s, (Math.PI/180)*e, false);
|
||||
ctx.stroke();
|
||||
|
||||
ctx.restore();
|
||||
|
||||
i++;
|
||||
if (i >= degrees) {
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<footer><a href="/">HTML5 demos</a>/<a id="built" href="http://twitter.com/rem">@rem built this</a></footer>
|
||||
</section>
|
||||
<a href="http://github.com/remy/html5demos"><img style="position: absolute; top: 0pt; left: 0pt; border: 0pt none;" src="http://s3.amazonaws.com/github/ribbons/forkme_left_darkblue_121621.png" alt="Fork me on GitHub"/></a>
|
||||
<script>
|
||||
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
||||
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
||||
</script><script src="http://www.google-analytics.com/ga.js" type="text/javascript"></script>
|
||||
<script>
|
||||
try {
|
||||
var pageTracker = _gat._getTracker("UA-1656750-18");
|
||||
pageTracker._trackPageview();
|
||||
} catch(err) {}</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,23 @@
|
||||
The RELAX NG Schema for (X)HTML 5 is licensed under the MIT open source license.
|
||||
The following legal notice applies to all files in this directory:
|
||||
|
||||
Copyright (c) 2005-2007 Elika J. Etemad (fantasai) and Henri Sivonen (hsivonen)
|
||||
Copyright (c) 2007-2008 Mozilla Foundation
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
@@ -0,0 +1,260 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Web Application Features #
|
||||
# #####################################################################
|
||||
|
||||
## Additions to Common Attributes
|
||||
|
||||
common.attrs.interact &=
|
||||
( common.attrs.contextmenu?
|
||||
& common.attrs.contenteditable?
|
||||
& common.attrs.draggable?
|
||||
& common.attrs.hidden?
|
||||
& common.attrs.spellcheck?
|
||||
)
|
||||
|
||||
common.attrs.other &= common.attrs.interact
|
||||
|
||||
## Context Menu: contextmenu
|
||||
|
||||
common.attrs.contextmenu =
|
||||
attribute contextmenu {
|
||||
common.data.idref
|
||||
}
|
||||
|
||||
## Editable Content: contenteditable
|
||||
|
||||
common.attrs.contenteditable =
|
||||
attribute contenteditable {
|
||||
w:string "true" | w:string "false" | w:string ""
|
||||
}
|
||||
|
||||
## Draggable Element: draggable
|
||||
|
||||
common.attrs.draggable =
|
||||
attribute draggable {
|
||||
w:string "true" | w:string "false"
|
||||
}
|
||||
|
||||
## Hidden Element: hidden
|
||||
|
||||
common.attrs.hidden =
|
||||
attribute hidden {
|
||||
w:string "hidden" | w:string ""
|
||||
}
|
||||
|
||||
## Spellchecking and grammar checking: spellcheck
|
||||
|
||||
common.attrs.spellcheck =
|
||||
attribute spellcheck{
|
||||
w:string "true" | w:string "false" | w:string ""
|
||||
}
|
||||
|
||||
## Application Cache: manifest
|
||||
|
||||
html.attrs.manifest =
|
||||
attribute manifest {
|
||||
common.data.uri
|
||||
}
|
||||
|
||||
html.attrs &= html.attrs.manifest?
|
||||
|
||||
## Progess Indicator: <progress>
|
||||
|
||||
progress.elem =
|
||||
element progress { progress.inner & progress.attrs }
|
||||
progress.attrs =
|
||||
( common.attrs
|
||||
& progress.attrs.value?
|
||||
& progress.attrs.max?
|
||||
)
|
||||
progress.attrs.value =
|
||||
attribute value {
|
||||
common.data.float.non-negative
|
||||
}
|
||||
progress.attrs.max =
|
||||
attribute max {
|
||||
common.data.float.positive
|
||||
}
|
||||
progress.inner =
|
||||
( common.inner.phrasing ) #Cannot enforce textContent format here
|
||||
|
||||
common.elem.phrasing |= progress.elem
|
||||
|
||||
## Command with an associated action: <command type='command'>
|
||||
|
||||
command.command.elem =
|
||||
element command { command.inner & command.command.attrs }
|
||||
command.command.attrs =
|
||||
( common.attrs
|
||||
& command.command.attrs.type?
|
||||
& common-command.attrs
|
||||
)
|
||||
command.command.attrs.type =
|
||||
attribute type {
|
||||
w:string "command"
|
||||
}
|
||||
command.elem = command.command.elem
|
||||
|
||||
## Selection of one item from a list of items: <command type='radio'>
|
||||
|
||||
command.radio.elem =
|
||||
element command { command.inner & command.radio.attrs }
|
||||
command.radio.attrs =
|
||||
( common.attrs
|
||||
& ( command.radio.attrs.type
|
||||
& command.radio.attrs.radiogroup #REVISIT taking liberties here
|
||||
& command.radio.attrs.checked?
|
||||
)
|
||||
& common-command.attrs
|
||||
)
|
||||
command.radio.attrs.type =
|
||||
attribute type {
|
||||
w:string "radio"
|
||||
}
|
||||
command.radio.attrs.radiogroup =
|
||||
attribute radiogroup {
|
||||
string #REVISIT need special format here?
|
||||
}
|
||||
command.radio.attrs.checked =
|
||||
attribute checked {
|
||||
w:string "checked" | w:string ""
|
||||
}
|
||||
command.elem |= command.radio.elem
|
||||
|
||||
## State or option that can be toggled: <command type='checkbox'>
|
||||
|
||||
command.checkbox.elem =
|
||||
element command { command.inner & command.checkbox.attrs }
|
||||
command.checkbox.attrs =
|
||||
( common.attrs
|
||||
& ( command.checkbox.attrs.type
|
||||
& command.checkbox.attrs.checked?
|
||||
)
|
||||
& common-command.attrs
|
||||
)
|
||||
command.checkbox.attrs.type =
|
||||
attribute type {
|
||||
w:string "checkbox"
|
||||
}
|
||||
command.checkbox.attrs.checked =
|
||||
attribute checked {
|
||||
w:string "checked" | w:string ""
|
||||
}
|
||||
command.elem |= command.checkbox.elem
|
||||
|
||||
common-command.attrs =
|
||||
( command.attrs.label?
|
||||
& command.attrs.icon?
|
||||
& command.attrs.disabled?
|
||||
)
|
||||
command.attrs.label =
|
||||
attribute label {
|
||||
string
|
||||
}
|
||||
command.attrs.icon =
|
||||
attribute icon {
|
||||
common.data.uri
|
||||
}
|
||||
command.attrs.disabled =
|
||||
attribute disabled {
|
||||
w:string "disabled" | w:string ""
|
||||
}
|
||||
command.inner =
|
||||
( empty )
|
||||
|
||||
common.elem.metadata |=
|
||||
( command.elem & nonHTMLizable )
|
||||
common.elem.phrasing |= command.elem
|
||||
|
||||
## Menu: <menu>
|
||||
|
||||
menu.elem =
|
||||
element menu { menu.inner & menu.attrs }
|
||||
menu.attrs =
|
||||
( common.attrs
|
||||
& menu.attrs.type?
|
||||
& menu.attrs.label?
|
||||
)
|
||||
menu.attrs.type =
|
||||
attribute type {
|
||||
w:string "toolbar" | w:string "context"
|
||||
}
|
||||
menu.attrs.label =
|
||||
attribute label {
|
||||
string
|
||||
}
|
||||
menu.inner =
|
||||
( mli.elem*
|
||||
| common.inner.flow
|
||||
)
|
||||
|
||||
common.elem.flow |= menu.elem
|
||||
# REVISIT allow nested menus
|
||||
|
||||
## Menu Item: <li>
|
||||
|
||||
mli.elem =
|
||||
element li { mli.inner & mli.attrs }
|
||||
mli.attrs =
|
||||
( common.attrs )
|
||||
mli.inner =
|
||||
( common.inner.flow )
|
||||
|
||||
## Canvas for Dynamic Graphics: <canvas>
|
||||
|
||||
canvas.elem.flow =
|
||||
element canvas { canvas.inner.flow & canvas.attrs }
|
||||
canvas.elem.phrasing =
|
||||
element canvas { canvas.inner.phrasing & canvas.attrs }
|
||||
canvas.attrs =
|
||||
( common.attrs
|
||||
& canvas.attrs.height?
|
||||
& canvas.attrs.width?
|
||||
& common.attrs.aria?
|
||||
)
|
||||
canvas.attrs.height =
|
||||
attribute height {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
canvas.attrs.width =
|
||||
attribute width {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
canvas.inner.flow =
|
||||
( common.inner.flow )
|
||||
canvas.inner.phrasing =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.flow |= canvas.elem.flow
|
||||
common.elem.phrasing |= canvas.elem.phrasing
|
||||
|
||||
## Additional On-Demand Information: <details>
|
||||
|
||||
details.elem =
|
||||
element details { details.inner & details.attrs }
|
||||
details.attrs =
|
||||
( common.attrs
|
||||
& details.attrs.open?
|
||||
& common.attrs.aria.implicit.region?
|
||||
)
|
||||
details.attrs.open =
|
||||
attribute open {
|
||||
w:string "open" | w:string ""
|
||||
}
|
||||
details.inner =
|
||||
( summary.elem?
|
||||
, common.inner.flow
|
||||
)
|
||||
|
||||
common.elem.flow |= details.elem
|
||||
|
||||
## Caption/summary for details element: <summary>
|
||||
|
||||
summary.elem =
|
||||
element summary { summary.inner & summary.attrs }
|
||||
summary.attrs =
|
||||
( common.attrs )
|
||||
summary.inner =
|
||||
( common.inner.phrasing )
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,196 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Basic Prose Markup #
|
||||
# #####################################################################
|
||||
|
||||
# #####################################################################
|
||||
## Paragraph-Level
|
||||
|
||||
## Paragraph: <p>
|
||||
|
||||
p.elem =
|
||||
element p { p.inner & p.attrs }
|
||||
p.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
p.inner =
|
||||
( common.inner.phrasing ) # REVISIT lists in span?
|
||||
|
||||
common.elem.flow |= p.elem
|
||||
|
||||
## Hint Transition: <hr>
|
||||
|
||||
hr.elem =
|
||||
element hr { hr.inner & hr.attrs }
|
||||
hr.attrs =
|
||||
( common.attrs )
|
||||
hr.inner =
|
||||
( empty )
|
||||
|
||||
common.elem.flow |= hr.elem
|
||||
|
||||
# #####################################################################
|
||||
## Preformatting Blocks
|
||||
|
||||
## Preformatted Text: <pre>
|
||||
|
||||
pre.elem =
|
||||
element pre { pre.inner & pre.attrs }
|
||||
pre.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
pre.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.flow |= pre.elem
|
||||
|
||||
# #####################################################################
|
||||
## Simple Lists
|
||||
|
||||
## Unordered List: <ul>
|
||||
|
||||
ul.elem =
|
||||
element ul { ul.inner & ul.attrs }
|
||||
ul.attrs =
|
||||
( common.attrs
|
||||
& ( common.attrs.aria
|
||||
| common.attrs.aria.implicit.region
|
||||
)?
|
||||
)
|
||||
ul.inner =
|
||||
( li.elem* )
|
||||
|
||||
common.elem.flow |= ul.elem
|
||||
|
||||
## Unordered List Item: <li>
|
||||
|
||||
li.elem =
|
||||
element li { li.inner & li.attrs }
|
||||
li.attrs =
|
||||
( common.attrs
|
||||
& ( common.attrs.aria
|
||||
| common.attrs.aria.implicit.listitem
|
||||
)?
|
||||
)
|
||||
li.inner =
|
||||
( common.inner.flow )
|
||||
|
||||
## Ordered List: <ol>
|
||||
|
||||
ol.elem =
|
||||
element ol { ol.inner & ol.attrs }
|
||||
ol.attrs =
|
||||
( common.attrs
|
||||
& ol.attrs.start?
|
||||
& ol.attrs.reversed?
|
||||
& ( common.attrs.aria
|
||||
| common.attrs.aria.implicit.region
|
||||
)?
|
||||
)
|
||||
ol.attrs.start =
|
||||
attribute start {
|
||||
common.data.integer
|
||||
}
|
||||
ol.attrs.reversed =
|
||||
attribute reversed {
|
||||
w:string "reversed" | w:string ""
|
||||
}
|
||||
ol.inner =
|
||||
( oli.elem* )
|
||||
|
||||
common.elem.flow |= ol.elem
|
||||
|
||||
## Ordered List Item: <li>
|
||||
|
||||
oli.elem =
|
||||
element li { oli.inner & oli.attrs }
|
||||
oli.attrs =
|
||||
( common.attrs
|
||||
& oli.attrs.value?
|
||||
& ( common.attrs.aria
|
||||
| common.attrs.aria.implicit.listitem
|
||||
)?
|
||||
)
|
||||
oli.attrs.value =
|
||||
attribute value {
|
||||
common.data.integer
|
||||
}
|
||||
oli.inner =
|
||||
( common.inner.flow )
|
||||
|
||||
# #####################################################################
|
||||
## Definition Lists
|
||||
|
||||
## Definition List: <dl>
|
||||
|
||||
dl.elem =
|
||||
element dl { dl.inner & dl.attrs }
|
||||
dl.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
dl.inner =
|
||||
( ( dt.elem+
|
||||
, dd.elem+
|
||||
)*
|
||||
)
|
||||
|
||||
common.elem.flow |= dl.elem
|
||||
|
||||
## Definition Term: <dt>
|
||||
|
||||
dt.elem =
|
||||
element dt { dt.inner & dt.attrs }
|
||||
dt.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
dt.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
## Definition Description: <dd>
|
||||
|
||||
dd.elem =
|
||||
element dd { dd.inner & dd.attrs }
|
||||
dd.elem.phrasing =
|
||||
element dd { dd.inner.phrasing & dd.attrs }
|
||||
dd.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
dd.inner =
|
||||
( common.inner.flow )
|
||||
dd.inner.phrasing =
|
||||
( common.inner.phrasing )
|
||||
|
||||
# #####################################################################
|
||||
## Miscellaneous Elements
|
||||
|
||||
## Generic Container: <div>
|
||||
|
||||
div.elem =
|
||||
element div { div.inner & div.attrs }
|
||||
div.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
div.inner =
|
||||
( style.elem.scoped*
|
||||
, common.inner.flow
|
||||
)
|
||||
|
||||
common.elem.flow |= div.elem
|
||||
|
||||
## Title or Explanatory Caption: <legend>
|
||||
|
||||
legend.elem =
|
||||
element legend { legend.inner & legend.attrs }
|
||||
legend.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria.implicit.region?
|
||||
)
|
||||
legend.inner =
|
||||
( common.inner.phrasing )
|
||||
@@ -0,0 +1,393 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Common Definitions #
|
||||
# #####################################################################
|
||||
|
||||
|
||||
# #####################################################################
|
||||
## Language Parameters - redefine in inclusion block as necessary #
|
||||
# #####################################################################
|
||||
|
||||
## HTML vs. XHTML restrictions
|
||||
|
||||
XMLonly = empty
|
||||
HTMLonly = notAllowed
|
||||
|
||||
## HTML 4 Compatibility - set to notAllowed to disallow markup introduced in HTML 5
|
||||
# (This only affects mixed-version modules; wholly HTML5
|
||||
# modules should simply be left out of the inclusion list.)
|
||||
|
||||
v5only = empty
|
||||
|
||||
## HTML Compatibility Switches - set to notAllowed to disallow
|
||||
|
||||
## XML features that can't be roundtripped HTML <-> XHTML
|
||||
# (xml:base on elements other than <html>)
|
||||
nonRoundtrippable = empty
|
||||
|
||||
## XML features that can't be serialized as HTML
|
||||
nonHTMLizable = empty
|
||||
|
||||
# #####################################################################
|
||||
## Wildcards #
|
||||
# #####################################################################
|
||||
|
||||
## Any attribute from any namespace
|
||||
|
||||
common.attr.anything =
|
||||
attribute * { text }*
|
||||
|
||||
## Any element from any namespace
|
||||
|
||||
common.elem.anything =
|
||||
element * { common.inner.anything & common.attr.anything }
|
||||
|
||||
## Any content from any namespace
|
||||
|
||||
common.inner.anything =
|
||||
( text
|
||||
& common.elem.anything*
|
||||
)
|
||||
|
||||
# #####################################################################
|
||||
## Common Element Classes #
|
||||
# #####################################################################
|
||||
|
||||
## Metadata Elements
|
||||
|
||||
common.elem.metadata =
|
||||
( notAllowed )
|
||||
|
||||
## Phrase Elements
|
||||
|
||||
common.elem.phrasing =
|
||||
( notAllowed )
|
||||
|
||||
## Prose Elements
|
||||
|
||||
common.elem.flow =
|
||||
( common.elem.phrasing )
|
||||
|
||||
|
||||
# #####################################################################
|
||||
## Common Content Models #
|
||||
# #####################################################################
|
||||
|
||||
## Metadata Content
|
||||
|
||||
common.inner.metadata =
|
||||
( common.elem.metadata* )
|
||||
|
||||
## Phrase Content
|
||||
|
||||
common.inner.phrasing =
|
||||
( text & common.elem.phrasing* )
|
||||
|
||||
## Prose Content
|
||||
|
||||
common.inner.flow =
|
||||
( text & common.elem.flow* ) # REVISIT <style scoped>
|
||||
|
||||
# #####################################################################
|
||||
## Common Attributes #
|
||||
# #####################################################################
|
||||
|
||||
# When updating, check <bdo> definition too
|
||||
|
||||
common.attrs =
|
||||
( common.attrs.basic
|
||||
& common.attrs.i18n
|
||||
& common.attrs.present
|
||||
& common.attrs.other
|
||||
)
|
||||
|
||||
common.attrs.basic =
|
||||
( ( common.attrs.id
|
||||
| common.attrs.xml-id
|
||||
)? # REVISIT assuming only either one is allowed
|
||||
& common.attrs.class?
|
||||
& common.attrs.title?
|
||||
& common.attrs.base?
|
||||
& common.attrs.space?
|
||||
)
|
||||
common.attrs.id =
|
||||
attribute id {
|
||||
common.data.id
|
||||
}
|
||||
common.attrs.xml-id =
|
||||
attribute xml:id {
|
||||
xsd:NCName
|
||||
} & XMLonly
|
||||
common.attrs.class =
|
||||
attribute class {
|
||||
common.data.tokens
|
||||
}
|
||||
common.attrs.title =
|
||||
attribute title {
|
||||
text
|
||||
}
|
||||
common.attrs.base =
|
||||
common.attrs.xmlbase
|
||||
& nonRoundtrippable
|
||||
common.attrs.xmlbase =
|
||||
attribute xml:base {
|
||||
common.data.uri
|
||||
} & XMLonly
|
||||
common.attrs.space =
|
||||
common.attrs.xmlspace
|
||||
common.attrs.xmlspace =
|
||||
attribute xml:space {
|
||||
string "preserve" # REVISIT this is not allowed per spec
|
||||
} & XMLonly
|
||||
|
||||
common.attrs.i18n =
|
||||
( common.attrs.dir?
|
||||
& common.attrs.language?
|
||||
)
|
||||
common.attrs.dir =
|
||||
attribute dir {
|
||||
w:string "ltr" | w:string "rtl"
|
||||
}
|
||||
# This lang definition is a hack for enviroments where
|
||||
# the HTML5 parser maps lang to xml:lang.
|
||||
# Sameness check left to Schematron
|
||||
common.attrs.language =
|
||||
( common.attrs.xmllang?
|
||||
& common.attrs.lang?
|
||||
)
|
||||
common.attrs.lang =
|
||||
attribute lang {
|
||||
common.data.langcode
|
||||
} & XMLonly
|
||||
common.attrs.xmllang =
|
||||
attribute xml:lang {
|
||||
common.data.langcode
|
||||
}
|
||||
# common.attrs.language =
|
||||
# ( common.attrs.lang
|
||||
# | common.attrs.xmllang
|
||||
# )
|
||||
# common.attrs.lang =
|
||||
# attribute lang {
|
||||
# common.data.langcode
|
||||
# } & HTMLonly
|
||||
# common.attrs.xmllang =
|
||||
# attribute xml:lang {
|
||||
# common.data.langcode
|
||||
# } & XMLonly
|
||||
|
||||
common.attrs.present =
|
||||
( common.attrs.style?
|
||||
& common.attrs.tabindex?
|
||||
& common.attrs.accesskey?
|
||||
)
|
||||
common.attrs.style =
|
||||
attribute style {
|
||||
string
|
||||
}
|
||||
common.attrs.tabindex =
|
||||
attribute tabindex {
|
||||
common.data.integer
|
||||
}
|
||||
# REVISIT move style to a module and bundle tabindex with ARIA
|
||||
common.attrs.accesskey =
|
||||
attribute accesskey {
|
||||
common.data.keylabellist
|
||||
}
|
||||
|
||||
common.attrs.other =
|
||||
empty
|
||||
|
||||
# #####################################################################
|
||||
## Common Datatypes #
|
||||
# #####################################################################
|
||||
|
||||
## Names and Tokens
|
||||
|
||||
common.data.tokens =
|
||||
list { token* }
|
||||
|
||||
common.data.browsing-context =
|
||||
w:browsing-context
|
||||
|
||||
common.data.browsing-context-or-keyword =
|
||||
w:browsing-context-or-keyword
|
||||
# xsd:string {
|
||||
# pattern = "()|([^_].*)|(_[bB][lL][aA][nN][kK])|(_[sS][eE][lL][fF])|(_[pP][aA][rR][eE][nN][tT])|(_[tT][oO][pP])"
|
||||
# }
|
||||
|
||||
|
||||
## IDs and IDREFs
|
||||
|
||||
common.data.id =
|
||||
w:ID
|
||||
# xsd:string {
|
||||
# pattern = "\S+"
|
||||
# }
|
||||
|
||||
common.data.idref =
|
||||
w:IDREF
|
||||
|
||||
common.data.idrefs =
|
||||
w:IDREFS
|
||||
|
||||
common.data.name =
|
||||
w:ID #FIXME
|
||||
|
||||
common.data.hash-name =
|
||||
w:hash-name
|
||||
# xsd:string {
|
||||
# pattern = "#.+"
|
||||
# }
|
||||
|
||||
## Numerical
|
||||
|
||||
common.data.integer =
|
||||
w:integer
|
||||
# xsd:string {
|
||||
# pattern = "-?[0-9]+"
|
||||
# }
|
||||
|
||||
common.data.integer.positive =
|
||||
w:integer-positive
|
||||
# xsd:string {
|
||||
# pattern = "0*[1-9][0-9]*"
|
||||
# }
|
||||
|
||||
common.data.integer.non-negative =
|
||||
w:integer-non-negative
|
||||
# xsd:string {
|
||||
# pattern = "[0-9]+"
|
||||
# }
|
||||
|
||||
# common.data.percent =
|
||||
# xsd:string {
|
||||
# pattern = "(100)|([1-9]?[0-9](\.[0-9]+)?)%"
|
||||
# }
|
||||
|
||||
common.data.float =
|
||||
w:float
|
||||
# xsd:string {
|
||||
# pattern = "-?[0-9]+(\.[0-9]+)?([eE]-?[0-9]+)?"
|
||||
# }
|
||||
|
||||
common.data.float.positive =
|
||||
w:float-positive
|
||||
# xsd:string {
|
||||
# pattern = "(0*[1-9][0-9]*(\.[0-9]+)?)|([0-9]+(\.0*[1-9][0-9]*)?)([eE]-?[0-9]+)?"
|
||||
# }
|
||||
|
||||
common.data.float.non-negative =
|
||||
w:float-non-negative
|
||||
# xsd:string {
|
||||
# pattern = "[0-9]+(\.[0-9]+)?([eE]-?[0-9]+)?"
|
||||
# }
|
||||
|
||||
## Temporal
|
||||
|
||||
common.data.datetime =
|
||||
w:datetime-tz
|
||||
|
||||
common.data.date-or-time =
|
||||
w:date-or-time
|
||||
|
||||
## IRIs
|
||||
|
||||
common.data.uri =
|
||||
w:string "" | w:iri-ref
|
||||
|
||||
common.data.uris =
|
||||
list { w:iri-ref* }
|
||||
|
||||
common.data.uri.absolute =
|
||||
w:iri
|
||||
|
||||
## <link type='icon'> sizes
|
||||
|
||||
common.data.sizes =
|
||||
# list { w:sizes }
|
||||
list {
|
||||
xsd:string {
|
||||
pattern = "[1-9][0-9]*x[1-9][0-9]*"
|
||||
}+
|
||||
}
|
||||
|
||||
## MIME types
|
||||
|
||||
common.data.mimetype =
|
||||
w:mime-type
|
||||
|
||||
## Encodings
|
||||
|
||||
common.data.charset =
|
||||
w:charset
|
||||
|
||||
common.data.meta-charset =
|
||||
w:meta-charset
|
||||
|
||||
## Refresh
|
||||
|
||||
common.data.refresh =
|
||||
w:refresh
|
||||
|
||||
## Default style
|
||||
|
||||
common.data.default-style =
|
||||
string
|
||||
# w:default-style
|
||||
|
||||
## Media Queries
|
||||
|
||||
common.data.mediaquery =
|
||||
w:media-query
|
||||
|
||||
## Language Codes
|
||||
|
||||
common.data.langcode =
|
||||
w:string "" | w:language
|
||||
|
||||
## List of Key Labels
|
||||
common.data.keylabellist =
|
||||
w:keylabellist
|
||||
|
||||
## Microdata Identifier
|
||||
common.data.microdata-identifier =
|
||||
w:microdata-identifier
|
||||
|
||||
## Zero
|
||||
common.data.zero =
|
||||
w:zero
|
||||
|
||||
# #####################################################################
|
||||
## WF2 Module Hook #
|
||||
# #####################################################################
|
||||
|
||||
common-form.attrs.form = ( notAllowed )
|
||||
|
||||
# #####################################################################
|
||||
## ARIA Module Hooks #
|
||||
# #####################################################################
|
||||
|
||||
common.attrs.aria = ( notAllowed )
|
||||
common.attrs.aria.implicit.button = ( notAllowed )
|
||||
common.attrs.aria.implicit.input = ( notAllowed )
|
||||
common.attrs.aria.implicit.region = ( notAllowed )
|
||||
common.attrs.aria.implicit.group = ( notAllowed )
|
||||
common.attrs.aria.implicit.th = ( notAllowed )
|
||||
common.attrs.aria.implicit.structure = ( notAllowed )
|
||||
common.attrs.aria.implicit.link = ( notAllowed )
|
||||
common.attrs.aria.implicit.listitem = ( notAllowed )
|
||||
common.attrs.aria.implicit.img = ( notAllowed )
|
||||
common.attrs.aria.implicit.select = ( notAllowed )
|
||||
common.attrs.aria.landmark.application = ( notAllowed )
|
||||
common.attrs.aria.landmark.banner = ( notAllowed )
|
||||
common.attrs.aria.landmark.complementary = ( notAllowed )
|
||||
common.attrs.aria.landmark.contentinfo = ( notAllowed )
|
||||
common.attrs.aria.landmark.main = ( notAllowed )
|
||||
common.attrs.aria.landmark.navigation = ( notAllowed )
|
||||
common.attrs.aria.landmark.search = ( notAllowed )
|
||||
# per ARIA spec: article, document, and note are not actually landmarks
|
||||
common.attrs.aria.landmark.article = ( notAllowed )
|
||||
common.attrs.aria.landmark.document = ( notAllowed )
|
||||
common.attrs.aria.landmark.note = ( notAllowed )
|
||||
@@ -0,0 +1,331 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Core Scripting #
|
||||
# #####################################################################
|
||||
|
||||
# #####################################################################
|
||||
## Scripting Elements
|
||||
|
||||
## Inline Scripts: <script>
|
||||
|
||||
script.elem.embedded =
|
||||
element script { script.inner.embedded & script.attrs.embedded }
|
||||
script.attrs.embedded =
|
||||
( common.attrs
|
||||
& script.attrs.type?
|
||||
& script.attrs.language? # restricted in Schematron
|
||||
)
|
||||
script.elem.imported =
|
||||
element script { script.inner.imported & script.attrs.imported }
|
||||
script.attrs.imported =
|
||||
( common.attrs
|
||||
& script.attrs.src
|
||||
& script.attrs.defer?
|
||||
& script.attrs.async?
|
||||
& script.attrs.type?
|
||||
& script.attrs.charset?
|
||||
& script.attrs.language? # restricted in Schematron
|
||||
)
|
||||
script.attrs.src =
|
||||
attribute src {
|
||||
common.data.uri
|
||||
}
|
||||
script.attrs.defer =
|
||||
attribute defer {
|
||||
w:string "defer" | w:string ""
|
||||
}
|
||||
script.attrs.async =
|
||||
attribute async {
|
||||
w:string "async" | w:string ""
|
||||
} & v5only
|
||||
script.attrs.type =
|
||||
attribute type {
|
||||
common.data.mimetype # XXX without charset parameter!
|
||||
}
|
||||
script.attrs.charset =
|
||||
attribute charset {
|
||||
common.data.charset
|
||||
}
|
||||
script.attrs.language =
|
||||
attribute language {
|
||||
string
|
||||
}
|
||||
script.inner.embedded =
|
||||
( common.inner.anything )
|
||||
script.inner.imported =
|
||||
( common.inner.anything )
|
||||
|
||||
script.elem =
|
||||
( script.elem.embedded
|
||||
| script.elem.imported
|
||||
)
|
||||
|
||||
common.elem.metadata |= script.elem
|
||||
common.elem.phrasing |= script.elem
|
||||
|
||||
## Fallback Unscripted Content: <noscript>
|
||||
|
||||
noscript.elem.head =
|
||||
element noscript { noscript.inner.head & noscript.attrs }
|
||||
& HTMLonly
|
||||
noscript.inner.head =
|
||||
( link.elem
|
||||
| meta.http-equiv.default-style.elem
|
||||
| meta.http-equiv.refresh.elem
|
||||
| style.elem
|
||||
)*
|
||||
noscript.elem.phrasing =
|
||||
element noscript { noscript.inner.phrasing & noscript.attrs }
|
||||
& HTMLonly
|
||||
noscript.inner.phrasing =
|
||||
( common.inner.phrasing )
|
||||
noscript.elem.flow =
|
||||
element noscript { noscript.inner.flow & noscript.attrs }
|
||||
& HTMLonly
|
||||
noscript.inner.flow =
|
||||
( common.inner.flow )
|
||||
noscript.attrs =
|
||||
( common.attrs )
|
||||
|
||||
common.elem.metadata |= noscript.elem.head
|
||||
common.elem.phrasing |= noscript.elem.phrasing
|
||||
common.elem.flow |= noscript.elem.flow
|
||||
|
||||
# #####################################################################
|
||||
## Event Handler Attribute Definitions
|
||||
|
||||
common.attrs.scripting &=
|
||||
( scripting.attr.onabort?
|
||||
& scripting.attr.onblur?
|
||||
& scripting.attr.oncanplay?
|
||||
& scripting.attr.oncanplaythrough?
|
||||
& scripting.attr.onchange?
|
||||
& scripting.attr.onclick?
|
||||
& scripting.attr.oncontextmenu?
|
||||
& scripting.attr.ondblclick?
|
||||
& scripting.attr.ondrag?
|
||||
& scripting.attr.ondragend?
|
||||
& scripting.attr.ondragenter?
|
||||
& scripting.attr.ondragleave?
|
||||
& scripting.attr.ondragover?
|
||||
& scripting.attr.ondragstart?
|
||||
& scripting.attr.ondrop?
|
||||
& scripting.attr.ondurationchange?
|
||||
& scripting.attr.onemptied?
|
||||
& scripting.attr.onended?
|
||||
& scripting.attr.onerror?
|
||||
& scripting.attr.onfocus?
|
||||
& scripting.attr.onformchange?
|
||||
& scripting.attr.onforminput?
|
||||
& scripting.attr.oninput?
|
||||
& scripting.attr.oninvalid?
|
||||
& scripting.attr.onkeydown?
|
||||
& scripting.attr.onkeypress?
|
||||
& scripting.attr.onkeyup?
|
||||
& scripting.attr.onload?
|
||||
& scripting.attr.onloadeddata?
|
||||
& scripting.attr.onloadedmetadata?
|
||||
& scripting.attr.onloadstart?
|
||||
& scripting.attr.onmousedown?
|
||||
& scripting.attr.onmousemove?
|
||||
& scripting.attr.onmouseout?
|
||||
& scripting.attr.onmouseover?
|
||||
& scripting.attr.onmouseup?
|
||||
& scripting.attr.onmousewheel?
|
||||
& scripting.attr.onpause?
|
||||
& scripting.attr.onplay?
|
||||
& scripting.attr.onplaying?
|
||||
& scripting.attr.onprogress?
|
||||
& scripting.attr.onratechange?
|
||||
& scripting.attr.onreadystatechange?
|
||||
& scripting.attr.onscroll?
|
||||
& scripting.attr.onseeked?
|
||||
& scripting.attr.onseeking?
|
||||
& scripting.attr.onselect?
|
||||
& scripting.attr.onshow?
|
||||
& scripting.attr.onstalled?
|
||||
& scripting.attr.onsubmit?
|
||||
& scripting.attr.onsuspend?
|
||||
& scripting.attr.ontimeupdate?
|
||||
& scripting.attr.onvolumechange?
|
||||
& scripting.attr.onwaiting?
|
||||
)
|
||||
|
||||
common.attrs.other &= common.attrs.scripting
|
||||
|
||||
scripting.attr.onabort =
|
||||
attribute onabort { string }
|
||||
scripting.attr.onblur =
|
||||
attribute onblur { string }
|
||||
scripting.attr.oncanplay =
|
||||
attribute oncanplay { string }
|
||||
scripting.attr.oncanplaythrough =
|
||||
attribute oncanplaythrough { string }
|
||||
scripting.attr.onchange =
|
||||
attribute onchange { string }
|
||||
scripting.attr.onclick =
|
||||
attribute onclick { string }
|
||||
scripting.attr.oncontextmenu =
|
||||
attribute oncontextmenu { string }
|
||||
scripting.attr.ondblclick =
|
||||
attribute ondblclick { string }
|
||||
scripting.attr.ondrag =
|
||||
attribute ondrag { string }
|
||||
scripting.attr.ondragend =
|
||||
attribute ondragend { string }
|
||||
scripting.attr.ondragenter =
|
||||
attribute ondragenter { string }
|
||||
scripting.attr.ondragleave =
|
||||
attribute ondragleave { string }
|
||||
scripting.attr.ondragover =
|
||||
attribute ondragover { string }
|
||||
scripting.attr.ondragstart =
|
||||
attribute ondragstart { string }
|
||||
scripting.attr.ondrop =
|
||||
attribute ondrop { string }
|
||||
scripting.attr.ondurationchange =
|
||||
attribute ondurationchange { string }
|
||||
scripting.attr.onemptied =
|
||||
attribute onemptied { string }
|
||||
scripting.attr.onended =
|
||||
attribute onended { string }
|
||||
scripting.attr.onerror =
|
||||
attribute onerror { string }
|
||||
scripting.attr.onfocus =
|
||||
attribute onfocus { string }
|
||||
scripting.attr.onformchange =
|
||||
attribute onformchange { string }
|
||||
scripting.attr.onforminput =
|
||||
attribute onforminput { string }
|
||||
scripting.attr.oninput =
|
||||
attribute oninput { string }
|
||||
scripting.attr.oninvalid =
|
||||
attribute oninvalid { string }
|
||||
scripting.attr.onkeydown =
|
||||
attribute onkeydown { string }
|
||||
scripting.attr.onkeypress =
|
||||
attribute onkeypress { string }
|
||||
scripting.attr.onkeyup =
|
||||
attribute onkeyup { string }
|
||||
scripting.attr.onload =
|
||||
attribute onload { string }
|
||||
scripting.attr.onloadeddata =
|
||||
attribute onloadeddata { string }
|
||||
scripting.attr.onloadedmetadata =
|
||||
attribute onloadedmetadata { string }
|
||||
scripting.attr.onloadstart =
|
||||
attribute onloadstart { string }
|
||||
scripting.attr.onmousedown =
|
||||
attribute onmousedown { string }
|
||||
scripting.attr.onmousemove =
|
||||
attribute onmousemove { string }
|
||||
scripting.attr.onmouseout =
|
||||
attribute onmouseout { string }
|
||||
scripting.attr.onmouseover =
|
||||
attribute onmouseover { string }
|
||||
scripting.attr.onmouseup =
|
||||
attribute onmouseup { string }
|
||||
scripting.attr.onmousewheel =
|
||||
attribute onmousewheel { string }
|
||||
scripting.attr.onpause =
|
||||
attribute onpause { string }
|
||||
scripting.attr.onplay =
|
||||
attribute onplay { string }
|
||||
scripting.attr.onplaying =
|
||||
attribute onplaying { string }
|
||||
scripting.attr.onprogress =
|
||||
attribute onprogress { string }
|
||||
scripting.attr.onratechange =
|
||||
attribute onratechange { string }
|
||||
scripting.attr.onreadystatechange =
|
||||
attribute onreadystatechange { string }
|
||||
scripting.attr.onscroll =
|
||||
attribute onscroll { string }
|
||||
scripting.attr.onseeked =
|
||||
attribute onseeked { string }
|
||||
scripting.attr.onseeking =
|
||||
attribute onseeking { string }
|
||||
scripting.attr.onselect =
|
||||
attribute onselect { string }
|
||||
scripting.attr.onshow =
|
||||
attribute onshow { string }
|
||||
scripting.attr.onstalled =
|
||||
attribute onstalled { string }
|
||||
scripting.attr.onsubmit =
|
||||
attribute onsubmit { string }
|
||||
scripting.attr.onsuspend =
|
||||
attribute onsuspend { string }
|
||||
scripting.attr.ontimeupdate =
|
||||
attribute ontimeupdate { string }
|
||||
scripting.attr.onvolumechange =
|
||||
attribute onvolumechange { string }
|
||||
scripting.attr.onwaiting =
|
||||
attribute onwaiting { string }
|
||||
|
||||
# scripting.attr.common =
|
||||
# ( scripting.attr.mouse
|
||||
# & scripting.attr.keyboard
|
||||
# & scripting.attr.focus
|
||||
# )
|
||||
#
|
||||
# scripting.attr.mouse =
|
||||
# ( scripting.attr.mouse.click?
|
||||
# & scripting.attr.mouse.dblclick?
|
||||
# & scripting.attr.mouse.down?
|
||||
# & scripting.attr.mouse.up?
|
||||
# & scripting.attr.mouse.over?
|
||||
# & scripting.attr.mouse.move?
|
||||
# & scripting.attr.mouse.out?
|
||||
# )
|
||||
# scripting.attr.mouse.click =
|
||||
# attribute onclick { string }
|
||||
# scripting.attr.mouse.dblclick =
|
||||
# attribute ondblclick { string }
|
||||
# scripting.attr.mouse.down =
|
||||
# attribute onmousedown { string }
|
||||
# scripting.attr.mouse.up =
|
||||
# attribute onmouseup { string }
|
||||
# scripting.attr.mouse.over =
|
||||
# attribute onmouseover { string }
|
||||
# scripting.attr.mouse.move =
|
||||
# attribute onmousemove { string }
|
||||
# scripting.attr.mouse.out =
|
||||
# attribute onmouseout { string }
|
||||
#
|
||||
# scripting.attr.keyboard =
|
||||
# ( scripting.attr.keyboard.press?
|
||||
# & scripting.attr.keyboard.down?
|
||||
# & scripting.attr.keyboard.up?
|
||||
# )
|
||||
# scripting.attr.keyboard.press =
|
||||
# attribute onkeypress { string }
|
||||
# scripting.attr.keyboard.down =
|
||||
# attribute onkeydown { string }
|
||||
# scripting.attr.keyboard.up =
|
||||
# attribute onkeyup { string }
|
||||
#
|
||||
#
|
||||
# scripting.attr.focus =
|
||||
# ( scripting.attr.focus.gain?
|
||||
# & scripting.attr.focus.lose?
|
||||
# )
|
||||
# scripting.attr.focus.gain =
|
||||
# attribute onfocus { string }
|
||||
# scripting.attr.focus.lose =
|
||||
# attribute onblur { string }
|
||||
#
|
||||
# scripting.attr.loading =
|
||||
# ( scripting.attr.loading.load?
|
||||
# & scripting.attr.loading.unload?
|
||||
# )
|
||||
# scripting.attr.loading.load =
|
||||
# attribute onload { string }
|
||||
# scripting.attr.loading.unload =
|
||||
# attribute onunload { string }
|
||||
|
||||
|
||||
# #####################################################################
|
||||
# Event Handler Attribute Assignments
|
||||
|
||||
# body.attrs &= scripting.attr.loading
|
||||
@@ -0,0 +1,69 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Static Data Markup #
|
||||
# #####################################################################
|
||||
|
||||
## Time: <time>
|
||||
|
||||
time.elem =
|
||||
element time { time.inner & time.attrs }
|
||||
time.attrs =
|
||||
( common.attrs
|
||||
& time.attrs.datetime?
|
||||
& time.attrs.pubdate?
|
||||
)
|
||||
time.attrs.datetime =
|
||||
attribute datetime {
|
||||
common.data.date-or-time #REVISIT check format
|
||||
}
|
||||
time.attrs.pubdate =
|
||||
attribute pubdate {
|
||||
w:string "pubdate" | w:string ""
|
||||
}
|
||||
time.inner =
|
||||
( common.inner.phrasing ) #Cannot enforce textContent format here
|
||||
|
||||
common.elem.phrasing |= time.elem
|
||||
|
||||
## Scalar Gauge: <meter>
|
||||
|
||||
meter.elem =
|
||||
element meter { meter.inner & meter.attrs }
|
||||
meter.attrs =
|
||||
( common.attrs
|
||||
& meter.attrs.value
|
||||
& meter.attrs.min?
|
||||
& meter.attrs.low?
|
||||
& meter.attrs.high?
|
||||
& meter.attrs.max?
|
||||
& meter.attrs.optimum?
|
||||
)
|
||||
meter.attrs.value =
|
||||
attribute value {
|
||||
common.data.float
|
||||
}
|
||||
meter.attrs.min =
|
||||
attribute min {
|
||||
common.data.float
|
||||
}
|
||||
meter.attrs.low =
|
||||
attribute low {
|
||||
common.data.float
|
||||
}
|
||||
meter.attrs.high =
|
||||
attribute high {
|
||||
common.data.float
|
||||
}
|
||||
meter.attrs.max =
|
||||
attribute max {
|
||||
common.data.float
|
||||
}
|
||||
meter.attrs.optimum =
|
||||
attribute optimum {
|
||||
common.data.float
|
||||
}
|
||||
meter.inner =
|
||||
( common.inner.phrasing ) #Cannot enforce textContent format here
|
||||
|
||||
common.elem.phrasing |= meter.elem
|
||||
@@ -0,0 +1,565 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
namespace local = ""
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Embedded Content #
|
||||
# #####################################################################
|
||||
|
||||
#######################################################################
|
||||
## Replaced Content
|
||||
|
||||
## Images: <img>
|
||||
|
||||
img.elem =
|
||||
element img { img.inner & img.attrs }
|
||||
img.attrs =
|
||||
( common.attrs
|
||||
& img.attrs.src
|
||||
& img.attrs.alt?
|
||||
& img.attrs.height?
|
||||
& img.attrs.width?
|
||||
& img.attrs.usemap?
|
||||
& img.attrs.ismap?
|
||||
& img.attrs.border? # obsolete
|
||||
& common.attrs.aria?
|
||||
)
|
||||
img.attrs.src =
|
||||
attribute src {
|
||||
common.data.uri
|
||||
}
|
||||
img.attrs.alt =
|
||||
attribute alt {
|
||||
text
|
||||
}
|
||||
img.attrs.height =
|
||||
attribute height {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
img.attrs.width =
|
||||
attribute width {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
img.attrs.usemap =
|
||||
attribute usemap {
|
||||
common.data.hash-name
|
||||
}
|
||||
img.attrs.ismap =
|
||||
attribute ismap {
|
||||
w:string "ismap" | w:string ""
|
||||
}
|
||||
img.attrs.border =
|
||||
attribute border {
|
||||
common.data.zero
|
||||
}
|
||||
img.inner =
|
||||
empty
|
||||
|
||||
common.elem.phrasing |= img.elem
|
||||
|
||||
## Plug-ins: <embed>
|
||||
|
||||
embed.elem =
|
||||
element embed { embed.inner & embed.attrs }
|
||||
embed.attrs =
|
||||
( common.attrs
|
||||
& embed.attrs.src?
|
||||
& embed.attrs.type?
|
||||
& embed.attrs.height?
|
||||
& embed.attrs.width?
|
||||
& embed.attrs.other*
|
||||
)
|
||||
embed.attrs.src =
|
||||
attribute src {
|
||||
common.data.uri
|
||||
}
|
||||
embed.attrs.type =
|
||||
attribute type {
|
||||
common.data.mimetype
|
||||
}
|
||||
embed.attrs.height =
|
||||
attribute height {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
embed.attrs.width =
|
||||
attribute width {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
embed.attrs.other = # REVISIT common.attrs
|
||||
attribute local:* - ( src
|
||||
| type
|
||||
| height
|
||||
| width
|
||||
| id
|
||||
| class
|
||||
| title
|
||||
| dir
|
||||
| lang
|
||||
| style
|
||||
| tabindex
|
||||
| contextmenu
|
||||
| contenteditable
|
||||
| draggable
|
||||
| hidden
|
||||
| onabort
|
||||
| onblur
|
||||
| oncanplay
|
||||
| oncanplaythrough
|
||||
| onchange
|
||||
| onclick
|
||||
| oncontextmenu
|
||||
| ondblclick
|
||||
| ondrag
|
||||
| ondragend
|
||||
| ondragenter
|
||||
| ondragleave
|
||||
| ondragover
|
||||
| ondragstart
|
||||
| ondrop
|
||||
| ondurationchange
|
||||
| onemptied
|
||||
| onended
|
||||
| onerror
|
||||
| onfocus
|
||||
| onformchange
|
||||
| onforminput
|
||||
| oninput
|
||||
| oninvalid
|
||||
| onkeydown
|
||||
| onkeypress
|
||||
| onkeyup
|
||||
| onload
|
||||
| onloadeddata
|
||||
| onloadedmetadata
|
||||
| onloadstart
|
||||
| onmousedown
|
||||
| onmousemove
|
||||
| onmouseout
|
||||
| onmouseover
|
||||
| onmouseup
|
||||
| onmousewheel
|
||||
| onpause
|
||||
| onplay
|
||||
| onplaying
|
||||
| onprogress
|
||||
| onratechange
|
||||
| onreadystatechange
|
||||
| onscroll
|
||||
| onseeked
|
||||
| onseeking
|
||||
| onselect
|
||||
| onshow
|
||||
| onstalled
|
||||
| onsubmit
|
||||
| onsuspend
|
||||
| ontimeupdate
|
||||
| onvolumechange
|
||||
| onwaiting
|
||||
| onafterprint
|
||||
| onbeforeprint
|
||||
| onbeforeunload
|
||||
| onhashchange
|
||||
| onmessage
|
||||
| onoffline
|
||||
| ononline
|
||||
| onpopstate
|
||||
| onredo
|
||||
| onresize
|
||||
| onstorage
|
||||
| onundo
|
||||
| onunload
|
||||
| role
|
||||
| aria-atomic
|
||||
| aria-busy
|
||||
| aria-controls
|
||||
| aria-describedby
|
||||
| aria-disabled
|
||||
| aria-dropeffect
|
||||
| aria-flowto
|
||||
| aria-grabbed
|
||||
| aria-haspopup
|
||||
| aria-hidden
|
||||
| aria-invalid
|
||||
| aria-label
|
||||
| aria-labelledby
|
||||
| aria-live
|
||||
| aria-owns
|
||||
| aria-relevant
|
||||
| aria-required
|
||||
| spellcheck
|
||||
| accesskey
|
||||
| itemref
|
||||
| itemprop
|
||||
| itemscope
|
||||
| itemtype
|
||||
| itemid
|
||||
| name
|
||||
| align
|
||||
)
|
||||
{
|
||||
string
|
||||
}
|
||||
embed.inner =
|
||||
empty
|
||||
|
||||
common.elem.phrasing |= embed.elem
|
||||
|
||||
## Generic Objects: <object>
|
||||
|
||||
object.elem.flow =
|
||||
element object { object.inner.flow & object.attrs }
|
||||
object.elem.phrasing =
|
||||
element object { object.inner.phrasing & object.attrs }
|
||||
object.attrs =
|
||||
( common.attrs
|
||||
& ( ( object.attrs.data
|
||||
& object.attrs.type?
|
||||
)
|
||||
| object.attrs.type
|
||||
)
|
||||
# & object.attrs.classid?
|
||||
# & object.attrs.codebase?
|
||||
# & object.attrs.codetype?
|
||||
& object.attrs.height?
|
||||
& object.attrs.width?
|
||||
& object.attrs.usemap?
|
||||
& object.attrs.name?
|
||||
& common-form.attrs.form?
|
||||
& common.attrs.aria?
|
||||
)
|
||||
object.attrs.data =
|
||||
attribute data {
|
||||
common.data.uri
|
||||
}
|
||||
object.attrs.type =
|
||||
attribute type {
|
||||
common.data.mimetype
|
||||
}
|
||||
object.attrs.height =
|
||||
attribute height {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
object.attrs.width =
|
||||
attribute width {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
object.attrs.usemap =
|
||||
attribute usemap {
|
||||
common.data.hash-name
|
||||
}
|
||||
object.attrs.name =
|
||||
attribute name {
|
||||
common.data.browsing-context
|
||||
}
|
||||
object.inner.flow =
|
||||
( param.elem*
|
||||
, common.inner.flow
|
||||
)
|
||||
object.inner.phrasing =
|
||||
( param.elem*
|
||||
, common.inner.phrasing
|
||||
)
|
||||
|
||||
common.elem.flow |= object.elem.flow
|
||||
common.elem.phrasing |= object.elem.phrasing
|
||||
|
||||
## Initialization Parameters: <param>
|
||||
|
||||
param.elem =
|
||||
element param { param.inner & param.attrs }
|
||||
param.attrs =
|
||||
( common.attrs
|
||||
& param.attrs.name
|
||||
& param.attrs.value
|
||||
)
|
||||
param.attrs.name =
|
||||
attribute name {
|
||||
string
|
||||
}
|
||||
param.attrs.value =
|
||||
attribute value {
|
||||
string
|
||||
}
|
||||
param.inner =
|
||||
( empty )
|
||||
|
||||
## Inline Frame: <iframe>
|
||||
|
||||
iframe.elem =
|
||||
element iframe { iframe.inner & iframe.attrs }
|
||||
iframe.attrs =
|
||||
( common.attrs
|
||||
& iframe.attrs.src?
|
||||
& iframe.attrs.name?
|
||||
& iframe.attrs.width?
|
||||
& iframe.attrs.height?
|
||||
& iframe.attrs.sandbox?
|
||||
& iframe.attrs.seamless?
|
||||
& ( common.attrs.aria
|
||||
| common.attrs.aria.implicit.region
|
||||
)?
|
||||
)
|
||||
iframe.attrs.src =
|
||||
attribute src {
|
||||
common.data.uri
|
||||
}
|
||||
iframe.attrs.name =
|
||||
attribute name {
|
||||
common.data.browsing-context
|
||||
}
|
||||
iframe.attrs.height =
|
||||
attribute height {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
iframe.attrs.width =
|
||||
attribute width {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
iframe.attrs.seamless =
|
||||
attribute seamless {
|
||||
w:string "seamless" | w:string ""
|
||||
} & v5only
|
||||
iframe.attrs.sandbox =
|
||||
attribute sandbox
|
||||
{ list
|
||||
{ ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
}
|
||||
| list
|
||||
{ ( w:string "allow-scripts" )?
|
||||
, ( w:string "allow-forms" )?
|
||||
, ( w:string "allow-same-origin" )?
|
||||
, ( w:string "allow-top-navigation" )?
|
||||
}
|
||||
} & v5only
|
||||
iframe.inner =
|
||||
( text )
|
||||
|
||||
common.elem.phrasing |= iframe.elem
|
||||
|
||||
#######################################################################
|
||||
## Image Maps
|
||||
|
||||
## Map Definition: <map>
|
||||
|
||||
map.elem.flow =
|
||||
element map { map.inner.flow & map.attrs }
|
||||
map.elem.phrasing =
|
||||
element map { map.inner.phrasing & map.attrs }
|
||||
map.attrs =
|
||||
( common.attrs
|
||||
& map.attrs.name
|
||||
) # REVISIT make id required in Schematron
|
||||
map.attrs.name =
|
||||
attribute name {
|
||||
common.data.name
|
||||
}
|
||||
map.inner.flow =
|
||||
( common.inner.flow )
|
||||
map.inner.phrasing =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.flow |= map.elem.flow
|
||||
common.elem.phrasing |= map.elem.phrasing
|
||||
|
||||
## Map Area Definition: <area>
|
||||
|
||||
area.elem =
|
||||
element area { area.inner & area.attrs }
|
||||
area.attrs =
|
||||
( common.attrs
|
||||
& ( area.attrs.alt
|
||||
& shared-hyperlink.attrs.href
|
||||
)?
|
||||
& shared-hyperlink.attrs.target?
|
||||
& shared-hyperlink.attrs.ping?
|
||||
& shared-hyperlink.attrs.rel?
|
||||
& shared-hyperlink.attrs.media?
|
||||
& shared-hyperlink.attrs.hreflang?
|
||||
& shared-hyperlink.attrs.type?
|
||||
& area.attrs.shape?
|
||||
)
|
||||
area.attrs.alt =
|
||||
attribute alt {
|
||||
text
|
||||
}
|
||||
area.attrs.shape =
|
||||
( ( area.attrs.shape.rect? & area.attrs.coords.rect )
|
||||
| ( area.attrs.shape.circle & area.attrs.coords.circle )
|
||||
| ( area.attrs.shape.poly & area.attrs.coords.poly )
|
||||
| ( area.attrs.shape.default )
|
||||
)
|
||||
area.attrs.shape.rect =
|
||||
attribute shape {
|
||||
w:string "rect"
|
||||
}
|
||||
area.attrs.coords.rect =
|
||||
attribute coords {
|
||||
w:rectangle
|
||||
# xsd:token {
|
||||
# pattern = "-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+"
|
||||
# }
|
||||
}
|
||||
area.attrs.shape.circle =
|
||||
attribute shape {
|
||||
w:string "circle"
|
||||
}
|
||||
area.attrs.coords.circle =
|
||||
attribute coords {
|
||||
w:circle
|
||||
# xsd:token {
|
||||
# pattern = "-?[0-9]+,-?[0-9]+,[0-9]+"
|
||||
# }
|
||||
}
|
||||
area.attrs.shape.poly =
|
||||
attribute shape {
|
||||
w:string "poly"
|
||||
}
|
||||
area.attrs.coords.poly =
|
||||
attribute coords {
|
||||
w:polyline
|
||||
# xsd:token {
|
||||
# pattern = "-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+(,-?[0-9]+,-?[0-9]+)*"
|
||||
# }
|
||||
}
|
||||
area.attrs.shape.default =
|
||||
attribute shape {
|
||||
w:string "default"
|
||||
}
|
||||
area.inner =
|
||||
( empty )
|
||||
|
||||
common.elem.phrasing |= area.elem
|
||||
@@ -0,0 +1,52 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Datatypes related to forms #
|
||||
# #####################################################################
|
||||
|
||||
## MIME types
|
||||
|
||||
form.data.mimetypelist =
|
||||
w:mime-type-list
|
||||
|
||||
form.data.charsetlist =
|
||||
string # FIXME should be a "a space- and/or comma-delimited
|
||||
# list of charset values"
|
||||
|
||||
## ECMAScript Regular Expression
|
||||
|
||||
form.data.pattern =
|
||||
w:pattern
|
||||
|
||||
## Temporal
|
||||
|
||||
form.data.datetime-local =
|
||||
w:datetime-local
|
||||
|
||||
form.data.date =
|
||||
w:date
|
||||
|
||||
form.data.month =
|
||||
w:month
|
||||
|
||||
form.data.week =
|
||||
w:week
|
||||
|
||||
form.data.time =
|
||||
w:time
|
||||
|
||||
## Email
|
||||
|
||||
form.data.emailaddress =
|
||||
w:email-address
|
||||
|
||||
form.data.emailaddresslist =
|
||||
w:email-address-list
|
||||
|
||||
## Color
|
||||
|
||||
form.data.color =
|
||||
w:color
|
||||
# xsd:string {
|
||||
# pattern = "#[a-fA-F0-9]{6}"
|
||||
# }
|
||||
@@ -0,0 +1,56 @@
|
||||
default namespace = "http://www.w3.org/1999/xhtml/html5"
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5 #
|
||||
# #####################################################################
|
||||
|
||||
# To validate an HTML 5 document, you must first validate against #
|
||||
# this schema and then ALSO validate against assertions.sch #
|
||||
|
||||
## HTML flavor RELAX NG schemas can only be used after the #
|
||||
## document has been transformed to well-formed XML. #
|
||||
## - Insert closing slashes in all empty element tags #
|
||||
## - Insert all optional start and end tags #
|
||||
## - Add xmlns "http://www.w3.org/1999/xhtml" #
|
||||
## - Properly escape <script> and <style> CDATA #
|
||||
## - Parse and transform all HTML-only entities to numeric #
|
||||
## character references #
|
||||
## Obviously, syntax-checking involving these features cannot be #
|
||||
## done by the RELAX NG schema and must be checked, along with the #
|
||||
## <!DOCTYPE> requirement, by some other application. #
|
||||
|
||||
# #####################################################################
|
||||
## Schema Framework & Parameters
|
||||
|
||||
include "common.rnc" {
|
||||
# XHTML flavor #
|
||||
XMLonly = notAllowed
|
||||
HTMLonly = empty
|
||||
# HTML 4 compat #
|
||||
v5only = empty
|
||||
# HTML-serializability #
|
||||
nonHTMLizable = notAllowed
|
||||
# HTML-roundtrippability #
|
||||
nonRoundtrippable = notAllowed
|
||||
}
|
||||
|
||||
# #####################################################################
|
||||
## Language Definitions
|
||||
|
||||
start = html.elem
|
||||
|
||||
include "meta.rnc"
|
||||
include "phrase.rnc"
|
||||
include "block.rnc"
|
||||
include "sectional.rnc"
|
||||
include "structural.rnc"
|
||||
include "revision.rnc"
|
||||
include "embed.rnc"
|
||||
include "ruby.rnc"
|
||||
include "media.rnc"
|
||||
include "core-scripting.rnc"
|
||||
include "tables.rnc"
|
||||
include "form-datatypes.rnc"
|
||||
include "web-forms.rnc"
|
||||
include "web-forms2.rnc"
|
||||
include "applications.rnc"
|
||||
include "data.rnc"
|
||||
@@ -0,0 +1,63 @@
|
||||
default namespace = "http://www.w3.org/1999/xhtml"
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for (X)HTML 5: Exclusions #
|
||||
# #####################################################################
|
||||
|
||||
## This file is unmaintained. Please use assertions.sch instead.
|
||||
|
||||
# #####################################################################
|
||||
## Schema Framework & Parameters
|
||||
|
||||
start = normal.elem.all-inclusive
|
||||
|
||||
# #####################################################################
|
||||
## Normal Element Patterns
|
||||
|
||||
## Any attribute from any namespace
|
||||
|
||||
normal.attr.anything =
|
||||
attribute * { text }*
|
||||
|
||||
## Any element from any namespace except exceptional elements,
|
||||
## but allowing those elements as descendants
|
||||
|
||||
normal.elem.all =
|
||||
element * - (dfn) {
|
||||
normal.elem.all-inclusive
|
||||
}
|
||||
|
||||
## Any element from any namespace including exceptional elements
|
||||
|
||||
normal.elem.all-inclusive =
|
||||
wildcard.elem.exclude-all | dfn.elem.exclude-self
|
||||
|
||||
|
||||
# #####################################################################
|
||||
## Exclusion Element Patterns
|
||||
|
||||
# exclude all exceptional elements from the name classes;
|
||||
# list them explicitly in content models instead
|
||||
|
||||
normal.elem.exclude-dfn =
|
||||
element * - (dfn) {
|
||||
normal.elem.exclude-dfn
|
||||
}
|
||||
|
||||
dfn.elem.exclude-self =
|
||||
element dfn {
|
||||
( normal.attr.anything
|
||||
& normal.elem.exclude-dfn
|
||||
)
|
||||
}
|
||||
|
||||
# FIXME this part was cut off -- hsivonen
|
||||
wildcard.elem.exclude-all =
|
||||
notAllowed
|
||||
|
||||
#FIXME no nested forms in HTML-serializable docs
|
||||
|
||||
#FIXME no nested labels
|
||||
|
||||
#FIXME no blockquote inside header or footer
|
||||
|
||||
#FIXME exactly one hn in header
|
||||
@@ -0,0 +1,151 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Advanced Embedded Content #
|
||||
# #####################################################################
|
||||
|
||||
## Attributes Common to Media Elements
|
||||
|
||||
# src not included
|
||||
media.attrs =
|
||||
( media.attrs.autoplay?
|
||||
& media.attrs.preload?
|
||||
& media.attrs.controls?
|
||||
& media.attrs.loop?
|
||||
)
|
||||
media.attrs.autoplay =
|
||||
attribute autoplay {
|
||||
w:string "autoplay" | w:string ""
|
||||
}
|
||||
media.attrs.preload =
|
||||
attribute preload {
|
||||
w:string "none" | w:string "metadata" | w:string "auto" | w:string ""
|
||||
}
|
||||
media.attrs.controls =
|
||||
attribute controls {
|
||||
w:string "controls" | w:string ""
|
||||
}
|
||||
media.attrs.loop =
|
||||
attribute loop {
|
||||
w:string "loop" | w:string ""
|
||||
}
|
||||
|
||||
## Source: <source>
|
||||
|
||||
source.elem =
|
||||
element source { source.inner & source.attrs }
|
||||
source.attrs =
|
||||
( common.attrs
|
||||
& source.attrs.src
|
||||
& source.attrs.type?
|
||||
& source.attrs.media?
|
||||
)
|
||||
source.attrs.src =
|
||||
attribute src {
|
||||
common.data.uri
|
||||
}
|
||||
source.attrs.type =
|
||||
attribute type {
|
||||
common.data.mimetype
|
||||
}
|
||||
source.attrs.media =
|
||||
attribute media {
|
||||
common.data.mediaquery
|
||||
}
|
||||
source.inner =
|
||||
( empty )
|
||||
|
||||
## Media Source
|
||||
|
||||
media.source =
|
||||
( media.attrs.src
|
||||
| source.elem*
|
||||
)
|
||||
|
||||
media.attrs.src =
|
||||
attribute src {
|
||||
common.data.uri
|
||||
}
|
||||
|
||||
## Video: <video>
|
||||
|
||||
video.elem.flow =
|
||||
element video { video.inner.flow & video.attrs }
|
||||
video.elem.phrasing =
|
||||
element video { video.inner.phrasing & video.attrs }
|
||||
video.attrs =
|
||||
( common.attrs
|
||||
& media.attrs
|
||||
& video.attrs.poster?
|
||||
& video.attrs.height?
|
||||
& video.attrs.width?
|
||||
)
|
||||
video.attrs.poster =
|
||||
attribute poster {
|
||||
common.data.uri
|
||||
}
|
||||
video.attrs.height =
|
||||
attribute height {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
video.attrs.width =
|
||||
attribute width {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
video.inner.flow =
|
||||
( media.source
|
||||
, common.inner.flow
|
||||
)
|
||||
video.inner.phrasing =
|
||||
( media.source
|
||||
, common.inner.phrasing
|
||||
)
|
||||
|
||||
common.elem.flow |= video.elem.flow
|
||||
common.elem.phrasing |= video.elem.phrasing
|
||||
|
||||
## Audio: <audio>
|
||||
|
||||
audio.elem.flow =
|
||||
element audio { audio.inner.flow & audio.attrs }
|
||||
audio.elem.phrasing =
|
||||
element audio { audio.inner.phrasing & audio.attrs }
|
||||
audio.attrs =
|
||||
( common.attrs
|
||||
& media.attrs
|
||||
)
|
||||
audio.inner.flow =
|
||||
( media.source
|
||||
, common.inner.flow
|
||||
)
|
||||
audio.inner.phrasing =
|
||||
( media.source
|
||||
, common.inner.phrasing
|
||||
)
|
||||
|
||||
common.elem.flow |= audio.elem.flow
|
||||
common.elem.phrasing |= audio.elem.phrasing
|
||||
|
||||
## Captioned Content: <figure>
|
||||
|
||||
figure.elem =
|
||||
element figure { figure.inner & figure.attrs }
|
||||
figure.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria.implicit.img?
|
||||
)
|
||||
figure.inner =
|
||||
( ( figcaption.elem, common.inner.flow )
|
||||
| ( common.inner.flow, figcaption.elem? )
|
||||
)
|
||||
|
||||
common.elem.flow |= figure.elem
|
||||
|
||||
## Figure caption: <figcaption>
|
||||
|
||||
figcaption.elem =
|
||||
element figcaption { figcaption.inner & figcaption.attrs }
|
||||
figcaption.attrs =
|
||||
( common.attrs )
|
||||
figcaption.inner =
|
||||
( common.inner.flow )
|
||||
@@ -0,0 +1,331 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Global Structure & Metadata #
|
||||
# #####################################################################
|
||||
|
||||
## Root Element: <html>
|
||||
|
||||
html.elem =
|
||||
element html { html.inner & html.attrs }
|
||||
html.attrs =
|
||||
( common.attrs )
|
||||
html.inner =
|
||||
( head.elem
|
||||
, body.elem
|
||||
)
|
||||
|
||||
## Metadata Container: <head>
|
||||
|
||||
head.elem =
|
||||
element head { head.inner & head.attrs }
|
||||
head.attrs =
|
||||
( common.attrs
|
||||
# & head.attrs.profile?
|
||||
)
|
||||
# head.attrs.profile =
|
||||
# attribute profile {
|
||||
# common.data.uris #REVISIT should these be absolute (zero or more)
|
||||
# }
|
||||
head.inner =
|
||||
( title.elem
|
||||
& base.elem? # REVISIT need a non-schema checker or Schematron
|
||||
& common.inner.metadata # Limit encoding decl position in Schematron
|
||||
)
|
||||
# head.inner =
|
||||
# ( meta.elem.encoding?
|
||||
# , ( title.elem
|
||||
# & base.elem? # REVISIT need a non-schema checker or Schematron
|
||||
# & common.inner.metadata
|
||||
# )
|
||||
# )
|
||||
|
||||
## Content Container: <body>
|
||||
|
||||
body.elem =
|
||||
element body { body.inner & body.attrs }
|
||||
body.attrs =
|
||||
( common.attrs
|
||||
& ( common.attrs.aria.landmark.application
|
||||
| common.attrs.aria.landmark.document
|
||||
| common.attrs.aria.implicit.structure
|
||||
)?
|
||||
& body.attrs.onafterprint?
|
||||
& body.attrs.onbeforeprint?
|
||||
& body.attrs.onbeforeunload?
|
||||
& body.attrs.onhashchange?
|
||||
& body.attrs.onmessage?
|
||||
& body.attrs.onoffline?
|
||||
& body.attrs.ononline?
|
||||
& body.attrs.onpopstate?
|
||||
& body.attrs.onredo?
|
||||
& body.attrs.onresize?
|
||||
& body.attrs.onstorage?
|
||||
& body.attrs.onundo?
|
||||
& body.attrs.onunload?
|
||||
)
|
||||
body.inner =
|
||||
( common.inner.flow )
|
||||
|
||||
body.attrs.onafterprint =
|
||||
attribute onafterprint { string }
|
||||
body.attrs.onbeforeprint =
|
||||
attribute onbeforeprint { string }
|
||||
body.attrs.onbeforeunload =
|
||||
attribute onbeforeunload { string }
|
||||
body.attrs.onhashchange =
|
||||
attribute onhashchange { string }
|
||||
body.attrs.onmessage =
|
||||
attribute onmessage { string }
|
||||
body.attrs.onoffline =
|
||||
attribute onoffline { string }
|
||||
body.attrs.ononline =
|
||||
attribute ononline { string }
|
||||
body.attrs.onpopstate =
|
||||
attribute onpopstate { string }
|
||||
body.attrs.onredo =
|
||||
attribute onredo { string }
|
||||
body.attrs.onresize =
|
||||
attribute onresize { string }
|
||||
body.attrs.onstorage =
|
||||
attribute onstorage { string }
|
||||
body.attrs.onundo =
|
||||
attribute onundo { string }
|
||||
body.attrs.onunload =
|
||||
attribute onunload { string }
|
||||
|
||||
## Document Title: <title>
|
||||
|
||||
title.elem =
|
||||
element title { title.inner & title.attrs }
|
||||
title.attrs =
|
||||
( common.attrs )
|
||||
title.inner =
|
||||
( text )
|
||||
|
||||
## Base URI: <base>
|
||||
|
||||
base.elem =
|
||||
element base { base.inner & base.attrs }
|
||||
base.attrs =
|
||||
( common.attrs
|
||||
& ( ( base.attrs.href
|
||||
& base.attrs.target?
|
||||
)
|
||||
| base.attrs.target
|
||||
)
|
||||
)
|
||||
base.attrs.href =
|
||||
attribute href {
|
||||
common.data.uri
|
||||
}
|
||||
base.attrs.target =
|
||||
attribute target {
|
||||
common.data.browsing-context-or-keyword
|
||||
}
|
||||
base.inner =
|
||||
( empty )
|
||||
|
||||
## Global Relationships: <link>
|
||||
|
||||
link.elem =
|
||||
element link { link.inner & link.attrs }
|
||||
link.attrs =
|
||||
( common.attrs
|
||||
& shared-hyperlink.attrs.href
|
||||
& shared-hyperlink.attrs.rel
|
||||
& shared-hyperlink.attrs.hreflang?
|
||||
& shared-hyperlink.attrs.media?
|
||||
& shared-hyperlink.attrs.type?
|
||||
& link.attrs.sizes?
|
||||
# link.attrs.title included in common.attrs
|
||||
)
|
||||
link.attrs.sizes =
|
||||
attribute sizes {
|
||||
w:string "any" | common.data.sizes
|
||||
}
|
||||
link.inner =
|
||||
( empty )
|
||||
|
||||
common.elem.metadata |= link.elem
|
||||
|
||||
## Global Style: <style>
|
||||
|
||||
style.elem =
|
||||
element style { style.inner & style.attrs }
|
||||
style.attrs =
|
||||
( common.attrs
|
||||
& style.attrs.type?
|
||||
& style.attrs.media?
|
||||
# style.attrs.title included in common.attrs
|
||||
)
|
||||
style.attrs.type =
|
||||
attribute type {
|
||||
common.data.mimetype
|
||||
}
|
||||
style.attrs.media =
|
||||
attribute media {
|
||||
common.data.mediaquery
|
||||
}
|
||||
style.inner =
|
||||
( common.inner.anything )
|
||||
|
||||
common.elem.metadata |= style.elem
|
||||
|
||||
## Scoped Style: <style scoped>
|
||||
|
||||
style.elem.scoped =
|
||||
element style { style.inner & style.scoped.attrs }
|
||||
style.scoped.attrs =
|
||||
( common.attrs
|
||||
& style.attrs.type?
|
||||
& style.attrs.media?
|
||||
& style.attrs.scoped
|
||||
# style.attrs.title included in common.attrs
|
||||
)
|
||||
style.attrs.scoped =
|
||||
attribute scoped {
|
||||
w:string "scoped" | w:string ""
|
||||
}
|
||||
|
||||
## Name-Value Metadata: <meta name>
|
||||
|
||||
meta.name.elem =
|
||||
element meta { meta.inner & meta.name.attrs }
|
||||
meta.name.attrs =
|
||||
( common.attrs.basic
|
||||
& common.attrs.i18n
|
||||
& common.attrs.present
|
||||
& common.attrs.other
|
||||
& meta.name.attrs.name
|
||||
& meta.name.attrs.content
|
||||
)
|
||||
meta.name.attrs.name =
|
||||
attribute name {
|
||||
string
|
||||
}
|
||||
meta.name.attrs.content =
|
||||
attribute content {
|
||||
string
|
||||
}
|
||||
meta.inner =
|
||||
( empty )
|
||||
|
||||
common.elem.metadata |= meta.name.elem
|
||||
|
||||
## "refresh" pragma directive: <meta http-equiv='refresh'>
|
||||
|
||||
meta.http-equiv.refresh.elem =
|
||||
element meta { meta.inner & meta.http-equiv.refresh.attrs }
|
||||
meta.http-equiv.refresh.attrs =
|
||||
( common.attrs.basic
|
||||
& common.attrs.i18n
|
||||
& common.attrs.present
|
||||
& common.attrs.other
|
||||
& meta.http-equiv.attrs.http-equiv.refresh
|
||||
& meta.http-equiv.attrs.content.refresh
|
||||
)
|
||||
meta.http-equiv.attrs.http-equiv.refresh =
|
||||
attribute http-equiv {
|
||||
w:string "refresh"
|
||||
}
|
||||
meta.http-equiv.attrs.content.refresh =
|
||||
attribute content {
|
||||
common.data.refresh
|
||||
}
|
||||
common.elem.metadata |= meta.http-equiv.refresh.elem # not quite right per spec
|
||||
# if the definition is
|
||||
# reused in another language
|
||||
|
||||
## "default-style" pragma directive: <meta http-equiv='default-style'>
|
||||
|
||||
meta.http-equiv.default-style.elem =
|
||||
element meta { meta.inner & meta.http-equiv.default-style.attrs }
|
||||
meta.http-equiv.default-style.attrs =
|
||||
( common.attrs.basic
|
||||
& common.attrs.i18n
|
||||
& common.attrs.present
|
||||
& common.attrs.other
|
||||
& meta.http-equiv.attrs.http-equiv.default-style
|
||||
& meta.http-equiv.attrs.content.default-style
|
||||
)
|
||||
meta.http-equiv.attrs.http-equiv.default-style =
|
||||
attribute http-equiv {
|
||||
w:string "default-style"
|
||||
}
|
||||
meta.http-equiv.attrs.content.default-style =
|
||||
attribute content {
|
||||
common.data.default-style
|
||||
}
|
||||
|
||||
common.elem.metadata |= meta.http-equiv.default-style.elem # not quite right per spec
|
||||
# if the definition is
|
||||
# reused in another language
|
||||
|
||||
## "content-language" pragma directive: <meta http-equiv='content-language'> (obsolete)
|
||||
|
||||
meta.http-equiv.content-language.elem =
|
||||
element meta { meta.inner & meta.http-equiv.content-language.attrs }
|
||||
meta.http-equiv.content-language.attrs =
|
||||
( common.attrs.basic
|
||||
& common.attrs.i18n
|
||||
& common.attrs.present
|
||||
& common.attrs.other
|
||||
& meta.http-equiv.attrs.http-equiv.content-language
|
||||
& meta.http-equiv.attrs.content.content-language
|
||||
)
|
||||
meta.http-equiv.attrs.http-equiv.content-language =
|
||||
attribute http-equiv {
|
||||
w:string "content-language"
|
||||
}
|
||||
meta.http-equiv.attrs.content.content-language =
|
||||
attribute content {
|
||||
common.data.langcode
|
||||
}
|
||||
|
||||
common.elem.metadata |= meta.http-equiv.content-language.elem # not quite right per spec
|
||||
# if the definition is
|
||||
# reused in another language
|
||||
|
||||
## Inline Character Encoding Statement for HTML: <meta charset>
|
||||
|
||||
meta.charset.elem =
|
||||
element meta { meta.inner & meta.charset.attrs }
|
||||
meta.charset.attrs =
|
||||
( common.attrs.basic
|
||||
& common.attrs.i18n
|
||||
& common.attrs.present
|
||||
& common.attrs.other
|
||||
& meta.charset.attrs.charset
|
||||
)
|
||||
meta.charset.attrs.charset =
|
||||
attribute charset {
|
||||
(common.data.charset & HTMLonly)
|
||||
| (xsd:string {
|
||||
pattern = "[uU][tT][fF]-8"
|
||||
} & XMLonly )
|
||||
}
|
||||
|
||||
## Inline Character Encoding Statement for HTML: <meta http-equiv='content-type'>
|
||||
|
||||
meta.http-equiv.content-type.elem =
|
||||
element meta { meta.inner & meta.http-equiv.content-type.attrs }
|
||||
& HTMLonly
|
||||
meta.http-equiv.content-type.attrs =
|
||||
( common.attrs.basic
|
||||
& common.attrs.i18n
|
||||
& common.attrs.present
|
||||
& common.attrs.other
|
||||
& meta.http-equiv.attrs.http-equiv.content-type
|
||||
& meta.http-equiv.attrs.content.content-type
|
||||
)
|
||||
meta.http-equiv.attrs.http-equiv.content-type =
|
||||
attribute http-equiv {
|
||||
w:string "content-type"
|
||||
}
|
||||
meta.http-equiv.attrs.content.content-type =
|
||||
attribute content {
|
||||
common.data.meta-charset
|
||||
}
|
||||
|
||||
common.elem.metadata |= ( meta.charset.elem | meta.http-equiv.content-type.elem )
|
||||
@@ -0,0 +1,80 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Microdata #
|
||||
# #####################################################################
|
||||
|
||||
common.attrs.microdata =
|
||||
( common.attrs.microdata.itemref?
|
||||
& common.attrs.microdata.itemprop?
|
||||
& common.attrs.microdata.itemscope?
|
||||
& common.attrs.microdata.itemtype?
|
||||
& common.attrs.microdata.itemid?
|
||||
)
|
||||
common.attrs.microdata.itemref =
|
||||
attribute itemref {
|
||||
common.data.idrefs
|
||||
}
|
||||
common.attrs.microdata.itemprop =
|
||||
attribute itemprop {
|
||||
common.data.microdata-identifier
|
||||
}
|
||||
common.attrs.microdata.itemscope =
|
||||
attribute itemscope {
|
||||
w:string "itemscope" | w:string ""
|
||||
}
|
||||
common.attrs.microdata.itemtype =
|
||||
attribute itemtype {
|
||||
common.data.uri
|
||||
}
|
||||
common.attrs.microdata.itemid =
|
||||
attribute itemid {
|
||||
common.data.uri
|
||||
}
|
||||
|
||||
common.attrs &= common.attrs.microdata
|
||||
|
||||
link.elem.phrasing =
|
||||
element link { link.inner & link.phrasing.attrs }
|
||||
link.phrasing.attrs =
|
||||
( common.attrs.basic
|
||||
& common.attrs.i18n
|
||||
& common.attrs.present
|
||||
& common.attrs.other
|
||||
& common.attrs.microdata.itemprop
|
||||
& common.attrs.microdata.itemref?
|
||||
& common.attrs.microdata.itemscope?
|
||||
& common.attrs.microdata.itemtype?
|
||||
& common.attrs.microdata.itemid?
|
||||
& shared-hyperlink.attrs.href
|
||||
& shared-hyperlink.attrs.rel
|
||||
& shared-hyperlink.attrs.hreflang?
|
||||
& shared-hyperlink.attrs.media?
|
||||
& shared-hyperlink.attrs.type?
|
||||
& link.attrs.sizes?
|
||||
# link.attrs.title included in common.attrs
|
||||
)
|
||||
common.elem.phrasing |= link.elem.phrasing
|
||||
|
||||
## Property Metadata: <meta itemprop>
|
||||
|
||||
meta.itemprop.elem =
|
||||
element meta { meta.inner & meta.itemprop.attrs }
|
||||
meta.itemprop.attrs =
|
||||
( common.attrs.basic
|
||||
& common.attrs.i18n
|
||||
& common.attrs.present
|
||||
& common.attrs.other
|
||||
& common.attrs.microdata.itemprop
|
||||
& common.attrs.microdata.itemref?
|
||||
& common.attrs.microdata.itemscope?
|
||||
& common.attrs.microdata.itemtype?
|
||||
& common.attrs.microdata.itemid?
|
||||
& meta.itemprop.attrs.content
|
||||
)
|
||||
meta.itemprop.attrs.content =
|
||||
attribute content {
|
||||
string
|
||||
}
|
||||
common.elem.metadata |= meta.itemprop.elem
|
||||
common.elem.phrasing |= meta.itemprop.elem
|
||||
@@ -0,0 +1,324 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Phrase Markup #
|
||||
# #####################################################################
|
||||
|
||||
## Contextual Hyperlink: <a>
|
||||
|
||||
a.elem.phrasing =
|
||||
element a { a.inner.phrasing & a.attrs }
|
||||
a.elem.flow =
|
||||
element a { a.inner.flow & a.attrs }
|
||||
a.attrs =
|
||||
( common.attrs
|
||||
& a.attrs.name?
|
||||
& shared-hyperlink.attrs.href?
|
||||
& shared-hyperlink.attrs.target?
|
||||
& shared-hyperlink.attrs.rel?
|
||||
& shared-hyperlink.attrs.hreflang?
|
||||
& shared-hyperlink.attrs.media?
|
||||
& shared-hyperlink.attrs.type?
|
||||
& shared-hyperlink.attrs.ping?
|
||||
& ( common.attrs.aria
|
||||
| common.attrs.aria.implicit.link
|
||||
)?
|
||||
)
|
||||
a.attrs.name =
|
||||
attribute name {
|
||||
common.data.id # XXX not what the spec says
|
||||
}
|
||||
a.inner.phrasing =
|
||||
( common.inner.phrasing )
|
||||
a.inner.flow =
|
||||
( common.inner.flow )
|
||||
|
||||
common.elem.phrasing |= a.elem.phrasing
|
||||
common.elem.flow |= a.elem.flow
|
||||
|
||||
## Shared hyperlink attributes
|
||||
|
||||
shared-hyperlink.attrs.href =
|
||||
attribute href {
|
||||
common.data.uri
|
||||
}
|
||||
shared-hyperlink.attrs.target =
|
||||
attribute target {
|
||||
common.data.browsing-context-or-keyword
|
||||
}
|
||||
shared-hyperlink.attrs.rel =
|
||||
attribute rel {
|
||||
common.data.tokens
|
||||
}
|
||||
shared-hyperlink.attrs.hreflang =
|
||||
attribute hreflang {
|
||||
common.data.langcode
|
||||
}
|
||||
shared-hyperlink.attrs.media =
|
||||
attribute media {
|
||||
common.data.mediaquery
|
||||
}
|
||||
shared-hyperlink.attrs.type =
|
||||
attribute type {
|
||||
common.data.mimetype
|
||||
}
|
||||
shared-hyperlink.attrs.ping =
|
||||
attribute ping {
|
||||
common.data.uris
|
||||
} & v5only
|
||||
|
||||
## Emphatic Stress: <em>
|
||||
|
||||
em.elem =
|
||||
element em { em.inner & em.attrs }
|
||||
em.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
em.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= em.elem
|
||||
|
||||
## Strong Importance: <strong>
|
||||
|
||||
strong.elem =
|
||||
element strong { strong.inner & strong.attrs }
|
||||
strong.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
strong.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= strong.elem
|
||||
|
||||
## Small Print and Side Comments: <small>
|
||||
|
||||
small.elem =
|
||||
element small { small.inner & small.attrs }
|
||||
small.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
small.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= small.elem
|
||||
|
||||
## Marked (Highlighted) Text: <mark>
|
||||
|
||||
mark.elem =
|
||||
element mark { mark.inner & mark.attrs }
|
||||
& v5only
|
||||
mark.attrs =
|
||||
( common.attrs )
|
||||
mark.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= mark.elem
|
||||
|
||||
## Abbreviation: <abbr>
|
||||
|
||||
abbr.elem =
|
||||
element abbr { abbr.inner & abbr.attrs }
|
||||
abbr.attrs =
|
||||
( common.attrs
|
||||
# abbr.attrs.title included in common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
abbr.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= abbr.elem
|
||||
|
||||
## Defining Instance: <dfn>
|
||||
|
||||
dfn.elem =
|
||||
element dfn { dfn.inner & dfn.attrs }
|
||||
dfn.attrs =
|
||||
( common.attrs
|
||||
# dfn.attrs.title included in common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
dfn.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= dfn.elem
|
||||
|
||||
## Italic: <i>
|
||||
|
||||
i.elem =
|
||||
element i { i.inner & i.attrs }
|
||||
i.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
i.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= i.elem
|
||||
|
||||
## Bold: <b>
|
||||
|
||||
b.elem =
|
||||
element b { b.inner & b.attrs }
|
||||
b.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
b.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= b.elem
|
||||
|
||||
## Code Fragment: <code>
|
||||
|
||||
code.elem =
|
||||
element code { code.inner & code.attrs }
|
||||
code.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
code.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= code.elem
|
||||
|
||||
## Variable or Placeholder: <var>
|
||||
|
||||
var.elem =
|
||||
element var { var.inner & var.attrs }
|
||||
var.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
var.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= var.elem
|
||||
|
||||
## (Sample) Output: <samp>
|
||||
|
||||
samp.elem =
|
||||
element samp { samp.inner & samp.attrs }
|
||||
samp.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
samp.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= samp.elem
|
||||
|
||||
## User Input: <kbd>
|
||||
|
||||
kbd.elem =
|
||||
element kbd { kbd.inner & kbd.attrs }
|
||||
kbd.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
kbd.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= kbd.elem
|
||||
|
||||
## Superscript: <sup>
|
||||
|
||||
sup.elem =
|
||||
element sup { sup.inner & sup.attrs }
|
||||
sup.attrs =
|
||||
( common.attrs )
|
||||
sup.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= sup.elem
|
||||
|
||||
## Subscript: <sub>
|
||||
|
||||
sub.elem =
|
||||
element sub { sub.inner & sub.attrs }
|
||||
sub.attrs =
|
||||
( common.attrs )
|
||||
sub.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= sub.elem
|
||||
|
||||
## Quotation: <q>
|
||||
|
||||
q.elem =
|
||||
element q { q.inner & q.attrs }
|
||||
q.attrs =
|
||||
( common.attrs
|
||||
& q.attrs.cite?
|
||||
& common.attrs.aria?
|
||||
)
|
||||
q.attrs.cite =
|
||||
attribute cite {
|
||||
common.data.uri
|
||||
}
|
||||
q.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= q.elem
|
||||
|
||||
## Title of Work: <cite>
|
||||
|
||||
cite.elem =
|
||||
element cite { cite.inner & cite.attrs }
|
||||
cite.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
cite.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= cite.elem
|
||||
|
||||
## Generic Span: <span>
|
||||
|
||||
span.elem =
|
||||
element span { span.inner & span.attrs }
|
||||
span.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
span.inner =
|
||||
( common.inner.phrasing ) # REVISIT allow ol and ul?
|
||||
|
||||
common.elem.phrasing |= span.elem
|
||||
|
||||
## Bidirectional Override: <bdo>
|
||||
|
||||
bdo.elem =
|
||||
element bdo { bdo.inner & bdo.attrs }
|
||||
bdo.attrs =
|
||||
( common.attrs ) # dir required in Schematron
|
||||
bdo.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= bdo.elem
|
||||
|
||||
## Line Break: <br>
|
||||
|
||||
br.elem =
|
||||
element br { br.inner & br.attrs }
|
||||
br.attrs =
|
||||
( common.attrs )
|
||||
br.inner =
|
||||
( empty )
|
||||
|
||||
common.elem.phrasing |= br.elem
|
||||
|
||||
## Line-break opportunity: <wbr>
|
||||
|
||||
wbr.elem =
|
||||
element wbr { wbr.inner & wbr.attrs }
|
||||
wbr.attrs =
|
||||
( common.attrs )
|
||||
wbr.inner =
|
||||
( empty )
|
||||
|
||||
common.elem.phrasing |= wbr.elem
|
||||
@@ -0,0 +1,52 @@
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Revision Annotations #
|
||||
# #####################################################################
|
||||
|
||||
## Common Attributes
|
||||
|
||||
edit.attrs.cite =
|
||||
attribute cite {
|
||||
common.data.uri
|
||||
}
|
||||
edit.attrs.datetime =
|
||||
attribute datetime {
|
||||
common.data.datetime
|
||||
}
|
||||
|
||||
## Inserts: <ins>
|
||||
|
||||
ins.elem.flow =
|
||||
element ins { ins.inner.flow & ins.attrs }
|
||||
ins.elem.phrasing =
|
||||
element ins { ins.inner.phrasing & ins.attrs }
|
||||
ins.attrs =
|
||||
( common.attrs
|
||||
& edit.attrs.cite?
|
||||
& edit.attrs.datetime?
|
||||
)
|
||||
ins.inner.flow =
|
||||
( common.inner.flow )
|
||||
ins.inner.phrasing =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.flow |= ins.elem.flow
|
||||
common.elem.phrasing |= ins.elem.phrasing
|
||||
|
||||
## Deletions: <del>
|
||||
|
||||
del.elem.flow =
|
||||
element del { del.inner.flow & del.attrs }
|
||||
del.elem.phrasing =
|
||||
element del { del.inner.phrasing & del.attrs }
|
||||
del.attrs =
|
||||
( common.attrs
|
||||
& edit.attrs.cite?
|
||||
& edit.attrs.datetime?
|
||||
)
|
||||
del.inner.flow =
|
||||
( common.inner.flow )
|
||||
del.inner.phrasing =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.flow |= del.elem.flow
|
||||
common.elem.phrasing |= del.elem.phrasing
|
||||
@@ -0,0 +1,51 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
namespace local = ""
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Ruby #
|
||||
# #####################################################################
|
||||
|
||||
#######################################################################
|
||||
|
||||
## Ruby Annotation: <ruby>
|
||||
|
||||
ruby.elem =
|
||||
element ruby { ruby.inner & ruby.attrs }
|
||||
ruby.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
ruby.inner =
|
||||
( ( common.inner.phrasing
|
||||
, ( rt.elem
|
||||
| ( rp.elem
|
||||
, rt.elem
|
||||
, rp.elem
|
||||
)
|
||||
)
|
||||
)+
|
||||
)
|
||||
|
||||
common.elem.phrasing |= ruby.elem
|
||||
|
||||
## Ruby Text: <rt>
|
||||
|
||||
rt.elem =
|
||||
element rt { rt.inner & rt.attrs }
|
||||
rt.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
rt.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
## Ruby Parenthesis: <rp>
|
||||
|
||||
rp.elem =
|
||||
element rp { rp.inner & rp.attrs }
|
||||
rp.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
rp.inner =
|
||||
( common.inner.phrasing )
|
||||
@@ -0,0 +1,140 @@
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Sectioning Markup #
|
||||
# #####################################################################
|
||||
|
||||
# #####################################################################
|
||||
## Headings
|
||||
|
||||
## Heading (Rank 1): <h1>
|
||||
|
||||
h1.elem =
|
||||
element h1 { h1.inner & h1.attrs }
|
||||
h1.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria.implicit.structure?
|
||||
)
|
||||
h1.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.flow |= h1.elem
|
||||
|
||||
## Heading (Rank 2): <h2>
|
||||
|
||||
h2.elem =
|
||||
element h2 { h2.inner & h2.attrs }
|
||||
h2.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria.implicit.structure?
|
||||
)
|
||||
h2.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.flow |= h2.elem
|
||||
|
||||
## Heading (Rank 3): <h3>
|
||||
|
||||
h3.elem =
|
||||
element h3 { h3.inner & h3.attrs }
|
||||
h3.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria.implicit.structure?
|
||||
)
|
||||
h3.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.flow |= h3.elem
|
||||
|
||||
## Heading (Rank 4): <h4>
|
||||
|
||||
h4.elem =
|
||||
element h4 { h4.inner & h4.attrs }
|
||||
h4.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria.implicit.structure?
|
||||
)
|
||||
h4.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.flow |= h4.elem
|
||||
|
||||
## Heading (Rank 5): <h5>
|
||||
|
||||
h5.elem =
|
||||
element h5 { h5.inner & h5.attrs }
|
||||
h5.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria.implicit.structure?
|
||||
)
|
||||
h5.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.flow |= h5.elem
|
||||
|
||||
## Heading (Rank 6): <h6>
|
||||
|
||||
h6.elem =
|
||||
element h6 { h6.inner & h6.attrs }
|
||||
h6.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria.implicit.structure?
|
||||
)
|
||||
h6.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.flow |= h6.elem
|
||||
|
||||
## Heading Group: <hgroup>
|
||||
|
||||
hgroup.elem =
|
||||
element hgroup { hgroup.inner & hgroup.attrs }
|
||||
hgroup.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria.implicit.structure?
|
||||
)
|
||||
hgroup.inner =
|
||||
( h1.elem
|
||||
| h2.elem
|
||||
| h3.elem
|
||||
| h4.elem
|
||||
| h5.elem
|
||||
| h6.elem
|
||||
)+
|
||||
|
||||
common.elem.flow |= hgroup.elem
|
||||
|
||||
# #####################################################################
|
||||
## Section Meta
|
||||
|
||||
## Contact Info: <address>
|
||||
|
||||
address.elem =
|
||||
element address { address.inner & address.attrs }
|
||||
address.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria.implicit.region?
|
||||
)
|
||||
address.inner =
|
||||
( common.inner.flow )
|
||||
|
||||
common.elem.flow |= address.elem
|
||||
|
||||
# #####################################################################
|
||||
## Quotations
|
||||
|
||||
## Block Quotes: <blockquote>
|
||||
|
||||
blockquote.elem =
|
||||
element blockquote { blockquote.inner & blockquote.attrs }
|
||||
blockquote.attrs =
|
||||
( common.attrs
|
||||
& blockquote.attrs.cite?
|
||||
& common.attrs.aria?
|
||||
)
|
||||
blockquote.attrs.cite =
|
||||
attribute cite {
|
||||
common.data.uri
|
||||
}
|
||||
blockquote.inner =
|
||||
( common.inner.flow )
|
||||
|
||||
common.elem.flow |= blockquote.elem
|
||||
@@ -0,0 +1,105 @@
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Block Markup Added in HTML5 #
|
||||
# #####################################################################
|
||||
|
||||
## Section: <section>
|
||||
|
||||
section.elem =
|
||||
element section { section.inner & section.attrs }
|
||||
section.attrs =
|
||||
( common.attrs
|
||||
& ( common.attrs.aria
|
||||
| common.attrs.aria.implicit.region
|
||||
)?
|
||||
)
|
||||
section.inner =
|
||||
( style.elem.scoped*
|
||||
, common.inner.flow
|
||||
)
|
||||
|
||||
common.elem.flow |= section.elem
|
||||
|
||||
## Navigational Links: <nav>
|
||||
|
||||
nav.elem =
|
||||
element nav { nav.inner & nav.attrs }
|
||||
nav.attrs =
|
||||
( common.attrs
|
||||
& ( common.attrs.aria.implicit.region
|
||||
| common.attrs.aria.landmark.navigation
|
||||
)?
|
||||
)
|
||||
nav.inner =
|
||||
( common.inner.flow )
|
||||
|
||||
common.elem.flow |= nav.elem
|
||||
|
||||
## Article: <article>
|
||||
|
||||
article.elem =
|
||||
element article { article.inner & article.attrs }
|
||||
article.attrs =
|
||||
( common.attrs
|
||||
& ( common.attrs.aria.implicit.region
|
||||
| common.attrs.aria.landmark.article
|
||||
| common.attrs.aria.landmark.main
|
||||
| common.attrs.aria.landmark.document
|
||||
| common.attrs.aria.landmark.application
|
||||
)?
|
||||
)
|
||||
article.inner =
|
||||
( style.elem*
|
||||
, common.inner.flow
|
||||
)
|
||||
|
||||
common.elem.flow |= article.elem
|
||||
|
||||
## Tangential Aside: <aside>
|
||||
|
||||
aside.elem =
|
||||
element aside { aside.inner & aside.attrs }
|
||||
aside.attrs =
|
||||
( common.attrs
|
||||
& ( common.attrs.aria.implicit.region
|
||||
| common.attrs.aria.landmark.complementary
|
||||
| common.attrs.aria.landmark.search
|
||||
| common.attrs.aria.landmark.note
|
||||
)?
|
||||
)
|
||||
aside.inner =
|
||||
( style.elem*
|
||||
, common.inner.flow
|
||||
)
|
||||
|
||||
common.elem.flow |= aside.elem
|
||||
|
||||
## Header: <header>
|
||||
|
||||
header.elem =
|
||||
element header { header.inner & header.attrs }
|
||||
header.attrs =
|
||||
( common.attrs
|
||||
& ( common.attrs.aria.implicit.region
|
||||
| common.attrs.aria.landmark.banner
|
||||
)?
|
||||
)
|
||||
header.inner =
|
||||
( common.inner.flow )
|
||||
|
||||
common.elem.flow |= header.elem
|
||||
|
||||
## Footer: <footer>
|
||||
|
||||
footer.elem =
|
||||
element footer { footer.inner & footer.attrs }
|
||||
footer.attrs =
|
||||
( common.attrs
|
||||
& ( common.attrs.aria.implicit.region
|
||||
| common.attrs.aria.landmark.contentinfo
|
||||
)?
|
||||
)
|
||||
footer.inner =
|
||||
( common.inner.flow )
|
||||
|
||||
common.elem.flow |= footer.elem
|
||||
|
||||
@@ -0,0 +1,224 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Tables #
|
||||
# #####################################################################
|
||||
|
||||
# #####################################################################
|
||||
## Table Envelope
|
||||
|
||||
## Table Datatypes
|
||||
|
||||
# tables.data.multilen =
|
||||
# ( common.data.integer.positive
|
||||
# | common.data.percent
|
||||
# | xsd:token { pattern = "[0-9]+\*" } #REVISIT should this one be string?
|
||||
# )
|
||||
|
||||
## Table Alignment Attributes
|
||||
|
||||
tables.attrs.alignment =
|
||||
( tables.attrs.align?
|
||||
& tables.attrs.char?
|
||||
& tables.attrs.valign?
|
||||
)
|
||||
tables.attrs.align =
|
||||
attribute align {
|
||||
( w:string "left"
|
||||
| w:string "center"
|
||||
| w:string "right"
|
||||
| w:string "justify"
|
||||
| w:string "char"
|
||||
)
|
||||
}
|
||||
tables.attrs.char =
|
||||
attribute char {
|
||||
xsd:string { pattern = "." }
|
||||
}
|
||||
tables.attrs.valign =
|
||||
attribute valign {
|
||||
( w:string "top"
|
||||
| w:string "middle"
|
||||
| w:string "bottom"
|
||||
| w:string "baseline"
|
||||
)
|
||||
}
|
||||
|
||||
## Data Table: <table>
|
||||
|
||||
table.elem =
|
||||
element table { table.inner & table.attrs }
|
||||
table.attrs =
|
||||
( common.attrs
|
||||
& table.attrs.summary? # obsolete
|
||||
& common.attrs.aria?
|
||||
)
|
||||
table.attrs.summary =
|
||||
attribute summary {
|
||||
string
|
||||
}
|
||||
table.inner =
|
||||
( caption.elem?
|
||||
, colgroup.elem*
|
||||
, thead.elem?
|
||||
, ( ( tfoot.elem
|
||||
, ( tbody.elem* | tr.elem+ )
|
||||
)
|
||||
| ( ( tbody.elem* | tr.elem+ )
|
||||
, tfoot.elem?
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
common.elem.flow |= table.elem
|
||||
|
||||
## Table Caption: <caption>
|
||||
|
||||
caption.elem =
|
||||
element caption { caption.inner & caption.attrs }
|
||||
caption.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria.implicit.region?
|
||||
)
|
||||
caption.inner =
|
||||
( common.inner.flow )
|
||||
|
||||
# #####################################################################
|
||||
## Table Super Structure
|
||||
|
||||
## Table Column Group: <colgroup>
|
||||
|
||||
colgroup.elem =
|
||||
element colgroup { colgroup.inner & colgroup.attrs }
|
||||
colgroup.attrs =
|
||||
( common.attrs )
|
||||
colgroup.attrs.span =
|
||||
attribute span {
|
||||
common.data.integer.positive
|
||||
}
|
||||
colgroup.inner =
|
||||
( col.elem*
|
||||
| colgroup.attrs.span?
|
||||
)
|
||||
|
||||
## Table Column: <col>
|
||||
|
||||
col.elem =
|
||||
element col { col.inner & col.attrs }
|
||||
col.attrs =
|
||||
( common.attrs
|
||||
& col.attrs.span?
|
||||
)
|
||||
col.attrs.span =
|
||||
attribute span {
|
||||
common.data.integer.positive
|
||||
}
|
||||
col.inner =
|
||||
( empty )
|
||||
|
||||
## Table Header Row Group
|
||||
|
||||
thead.elem =
|
||||
element thead { thead.inner & thead.attrs }
|
||||
thead.attrs =
|
||||
( common.attrs )
|
||||
thead.inner =
|
||||
( tr.elem* )
|
||||
|
||||
## Table Footer Row Group
|
||||
|
||||
tfoot.elem =
|
||||
element tfoot { tfoot.inner & tfoot.attrs }
|
||||
tfoot.attrs =
|
||||
( common.attrs )
|
||||
tfoot.inner =
|
||||
( tr.elem* )
|
||||
|
||||
## Table Row Group
|
||||
|
||||
tbody.elem =
|
||||
element tbody { tbody.inner & tbody.attrs }
|
||||
tbody.attrs =
|
||||
( common.attrs )
|
||||
tbody.inner =
|
||||
( tr.elem* )
|
||||
|
||||
# #####################################################################
|
||||
## Cell Structure
|
||||
|
||||
## Table Row
|
||||
|
||||
tr.elem =
|
||||
element tr { tr.inner & tr.attrs }
|
||||
tr.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria?
|
||||
)
|
||||
tr.inner =
|
||||
( ( td.elem | th.elem )* )
|
||||
|
||||
## Common Table Cell Attributes
|
||||
|
||||
tables.attrs.cell-structure =
|
||||
( tables.attrs.colspan?
|
||||
& tables.attrs.rowspan?
|
||||
)
|
||||
tables.attrs.colspan =
|
||||
attribute colspan {
|
||||
common.data.integer.positive
|
||||
}
|
||||
tables.attrs.rowspan =
|
||||
attribute rowspan {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
|
||||
tables.attrs.access-headers =
|
||||
( tables.attrs.headers? )
|
||||
tables.attrs.headers =
|
||||
attribute headers {
|
||||
common.data.idrefs
|
||||
}
|
||||
|
||||
tables.attrs.define-headers =
|
||||
( tables.attrs.scope? )
|
||||
tables.attrs.scope =
|
||||
attribute scope {
|
||||
( w:string "row"
|
||||
| w:string "col"
|
||||
| w:string "rowgroup"
|
||||
| w:string "colgroup"
|
||||
)
|
||||
}
|
||||
tables.attrs.abbr =
|
||||
attribute abbr {
|
||||
text
|
||||
}
|
||||
|
||||
## Table Data Cell: <td>
|
||||
|
||||
td.elem =
|
||||
element td { td.inner & td.attrs }
|
||||
td.attrs =
|
||||
( common.attrs
|
||||
& tables.attrs.cell-structure
|
||||
& tables.attrs.headers?
|
||||
# & tables.attrs.alignment
|
||||
& common.attrs.aria?
|
||||
)
|
||||
td.inner =
|
||||
( common.inner.flow )
|
||||
|
||||
## Table Header Cells: <th>
|
||||
|
||||
th.elem =
|
||||
element th { th.inner & th.attrs }
|
||||
th.attrs =
|
||||
( common.attrs
|
||||
& tables.attrs.cell-structure
|
||||
& tables.attrs.scope?
|
||||
& tables.attrs.headers?
|
||||
# & tables.attrs.alignment
|
||||
& common.attrs.aria.implicit.th?
|
||||
)
|
||||
th.inner =
|
||||
( common.inner.phrasing )
|
||||
@@ -0,0 +1,27 @@
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Web Forms 1.0 Scripting #
|
||||
# #####################################################################
|
||||
|
||||
scripting.attr.form.select =
|
||||
attribute onselect { string }
|
||||
scripting.attr.form.change =
|
||||
attribute onchange { string }
|
||||
|
||||
# input.text.attrs &=
|
||||
# ( scripting.attr.form.select?
|
||||
# )
|
||||
|
||||
# shared-form.attrs &=
|
||||
# ( scripting.attr.form.change?
|
||||
# )
|
||||
|
||||
# form.attrs &=
|
||||
# ( scripting.attr.form.reset?
|
||||
# & scripting.attr.form.submit?
|
||||
# )
|
||||
scripting.attr.form.submit =
|
||||
attribute onsubmit { string }
|
||||
scripting.attr.form.reset =
|
||||
attribute onreset { string }
|
||||
|
||||
|
||||
@@ -0,0 +1,536 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Web Forms 1.0 markup #
|
||||
# #####################################################################
|
||||
|
||||
## Shared attributes for form controls
|
||||
|
||||
common-form.attrs =
|
||||
( common-form.attrs.name?
|
||||
& common-form.attrs.disabled?
|
||||
)
|
||||
|
||||
common-form.attrs.name =
|
||||
attribute name {
|
||||
string #REVISIT should this be restricted somehow? No & and = perhaps?
|
||||
}
|
||||
|
||||
common-form.attrs.disabled =
|
||||
attribute disabled {
|
||||
w:string "disabled" | w:string ""
|
||||
}
|
||||
|
||||
shared-form.attrs.readonly =
|
||||
attribute readonly {
|
||||
w:string "readonly" | w:string ""
|
||||
}
|
||||
|
||||
shared-form.attrs.maxlength =
|
||||
attribute maxlength {
|
||||
common.data.integer.positive #REVISIT should this be non-negative?
|
||||
}
|
||||
|
||||
shared-form.attrs.size =
|
||||
attribute size {
|
||||
common.data.integer.positive
|
||||
}
|
||||
|
||||
# REVISIT tabindex goes in common.attrs
|
||||
|
||||
## Shared attributes for <input>
|
||||
|
||||
input.attrs.checked =
|
||||
attribute checked {
|
||||
w:string "checked" | w:string ""
|
||||
}
|
||||
|
||||
## Text Field: <input type='text'>
|
||||
|
||||
input.text.elem =
|
||||
element input { input.text.attrs }
|
||||
input.text.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.text.attrs.type?
|
||||
& shared-form.attrs.maxlength?
|
||||
& shared-form.attrs.readonly?
|
||||
& shared-form.attrs.size?
|
||||
& input.text.attrs.value?
|
||||
& ( common.attrs.aria
|
||||
| common.attrs.aria.implicit.input
|
||||
)?
|
||||
)
|
||||
input.text.attrs.type =
|
||||
attribute type {
|
||||
w:string "text"
|
||||
}
|
||||
input.text.attrs.value =
|
||||
attribute value {
|
||||
string #REVISIT "nominally" free of line breaks?
|
||||
}
|
||||
|
||||
input.elem = input.text.elem
|
||||
|
||||
## Password Field: <input type='password'>
|
||||
|
||||
input.password.elem =
|
||||
element input { input.password.attrs }
|
||||
input.password.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.password.attrs.type
|
||||
& shared-form.attrs.maxlength?
|
||||
& shared-form.attrs.readonly?
|
||||
& shared-form.attrs.size?
|
||||
& input.password.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.password.attrs.type =
|
||||
attribute type {
|
||||
w:string "password"
|
||||
}
|
||||
input.password.attrs.value =
|
||||
attribute value {
|
||||
string #REVISIT "nominally" free of line breaks?
|
||||
}
|
||||
|
||||
input.elem |= input.password.elem
|
||||
|
||||
## Checkbox: <input type='checkbox'>
|
||||
|
||||
input.checkbox.elem =
|
||||
element input { input.checkbox.attrs }
|
||||
input.checkbox.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.checkbox.attrs.type
|
||||
& input.attrs.checked?
|
||||
& input.checkbox.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.checkbox.attrs.type =
|
||||
attribute type {
|
||||
w:string "checkbox"
|
||||
}
|
||||
input.checkbox.attrs.value =
|
||||
attribute value {
|
||||
string #REVISIT require non-empty value?
|
||||
}
|
||||
|
||||
input.elem |= input.checkbox.elem
|
||||
|
||||
## Radiobutton: <input type='radio'>
|
||||
|
||||
input.radio.elem =
|
||||
element input { input.radio.attrs }
|
||||
input.radio.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.radio.attrs.type
|
||||
& input.attrs.checked?
|
||||
& input.radio.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.radio.attrs.type =
|
||||
attribute type {
|
||||
w:string "radio"
|
||||
}
|
||||
input.radio.attrs.value =
|
||||
attribute value {
|
||||
string #REVISIT require non-empty value?
|
||||
}
|
||||
|
||||
input.elem |= input.radio.elem
|
||||
|
||||
## Scripting Hook Button: <input type='button'>
|
||||
|
||||
input.button.elem =
|
||||
element input { input.button.attrs }
|
||||
input.button.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.button.attrs.type
|
||||
& input.button.attrs.value?
|
||||
& ( common.attrs.aria
|
||||
| common.attrs.aria.implicit.button
|
||||
)?
|
||||
)
|
||||
input.button.attrs.type =
|
||||
attribute type {
|
||||
w:string "button"
|
||||
}
|
||||
input.button.attrs.value =
|
||||
attribute value {
|
||||
string #REVISIT require non-empty value?
|
||||
}
|
||||
|
||||
input.elem |= input.button.elem
|
||||
#REVISIT should this be enabled by a scripting module only?
|
||||
|
||||
## Submit Button: <input type='submit'>
|
||||
|
||||
input.submit.elem =
|
||||
element input { input.submit.attrs }
|
||||
input.submit.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.submit.attrs.type
|
||||
& input.submit.attrs.value?
|
||||
& common.attrs.aria.implicit.button?
|
||||
)
|
||||
input.submit.attrs.type =
|
||||
attribute type {
|
||||
w:string "submit"
|
||||
}
|
||||
input.submit.attrs.value =
|
||||
attribute value {
|
||||
string #REVISIT require non-empty value?
|
||||
}
|
||||
|
||||
input.elem |= input.submit.elem
|
||||
|
||||
## Reset Button: <input type='reset'>
|
||||
|
||||
input.reset.elem =
|
||||
element input { input.reset.attrs }
|
||||
input.reset.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.reset.attrs.type
|
||||
& input.reset.attrs.value?
|
||||
& common.attrs.aria.implicit.button?
|
||||
)
|
||||
input.reset.attrs.type =
|
||||
attribute type {
|
||||
w:string "reset"
|
||||
}
|
||||
input.reset.attrs.value =
|
||||
attribute value {
|
||||
string #REVISIT require non-empty value?
|
||||
}
|
||||
|
||||
input.elem |= input.reset.elem
|
||||
# REVISIT does reset make sense outside a form?
|
||||
|
||||
## File Upload: <input type='file'>
|
||||
|
||||
input.file.elem =
|
||||
element input { input.file.attrs }
|
||||
input.file.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.file.attrs.type
|
||||
& input.file.attrs.accept?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.file.attrs.type =
|
||||
attribute type {
|
||||
w:string "file"
|
||||
}
|
||||
input.file.attrs.accept =
|
||||
attribute accept {
|
||||
form.data.mimetypelist
|
||||
}
|
||||
|
||||
input.elem |= input.file.elem
|
||||
|
||||
## Hidden String: <input type='hidden'>
|
||||
|
||||
input.hidden.elem =
|
||||
element input { input.hidden.attrs }
|
||||
input.hidden.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.hidden.attrs.type
|
||||
& input.hidden.attrs.value?
|
||||
)
|
||||
input.hidden.attrs.type =
|
||||
attribute type {
|
||||
w:string "hidden"
|
||||
}
|
||||
input.hidden.attrs.value =
|
||||
attribute value {
|
||||
string
|
||||
}
|
||||
|
||||
input.elem |= input.hidden.elem
|
||||
|
||||
## Image Submit Button: <input type='image'>
|
||||
|
||||
input.image.elem =
|
||||
element input { input.image.attrs }
|
||||
input.image.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.image.attrs.type
|
||||
& input.image.attrs.alt
|
||||
& input.image.attrs.src?
|
||||
& ( common.attrs.aria
|
||||
| common.attrs.aria.implicit.button
|
||||
)?
|
||||
)
|
||||
input.image.attrs.type =
|
||||
attribute type {
|
||||
w:string "image"
|
||||
}
|
||||
input.image.attrs.alt =
|
||||
attribute alt {
|
||||
string # XXX non-empty
|
||||
}
|
||||
input.image.attrs.src =
|
||||
attribute src {
|
||||
common.data.uri
|
||||
}
|
||||
|
||||
input.elem |= input.image.elem
|
||||
|
||||
common.elem.phrasing |= input.elem
|
||||
|
||||
## Text Area: <textarea>
|
||||
|
||||
textarea.elem =
|
||||
element textarea { textarea.inner & textarea.attrs }
|
||||
textarea.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& shared-form.attrs.readonly?
|
||||
& textarea.attrs.rows-and-cols-wf1
|
||||
& common.attrs.aria.implicit.input?
|
||||
#FIXME onfocus, onblur, onselect,onchange
|
||||
)
|
||||
# This is ugly.
|
||||
textarea.attrs.rows-and-cols-wf1 =
|
||||
textarea.attrs.rows-and-cols-wf1.inner
|
||||
textarea.attrs.rows-and-cols-wf1.inner =
|
||||
( textarea.attrs.cols
|
||||
& textarea.attrs.rows
|
||||
)
|
||||
textarea.attrs.cols =
|
||||
attribute cols {
|
||||
common.data.integer.positive
|
||||
}
|
||||
textarea.attrs.rows =
|
||||
attribute rows {
|
||||
common.data.integer.positive
|
||||
}
|
||||
textarea.inner =
|
||||
( text )
|
||||
|
||||
common.elem.phrasing |= textarea.elem
|
||||
|
||||
# Due to limitations with interleave, handling single/multiple selection
|
||||
# enforcement in RELAX NG seems to be possible but really awkward.
|
||||
# Tried it. Leaving it to Schematron.
|
||||
|
||||
## Select menu option: <option selected>
|
||||
|
||||
option.elem =
|
||||
element option { option.inner & option.attrs }
|
||||
option.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs.disabled?
|
||||
& option.attrs.selected?
|
||||
& option.attrs.label?
|
||||
& option.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
option.attrs.selected =
|
||||
attribute selected {
|
||||
w:string "selected" | w:string ""
|
||||
}
|
||||
option.attrs.label =
|
||||
attribute label {
|
||||
string
|
||||
}
|
||||
option.attrs.value =
|
||||
attribute value {
|
||||
string
|
||||
}
|
||||
option.inner =
|
||||
( text )
|
||||
|
||||
## Option Group: <optgroup>
|
||||
|
||||
optgroup.elem =
|
||||
element optgroup { optgroup.inner & optgroup.attrs }
|
||||
optgroup.attrs =
|
||||
( common.attrs
|
||||
& optgroup.attrs.label
|
||||
& common-form.attrs.disabled?
|
||||
)
|
||||
optgroup.attrs.label =
|
||||
attribute label {
|
||||
string
|
||||
}
|
||||
optgroup.inner =
|
||||
( option.elem* )
|
||||
|
||||
## Selection Menu: <select>
|
||||
|
||||
select.elem =
|
||||
element select { select.inner & select.attrs }
|
||||
select.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& select.attrs.size?
|
||||
& select.attrs.multiple?
|
||||
# FIXME onfocus, onblur, onchange
|
||||
)
|
||||
select.attrs.size =
|
||||
attribute size {
|
||||
common.data.integer.positive
|
||||
}
|
||||
select.attrs.multiple =
|
||||
attribute multiple {
|
||||
w:string "multiple" | w:string ""
|
||||
}
|
||||
select.inner =
|
||||
( optgroup.elem*
|
||||
& option.elem*
|
||||
)
|
||||
|
||||
common.elem.phrasing |= select.elem
|
||||
|
||||
## Shared Definitions for Complex Button
|
||||
|
||||
button.attrs.value =
|
||||
attribute value {
|
||||
string
|
||||
}
|
||||
button.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
## Complex Submit Button: <button type='submit'>
|
||||
|
||||
button.submit.elem =
|
||||
element button { button.inner & button.submit.attrs }
|
||||
button.submit.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& button.submit.attrs.type?
|
||||
& button.attrs.value?
|
||||
& common.attrs.aria.implicit.button?
|
||||
)
|
||||
button.submit.attrs.type =
|
||||
attribute type {
|
||||
w:string "submit"
|
||||
}
|
||||
|
||||
button.elem = button.submit.elem
|
||||
|
||||
## Complex Reset Button: <button type='reset'>
|
||||
|
||||
button.reset.elem =
|
||||
element button { button.inner & button.reset.attrs }
|
||||
button.reset.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& button.reset.attrs.type
|
||||
& button.attrs.value? #REVISIT I guess this still affects the DOM
|
||||
& common.attrs.aria.implicit.button?
|
||||
)
|
||||
button.reset.attrs.type =
|
||||
attribute type {
|
||||
w:string "reset"
|
||||
}
|
||||
|
||||
button.elem |= button.reset.elem
|
||||
|
||||
## Complex Push Button: <button type='button'>
|
||||
|
||||
button.button.elem =
|
||||
element button { button.inner & button.button.attrs }
|
||||
button.button.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& button.button.attrs.type
|
||||
& button.attrs.value? #REVISIT I guess this still affects the DOM
|
||||
& ( common.attrs.aria
|
||||
| common.attrs.aria.implicit.button
|
||||
)?
|
||||
)
|
||||
button.button.attrs.type =
|
||||
attribute type {
|
||||
w:string "button"
|
||||
}
|
||||
|
||||
button.elem |= button.button.elem
|
||||
|
||||
common.elem.phrasing |= button.elem
|
||||
|
||||
## Form: <form>
|
||||
|
||||
form.elem =
|
||||
element form { form.inner & form.attrs }
|
||||
form.attrs =
|
||||
( common.attrs
|
||||
& form.attrs.action? #REVISIT Should this be required anyway?
|
||||
& form.attrs.method?
|
||||
& form.attrs.enctype?
|
||||
& common-form.attrs.name?
|
||||
& form.attrs.accept-charset?
|
||||
& ( common.attrs.aria
|
||||
| common.attrs.aria.implicit.region
|
||||
)?
|
||||
)
|
||||
form.attrs.action =
|
||||
attribute action {
|
||||
common.data.uri
|
||||
}
|
||||
form.attrs.method =
|
||||
attribute method {
|
||||
form.attrs.method.data
|
||||
}
|
||||
form.attrs.method.data =
|
||||
( w:string "get" | w:string "post" )
|
||||
form.attrs.enctype =
|
||||
attribute enctype {
|
||||
form.attrs.enctype.data
|
||||
}
|
||||
form.attrs.enctype.data =
|
||||
( w:string "application/x-www-form-urlencoded"
|
||||
| w:string "multipart/form-data"
|
||||
)
|
||||
form.attrs.accept-charset =
|
||||
attribute accept-charset {
|
||||
form.data.charsetlist
|
||||
}
|
||||
form.inner =
|
||||
( common.inner.flow )
|
||||
|
||||
common.elem.flow |= form.elem
|
||||
|
||||
## Fieldset: <fieldset>
|
||||
|
||||
fieldset.elem =
|
||||
element fieldset { fieldset.inner & fieldset.attrs }
|
||||
fieldset.attrs =
|
||||
( common.attrs
|
||||
& common.attrs.aria.implicit.group?
|
||||
)
|
||||
fieldset.inner =
|
||||
( legend.elem? #REVISIT should this be required?
|
||||
, common.inner.flow
|
||||
)
|
||||
|
||||
common.elem.flow |= fieldset.elem
|
||||
|
||||
## Label: <label>
|
||||
|
||||
label.elem =
|
||||
element label { label.inner & label.attrs }
|
||||
label.attrs =
|
||||
( common.attrs
|
||||
& label.attrs.for?
|
||||
& common.attrs.aria.implicit.region?
|
||||
)
|
||||
label.attrs.for =
|
||||
attribute for {
|
||||
common.data.idref
|
||||
}
|
||||
label.inner =
|
||||
( common.inner.phrasing ) #REVISIT making obvious guess
|
||||
|
||||
common.elem.phrasing |= label.elem
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Web Forms 2.0 Scripting #
|
||||
# #####################################################################
|
||||
|
||||
scripting.attr.form.formchange =
|
||||
attribute onformchange { string }
|
||||
|
||||
scripting.attr.form.forminput =
|
||||
attribute onforminput { string }
|
||||
|
||||
# output.attrs &=
|
||||
# ( scripting.attr.form.formchange?
|
||||
# & scripting.attr.form.forminput?
|
||||
# & scripting.attr.form.change?
|
||||
# )
|
||||
@@ -0,0 +1,790 @@
|
||||
datatypes w = "http://whattf.org/datatype-draft"
|
||||
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for HTML 5: Web Forms 2.0 markup #
|
||||
# #####################################################################
|
||||
|
||||
## Shared attributes for form controls
|
||||
|
||||
common-form.attrs &=
|
||||
( common-form.attrs.form? )
|
||||
|
||||
common-form.attrs.form |=
|
||||
attribute form {
|
||||
common.data.idref
|
||||
}
|
||||
|
||||
shared-form.attrs.formaction =
|
||||
attribute formaction {
|
||||
common.data.uri
|
||||
}
|
||||
|
||||
shared-form.attrs.formenctype =
|
||||
attribute formenctype {
|
||||
shared-form.attrs.formenctype.data
|
||||
}
|
||||
shared-form.attrs.formenctype.data =
|
||||
( w:string "application/x-www-form-urlencoded"
|
||||
| w:string "multipart/form-data"
|
||||
| w:string "text/plain"
|
||||
)
|
||||
|
||||
shared-form.attrs.formmethod =
|
||||
attribute formmethod {
|
||||
shared-form.attrs.formmethod.data
|
||||
}
|
||||
shared-form.attrs.formmethod.data =
|
||||
( w:string "get"
|
||||
| w:string "post"
|
||||
| w:string "put"
|
||||
| w:string "delete"
|
||||
)
|
||||
|
||||
shared-form.attrs.formtarget =
|
||||
attribute formtarget {
|
||||
common.data.browsing-context-or-keyword
|
||||
}
|
||||
|
||||
shared-form.attrs.formnovalidate =
|
||||
attribute formnovalidate {
|
||||
w:string "formnovalidate" | w:string ""
|
||||
}
|
||||
|
||||
shared-form.attrs.autofocus =
|
||||
attribute autofocus {
|
||||
w:string "autofocus" | w:string ""
|
||||
}
|
||||
|
||||
shared-form.attrs.pattern =
|
||||
attribute pattern {
|
||||
form.data.pattern
|
||||
}
|
||||
|
||||
shared-form.attrs.template =
|
||||
attribute template {
|
||||
common.data.idref
|
||||
}
|
||||
|
||||
shared-form.attrs.required =
|
||||
attribute required {
|
||||
w:string "required" | w:string ""
|
||||
}
|
||||
|
||||
shared-form.attrs.placeholder =
|
||||
attribute placeholder {
|
||||
string # FIXME line breaks
|
||||
}
|
||||
|
||||
## Shared attributes for <input>
|
||||
|
||||
input.attrs.autocomplete =
|
||||
attribute autocomplete {
|
||||
w:string "on" | w:string "off"
|
||||
}
|
||||
|
||||
input.attrs.list =
|
||||
attribute list {
|
||||
common.data.idref
|
||||
}
|
||||
|
||||
input.attrs.step.float =
|
||||
attribute step {
|
||||
w:string "any" | common.data.float.positive
|
||||
}
|
||||
|
||||
input.attrs.step.integer =
|
||||
attribute step {
|
||||
w:string "any" | common.data.integer.positive
|
||||
}
|
||||
|
||||
input.attrs.multiple =
|
||||
attribute multiple {
|
||||
w:string "multiple" | w:string ""
|
||||
}
|
||||
|
||||
## Text Field: <input type='text'>, Extensions
|
||||
|
||||
input.text.attrs &=
|
||||
( input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& shared-form.attrs.pattern?
|
||||
& shared-form.attrs.required?
|
||||
& shared-form.attrs.placeholder?
|
||||
)
|
||||
|
||||
## Password Field: <input type='password'>, Extensions
|
||||
|
||||
input.password.attrs &=
|
||||
( input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& shared-form.attrs.pattern?
|
||||
& shared-form.attrs.required?
|
||||
& shared-form.attrs.placeholder?
|
||||
)
|
||||
|
||||
## Checkbox <input type='checkbox'>, Extensions
|
||||
|
||||
input.checkbox.attrs &=
|
||||
( shared-form.attrs.autofocus?
|
||||
& shared-form.attrs.required?
|
||||
)
|
||||
|
||||
## Radiobutton: <input type='radio'>, Extensions
|
||||
|
||||
input.radio.attrs &=
|
||||
( shared-form.attrs.autofocus?
|
||||
& shared-form.attrs.required?
|
||||
)
|
||||
|
||||
## Scripting Hook Button: <input type='button'>, Extensions
|
||||
|
||||
input.button.attrs &=
|
||||
( shared-form.attrs.autofocus? )
|
||||
|
||||
## Submit Button: <input type='submit'>, Extensions
|
||||
|
||||
input.submit.attrs &=
|
||||
( shared-form.attrs.formaction?
|
||||
& shared-form.attrs.autofocus?
|
||||
& shared-form.attrs.formenctype?
|
||||
& shared-form.attrs.formmethod?
|
||||
& shared-form.attrs.formtarget?
|
||||
& shared-form.attrs.formnovalidate?
|
||||
)
|
||||
|
||||
## Reset Button: <input type='reset'>, Extensions
|
||||
|
||||
input.reset.attrs &=
|
||||
( shared-form.attrs.autofocus? )
|
||||
|
||||
## File Upload: <input type='file'>, Extensions
|
||||
|
||||
input.file.attrs &=
|
||||
( shared-form.attrs.autofocus?
|
||||
& shared-form.attrs.required?
|
||||
& input.attrs.multiple?
|
||||
)
|
||||
|
||||
## Image Submit Button: <input type='image'>, Extensions
|
||||
|
||||
input.image.attrs &=
|
||||
( shared-form.attrs.formaction?
|
||||
& shared-form.attrs.autofocus?
|
||||
& shared-form.attrs.formenctype?
|
||||
& shared-form.attrs.formmethod?
|
||||
& shared-form.attrs.formtarget?
|
||||
& shared-form.attrs.formnovalidate?
|
||||
& input.image.attrs.height?
|
||||
& input.image.attrs.width?
|
||||
)
|
||||
input.image.attrs.height =
|
||||
attribute height {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
input.image.attrs.width =
|
||||
attribute width {
|
||||
common.data.integer.non-negative
|
||||
}
|
||||
|
||||
## Global Date and Time: <input type='datetime'>
|
||||
|
||||
input.datetime.elem =
|
||||
element input { input.datetime.attrs }
|
||||
input.datetime.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.datetime.attrs.type
|
||||
& input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& input.datetime.attrs.min?
|
||||
& input.datetime.attrs.max?
|
||||
& input.attrs.step.float?
|
||||
& shared-form.attrs.readonly?
|
||||
& shared-form.attrs.required?
|
||||
& input.datetime.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.datetime.attrs.type =
|
||||
attribute type {
|
||||
w:string "datetime"
|
||||
}
|
||||
input.datetime.attrs.min =
|
||||
attribute min {
|
||||
common.data.datetime
|
||||
}
|
||||
input.datetime.attrs.max =
|
||||
attribute max {
|
||||
common.data.datetime
|
||||
}
|
||||
input.datetime.attrs.value =
|
||||
attribute value {
|
||||
common.data.datetime
|
||||
}
|
||||
|
||||
input.elem |= input.datetime.elem
|
||||
|
||||
## Date and Time with No Time Zone Information: <input type='datetime-local'>
|
||||
|
||||
input.datetime-local.elem =
|
||||
element input { input.datetime-local.attrs }
|
||||
input.datetime-local.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.datetime-local.attrs.type
|
||||
& input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& input.datetime-local.attrs.min?
|
||||
& input.datetime-local.attrs.max?
|
||||
& input.attrs.step.float?
|
||||
& shared-form.attrs.readonly?
|
||||
& shared-form.attrs.required?
|
||||
& input.datetime-local.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.datetime-local.attrs.type =
|
||||
attribute type {
|
||||
w:string "datetime-local"
|
||||
}
|
||||
input.datetime-local.attrs.min =
|
||||
attribute min {
|
||||
form.data.datetime-local
|
||||
}
|
||||
input.datetime-local.attrs.max =
|
||||
attribute max {
|
||||
form.data.datetime-local
|
||||
}
|
||||
input.datetime-local.attrs.value =
|
||||
attribute value {
|
||||
form.data.datetime-local
|
||||
}
|
||||
|
||||
input.elem |= input.datetime-local.elem
|
||||
|
||||
## Date: <input type='date'>
|
||||
|
||||
input.date.elem =
|
||||
element input { input.date.attrs }
|
||||
input.date.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.date.attrs.type
|
||||
& input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& input.date.attrs.min?
|
||||
& input.date.attrs.max?
|
||||
& input.attrs.step.integer?
|
||||
& shared-form.attrs.readonly?
|
||||
& shared-form.attrs.required?
|
||||
& input.date.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.date.attrs.type =
|
||||
attribute type {
|
||||
w:string "date"
|
||||
}
|
||||
input.date.attrs.min =
|
||||
attribute min {
|
||||
form.data.date
|
||||
}
|
||||
input.date.attrs.max =
|
||||
attribute max {
|
||||
form.data.date
|
||||
}
|
||||
input.date.attrs.value =
|
||||
attribute value {
|
||||
form.data.date
|
||||
}
|
||||
|
||||
input.elem |= input.date.elem
|
||||
|
||||
## Year and Month: <input type='month'>
|
||||
|
||||
input.month.elem =
|
||||
element input { input.month.attrs }
|
||||
input.month.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.month.attrs.type
|
||||
& input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& input.month.attrs.min?
|
||||
& input.month.attrs.max?
|
||||
& input.attrs.step.integer?
|
||||
& shared-form.attrs.readonly?
|
||||
& shared-form.attrs.required?
|
||||
& input.month.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.month.attrs.type =
|
||||
attribute type {
|
||||
w:string "month"
|
||||
}
|
||||
input.month.attrs.min =
|
||||
attribute min {
|
||||
form.data.month
|
||||
}
|
||||
input.month.attrs.max =
|
||||
attribute max {
|
||||
form.data.month
|
||||
}
|
||||
input.month.attrs.value =
|
||||
attribute value {
|
||||
form.data.month
|
||||
}
|
||||
|
||||
input.elem |= input.month.elem
|
||||
|
||||
## Time without Time Zone Information: <input type='time'>
|
||||
|
||||
input.time.elem =
|
||||
element input { input.time.attrs }
|
||||
input.time.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.time.attrs.type
|
||||
& input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& input.time.attrs.min?
|
||||
& input.time.attrs.max?
|
||||
& input.attrs.step.float?
|
||||
& shared-form.attrs.readonly?
|
||||
& shared-form.attrs.required?
|
||||
& input.time.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.time.attrs.type =
|
||||
attribute type {
|
||||
w:string "time"
|
||||
}
|
||||
input.time.attrs.min =
|
||||
attribute min {
|
||||
form.data.time
|
||||
}
|
||||
input.time.attrs.max =
|
||||
attribute max {
|
||||
form.data.time
|
||||
}
|
||||
input.time.attrs.value =
|
||||
attribute value {
|
||||
form.data.time
|
||||
}
|
||||
|
||||
input.elem |= input.time.elem
|
||||
|
||||
## Year and Week: <input type='week'>
|
||||
|
||||
input.week.elem =
|
||||
element input { input.week.attrs }
|
||||
input.week.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.week.attrs.type
|
||||
& input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& input.week.attrs.min?
|
||||
& input.week.attrs.max?
|
||||
& input.attrs.step.integer?
|
||||
& shared-form.attrs.readonly?
|
||||
& shared-form.attrs.required?
|
||||
& input.week.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.week.attrs.type =
|
||||
attribute type {
|
||||
w:string "week"
|
||||
}
|
||||
input.week.attrs.min =
|
||||
attribute min {
|
||||
form.data.week
|
||||
}
|
||||
input.week.attrs.max =
|
||||
attribute max {
|
||||
form.data.week
|
||||
}
|
||||
input.week.attrs.value =
|
||||
attribute value {
|
||||
form.data.week
|
||||
}
|
||||
|
||||
input.elem |= input.week.elem
|
||||
|
||||
## Number: <input type='number'>
|
||||
|
||||
input.number.elem =
|
||||
element input { input.number.attrs }
|
||||
input.number.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.number.attrs.type
|
||||
& input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& input.number.attrs.min?
|
||||
& input.number.attrs.max?
|
||||
& input.attrs.step.float?
|
||||
& shared-form.attrs.readonly?
|
||||
& shared-form.attrs.required?
|
||||
& input.number.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.number.attrs.type =
|
||||
attribute type {
|
||||
w:string "number"
|
||||
}
|
||||
input.number.attrs.min =
|
||||
attribute min {
|
||||
common.data.float
|
||||
}
|
||||
input.number.attrs.max =
|
||||
attribute max {
|
||||
common.data.float
|
||||
}
|
||||
input.number.attrs.value =
|
||||
attribute value {
|
||||
common.data.float
|
||||
}
|
||||
|
||||
input.elem |= input.number.elem
|
||||
|
||||
## Imprecise Number: <input type='range'>
|
||||
|
||||
input.range.elem =
|
||||
element input { input.range.attrs }
|
||||
input.range.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.range.attrs.type
|
||||
& input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& input.range.attrs.min?
|
||||
& input.range.attrs.max?
|
||||
& input.attrs.step.float?
|
||||
& input.range.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.range.attrs.type =
|
||||
attribute type {
|
||||
w:string "range"
|
||||
}
|
||||
input.range.attrs.min =
|
||||
attribute min {
|
||||
common.data.float
|
||||
}
|
||||
input.range.attrs.max =
|
||||
attribute max {
|
||||
common.data.float
|
||||
}
|
||||
input.range.attrs.value =
|
||||
attribute value {
|
||||
common.data.float
|
||||
}
|
||||
|
||||
input.elem |= input.range.elem
|
||||
|
||||
## Email Address: <input type='email'>
|
||||
|
||||
input.email.elem =
|
||||
element input { input.email.attrs }
|
||||
input.email.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.email.attrs.type
|
||||
& input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& shared-form.attrs.maxlength?
|
||||
& shared-form.attrs.pattern?
|
||||
& shared-form.attrs.readonly?
|
||||
& shared-form.attrs.required?
|
||||
& shared-form.attrs.size?
|
||||
& shared-form.attrs.placeholder?
|
||||
& ( ( input.attrs.multiple
|
||||
& input.email.attrs.value.multiple?
|
||||
)
|
||||
| input.email.attrs.value.single?
|
||||
)?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.email.attrs.type =
|
||||
attribute type {
|
||||
w:string "email"
|
||||
}
|
||||
input.email.attrs.value.single =
|
||||
attribute value {
|
||||
form.data.emailaddress
|
||||
}
|
||||
input.email.attrs.value.multiple =
|
||||
attribute value {
|
||||
form.data.emailaddresslist
|
||||
}
|
||||
|
||||
input.elem |= input.email.elem
|
||||
|
||||
## IRI: <input type='url'>
|
||||
|
||||
input.url.elem =
|
||||
element input { input.url.attrs }
|
||||
input.url.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.url.attrs.type
|
||||
& input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& shared-form.attrs.maxlength?
|
||||
& shared-form.attrs.pattern?
|
||||
& shared-form.attrs.readonly?
|
||||
& shared-form.attrs.required?
|
||||
& shared-form.attrs.size?
|
||||
& shared-form.attrs.placeholder?
|
||||
& input.url.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.url.attrs.type =
|
||||
attribute type {
|
||||
w:string "url"
|
||||
}
|
||||
input.url.attrs.value =
|
||||
attribute value {
|
||||
w:string "" | common.data.uri.absolute
|
||||
}
|
||||
|
||||
input.elem |= input.url.elem
|
||||
|
||||
## Search: <input type='search'>
|
||||
|
||||
input.search.elem =
|
||||
element input { input.search.attrs }
|
||||
input.search.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.search.attrs.type
|
||||
& input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& shared-form.attrs.maxlength?
|
||||
& shared-form.attrs.pattern?
|
||||
& shared-form.attrs.readonly?
|
||||
& shared-form.attrs.required?
|
||||
& shared-form.attrs.size?
|
||||
& shared-form.attrs.placeholder?
|
||||
& input.search.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.search.attrs.type =
|
||||
attribute type {
|
||||
w:string "search"
|
||||
}
|
||||
input.search.attrs.value =
|
||||
attribute value {
|
||||
string # FIXME line breaks
|
||||
}
|
||||
|
||||
input.elem |= input.search.elem
|
||||
|
||||
## Telephone Number: <input type='tel'>
|
||||
|
||||
input.tel.elem =
|
||||
element input { input.tel.attrs }
|
||||
input.tel.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.tel.attrs.type
|
||||
& input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& shared-form.attrs.maxlength?
|
||||
& shared-form.attrs.pattern?
|
||||
& shared-form.attrs.readonly?
|
||||
& shared-form.attrs.required?
|
||||
& shared-form.attrs.size?
|
||||
& shared-form.attrs.placeholder?
|
||||
& input.tel.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.tel.attrs.type =
|
||||
attribute type {
|
||||
w:string "tel"
|
||||
}
|
||||
input.tel.attrs.value =
|
||||
attribute value {
|
||||
string # FIXME line breaks
|
||||
}
|
||||
|
||||
input.elem |= input.tel.elem
|
||||
|
||||
## Color: <input type='color'>
|
||||
|
||||
input.color.elem =
|
||||
element input { input.color.attrs }
|
||||
input.color.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs
|
||||
& input.color.attrs.type
|
||||
& input.attrs.autocomplete?
|
||||
& shared-form.attrs.autofocus?
|
||||
& input.attrs.list?
|
||||
& input.color.attrs.value?
|
||||
& common.attrs.aria.implicit.input?
|
||||
)
|
||||
input.color.attrs.type =
|
||||
attribute type {
|
||||
w:string "color"
|
||||
}
|
||||
input.color.attrs.value =
|
||||
attribute value {
|
||||
form.data.color
|
||||
}
|
||||
|
||||
input.elem |= input.color.elem
|
||||
|
||||
## Form Output: <output>
|
||||
|
||||
output.elem =
|
||||
element output { output.inner & output.attrs }
|
||||
output.attrs =
|
||||
( common.attrs
|
||||
& common-form.attrs.name?
|
||||
& common-form.attrs.form?
|
||||
& output.attrs.for?
|
||||
& common.attrs.aria.implicit.region?
|
||||
)
|
||||
output.attrs.for =
|
||||
attribute for {
|
||||
common.data.idrefs #REVISIT spec says space--not whitespace
|
||||
}
|
||||
output.inner =
|
||||
( common.inner.phrasing )
|
||||
|
||||
common.elem.phrasing |= output.elem
|
||||
|
||||
## Text Area: <textarea>, extensions
|
||||
|
||||
textarea.attrs.rows-and-cols-wf1.inner &=
|
||||
notAllowed
|
||||
textarea.attrs.rows-and-cols-wf1 |=
|
||||
empty
|
||||
textarea.attrs &=
|
||||
( shared-form.attrs.maxlength?
|
||||
& shared-form.attrs.autofocus?
|
||||
& shared-form.attrs.required?
|
||||
& shared-form.attrs.placeholder?
|
||||
& textarea.attrs.rows?
|
||||
& ( ( textarea.attrs.wrap.hard
|
||||
& textarea.attrs.cols
|
||||
)
|
||||
| ( textarea.attrs.wrap.soft?
|
||||
& textarea.attrs.cols?
|
||||
)
|
||||
)
|
||||
)
|
||||
textarea.attrs.wrap.hard =
|
||||
attribute wrap {
|
||||
w:string "hard"
|
||||
}
|
||||
textarea.attrs.wrap.soft =
|
||||
attribute wrap {
|
||||
w:string "soft"
|
||||
}
|
||||
|
||||
## List of Prefill Data: <datalist>
|
||||
|
||||
#REVISIT should the options in datalist be non-selectable?
|
||||
|
||||
datalist.elem =
|
||||
element datalist { datalist.inner & datalist.attrs }
|
||||
datalist.inner =
|
||||
( option.elem* & common.inner.phrasing )
|
||||
datalist.attrs =
|
||||
( common.attrs )
|
||||
|
||||
common.elem.phrasing |= datalist.elem
|
||||
|
||||
## Complex Submit Button: <button type='submit'>, extensions
|
||||
|
||||
button.submit.attrs &=
|
||||
( shared-form.attrs.formaction?
|
||||
& shared-form.attrs.autofocus?
|
||||
& shared-form.attrs.formenctype?
|
||||
& shared-form.attrs.formmethod?
|
||||
& shared-form.attrs.formtarget?
|
||||
& shared-form.attrs.formnovalidate?
|
||||
)
|
||||
|
||||
## Complex Reset Button: <button type='reset'>, extensions
|
||||
|
||||
button.reset.attrs &=
|
||||
( shared-form.attrs.autofocus? )
|
||||
|
||||
## Complex Push Button: <button type='button'>, extensions
|
||||
|
||||
button.button.attrs &=
|
||||
( shared-form.attrs.autofocus? )
|
||||
|
||||
## Form: <form>, extensions
|
||||
form.attrs &=
|
||||
( form.attrs.novalidate?
|
||||
& form.attrs.target?
|
||||
& form.attrs.autocomplete?
|
||||
)
|
||||
form.attrs.novalidate =
|
||||
attribute novalidate {
|
||||
w:string "novalidate" | w:string ""
|
||||
}
|
||||
form.attrs.target =
|
||||
attribute target {
|
||||
common.data.browsing-context-or-keyword
|
||||
}
|
||||
form.attrs.autocomplete =
|
||||
attribute autocomplete {
|
||||
w:string "on" | w:string "off"
|
||||
}
|
||||
# REVISIT should this be case-insensitive in conforming XHTML documents?
|
||||
form.attrs.enctype.data |=
|
||||
( w:string "text/plain" )
|
||||
form.attrs.method.data |=
|
||||
( w:string "put" | w:string "delete" )
|
||||
|
||||
## Fieldset: <fieldset>, extensions
|
||||
|
||||
fieldset.attrs &=
|
||||
( common-form.attrs )
|
||||
|
||||
## Label: <label>, extensions
|
||||
|
||||
label.attrs &=
|
||||
( common-form.attrs.form? )
|
||||
|
||||
## Key-pair generator/input control: <keygen>
|
||||
|
||||
keygen.elem =
|
||||
element keygen { keygen.inner & keygen.attrs }
|
||||
keygen.attrs =
|
||||
( common.attrs
|
||||
& keygen.attrs.challenge?
|
||||
& keygen.attrs.keytype?
|
||||
& shared-form.attrs.autofocus?
|
||||
& common-form.attrs?
|
||||
#REVISIT which ARIA attributes needed here
|
||||
)
|
||||
keygen.attrs.challenge =
|
||||
attribute challenge {
|
||||
string
|
||||
}
|
||||
keygen.attrs.keytype =
|
||||
attribute keytype {
|
||||
w:string "rsa"
|
||||
}
|
||||
keygen.inner =
|
||||
( empty )
|
||||
|
||||
common.elem.phrasing |= keygen.elem
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
default namespace = "http://www.w3.org/1999/xhtml/html5"
|
||||
# #####################################################################
|
||||
## RELAX NG Schema for XHTML 5 #
|
||||
# #####################################################################
|
||||
|
||||
# To validate an XHTML 5 document, you must first validate against #
|
||||
# this schema and then ALSO validate against assertions.sch #
|
||||
|
||||
# #####################################################################
|
||||
## Schema Framework & Parameters
|
||||
|
||||
include "common.rnc" {
|
||||
# XHTML flavor #
|
||||
XMLonly = empty
|
||||
HTMLonly = notAllowed
|
||||
# HTML 4 compat #
|
||||
v5only = empty
|
||||
}
|
||||
|
||||
# #####################################################################
|
||||
## Language Definitions
|
||||
|
||||
start = html.elem
|
||||
|
||||
include "meta.rnc"
|
||||
include "phrase.rnc"
|
||||
include "block.rnc"
|
||||
include "sectional.rnc"
|
||||
include "structural.rnc"
|
||||
include "revision.rnc"
|
||||
include "embed.rnc"
|
||||
include "ruby.rnc"
|
||||
include "media.rnc"
|
||||
include "core-scripting.rnc"
|
||||
include "tables.rnc"
|
||||
include "form-datatypes.rnc"
|
||||
include "web-forms.rnc"
|
||||
include "web-forms2.rnc"
|
||||
include "applications.rnc"
|
||||
include "data.rnc"
|
||||
@@ -166,7 +166,7 @@ public class XmlTagInsertHandler implements InsertHandler<LookupElement> {
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (attributeDecl.isFixed() && attributeDecl.getDefaultValue() != null && !htmlCode) {
|
||||
else if (attributeDecl.isRequired() && attributeDecl.isFixed() && attributeDecl.getDefaultValue() != null && !htmlCode) {
|
||||
template.addTextSegment(" " + attributeName + "=\"" + attributeDecl.getDefaultValue() + "\"");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user