diff --git a/.github/workflows/site.yml b/.github/workflows/site.yml index 87f2021f978..3f7946caf03 100644 --- a/.github/workflows/site.yml +++ b/.github/workflows/site.yml @@ -34,6 +34,8 @@ jobs: bundler-cache: true - name: Setup Jekyll run: 'gem install bundler jekyll kramdown-parser-gfm webrick' + - name: Setup assets + run: 'cd docs/site/assets && npm ci && npm run build' - name: Build cldr.pages.dev run: 'cd docs/site && jekyll build' - name: Pre-install Wrangler diff --git a/docs/site/.gitignore b/docs/site/.gitignore new file mode 100644 index 00000000000..9fbbb2c6f27 --- /dev/null +++ b/docs/site/.gitignore @@ -0,0 +1,2 @@ +/node_modules +/assets/json diff --git a/docs/site/_config.yml b/docs/site/_config.yml index ab7eabda587..65571896a21 100644 --- a/docs/site/_config.yml +++ b/docs/site/_config.yml @@ -19,3 +19,6 @@ defaults: values: layout: page +include: + - node_modules + diff --git a/docs/site/_layouts/page.html b/docs/site/_layouts/page.html index adff46349b0..34abe8b81c8 100644 --- a/docs/site/_layouts/page.html +++ b/docs/site/_layouts/page.html @@ -14,23 +14,25 @@
[Unicode]   - - - CLDR Site / {{page.title}} - - + +
-
Home - | Site - Map | Search
+ + +
{{ content }}
+ + diff --git a/docs/site/assets/css/page.css b/docs/site/assets/css/page.css index 50fbaf70a46..2c6a3403a17 100644 --- a/docs/site/assets/css/page.css +++ b/docs/site/assets/css/page.css @@ -21,6 +21,19 @@ header > div.icon { flex-grow: 1; } +header .title { + color: white; + font-size: 1.5em; +} + +header .nav, header .nav > div { + display: inline; +} + +header .nav a, header .nav .title { + color: white; +} + footer { width: 100%; margin-left: auto; diff --git a/docs/site/assets/js/build.mjs b/docs/site/assets/js/build.mjs new file mode 100644 index 00000000000..a60b51d82d5 --- /dev/null +++ b/docs/site/assets/js/build.mjs @@ -0,0 +1,60 @@ +// extract site frontmatter, save to json + +import * as fs from 'node:fs/promises'; +import * as path from 'node:path'; +import { default as process } from 'node:process'; +import { default as matter } from 'gray-matter'; + + +const SKIP_THESE = /(node_modules|\.jekyll-cache)/; + + +async function processFile(d, fullPath, out) { + const f = await fs.readFile(fullPath, 'utf-8'); + const m = matter(f); + if (m && m.data) { + const { data } = m; + out.all.push({ ...data, fullPath }); + } else { + out.app.push({ fullPath }); // synthesize data? + } +} + +/** process one dirent */ +async function processEntry(d, out, e) { + const fullpath = path.join(d, e.name); + if (SKIP_THESE.test(e.name)) return; + if (e.isDirectory()) { + return await traverse(fullpath, out); + } else if(!e.isFile() || !/\.md$/.test(e.name)) { + return; + } + await processFile(d, fullpath, out); +} + +/** + * @param {string} d path to directory + * @param {object} out output struct + */ +async function traverse(d, out) { + const dirents = await fs.readdir(d, { withFileTypes: true }); + const promises = dirents.map(e => processEntry(d, out, e)); + return Promise.all(promises); +} + +async function main() { + const out = { + all: [], + dirs: {}, + }; + await traverse('.', out); + await fs.writeFile('assets/json/tree.json', JSON.stringify(out, null, ' ')); +} + +main().then(() => console.log('Done.'), (e) => { + console.error(e); + process.exitCode = 1; +}); + + + diff --git a/docs/site/assets/js/cldrsite.js b/docs/site/assets/js/cldrsite.js new file mode 100644 index 00000000000..623a7cbaaa2 --- /dev/null +++ b/docs/site/assets/js/cldrsite.js @@ -0,0 +1,207 @@ +const { ref } = Vue; + +// site management + +/** replace a/b/c.md with a/b */ +function path2dir(p) { + const dir = p.split('/').slice(0,-1).join('/'); + return dir; +} + +/** replace a/b/c.md with a/b/c.html */ +function md2html(p) { + return (p.replace(/\.md$/,'.html')); +} + +/** replace a/b/c.html with a/b/c.md */ +function html2md(p) { + return (p.replace(/\.html$/,'.md')); +} + +/** load and cook the site data */ +async function siteData() { + // load the json + const d = await fetch('/assets/json/tree.json'); + const j = await d.json(); + const { all } = j; + + // 'all' is an array of { title, fullPath } entries. + // Flat list of paths + const allPaths = all.map(({fullPath})=>(fullPath)); + // Find all 'directories' (ending with /) + const allDirs = new Set(); + allPaths.forEach(p => { + const segs = p.split('/').slice(0,-1); // ['', 'dir1'] + for(let n=0; n<=segs.length; n++) { + // add all parent paths, so: '', dir1, dir1/dir2 etc. + const subpath = segs.slice(0,n).join('/'); + allDirs.add(subpath); + } + }); + j.allDirs = {}; + j.allIndexes = []; + // allDirs: '', index, downloads, etc… + allDirs.forEach(dir => { + // presumed index page: /downloads -> /downloads.md + // also / -> /index.md + const dirIndex = `${dir || 'index'}.md`; + // console.dir({dir, dirIndex}); + if (allPaths.indexOf(dirIndex) !== -1) { + j.allDirs[dir] = {index: dirIndex}; + j.allIndexes.push(dirIndex); + } else { + console.error(`No index page: ${dirIndex}`); + j.allDirs[dir] = {}; + } + j.allDirs[dir].pages = []; + }); + allPaths.forEach(p => { + const dir = path2dir(p); + j.allDirs[dir].pages.push(p); + }); + // map md -> title + j.title = {}; + all.forEach(({title, fullPath}) => j.title[fullPath] = title); + return j; +} + + +const app = Vue.createApp({ + setup(props) { + const tree = ref({}); + const status = ref(null); + + return { + tree, + status, + } + }, + mounted() { + const t = this; + siteData().then(d => t.tree.value = d, e => t.status = e); + }, + props: { + path: String, + }, + computed: { + mdPath() { + if(this.path) { + return html2md(this.path) + } + return null; + }, + ourDir() { + if(this.path) { + return path2dir(this.path); + } + return ''; + }, + ourIndex() { + if(this.tree?.value) { + // first ARE we an index page? + if (this.tree.value.allIndexes.indexOf(this.mdPath) != -1) { + return this.mdPath; // we are an index + } + return this.tree.value.allDirs[this.ourDir].index; + } + return null; + }, + ourIndexHtml() { + if (this.ourIndex) { + return md2html(this.ourIndex); + } else { + return null; + } + }, + ourIndexTitle() { + if (this.ourIndex && this.tree?.value) { + return this.tree.value.title[this.ourIndex] || this.ourIndex; + } else { + return null; + } + }, + ourTitle() { + if (this.tree?.value) { + if (this.path === '') return this.rootTitle; + return this.tree.value.title[html2md(this.path)]; + } + }, + // title of root + rootTitle() { + return this.tree?.value?.title['index.md']; + }, + // list of pages for siblings of this dir + siblingPages() { + if (!this.tree?.value) return []; + const dirForPage = this.ourDir; + let thePages = this.tree?.value?.allDirs[dirForPage].pages ?? []; + if (dirForPage === '') { + thePages = [...thePages, ...this.tree?.value?.allDirs['index'].pages]; + } + const c = new Intl.Collator([]); + return ( thePages ) + .map((path) => ({ + path, + html: md2html(path), + title: this.tree.value.title[path] ?? path, + })) + .sort((a, b) => c.compare(a.title, b.title)); + }, + }, + template: `
+
{{ status }}
+
Loading…
+ + {{ rootTitle }} | + + + + + {{ ourIndexTitle }} + + | + + {{ ourTitle }} + +
` +}, { + // path of / goes to /index.html + path: (window.location.pathname.slice(1) || 'index.html'), +}); + +app.component( + 'CldrPage', + { + setup() { + + }, + template: `

Hello

+ ` + } +); + +app.component( + 'CldrList', + { + setup() { + + }, + template: ` +

Hullo

+ ` + } +); + + +app.mount('#nav'); diff --git a/docs/site/development.md b/docs/site/development.md index b19d1fd381b..6b3107bbb66 100644 --- a/docs/site/development.md +++ b/docs/site/development.md @@ -4,4 +4,4 @@ title: Internal Development # Internal Development -![Unicode copyright](https://www.unicode.org/img/hb_notice.gif) \ No newline at end of file +![Unicode copyright](https://www.unicode.org/img/hb_notice.gif) diff --git a/docs/site/development/development-process.md b/docs/site/development/development-process.md index 93ec64d24f9..d48ae78ae53 100644 --- a/docs/site/development/development-process.md +++ b/docs/site/development/development-process.md @@ -11,9 +11,9 @@ title: Handling Tickets (bugs/enhancements) ### Pre\-Assessment for Weekly Triage -*There is a pre\-assessment of tickets to make the triage flow faster. This pre\-assessment should be done off\-line prior to every Wednesday in time for the TC triage. DO NOT fix a bug until it's been approved by the TC in triage.* +*There is a pre\-assessment of tickets to make the triage flow faster. This pre\-assessment should be done off\-line prior to every Wednesday in time for the TC triage. DO NOT fix a bug until it's been approved by the TC in triage.* -*The triage is a part of Monday and Wednesday meetings.* +*The triage is a part of Monday and Wednesday meetings.* 1. Ticket comes in, and the default is **Priority**\=assess, **Milestone**\=to\-assess 1. If user sets Component (we always should!) automatically assigns the Owner based on the component owner for the pre\-assessment. \[Add link to Components and Owner] @@ -22,7 +22,7 @@ title: Handling Tickets (bugs/enhancements) 2. All TC members, look at [To\-assess by Owner / Component](https://unicode.org/cldr/trac/report/100) before each triage day. 1. Assess the **to\-assess** tickets assigned to you. 2. You can close bugs as duplicate or if user misunderstanding if it is very clear without committee discussion. Always include a comment if you close the ticket. - 3. If the component is wrong, change component and reassign to the right component owner. + 3. If the component is wrong, change component and reassign to the right component owner. 1. (TODO: copy components to that page, and add notes to clarify; if possible, link to list of components \+ descriptions at top of new ticket). http://cldr.unicode.org/index/bug\-reports 4. Add your assessment information: 1. Change **Milestone** to “assessed” @@ -36,7 +36,7 @@ title: Handling Tickets (bugs/enhancements) 1. Follow the triage practice by making changes to all fields, Owner, Component, Priority, … or closing the ticket. 2. Update Milestone to one of the following (VV \= the current milestone, eg 35\) 1. **VV** if the (new) Owner agrees that it is a priority — and has some level of commitment to fix during release - 2. **VV\-optional**, eg 35\-optional + 2. **VV\-optional**, eg 35\-optional 1. A **future** milestone 3. Triage decides whether it's for Design or Accepted. (**design** indicates for more discussion needed. See design section below.). 5. Other ticket handling practices: @@ -48,7 +48,7 @@ title: Handling Tickets (bugs/enhancements) ### Design -When a ticket is in design, the owner is responsible for bringing back to the committee to approve the design before any lasting (aside from tests, instrumentation, etc.) work is checked in. +When a ticket is in design, the owner is responsible for bringing back to the committee to approve the design before any lasting (aside from tests, instrumentation, etc.) work is checked in. 1. The Owner is responsible for documenting the results of the discussion in the TC in comments in the ticket. 2. The Reviewer is responsible for verifying that the design was accepted by the TC before accepting. @@ -166,4 +166,4 @@ If there is a test failure that is due to a bug that cannot be fixed right now ( 1. The future folder tickets are moved to the discuss folder 2. Unscheduled tickets (with no release number) are re\-evaluated. -![Unicode copyright](https://www.unicode.org/img/hb_notice.gif) \ No newline at end of file +![Unicode copyright](https://www.unicode.org/img/hb_notice.gif) diff --git a/docs/site/downloads.md b/docs/site/downloads.md new file mode 100644 index 00000000000..c0ba26dd517 --- /dev/null +++ b/docs/site/downloads.md @@ -0,0 +1,4 @@ +--- +title: CLDR Downloads +--- + diff --git a/docs/site/index/corrigenda.md b/docs/site/index/corrigenda.md index 1359fe007ae..7da7241fe63 100644 --- a/docs/site/index/corrigenda.md +++ b/docs/site/index/corrigenda.md @@ -1,5 +1,5 @@ --- -title: CLDR Releases/Downloads +title: Corrigenda and Errata --- # Corrigenda and Errata @@ -15,4 +15,4 @@ At this time, there is only one Corrigendum: Each release of CLDR is a stable release and may be used as reference material or cited as a normative reference by other specifications. Each version, once published, is absolutely stable and will never change. However, implementations may - and are encouraged to - apply fixes for corrigenda and errata to their use of an appropriate version. For example, an implementation may claim conformance to "CLDR 1.3, as amended by Corrigendum 1". -![Unicode copyright](https://www.unicode.org/img/hb_notice.gif) \ No newline at end of file +![Unicode copyright](https://www.unicode.org/img/hb_notice.gif) diff --git a/docs/site/package-lock.json b/docs/site/package-lock.json new file mode 100644 index 00000000000..61e53a3ef3b --- /dev/null +++ b/docs/site/package-lock.json @@ -0,0 +1,368 @@ +{ + "name": "@unicode-org/cldr-site", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@unicode-org/cldr-site", + "version": "1.0.0", + "license": "Unicode-3.0", + "dependencies": { + "gray-matter": "^4.0.3", + "vue": "^3.5.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "dependencies": { + "@babel/types": "^7.25.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.0.tgz", + "integrity": "sha512-ja7cpqAOfw4tyFAxgBz70Z42miNDeaqTxExTsnXDLomRpqfyCgyvZvFp482fmsElpfvsoMJUsvzULhvxUTW6Iw==", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.0", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.0.tgz", + "integrity": "sha512-xYjUybWZXl+1R/toDy815i4PbeehL2hThiSGkcpmIOCy2HoYyeeC/gAWK/Y/xsoK+GSw198/T5O31bYuQx5uvQ==", + "dependencies": { + "@vue/compiler-core": "3.5.0", + "@vue/shared": "3.5.0" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.0.tgz", + "integrity": "sha512-B9DgLtrqok2GLuaFjLlSL15ZG3ZDBiitUH1ecex9guh/ZcA5MCdwuVE6nsfQxktuZY/QY0awJ35/ripIviCQTQ==", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.0", + "@vue/compiler-dom": "3.5.0", + "@vue/compiler-ssr": "3.5.0", + "@vue/shared": "3.5.0", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.44", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.0.tgz", + "integrity": "sha512-E263QZmA1dqRd7c3u/sWTLRMpQOT0aZ8av/L9SoD/v/BVMZaWFHPUUBswS+bzrfvG2suJF8vSLKx6k6ba5SUdA==", + "dependencies": { + "@vue/compiler-dom": "3.5.0", + "@vue/shared": "3.5.0" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.0.tgz", + "integrity": "sha512-Ew3F5riP3B3ZDGjD3ZKb9uZylTTPSqt8hAf4sGbvbjrjDjrFb3Jm15Tk1/w7WwTE5GbQ2Qhwxx1moc9hr8A/OQ==", + "dependencies": { + "@vue/shared": "3.5.0" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.0.tgz", + "integrity": "sha512-mQyW0F9FaNRdt8ghkAs+BMG3iQ7LGgWKOpkzUzR5AI5swPNydHGL5hvVTqFaeMzwecF1g0c86H4yFQsSxJhH1w==", + "dependencies": { + "@vue/reactivity": "3.5.0", + "@vue/shared": "3.5.0" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.0.tgz", + "integrity": "sha512-NQQXjpdXgyYVJ2M56FJ+lSJgZiecgQ2HhxhnQBN95FymXegRNY/N2htI7vOTwpP75pfxhIeYOJ8mE8sW8KAW6A==", + "dependencies": { + "@vue/reactivity": "3.5.0", + "@vue/runtime-core": "3.5.0", + "@vue/shared": "3.5.0", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.0.tgz", + "integrity": "sha512-HyDIFUg+l7L4PKrEnJlCYWHUOlm6NxZhmSxIefZ5MTYjkIPfDfkwhX7hqxAQHfgIAE1uLMLQZwuNR/ozI0NhZg==", + "dependencies": { + "@vue/compiler-ssr": "3.5.0", + "@vue/shared": "3.5.0" + }, + "peerDependencies": { + "vue": "3.5.0" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.0.tgz", + "integrity": "sha512-m9IgiteBpCkFaMNwCOBkFksA7z8QiKc30ooRuoXWUFRDu0mGyNPlFHmbncF0/Kra1RlX8QrmBbRaIxVvikaR0Q==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + }, + "node_modules/postcss": { + "version": "8.4.44", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.44.tgz", + "integrity": "sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/vue": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.0.tgz", + "integrity": "sha512-1t70favYoFijwfWJ7g81aTd32obGaAnKYE9FNyMgnEzn3F4YncRi/kqAHHKloG0VXTD8vBYMhbgLKCA+Sk6QDw==", + "dependencies": { + "@vue/compiler-dom": "3.5.0", + "@vue/compiler-sfc": "3.5.0", + "@vue/runtime-dom": "3.5.0", + "@vue/server-renderer": "3.5.0", + "@vue/shared": "3.5.0" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + } + } +} diff --git a/docs/site/package.json b/docs/site/package.json new file mode 100644 index 00000000000..f4095933d42 --- /dev/null +++ b/docs/site/package.json @@ -0,0 +1,18 @@ +{ + "name": "@unicode-org/cldr-site", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "node assets/js/build.mjs" + }, + "keywords": [], + "author": "Steven R. Loomis ", + "license": "Unicode-3.0", + "description": "Static Assets for CLDR Site", + "private": true, + "dependencies": { + "gray-matter": "^4.0.3", + "vue": "^3.5.0" + } +} diff --git a/tools/scripts/web/docker/README.md b/tools/scripts/web/docker/README.md index 73d23405b86..7a248e1bf57 100644 --- a/tools/scripts/web/docker/README.md +++ b/tools/scripts/web/docker/README.md @@ -1,5 +1,9 @@ # Docker for CLDR Site +## Installing assets + +1. run `npm i` and `npm run build` in `docs/site` + ## Previewing locally 1. install https://docker.io