'use strict'; // 要素取得 function E(id){ // const e = document.getElementById(id);if(!e) {console.log(id);};return e; return document.getElementById(id); } // 要素作成 function C(tag){ return tag ? document.createElement(tag) : document.createDocumentFragment(); } function EMPTY_FUNC(){} // セレクタ対象の要素を反復処理 function repeat(selector, callback, root){ if(!root) root = document const elements = root.querySelectorAll(selector); const L = elements.length; for(let i = 0; i < L; i++){ callback(elements[i]); } } const PAGE_DATA = Object.create(null); /* 予約済みメンバ( # → 詳細は common1.js ) options:# original_id_map:# original_urls:# trans_metadata:# spec_metadata:# ref_normative:# ref_informative:# ref_key_map:# ref_data:# link_map: keyword → リンク先 words_table: 単語トークン対応 words_table1: 単語トークン対応表 html_code_list: HTML 例示コード */ // see common1.js for possible members const COMMON_DATA = Object.create(null); // 予約済みメンバ const Util = { _COMP_: null, DEFERRED: [], // 遅延実行 defer: EMPTY_FUNC, // TODO initAdditional: EMPTY_FUNC, getState: EMPTY_FUNC, // 状態保存 setState: EMPTY_FUNC, get_mapping: EMPTY_FUNC, getDataByLevel: EMPTY_FUNC, get_header: EMPTY_FUNC, dump: EMPTY_FUNC, del_j: EMPTY_FUNC, ready: EMPTY_FUNC, rebuildToc: EMPTY_FUNC, buildTocList: EMPTY_FUNC, parseSourceBlock: EMPTY_FUNC, // common0a.js にはなし switchWordsInit: EMPTY_FUNC, replaceWords1: EMPTY_FUNC, rxp_wordsX: null, rxp_words1: null, collectParts: EMPTY_FUNC, replaceParts: EMPTY_FUNC, collectHtmlCodeList: EMPTY_FUNC, // common1.js ADDITIONAL_NODES: [], // CONTROL_UI: C(), //追加 UI CLICK_HANDLERS: {}, removeAdditionalNodes: EMPTY_FUNC, indexHide: EMPTY_FUNC, dfnHide: EMPTY_FUNC, dfnInit: EMPTY_FUNC, altLinkInit: EMPTY_FUNC, fillMisc: EMPTY_FUNC, toggleSource: EMPTY_FUNC, indexInit: EMPTY_FUNC, switchView: EMPTY_FUNC, ref_position: null, page_state: Object.create(null), saveStorage: EMPTY_FUNC, // supportsListenerOptions: false, XXXXX: EMPTY_FUNC }; // 改行+コロン区切りの文字列データから連想配列を取得 Util.get_mapping = function(data, map){ map = map || Object.create(null); const rxp = /\n(\S.*?):(.*)/g; let m; while(m = rxp.exec(data)){ map[m[1]] = m[2]; } return map; }; // ●●区切りの文字列から有名データブロックを抽出 Util.parseBlocks = function(source){ // const rxp = RegExp('(\n' + splitter + ').+'); const result = Object.create(null); let name = ''; source.split(/(\n●●.*)/).forEach(function(block){ if(block.slice(0,3) === '\n●●'){ name = block.slice(3); if(!name){ // 無名ブロックはコメント return; } if(!(name in result)){ result[name] = ''; } }else if(name){ result[name] += block; } }); return result; } /* HTML 例示コード用 */ Util.collectHtmlCodeList = function(parts){ if(!parts){ parts = Object.create(null); } const data = PAGE_DATA.html_code_list; delete PAGE_DATA.html_code_list; const rxp = /■(\S+)(.*)((?:\n.+)+)/g; let m; while(m = rxp.exec(data)){ const pre = C('pre'); pre.className = 'html-code' + (m[2] || ''); const markup = m[3].trim().replace(/%/g, ''); if(markup.indexOf('<') < 0 ){ pre.textContent = markup; } else { pre.innerHTML = markup .replace(/&/g, '&') .replace(//g, '>') .replace(/</g, '') .replace(/>/g, '') ; } parts['_ex-' + m[1]] = pre; } return parts; } /* 'token:word1:word2:word3:...' の形式の各行を 'token:word' の形に変換 ( word = level 番目の word ) word === 空 の場合 word = 最も level が高い空でない word word === '~' の場合 恒等置換 */ Util.getDataByLevel = function(data, level){ return data // スペース/タブ開始行を削除 .replace(/\n[ \t].*/g, '') // ":" 区切りの行フィールド数を level + 1 個に圧縮 // level = 2 の場合: /((:[^:\n]*){3}).*/g ( w:w1:w2:w3 => w:w1:w2 ) .replace(RegExp('((:[^:\\n]*){' + ((level & 0xF) + 1) + '}).*', 'g'), '$1') // 省略されたフィールドを補填 ( …w::\n => w:w\n) .replace(/([^:\n]*):+(?=\n)/g, '$1:$1') // 合間のフィールドをカット .replace(/:.*:/g, ':') // token が '-' で終端している場合 token:( token から末尾の '-' を除去した結果 ) に置換 // .replace(/^(.*)-:~$/mg, '$1-:$1') // "~" への map (恒等置換 指示)は削除 .replace(/^.*:~$/mg, '') ; }; // 節見出しを取得 Util.get_header = function(section){ const header = section && section.firstElementChild; return ( header && /^H\d$/.test(header.tagName) )? header : null; }; Util.collectParts = function(parts){ // 既定の収集器 repeat('#_persisted_parts > *[id]', function(e){ parts[e.id] = e; }); }; Util.dump = function(s){ if(s instanceof Array){ s = s.join('\n'); } else if(s instanceof Object){ const ss = []; for(let p in s){ ss.push(p + ': ' + s[p]); } s = ss.join('\n'); } const area = C('textarea'); area.cols = 200; area.rows = 100; area.value = s; document.body.appendChild(area); area.scrollIntoView(); }; // 訳文消去( diff 比較用) Util.del_j = function(){ let parent; repeat('.trans-note', function(e){ e.parentNode.removeChild(e); }); repeat('details', function(e){ e.open = true; }); repeat('*[lang="en"]', function(en){ const p = en.parentNode; if(en.tagName === 'SPAN'){ const en1 = C('P'); p.insertBefore(en1, en); en1.appendChild(en); en = en1; if(p === parent){ return; } parent = p; } while(p.firstChild !== en) { p.removeChild(p.firstChild); } }); repeat('h2,h3,h4,h5', function(e){ const text = e.title; if(text){ e.textContent = (e.textContent.match(/[ABC\d\.]+/) || '') + ' ' + text; } }); Util.DEFERRED.push(function(){ repeat('details', function(e){ e.open = true; }); }); }; Util.getState = function(key, default_val, type){ if(! (key in Util.page_state) ) return default_val; const val = Util.page_state[key]; return (type && (typeof(val) !== type))? default_val : val; }; Util.setState = function(key, val){ const page_state = Util.page_state; const old_val = page_state[key]; if(val === old_val) return; if(val === undefined){ delete page_state[key]; } else { page_state[key] = val; } history.replaceState( page_state, '' ); Util.saveStorage(page_state); }; new function(){ if(!window.console){ window.console = { log: EMPTY_FUNC }; } /* try { const opts = Object.defineProperty({}, 'passive', { get: function() { Util.supportsListenerOptions = true;} }); window.addEventListener("test", null, opts); } catch (e) {} */ } new function(){ // meta with viewport for mbile (ideally, should be set by CSS, not meta tag) const head = document.head || document.getElementsByTagName('head')[0]; if(!head) return; // const w = screen.width;... const meta = C('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width, initial-scale=1, shrink-to-fit=no'); head.appendChild(meta); } new function(){ Util._COMP_ = new Promise(function(resolve){ document.addEventListener('DOMContentLoaded', function(){ init(); resolve(); }, false); }); // 初期化 function init(){ document.removeEventListener('DOMContentLoaded', init, false); const elem = E('_source_data'); if(elem){ Object.assign(PAGE_DATA, Util.parseBlocks(elem.textContent)); elem.parentNode.removeChild(elem); } const options = PAGE_DATA.options = Util.get_mapping(PAGE_DATA.options || ''); // 利用者 表示設定 let page_state = (JSON && get_state()) // setup saveStorage Util.page_state = page_state = history.state || page_state || Util.page_state; const classList = document.body.classList; if(page_state.show_original){ classList.toggle('show-original'); } if(page_state.side_menu){ classList.toggle('side-menu'); } if(classList.contains('_expanded')){ // ページは展開状態で保存されている PAGE_DATA.options.expanded = true; repeat('._hide_if_expanded', function(e){ // e.parentNode.removeChild(e); e.style.display = 'none'; }); } else { Util.fillHeader() Util.ready(PAGE_DATA); classList.add('_expanded'); } Util.initAdditional(); } // 表示状態を sessionStorage から読み込む function get_state(){ let page_state = null; let storage_key = null; storage_key = PAGE_DATA.options.page_state_key || window.location.pathname; try { // sessionStorage property へのアクセスのみでも security error になることがある page_state = sessionStorage.getItem(storage_key); Util.saveStorage = function(data){ sessionStorage.setItem(storage_key, JSON.stringify(data)); }; if(! page_state || (page_state.length > 1000)) return; page_state = JSON.parse(page_state); } catch(e){ console.log(e.message + ' failed sessionStorage.getItem'); } if(page_state instanceof Object){ return page_state; } } } /** 目次構築 section の入れ子階層を反映する,入れ子 ol による目次を得る 各 section タグの先頭の子要素(見出し)の内容が目次の各項目の内容に複製される 引数 root : section を子に持つ DOM 要素 備考 ・ section の入れ子は直接の親子関係のみ ・ 子要素を持たない section は無視される ・ 自身またはその見出しに id があてがわれていない section も無視される ・ 見出しの内容に id を持つ要素があると生成項目と id が重複する(不正) ・ 見出しの内容が巨大になる可能性がある ・ すべての Node を走査することになるが、実行速度は getElementsByTagName('section') による反復と変わらないか高速 */ Util.rebuildToc = function(main_id, list_id){ list_id = list_id || '_toc_list'; const toc_list = E(list_id), main = E(main_id); if(toc_list && main) { const new_list = Util.buildTocList(main); new_list.id = list_id; toc_list.parentNode.replaceChild(new_list, toc_list); } return toc_list; } Util.buildTocList = function(root){ const range = document.createRange(); const toc = buildToc(root); if(toc) { // a 要素の入れ子を除去 repeat('a a', function(e){ range.selectNodeContents(e); e.parentNode.replaceChild(range.extractContents(), e); }, toc); repeat('[id]', function(e){ // 重複 id を除去 e.removeAttribute('id'); }, toc); } return toc; function buildToc(root){ let list = null; for(let section = root.firstElementChild; section; section = section.nextElementSibling ){ if('SECTION' !== section.tagName) continue; const header = Util.get_header(section); if(!header) continue; const id = section.id || header.id; if(!id) continue; const a = C('a'); a.href = '#' + id; range.selectNodeContents(header); a.appendChild(range.cloneContents()); const li = C('li'); li.appendChild(a); const child_list = buildToc(section); if(child_list) li.appendChild(child_list); if(!list) list = C('ol'); list.appendChild(li); } return list; } } Util.fillHeader = function(){ const options = PAGE_DATA.options; const url = options.original_url || ''; // if(!url) return; let isHTML = false; const header = document.body.querySelector('header'); if(!header) return; const hgroup = header.querySelector('hgroup'); if( url.slice(0,39) === 'https://html.spec.whatwg.org/multipage/' ){ options.copyright = '2018,whatwg'; } fillLogoImage(); fillDate(); placeMetadata(); function fillDate(){ let date = options.spec_date; if(!date) return; if(!hgroup) return; const m = date.match(/^(\d+)-0*(\d+)-0*(\d+)$/); if(m){ date = ''; } let header_text; if(isHTML) { header_text = 'HTML Living Standard'; } else { header_text = { WD: '作業草案', ED: '編集者草案', EDCG: 'W3C Community Group Draft Report', PR: '勧告案', CR: '勧告候補', REC: '勧告', NOTE: 'Working Group Note', LS: 'Living Standard', //IETFPR: 'IETF PROPOSED STANDARD' }[options.spec_status] || ''; } const html = '

