This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| yivalkes:nest [2026/03/22 01:40] – [Glossary] mangotrain | yivalkes:nest [2026/03/28 08:06] (current) – [Glossary] mangotrain | ||
|---|---|---|---|
| Line 5: | Line 5: | ||
| Studied here is less its topography than its main spoken and written language, Yivalese. | Studied here is less its topography than its main spoken and written language, Yivalese. | ||
| - | * [[font|Pen and Stylus scripts of the Yivalkes]] | + | ===== Writing system ===== |
| - | * [[script|The 8x8 YzWr Syllabary & Biliterals]] | + | |
| - | * [[font: | + | |
| + | Some things stay constant over the centuries, while some others change. | ||
| + | |||
| + | ^ All ^ Rustic ^ Modern ^ | ||
| + | | [[script|The 8x8 YzWr Syllabary & Biliterals]] | [[font|Pen and Stylus scripts of the Yivalkes]] | [[font: | ||
| + | | [[yivalkes: | ||
| ===== Glossary ===== | ===== Glossary ===== | ||
| + | |||
| + | * [[grammar|Grammar]] of Yivalese, or Yivalkerobba. | ||
| + | * [[ipa|IPA equivalencies]] to written text, for ease of on-the-spot phonetics. | ||
| * [[yivalkes: | * [[yivalkes: | ||
| - | * [[yivalkes: | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| Line 18: | Line 23: | ||
| * [[yivalkes: | * [[yivalkes: | ||
| + | * [[yivalkes: | ||
| + | |||
| + | |||
| + | < | ||
| + | < | ||
| + | < | ||
| + | (function(){ | ||
| + | const wordsEl = document.getElementById(' | ||
| + | const lastEl | ||
| + | if (!wordsEl && !lastEl) return; | ||
| + | |||
| + | const apiUrl = ' | ||
| + | |||
| + | function ordinal(n) { | ||
| + | const s = [" | ||
| + | return n + (s[(v-20)%10] || s[v] || s[0]); | ||
| + | } | ||
| + | |||
| + | function prettyDate(d) { | ||
| + | const months = [" | ||
| + | const year = d.getFullYear(); | ||
| + | const month = months[d.getMonth()]; | ||
| + | const day = ordinal(d.getDate()); | ||
| + | const now = new Date(); | ||
| + | return (year === now.getFullYear()) ? (month + ' ' + day) : (month + ' ' + day + ', ' + year); | ||
| + | } | ||
| + | |||
| + | function relativeTime(d) { | ||
| + | const now = new Date(); | ||
| + | const diffMs = now - d; | ||
| + | const sec = Math.floor(diffMs / 1000); | ||
| + | const min = Math.floor(sec / 60); | ||
| + | const hr = Math.floor(min / 60); | ||
| + | const days = Math.floor(hr / 24); | ||
| + | if (days >= 2) return days + ' days ago'; | ||
| + | if (days === 1) return '1 day ago'; | ||
| + | if (hr >= 1) return hr + ' hours ago'; | ||
| + | if (min >= 1) return min + ' minutes ago'; | ||
| + | return 'just now'; | ||
| + | } | ||
| + | |||
| + | function parseDateMaybe(s) { | ||
| + | if (!s) return null; | ||
| + | let d = new Date(s); | ||
| + | if (!isNaN(d.getTime())) return d; | ||
| + | d = new Date(s + ' | ||
| + | if (!isNaN(d.getTime())) return d; | ||
| + | return null; | ||
| + | } | ||
| + | |||
| + | fetch(apiUrl, | ||
| + | if (!json || json.status !== ' | ||
| + | if (wordsEl) wordsEl.textContent = ' | ||
| + | if (lastEl) lastEl.textContent = ' | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | const wordCount = (' | ||
| + | const added = (' | ||
| + | const modified = (' | ||
| + | |||
| + | const rawDate = json.date_for_display || (json.info && (json.info.date_from_github || json.info.date_from_uses)) || json.normalized_date || ''; | ||
| + | const d = parseDateMaybe(rawDate); | ||
| + | |||
| + | if (wordsEl) { | ||
| + | wordsEl.textContent = (wordCount !== null) ? String(wordCount) : ' | ||
| + | } | ||
| + | if (lastEl) { | ||
| + | if (!d) { | ||
| + | lastEl.textContent = rawDate || ' | ||
| + | return; | ||
| + | } | ||
| + | const rel = relativeTime(d); | ||
| + | const pretty = prettyDate(d); | ||
| + | const parts = []; | ||
| + | if (added && Number(added) > 0) parts.push(' | ||
| + | if (modified && Number(modified) > 0) parts.push(Number(modified) + ' modified' | ||
| + | const suffix = parts.length ? ' (' + parts.join(', | ||
| + | lastEl.textContent = rel + ', ' + pretty + ' | ||
| + | } | ||
| + | }).catch(err => { | ||
| + | if (wordsEl) wordsEl.textContent = ' | ||
| + | if (lastEl) lastEl.textContent = ' | ||
| + | console.error(' | ||
| + | }); | ||
| + | })(); | ||
| + | </ | ||
| + | </ | ||