codenautas/js-to-html

View on GitHub
generators/attributes.js

Summary

Maintainability
A
0 mins
Test Coverage
"use strict";

var fs=require('fs').promises;

var mapa={};

// Obtenido de https://html.spec.whatwg.org/#attributes-3

var lista=[
    ['abbr', 'th', 'Alternative label to use for the header cell when referencing the cell in other contexts', 'Text*'],
    ['accept', 'input', 'Hint for expected file type in file upload controls', 'Set of comma-separated tokens* consisting of valid MIME types with no parameters or audio/*, video/*, or image/*'],
    ['accept-charset', 'form', 'Character encodings to use for form submission', 'Ordered set of unique space-separated tokens, ASCII case-insensitive, consisting of labels of ASCII-compatible encodings*'],
    ['accesskey', 'HTML elements', 'Keyboard shortcut to activate or focus element', 'Ordered set of unique space-separated tokens, case-sensitive, consisting of one Unicode code point in length'],
    ['action', 'form', 'URL to use for form submission', 'Valid non-empty URL potentially surrounded by spaces'],
    ['allowfullscreen', 'iframe', 'Whether to allow the iframe\'s contents to use requestFullscreen()', 'Boolean attribute'],
    ['alt', 'area; img; input', 'Replacement text for use when images are not available', 'Text*'],
    ['async', 'script', 'Execute script when available, without blocking', 'Boolean attribute'],
    ['autocomplete', 'form', 'Default setting for autofill feature for controls in the form', '"on"; "off"'],
    ['autocomplete', 'input; select; textarea', 'Hint for form autofill feature', 'Autofill field name and related tokens*'],
    ['autofocus', 'button; input; keygen; select; textarea', 'Automatically focus the form control when the page is loaded', 'Boolean attribute'],
    ['autoplay', 'audio; video', 'Hint that the media resource can be started automatically when the page is loaded', 'Boolean attribute'],
    ['challenge', 'keygen', 'String to package with the generated and signed public key', 'Text'],
    ['charset', 'meta', 'Character encoding declaration', 'Encoding label*'],
    ['charset', 'script', 'Character encoding of the external script resource', 'Encoding label*'],
    ['checked', 'menuitem; input', 'Whether the command or control is checked', 'Boolean attribute'],
    ['cite', 'blockquote; del; ins; q', 'Link to the source of the quotation or more information about the edit', 'Valid URL potentially surrounded by spaces'],
    ['class', 'HTML elements', 'Classes to which the element belongs', 'Set of space-separated tokens'],
    ['cols', 'textarea', 'Maximum number of characters per line', 'Valid non-negative integer greater than zero'],
    ['colspan', 'td; th', 'Number of columns that the cell is to span', 'Valid non-negative integer greater than zero'],
    ['content', 'meta', 'Value of the element', 'Text*'],
    ['contenteditable', 'HTML elements', 'Whether the element is editable', '"true"; "false"'],
    ['contextmenu', 'HTML elements', 'The element\'s context menu', 'ID*'],
    ['controls', 'audio; video', 'Show user agent controls', 'Boolean attribute'],
    ['coords', 'area', 'Coordinates for the shape to be created in an image map', 'Valid list of integers*'],
    ['crossorigin', 'audio; img; link; script; video', 'How the element handles crossorigin requests', '"anonymous"; "use-credentials"'],
    ['data', 'object', 'Address of the resource', 'Valid non-empty URL potentially surrounded by spaces'],
    ['datetime', 'del; ins', 'Date and (optionally) time of the change', 'Valid date string with optional time'],
    ['datetime', 'time', 'Machine-readable value', 'Valid month string, valid date string, valid yearless date string, valid time string, valid local date and time string, valid time-zone offset string, valid global date and time string, valid week string, valid non-negative integer, or valid duration string'],
    ['default', 'menuitem', 'Mark the command as being a default command', 'Boolean attribute'],
    ['default', 'track', 'Enable the track if no other text track is more suitable', 'Boolean attribute'],
    ['defer', 'script', 'Defer script execution', 'Boolean attribute'],
    ['dir', 'HTML elements', 'The text directionality of the element', '"ltr"; "rtl"; "auto"'],
    ['dir', 'bdo', 'The text directionality of the element', '"ltr"; "rtl"'],
    ['dirname', 'input; textarea', 'Name of form field to use for sending the element\'s directionality in form submission', 'Text*'],
    ['disabled', 'button; menuitem; fieldset; input; keygen; optgroup; option; select; textarea', 'Whether the form control is disabled', 'Boolean attribute'],
    ['download', 'a; area', 'Whether to download the resource instead of navigating to it, and its file name if so', 'Text'],
    ['draggable', 'HTML elements', 'Whether the element is draggable', '"true"; "false"'],
    ['dropzone', 'HTML elements', 'Accepted item types for drag-and-drop', 'Unordered set of unique space-separated tokens, ASCII case-insensitive, consisting of accepted types and drag feedback*'],
    ['enctype', 'form', 'Form data set encoding type to use for form submission', '"application/x-www-form-urlencoded"; "multipart/form-data"; "text/plain"'],
    ['for', 'label', 'Associate the label with form control', 'ID*'],
    ['for', 'output', 'Specifies controls from which the output was calculated', 'Unordered set of unique space-separated tokens, case-sensitive, consisting of IDs*'],
    ['form', 'button; fieldset; input; keygen; label; object; output; select; textarea', 'Associates the control with a form element', 'ID*'],
    ['formaction', 'button; input', 'URL to use for form submission', 'Valid non-empty URL potentially surrounded by spaces'],
    ['formenctype', 'button; input', 'Form data set encoding type to use for form submission', '"application/x-www-form-urlencoded"; "multipart/form-data"; "text/plain"'],
    ['formmethod', 'button; input', 'HTTP method to use for form submission', '"GET"; "POST"'],
    ['formnovalidate', 'button; input', 'Bypass form control validation for form submission', 'Boolean attribute'],
    ['formtarget', 'button; input', 'Browsing context for form submission', 'Valid browsing context name or keyword'],
    ['headers', 'td; th', 'The header cells for this cell', 'Unordered set of unique space-separated tokens, case-sensitive, consisting of IDs*'],
    ['height', 'canvas; embed; iframe; img; input; object; video', 'Vertical dimension', 'Valid non-negative integer'],
    ['hidden', 'HTML elements', 'Whether the element is relevant', 'Boolean attribute'],
    ['high', 'meter', 'Low limit of high range', 'Valid floating-point number*'],
    ['href', 'a; area', 'Address of the hyperlink', 'Valid URL potentially surrounded by spaces'],
    ['href', 'link', 'Address of the hyperlink', 'Valid non-empty URL potentially surrounded by spaces'],
    ['href', 'base', 'Document base URL', 'Valid URL potentially surrounded by spaces'],
    ['hreflang', 'a; link', 'Language of the linked resource', 'Valid BCP 47 language tag'],
    ['http-equiv', 'meta', 'Pragma directive', 'Text*'],
    ['icon', 'menuitem', 'Icon for the command', 'Valid non-empty URL potentially surrounded by spaces'],
    ['id', 'HTML elements', 'The element\'s ID', 'Text*'],
    ['inputmode', 'input; textarea', 'Hint for selecting an input modality', '"verbatim"; "latin"; "latin-name"; "latin-prose"; "full-width-latin"; "kana"; "kana-name"; "katakana"; "numeric"; "tel"; "email"; "url"'],
    ['ismap', 'img', 'Whether the image is a server-side image map', 'Boolean attribute'],
    ['itemid', 'HTML elements', 'Global identifier for a microdata item', 'Valid URL potentially surrounded by spaces'],
    ['itemprop', 'HTML elements', 'Property names of a microdata item', 'Unordered set of unique space-separated tokens, case-sensitive, consisting of valid absolute URLs, defined property names, or text*'],
    ['itemref', 'HTML elements', 'Referenced elements', 'Unordered set of unique space-separated tokens, case-sensitive, consisting of IDs*'],
    ['itemscope', 'HTML elements', 'Introduces a microdata item', 'Boolean attribute'],
    ['itemtype', 'HTML elements', 'Item types of a microdata item', 'Unordered set of unique space-separated tokens, case-sensitive, consisting of valid absolute URL*'],
    ['keytype', 'keygen', 'The type of cryptographic key to generate', 'Text*'],
    ['kind', 'track', 'The type of text track', '"subtitles"; "captions"; "descriptions"; "chapters"; "metadata"'],
    ['label', 'menuitem; menu; optgroup; option; track', 'User-visible label', 'Text'],
    ['lang', 'HTML elements', 'Language of the element', 'Valid BCP 47 language tag or the empty string'],
    ['list', 'input', 'List of autocomplete options', 'ID*'],
    ['loop', 'audio; video', 'Whether to loop the media resource', 'Boolean attribute'],
    ['low', 'meter', 'High limit of low range', 'Valid floating-point number*'],
    ['manifest', 'html', 'Application cache manifest', 'Valid non-empty URL potentially surrounded by spaces'],
    ['max', 'input', 'Maximum value', 'Varies*'],
    ['max', 'meter; progress', 'Upper bound of range', 'Valid floating-point number*'],
    ['maxlength', 'input; textarea', 'Maximum length of value', 'Valid non-negative integer'],
    ['media', 'link; style', 'Applicable media', 'Valid media query list'],
    ['mediagroup', 'audio; video', 'Groups media elements together with an implicit MediaController', 'Text'],
    ['menu', 'button', 'Specifies the element\'s designated pop-up menu', 'ID*'],
    ['method', 'form', 'HTTP method to use for form submission', '"GET"; "POST"; "dialog"'],
    ['min', 'input', 'Minimum value', 'Varies*'],
    ['min', 'meter', 'Lower bound of range', 'Valid floating-point number*'],
    ['minlength', 'input; textarea', 'Minimum length of value', 'Valid non-negative integer'],
    ['multiple', 'input; select', 'Whether to allow multiple values', 'Boolean attribute'],
    ['muted', 'audio; video', 'Whether to mute the media resource by default', 'Boolean attribute'],
    ['name', 'button; fieldset; input; keygen; output; select; textarea', 'Name of form control to use for form submission and in the form.elements API', 'Text*'],
    ['name', 'form', 'Name of form to use in the document.forms API', 'Text*'],
    ['name', 'iframe; object', 'Name of nested browsing context', 'Valid browsing context name or keyword'],
    ['name', 'map', 'Name of image map to reference from the usemap attribute', 'Text*'],
    ['name', 'meta', 'Metadata name', 'Text*'],
    ['name', 'param', 'Name of parameter', 'Text'],
    ['nonce', 'script; style', 'Cryptographic nonce used in Content Security Policy checks [CSP]', 'Text'],
    ['novalidate', 'form', 'Bypass form control validation for form submission', 'Boolean attribute'],
    ['open', 'details', 'Whether the details are visible', 'Boolean attribute'],
    ['open', 'dialog', 'Whether the dialog box is showing', 'Boolean attribute'],
    ['optimum', 'meter', 'Optimum value in gauge', 'Valid floating-point number*'],
    ['pattern', 'input', 'Pattern to be matched by the form control\'s value', 'Regular expression matching the JavaScript Pattern production'],
    ['ping', 'a; area', 'URLs to ping', 'Set of space-separated tokens consisting of valid non-empty URLs'],
    ['placeholder', 'input; textarea', 'User-visible label to be placed within the form control', 'Text*'],
    ['poster', 'video', 'Poster frame to show prior to video playback', 'Valid non-empty URL potentially surrounded by spaces'],
    ['preload', 'audio; video', 'Hints how much buffering the media resource will likely need', '"none"; "metadata"; "auto"'],
    ['radiogroup', 'menuitem', 'Name of group of commands to treat as a radio button group', 'Text'],
    ['readonly', 'input; textarea', 'Whether to allow the value to be edited by the user', 'Boolean attribute'],
    ['rel', 'a; area; link', 'Relationship between the document containing the hyperlink and the destination resource', 'Set of space-separated tokens*'],
    ['required', 'input; select; textarea', 'Whether the control is required for form submission', 'Boolean attribute'],
    ['reversed', 'ol', 'Number the list backwards', 'Boolean attribute'],
    ['rows', 'textarea', 'Number of lines to show', 'Valid non-negative integer greater than zero'],
    ['rowspan', 'td; th', 'Number of rows that the cell is to span', 'Valid non-negative integer'],
    ['sandbox', 'iframe', 'Security rules for nested content', 'Unordered set of unique space-separated tokens, ASCII case-insensitive, consisting of "allow-forms", "allow-modals", "allow-pointer-lock", "allow-popups", "allow-popups-to-escape-sandbox", "allow-same-origin", "allow-scripts and "allow-top-navigation"'],
    ['spellcheck', 'HTML elements', 'Whether the element is to have its spelling and grammar checked', '"true"; "false"'],
    ['scope', 'th', 'Specifies which cells the header cell applies to', '"row"; "col"; "rowgroup"; "colgroup"'],
    ['scoped', 'style', 'Whether the styles apply to the entire document or just the parent subtree', 'Boolean attribute'],
    ['seamless', 'iframe', 'Whether to apply the document\'s styles to the nested content', 'Boolean attribute'],
    ['selected', 'option', 'Whether the option is selected by default', 'Boolean attribute'],
    ['shape', 'area', 'The kind of shape to be created in an image map', '"circle"; "default"; "poly"; "rect"'],
    ['size', 'input; select', 'Size of the control', 'Valid non-negative integer greater than zero'],
    ['sizes', 'link', 'Sizes of the icons (for rel="icon")', 'Unordered set of unique space-separated tokens, ASCII case-insensitive, consisting of sizes*'],
    ['sortable', 'table', 'Enables a sorting interface for the table', 'Boolean attribute'],
    ['sorted', 'th', 'Column sort direction and ordinality', 'Set of space-separated tokens, ASCII case-insensitive, consisting of neither, one, or both of "reversed" and a valid non-negative integer greater than zero'],
    ['span', 'col; colgroup', 'Number of columns spanned by the element', 'Valid non-negative integer greater than zero'],
    ['src', 'audio; embed; iframe; img; input; script; source; track; video', 'Address of the resource', 'Valid non-empty URL potentially surrounded by spaces'],
    ['srcdoc', 'iframe', 'A document to render in the iframe', 'The source of an iframe srcdoc document*'],
    ['srclang', 'track', 'Language of the text track', 'Valid BCP 47 language tag'],
    ['srcset', 'img', 'Images to use in different situations (e.g. high-resolution displays, small monitors, etc)', 'Comma-separated list of image candidate strings'],
    ['start', 'ol', 'Ordinal value of the first item', 'Valid integer'],
    ['step', 'input', 'Granularity to be matched by the form control\'s value', 'Valid floating-point number greater than zero, or "any"'],
    ['style', 'HTML elements', 'Presentational and formatting instructions', 'CSS declarations*'],
    ['tabindex', 'HTML elements', 'Whether the element is focusable, and the relative order of the element for the purposes of sequential focus navigation', 'Valid integer'],
    ['target', 'a; area', 'Browsing context for hyperlink navigation', 'Valid browsing context name or keyword'],
    ['target', 'base', 'Default browsing context for hyperlink navigation and form submission', 'Valid browsing context name or keyword'],
    ['target', 'form', 'Browsing context for form submission', 'Valid browsing context name or keyword'],
    ['title', 'HTML elements', 'Advisory information for the element', 'Text'],
    ['title', 'abbr; dfn', 'Full term or expansion of abbreviation', 'Text'],
    ['title', 'input', 'Description of pattern (when used with pattern attribute)', 'Text'],
    ['title', 'menuitem', 'Hint describing the command', 'Text'],
    ['title', 'link', 'Title of the link', 'Text'],
    ['title', 'link; style', 'Alternative style sheet set name', 'Text'],
    ['translate', 'HTML elements', 'Whether the element is to be translated when the page is localized', '"yes"; "no"'],
    ['type', 'a; link', 'Hint for the type of the referenced resource', 'Valid MIME type'],
    ['type', 'button', 'Type of button', '"submit"; "reset"; "button"; "menu"'],
    ['type', 'embed; object; script; source; style', 'Type of embedded resource', 'Valid MIME type'],
    ['type', 'input', 'Type of form control', 'input type keyword'],
    ['type', 'menu', 'Type of menu', '"context"; "toolbar"'],
    ['type', 'menuitem', 'Type of command', '"command"; "checkbox"; "radio"'],
    ['type', 'ol', 'Kind of list marker', '"1"; "a"; "A"; "i"; "I"'],
    ['typemustmatch', 'object', 'Whether the type attribute and the Content-Type value need to match for the resource to be used', 'Boolean attribute'],
    ['usemap', 'img; object', 'Name of image map to use', 'Valid hash-name reference*'],
    ['value', 'button; option', 'Value to be used for form submission', 'Text'],
    ['value', 'data', 'Machine-readable value', 'Text*'],
    ['value', 'input', 'Value of the form control', 'Varies*'],
    ['value', 'li', 'Ordinal value of the list item', 'Valid integer'],
    ['value', 'meter; progress', 'Current value of the element', 'Valid floating-point number'],
    ['value', 'param', 'Value of parameter', 'Text'],
    ['width', 'canvas; embed; iframe; img; input; object; video', 'Horizontal dimension', 'Valid non-negative integer'],
    ['wrap', 'textarea', 'How the value of the form control is to be wrapped for form submission', '"soft"; "hard"']
];
// obtenido de http://stackoverflow.com/questions/14544481/is-there-a-mapping-from-html-property-names-to-dom-propety-names
var html2idl = {
  "acceptcharset": "acceptCharset",
  "accesskey": "accessKey",
  "bgcolor": "bgColor",
  "cellindex": "cellIndex",
  "cellpadding": "cellPadding",
  "cellspacing": "cellSpacing",
  "checked": "defaultChecked",
  "choff": "chOff",
  "class": "className",
  "codebase": "codeBase",
  "codetype": "codeType",
  "colspan": "colSpan",
  "datetime": "dateTime",
  "for": "htmlFor",
  "frameborder": "frameBorder",
  "httpequiv": "httpEquiv",
  "longdesc": "longDesc",
  "marginheight": "marginHeight",
  "marginwidth": "marginWidth",
  "maxlength": "maxLength",
  "nohref": "noHref",
  "noresize": "noResize",
  "noshade": "noShade",
  "nowrap": "noWrap",
  "readonly": "readOnly",
  "rowindex": "rowIndex",
  "rowspan": "rowSpan",
  "sectionrowindex": "sectionRowIndex",
  "selected": "defaultSelected",
  "selectedindex": "selectedIndex",
  "tabindex": "tabIndex",
  "tbodies": "tBodies",
  "tfoot": "tFoot",
  "thead": "tHead",
  "url": "URL",
  "usemap": "useMap",
  "valign": "vAlign",
  "value": "value",
  "valuetype": "valueType" 
};