' + header_text + ' — ' + date + '

'; hgroup.insertAdjacentHTML('beforeend', html); } function fillLogoImage(){ // logo 画像 let html; const domain = url.match( /^https?:\/\/([\w\.\-]+)\// ); if(!domain) return; switch(domain[1]){ case 'www.w3.org': case 'w3c.github.io': case 'drafts.csswg.org': html = 'W3C'; break; case 'html.spec.whatwg.org': html = 'WHATWG'; isHTML = true; default: return; } header.insertAdjacentHTML('afterbegin', html); } // metadata 置き場 function placeMetadata(){ let html = '
この日本語訳は非公式な文書です…
'; if(PAGE_DATA.spec_metadata){ html += '
仕様メタデータ
'; } if(options.copyright){ html += ''; } if(!PAGE_DATA.options.no_index) { html += '
索引など
'; } if(hgroup){ hgroup.insertAdjacentHTML('afterend', html); } else { header.insertAdjacentHTML('beforeend', html); } } } /** 語彙切替/ HTML 生成 */ Util.switchWordsInit = function(source_data){ source_data = source_data || {}; if(!source_data.generate) source_data.generate = Util.produce; initLevels(); const main_id = source_data.main_id = source_data.main_id || 'MAIN'; initHTML(); source_data.switchWords = function(level){ level = Math.min(level & 0xF, this.levels.length - 1 ); const mapping = Util.get_mapping( Util.getDataByLevel( COMMON_DATA.WORDS + PAGE_DATA.words_table, level) // 値の最後の文字が英数の場合は末尾にスペースを補填 .replace(/(\w)(?=\n)/g, '$1 ') + COMMON_DATA.SYMBOLS + ( PAGE_DATA.words_table1 || '') ); let parts = this.persisted_parts; if(parts){ Object.keys(parts).forEach(function(id){ const e = parts[id]; if(e.parentNode){ e.parentNode.removeChild(e); } }); } generateHTML(mapping); if( source_data.populate ){ source_data.populate(); } parts = this.persisted_parts; if(parts){ // console.log(parts); Object.keys(parts).forEach(function(id){ const part = parts[id]; const e = E(id); if(e) { e.parentNode.replaceChild(part, e); } else { console.log('replaceParts: place holder not found for id=' + id ); } }); } createToc(this.toc_main); this.level = level; } if(source_data.collectParts){ const parts = source_data.persisted_parts || Object.create(null); source_data.collectParts(parts); source_data.persisted_parts = parts; } source_data.switchWords(source_data.level); Util.DEFERRED.push(create_word_switch); // 内容生成完了 E(main_id).style.display = ''; return; function initLevels(){ let levels = source_data.levels; if(!levels){ switch(PAGE_DATA.options.page_state_key){ case 'CSS': case 'TIMING' : levels = '英語主体:英語寄り:漢字主体:カナ主体'; break; case 'HTML' : default: levels = 'ほぼ英語:英語主体:漢字+英語:漢字主体:カナ主体'; } } levels = source_data.levels = levels.split(':'); if(levels.length === 0) levels = ['-']; let level = source_data.level; if(!level) { level = [0,1,1,2,2,3,3,4,4,5,5][levels.length] || 0; } level = Util.getState('words', level, 'number') source_data.level = Math.min( level & 0xF, levels.length - 1 ); } function initHTML(){ if(PAGE_DATA.link_map){ source_data.link_map = Util.get_mapping(PAGE_DATA.link_map); delete PAGE_DATA.link_map; } let html = E(main_id).innerHTML; // 前処理:英文を抽出して placeholder に置換など const en_list = source_data.en_text_list = [ '', // \uE000 '', // \uE001 '', // \uE002 ':', // \uE003 ':', // \uE004 // see PREMAP '', // \uE005 '', // \uE006 '', // \uE007 '', // \uE008 '', // \uE009 '', // \uE00A '
', // \uE00B '
' // \uE00C ]; let nesting = ''; let nesting1; let result; const premap = Util.get_mapping(COMMON_DATA.PREMAP); html = source_data.html = html.replace( /◎([\u0080-\uFFFF]\S*|[^<◎]+)|【.*?】|⇒#?\s*|<\/(?:li|p|dd|div|th|td)\b/g, // 一-鿆ア-ン // ⇒|⇒#を中で利用するタグはこれらのみ( ... figcaption|blockquote|pre ) // U+E000.., 私用領域( likely never be used in the specs. // up to 24bit 4096 items function f(match, cap1){ switch(match[0]){ case '◎': nesting1 = nesting; nesting = ''; // ⇒ を終端させる if(match.charCodeAt(1) < 0x80){ // english text en_list.push( cap1.trim() ); return ( nesting1 + '\uE001' + ( String.fromCharCode(0xE000 + en_list.length - 1 ) ) + '\uE000' ); } else { // PREMAP // console.assert(cap1 in premap, 'Undefined PREMAP symbol: ' + match); return nesting1 + ( premap[cap1] || '*' ); } case '【': return '\uE002' + match + '\uE000'; // TODO: 【\t で開始するならば