var htmlAttrsSpecials={
    "class"        :{ reserved:true, domName:'className', listName:'classList', rejectSpaces:true},
    "for"          :{ reserved:true, domName:'htmlFor'  },
    classList      :{ synonym:'class' },
    className      :{ synonym:'class' },
    htmlFor        :{ synonym:'for' },
    list           :{ noProperty: true }
};

lista.forEach(function(linea){
    var clave=linea[0];
    mapa[clave]=mapa[clave]||{tags:{}, idl:html2idl[clave]||clave};
    for(let featureName of 'rejectSpaces,listName,reserved,noProperty'.split(',')){
        if(htmlAttrsSpecials[clave] && htmlAttrsSpecials[clave][featureName]){
            console.log('ck',clave,featureName,htmlAttrsSpecials[clave][featureName])
            mapa[clave][featureName]=htmlAttrsSpecials[clave][featureName];
        }
    }
    linea[1].split('; ').forEach(function(tagName){
        mapa[clave].tags[tagName]={
            description:linea[2], 
            value:linea[3]
        };
    })
});

fs.writeFile(
    'attributes.data',
    "//\n"+
    "// generated by generators/attributes.js\n"+
    "jsToHtml.htmlAttributes="+
    JSON.stringify(mapa, null, '    ')
    .replace(/\n                /gm,'')
    .replace(/\n            \}/gm,'}')+
    "\n"+
    "// generated by generators/attributes.js\n"+
    "//\n"
);