用バージョン 等々 case '⇒': nesting += '\uE000'; return ( match[1] === '#' )? '\uE004' : '\uE003'; case '<': nesting1 = nesting; nesting = ''; return nesting1 + match; } }); if(en_list.length >= 0x1000 ){ console.log('Error: Too many lang="en" items.'); } } function generateHTML(words_mapping){ const en_list = source_data.en_text_list; E(main_id).innerHTML = Util .replaceWords1(source_data.generate(), words_mapping) .replace(/[\uE000-\uEFFF]/g, function(match){ return en_list[match.charCodeAt(0) - 0xE000]; }); } function createToc(id){ const root = E(id || 'MAIN0'); // default toc if(!root) return; let nav = E('_toc'); if(nav){ nav.textContent = ''; } else { nav = C('nav'); nav.className = 'toc'; nav.id = '_toc'; } const h2 = C('h2'); h2.textContent = '目次'; nav.appendChild(h2); nav.appendChild(Util.buildTocList(root)); const parent = root.parentNode; if(parent.tagName === 'MAIN'){ parent.parentNode.insertBefore(nav, parent); } else { parent.insertBefore(nav, root); } } /** 語彙切替(内容生成) UI */ function create_word_switch(){ const w_switch = C('span'); new function(){ w_switch.className = '_hide_if_expanded'; let html = ''; source_data.levels.forEach(function(label, index){ html += '' ; }); w_switch.innerHTML = html; } check_level(); E('_view_control').appendChild(w_switch); w_switch.onclick = function(event){ let level = (event.target.id || '').match(/^_words_level(\w)$/); if(!level) return; level = parseInt(level[1]); const auto = isNaN(level); // _words_levelX if(auto){ level = (source_data.level + 1 ) % source_data.levels.length; } if(level === source_data.level) return; Util.switchView(function(){ source_data.switchWords(level); }, true); Util.setState('words', source_data.level); if(auto){ check_level(); } } function check_level(){ w_switch.children[source_data.level + 1].firstChild.checked = true; } } } Util.rxp_wordsX = /\b ((?:<\/[^>]*>)+)|([\u2E80-\u9FFF])(?=(<\w[^>]*>)*\w)/g; /** 単語置換(送り仮名込み) 1 = 送り仮名1文字目 2 = 送り仮名2文字目 サ = [さしすせ] * = 任意 ? = 任意,mappingに利用 / = 語尾なし 語12 結果 例 語?? mapping[語 ??] 満たす →satisfyする|満たす 語でき mapping[語-]12 定義 + でき →define|定義 + でき 語?* mapping[語 ?]2 共通の + * →common|共通の + * 語?/ mapping[語 ?]/ 渡す →passする|渡す 語サ* mapping[語-]12 定義 + され →define|定義 + され 語サ/ mapping[語-]1/ 定義 + し →define|定義 + し 語** mapping[語 ]12 定義 + ** →definition|定義 + ** 語*/ mapping[語 ]1/ 定義 + * →definition|定義 + * 語// mapping[語 ]// 定義 →definition|定義 々U+3005 、U+3001 。U+3002 ,U+FF0C */ Util.rxp_words1 = /~([\w\-]+|[あ-ん])|(~*)(((?:[\u4E00-\u9FFF]+|[\u30A1-\u30F4ー]+)\w*)(-|[あ-ん]{0,2}))/g; Util.replaceWords1 = function(data, mapping){ return data.replace( this.rxp_words1, function(t, en, til, ja, kan, hira){ if(en){ if(en[0] > '~') return en; return (en in mapping)? mapping[en] : t; } if(til === '~~') return ja; let r = mapping[ja]; if(r) return r; if(hira.length === 0){ return ja; } if(hira === 'でき') { r = mapping[kan + '-']; if(r) return r + hira; } const hira1 = hira[0]; r = mapping[kan + hira1]; if(r) return r + hira.slice(1); if('さしすせ'.indexOf(hira1) >= 0) { r = mapping[kan + '-']; if(r) return r + hira; } r = mapping[kan]; if(r) return r + hira; return hira === '-' ? kan : ja; }) .replace(this.rxp_wordsX, '$1$2 '); }; COMMON_DATA.PREMAP = ` 終: 名:\uE00A\uE008名前\uE005 述:\uE00B\uE008名前\uE005 用:\uE007~For\uE005 値:\uE007\uE006 新値:\uE007新たに定義される\uE006 新初:\uE007新たに定義される初期値\uE005 新算:\uE007新たに定義される算出値\uE005 初:\uE007初期値\uE005 適:\uE007適用対象\uE005 継:\uE007継承-\uE005 百:\uE007百分率\uE005 媒:\uE007媒体\uE005 算:\uE007算出値\uE005 順:\uE007正準的順序\uE005 ア:\uE007~animation\uE005 型:\uE007型\uE005 表終:\uE009 イ型:\uE00C\uE008型\uE005 界面:\uE007~interface\uE005 同期:\uE007同期?\uE005 浮上:\uE007浮上-?\uE005 標的:\uE007標的\uE005 取消:\uE007取消~可?\uE005 構:\uE007Composed?\uE005 既定動作:\uE007既定~動作\uE005 文脈:\uE007文脈~情報\uE005 `; /* "終" は "⇒" の終端用 CSS propdef 名:

名前 述:
名前 対:
~For 値:
新値:
新たに定義される値 新初:
新たに定義される初期値 新算:
新たに定義される算出値 初:
初期値 適:
適用対象 継:
継承- 百:
百分率 媒:
媒体 算:
算出値 順:
正準的順序 ア:
~animation 型:
表終:
UIEVENTS CSS eventdef イ型:
界面:
~interface 同期:
同期? 浮上:
浮上-? 標的:
標的 取消:
取消可? 構:
Composed? 既定動作:
既定~動作 文脈:
文脈~情報 */ COMMON_DATA.SYMBOLS = ` THROW:THROW WHILE:WHILE RET:RETURN IF:IF ELSE:ELSE ELIF:ELSE IF ELSE_:他の場合は OTHER:その他 FOR: EACH: GOTO:GOTO BREAK:BREAK CONTINUE:CONTINUE 此れ:これ° Assert:Assert MUST:なければならない MUST_NOT:ならない SHOULD:べき MAY:よい AND: OR: NOT:¬ EQ: NEQ: LET: :← SET: ← F:false T:true ON:ON OFF:OFF NULL: null PLUS: + MINUS: MUL: × DIV: ÷ MOD: % DECBY: −= INCBY: += GT: > LT: < LTE: GTE: IN: NIN: SYMBOL_DEF_REF:アルゴリズムに共通して用いられる表記 INFORMATIVE:

この節は規範的ではない。This section is non-normative.

FINGERPRINTING: SPECBUGS:https://www.w3.org/Bugs/Public/show_bug.cgi CSSisaLANG:

CSS とは…

TR:https://www.w3.org/TR IETF:https://tools.ietf.org/html TC39:https://tc39.github.io/ecma262/ INFRA:infra-ja.html DOM4:DOM4-ja.html DOM-Parsing:DOM-Parsing-ja.html ENCODING:Encoding-ja.html FETCH:Fetch-ja.html SW:https://w3c.github.io/ServiceWorker/ FILEAPI:File_API-ja.html STREAMS:Streams-ja.html URL1:URL-ja.html MIMESNIFF:mimesniff-ja.html FULLSCREEN:fullscreen-ja.html NOTIFICATIONS:notifications-ja.html WEBIDL:WebIDL-ja.html XHR:XHR-ja.html UIEVENTS:uievents-ja.html RFC7230:RFC7230-ja.html RFC7231:RFC7231-ja.html RFC7232:RFC7232-ja.html RFC7234:RFC7234-ja.html HTTPweblink:http-web-linking-ja.html HTTPcookie:RFC6265-ja.html CSSWG:https://drafts.csswg.org CSSissue:https://github.com/w3c/csswg-drafts/issues CSS22:https://www.w3.org/TR/CSS22 CSS22:https://drafts.csswg.org/css2 CSS21:https://www.w3.org/TR/CSS21 CSP3:CSP3-ja.html COMPOSITING:compositing-ja.html FILTEREFFECTS1:filter-effects-ja.html MASKING1:css-masking-ja.html CASCADE:css-cascade-ja.html CSS2BOX:css22-box-ja.html CSS2CONFORM:css-common-ja.html CSS2VISUDET:css22-visudet-ja.html CSS2VISUFX:css22-visufx-ja.html CSS2VISUREN:css22-visuren-ja.html CSSALIGN:css-align-ja.html CSSANIM:css-animations-ja.html CSSBG:css-backgrounds-ja.html CSSBREAK:css-break-ja.html CSSCOLOR:css-color-ja.html CSSCOND:css-conditional-ja.html CSSCOUNTER:css-counter-styles-ja.html CSSDISP:css-display-ja.html CSSEXCLUSION:css-exclusions-ja.html CSSFLEX:css-flexbox-ja.html CSSFONT:css-fonts-ja.html CSSGRID:css-grid-ja.html CSSIMAGE:css-images-ja.html CSSIMAGE4:css-images4-ja.html CSSINLINE:css-inline-ja.html CSSLOGICAL:css-logical-ja.html CSSMCOL:css-multicol-ja.html CSSNS:css-namespaces-ja.html CSSOM1:cssom-ja.html CSSOMVIEW:cssom-view-ja.html CSSOVERFLOW:https://drafts.csswg.org/css-overflow-4/ CSSOVERFLOW3:css-overflow3-ja.html CSSPAGE:css-page-ja.html CSSPOS:https://drafts.csswg.org/css-position-3/ CSSRUBY:css-ruby-ja.html CSSREGION:https://drafts.csswg.org/css-regions-1/ CSSPSEUDO:css-pseudo-ja.html CSSSTYLEATTR:css-style-attr-ja.html CSSSYN:css-syntax-ja.html CSSTEXT:css-text-ja.html CSSTEXTDECOR:css-text-decor-ja.html CSSTIMING:css-timing-ja.html CSSUI:css-ui-ja.html CSSVAL:css-values-ja.html CSSVAR:css-variables-ja.html CSSWM:css-writing-modes-ja.html SELECTORS4:selectors4-ja.html SIZING:css-sizing-ja.html TRANSFORM:css-transforms-ja.html TRANSFORM2:css-transforms2-ja.html TRANSITION:css-transitions-ja.html WANIM:web-animations-ja.html MQ4:mediaqueries4-ja.html SVG11:SVG11 SVG2:https://svgwg.org/svg2-draft HTMLLS:https://html.spec.whatwg.org/multipage HTML50:https://www.w3.org/TR/html5 ARIA1:https://w3c.github.io/aria/ BROWSERS:browsers-ja.html WINDOW:HTML-window-ja.html ORIGIN:HTML-origin-ja.html HISTORY:HTML-history-ja.html NAVI:HTML-navigation-ja.html WAPI:webappapis-ja.html HTMLGAPI:HTML-global-api-ja.html HTMLINFRA:HTML-infrastructure-ja.html HTMLdep:HTML-dependencies-ja.html HTMLcms:HTML-common-microsyntaxes-ja.html HTMLcdom:HTML-common-dom-interfaces-ja.html HTMLurl:HTML-urls-and-fetching-ja.html HTMLcloning:HTML-structured-data-ja.html HTMLcomms:HTML-comms-ja.html HTMLsse:HTML-server-sent-events-ja.html HTMLdnd:HTML-dnd-ja.html HTMLdom:HTML-dom-ja.html HTMLforms:HTML-forms-ja.html HTMLautofill:HTML-autofill-ja.html HTMLindex:HTML-index-ja.html HTMLlinks:HTML-links-ja.html HTMLnavigator:HTML-navigator-ja.html HTMLinteraction:HTML-interaction-ja.html HTMLrendering:HTML-rendering-ja.html HTMLselectors:selectors-html-ja.html HTMLxml:HTML-xhtml-ja.html HTMLwriting:HTML-writing-ja.html HTMLparsing:HTML-parsing-ja.html HTMLdynamic:HTML-dynamic-markup-insertion-ja.html HTMLobs:HTML-obsolete-ja.html HEinteractive:HTML-interactive-elements-ja.html HEforms:HTML-form-elements-ja.html HEinput:HTML-input-ja.html HEmetadata:HTML-metadata-ja.html HEgrouping:HTML-grouping-ja.html HEedits:HTML-edits-ja.html HEimages:HTML-images-ja.html HEembed:HTML-embed-ja.html HEmedia:HTML-media-ja.html HEcustom:HTML-custom-ja.html HEtextlevel:HTML-text-level-ja.html HEsections:HTML-sections-ja.html HEscripting:HTML-scripting-ja.html HEcanvas:https://html.spec.whatwg.org/multipage/canvas.html HEtables:HTML-tables-ja.html WORKERS:Workers-ja.html WORKLETS1:worklets-ja.html WEBSOCKET:WebSocket-ja.html WEBSTORAGE:WebStorage-ja.html INDEXEDDB:IndexedDB-ja.html PROMISES:promises-guide-ja.html TIMELINE:performance-timeline-ja.html HRTIME:hr-time-ja.html FEATUREPOLICY:feature-policy-ja.html REFERRER-POLICY:webappsec-referrer-policy-ja.html MIXED-CONTENT:webappsec-mixed-content-ja.html SECURE-CONTEXT:webappsec-secure-contexts-ja.html `; /** 語彙 */ COMMON_DATA.WORDS = '';