diff --git a/assets/cena-trimalchionis.json b/assets/cena-trimalchionis.json index 9a4418c..8e0ff03 100644 --- a/assets/cena-trimalchionis.json +++ b/assets/cena-trimalchionis.json @@ -196,7 +196,7 @@ }, { "chapter": "LXXIV", - "body": "[LXXIV] Haec dicente eo gallus gallinaceus cantavit. Qua voce confusus Trimalchio vinum sub mensa iussit effundi lucernamque etiam mero spargi. Immo anulum traiecit in dexteram manum et: \"Non sine causa, inquit, hic bucinus signum dedit; nam aut incendium oportet fiat, aut aliquis in vicinia animam abiciat. Longe a nobis! Itaque quisquis hunc indicem attulerit, corollarium accipiet.\" Dicto citius de vicinia gallus allatus est, quem Trimalchio iussit ut aeno coctus fieret. Laceratus igitur ab illo doctissimo coco, qui paulo ante de porco aves piscesque fecerat, in caccabum est coniectus. Dumque Daedalus potionem ferventissimam haurit, Fortunata mola buxea piper trivit.\nSumptis igitur matteis, respiciens ad familiam Trimalchio: \"Quid vos, inquit, adhuc non cenastis? Abite, ut alii veniant ad officium.\" Subiit igitur alia classis, et illi quidem exclamavere: \"Vale Gai \", hi autem: \"Ave Gai.\" Hinc primum hilaritas nostra turbata est; nam cum puer non inspeciosus inter novos intrasset ministros, invasit eum Trimalchio et osculari diutius coepit. Itaque Fortunata, ut ex aequo ius firmum approbaret, male dicere Trimalchionem coepit et purgamentum dedecusque praedicare, qui non contineret libidinem suam. Vltimo etiam adiecit: \"canis!\". Trimalchio contra offensus convicio calicem in faciem Fortunatae immisit. Illa tanquam oculum perdidisset, exclamavit manusque trementes ad faciem suam admovit. Consternata est etiam Scintilla trepidantemque sinu suo texit. Immo puer quoque officiosus urceolum frigidum ad malam eius admovit, super quem incumbens Fortunata gemere ac flere coepit. Contra Trimalchio: \"Quid enim, inquit, ambubaia non meminit se? de machina illam sustuli, hominem inter homines feci. At inflat se tanquam rana, et in sinum suum non spuit, codex, non mulier. Sed hic, qui in pergula natus est, aedes non somniatur. Ita genium meum propitium habeam, curabo domata sit Cassandra caligaria. Et ego, homo dipundiarius, sestertium centies accipere potui. Scis tu me non mentiri. Agatho unguentarius here proxime seduxit me et: 'Suadeo, inquit, non patiaris genus tuum interire.' At ego dum bonatus ago et nolo videri levis, ipse mihi asciam in crus impegi. Recte, curabo me unguibus quaeras. Et, ut depraesentiarum intelligas quid tibi feceris: Habinna, nolo statuam eius in monumento meo ponas, ne mortuus quidem lites habeam. Immo, ut sciat me posse malum dare, nolo me mortuum basiet.\"" + "body": "Haec dicente eo gallus gallinaceus cantavit. Qua voce confusus Trimalchio vinum sub mensa iussit effundi lucernamque etiam mero spargi. Immo anulum traiecit in dexteram manum et: \"Non sine causa, inquit, hic bucinus signum dedit; nam aut incendium oportet fiat, aut aliquis in vicinia animam abiciat. Longe a nobis! Itaque quisquis hunc indicem attulerit, corollarium accipiet.\" Dicto citius de vicinia gallus allatus est, quem Trimalchio iussit ut aeno coctus fieret. Laceratus igitur ab illo doctissimo coco, qui paulo ante de porco aves piscesque fecerat, in caccabum est coniectus. Dumque Daedalus potionem ferventissimam haurit, Fortunata mola buxea piper trivit.\nSumptis igitur matteis, respiciens ad familiam Trimalchio: \"Quid vos, inquit, adhuc non cenastis? Abite, ut alii veniant ad officium.\" Subiit igitur alia classis, et illi quidem exclamavere: \"Vale Gai \", hi autem: \"Ave Gai.\" Hinc primum hilaritas nostra turbata est; nam cum puer non inspeciosus inter novos intrasset ministros, invasit eum Trimalchio et osculari diutius coepit. Itaque Fortunata, ut ex aequo ius firmum approbaret, male dicere Trimalchionem coepit et purgamentum dedecusque praedicare, qui non contineret libidinem suam. Vltimo etiam adiecit: \"canis!\". Trimalchio contra offensus convicio calicem in faciem Fortunatae immisit. Illa tanquam oculum perdidisset, exclamavit manusque trementes ad faciem suam admovit. Consternata est etiam Scintilla trepidantemque sinu suo texit. Immo puer quoque officiosus urceolum frigidum ad malam eius admovit, super quem incumbens Fortunata gemere ac flere coepit. Contra Trimalchio: \"Quid enim, inquit, ambubaia non meminit se? de machina illam sustuli, hominem inter homines feci. At inflat se tanquam rana, et in sinum suum non spuit, codex, non mulier. Sed hic, qui in pergula natus est, aedes non somniatur. Ita genium meum propitium habeam, curabo domata sit Cassandra caligaria. Et ego, homo dipundiarius, sestertium centies accipere potui. Scis tu me non mentiri. Agatho unguentarius here proxime seduxit me et: 'Suadeo, inquit, non patiaris genus tuum interire.' At ego dum bonatus ago et nolo videri levis, ipse mihi asciam in crus impegi. Recte, curabo me unguibus quaeras. Et, ut depraesentiarum intelligas quid tibi feceris: Habinna, nolo statuam eius in monumento meo ponas, ne mortuus quidem lites habeam. Immo, ut sciat me posse malum dare, nolo me mortuum basiet.\"" }, { "chapter": "LXXV", @@ -211,7 +211,7 @@ "body": "\"Rogo, Habinna — puto, interfuisti —: 'Tu dominam tuam de rebus illis fecisti. Tu parum felix in amicos es. Nemo unquam tibi parem gratiam refert. Tu latifundia possides. Tu viperam sub ala nutricas' et — quid vobis non dixerim — etiam nunc mi restare vitae annos triginta et menses quattuor et dies duos. Praeterea cito accipiam hereditatem. Hoc mihi dicit fatus meus. Quod si contigerit fundos Apuliae iungere, satis vivus pervenero. Interim dum Mercurius vigilat, aedificavi hanc domum. Vt scitis, casula erat; nunc templum est. Habet quattuor cenationes, cubicula viginti, porticus marmoratos duos, susum cellationem, cubiculum in quo ipse dormio, viperae huius sessorium, ostiarii cellam perbonam; hospitium hospites capit. Ad summam, Scaurus cnm huc venit, nusquam mavoluit hospitari, et habet ad mare paternum hospitium. Et multa alia sunt, quae statim vobis ostendam. Credite, mihi: assem habeas, assem valeas; habes, habeberis. Sic amicus vester, qui fuit rana, nunc est rex. Interim, Stiche, profer vitalia, in quibus volo me efferri. Profer et unguentum et ex illa amphora gustum, ex qua iubeo lavari ossa mea.\"" }, { - "chapter": "LXVIII", + "chapter": "LXXVIII", "body": "Non est moratus Stichus, sed et stragulam albam et praetextam in triclinium attulit. iussitque nos temptare, an bonis lanis essent confecta. Tum subridens: \"Vide tu, inquit, Stiche, ne ista mures tangant aut tineae; alioquin te vivum conburam. Ego gloriosus volo efferri, ut totus mihi populus bene imprecetur.\" Statim ampullam nardi aperuit omnesque nos unxit et: \"Spero, inquit, futurum ut aeque me mortuum iuvet tanquam vivum.\" Nam vinum quidem in vinarium iussit infundi et: \"Putate vos, ait, ad parentalia mea invitatos esse\".\nIbat res ad summam nauseam, cum Trimalchio ebrietate turpissima gravis novum acroama, cornicines, in triclinium iussit adduci, fultusque cervicalibus multis extendit se super torum extremum et: \"Fingite me, inquit, mortuum esse. Dicite aliquid belli.\" Consonuere cornicines funebri strepitu. Vnus praecipue servus libitinarii illius, qui inter hos honestissimus erat, tam valde intonuit, ut totam concitaret viciniam.\nItaque vigiles, qui custodiebant vicinam regionem, rati ardere Trimalchionis domum, effregerunt ianuam subito et cum aqua securibusque tumultuari suo iure coeperunt. Nos occasionem opportunissimam nacti Agamemnoni verba dedimus, raptimque tam plane quam ex incendio fugimus." } ] diff --git a/book/cena-trimalchionis.indd b/book/cena-trimalchionis.indd new file mode 100644 index 0000000..c4302a6 Binary files /dev/null and b/book/cena-trimalchionis.indd differ diff --git a/book/cena-trimalchionis.pdf b/book/cena-trimalchionis.pdf new file mode 100644 index 0000000..4c85670 Binary files /dev/null and b/book/cena-trimalchionis.pdf differ diff --git a/book/cena-trimalchionis.ps b/book/cena-trimalchionis.ps new file mode 100644 index 0000000..f0e73f7 Binary files /dev/null and b/book/cena-trimalchionis.ps differ diff --git a/book/scripts/missing_glyphs.jsx b/book/scripts/missing_glyphs.jsx new file mode 100644 index 0000000..7a73d31 --- /dev/null +++ b/book/scripts/missing_glyphs.jsx @@ -0,0 +1,216 @@ +//DESCRIPTION: List missing glyphs or apply selected font to missing glyphs. +// Peter Kahrel -- www.kahrel.plus.com +// Based on Peter Baumgartner's method, see http://forums.adobe.com/thread/1037284?tstart=0 + +if (parseInt (app.version) < 6) { + alert ('This script requires InDesign CS4 or later.'); + exit(); +} + + +if (app.documents.length > 0) { + main (); +} + + +function main () { + var data = get_data (); + if (data.replace) { + replace_missing_glyphs (data.replacement_font); + } else { + list_missing_glyphs (); + } +} + + +function replace_missing_glyphs (replacement_font) { + var j; + var found; + var errormsg = ''; + var docFonts = app.activeDocument.fonts.everyItem().getElements(); + + app.findGlyphPreferences = null; + for (var i = 0; i < docFonts.length; i++) { + if (docFonts[i].status == FontStatus.INSTALLED) { + app.findGlyphPreferences.glyphID = 0; + app.findGlyphPreferences.appliedFont = docFonts[i].fontFamily; + app.findGlyphPreferences.fontStyle = docFonts[i].fontStyleName; + found = app.activeDocument.findGlyph (); + for (j = 0; j < found.length; j++) { + found[j].appliedFont = replacement_font; + } + } else { + errormsg += docFonts[i].fontFamily + '\r'; + } + } + if (errormsg.length > 1) { + errormsg = 'The following fonts are not installed\r(or have an illegal font style specified)\rand were skipped:\r\r' + errormsg; + alert (errormsg); + } +} + + +function list_missing_glyphs () + { + var j, report = "", + known, miss, + docFonts = app.activeDocument.fonts.everyItem().getElements(); + + + for (var i = 0; i < docFonts.length; i++) + { + if (docFonts[i].status != FontStatus.INSTALLED) + { + //app.findGrepPreferences.appliedFont = docFonts[i] + //report += '['+docFonts[i].fontFamily+']\r'; + report += '['+docFonts[i].name+']\r'; + } + else + { + app.findGlyphPreferences = null; + app.findGlyphPreferences.glyphID = 0; + app.findGlyphPreferences.appliedFont = docFonts[i].fontFamily; + app.findGlyphPreferences.fontStyle = docFonts[i].fontStyleName; + found = app.activeDocument.findGlyph(); + if (found.length > 0) + { + known = {}; + report += docFonts[i].fontFamily + " (" + docFonts[i].fontStyleName + ")\r"; + for (j = 0; j < found.length; j++) + { + miss = get_hex (found[j]); + if (!known[miss]) + { + report += found[j].contents + "\t" + miss + "\r"; + known[miss] = true; + } + } + report += "\r"; + } + } + } + display_missing_glyphs (report); + } + + + +function get_hex (ch) + { + function pad (n) {return ('0000' + n).slice(-4);} + try + { + if (ch.contents.length == 2) + { // plane-1 and higher algorithm adapted from + // http://www.russellcottrell.com/greek/utilities/SurrogatePairCalculator .htm + var H = parseInt (ch.contents.charCodeAt(0).toString(16), 16); + var L = parseInt (ch.contents.charCodeAt(1).toString(16), 16); + var s = ((H - 0xD800) * 0x400) + (L - 0xDC00) + 0x10000; + return '\\x{' + s.toString(16).toUpperCase() + '}'; + } + // Plane-0 character; pad hex up to four characters + var s = ch.contents.charCodeAt(0).toString(16); + return '\\x{' + pad (s).toUpperCase() + '}'; + } + catch (_) {return 'U+????'} + } + + +function display_missing_glyphs (s) + { + var e, w = new Window ('dialog {text: "Missing glyphs", properties: {closeButton: false}}'); + if (s.length == 0) + { + s = "No missing glyphs." + e = w.add ('edittext', undefined, s); + } + else + e = w.add ('edittext', undefined, s, {multiline: true, scrolling: true}); + e.maximumSize.height = w.maximumSize.height-150; + + var b = w.add ('group') + b.add ('button {text: "Close", properties: {name: "ok"}}') + var save = b.add ('button {text: "Save"}'); + + save.onClick = function () + { + var outfile = File("~/Desktop/" + app.activeDocument.name.replace(/\.indd$/, '_missing_glyphs.txt')); + outfile.encoding = 'UTF-8'; + outfile.open ('w'); outfile.write (e.text); outfile.close(); outfile.execute(); + } + + w.show(); + } + + +function get_data () { + + var fontnames = find_fonts(); + var w = new Window ('dialog {text: "Missing glyphs", properties: {closeButton: false}}'); + var main = w.add ('panel {alignChildren: "left"}'); + var fontgroup = main.add ('group'); + var replacefonts = fontgroup.add ('checkbox {text: "Replace missing glyphs with font:"}'); + var replacement_font = fontgroup.add ('dropdownlist', undefined, fontnames); + var display = main.add ('checkbox {text: "Display missing glyphs and fonts"}'); + var buttons = w.add ('group {alignment: "right"}'); + + buttons.add ('button {text: "OK", name: "ok"}'); + buttons.add ('button {text: "Cancel", name: "cancel"}'); + + replacefonts.onClick = function () {display.value = !replacefonts.value} + display.onClick = function () {replacefonts.value = !display.value} + replacement_font.onChange = function () {display.value = 0; replacefonts.value = 1} + + var minion = replacement_font.find ("Minion Pro"); + if (minion != null) + replacement_font.selection = minion; + else + replacement_font.selection = 0; + + display.value = 1; + replacefonts.value = 0; + replacement_font.active = true; + current = replacement_font.selection.text; + + var i, buffer = ""; + replacement_font.onActivate = function () {buffer = ""; current = replacement_font.selection.text} + replacement_font.addEventListener ("keydown", function (k) + { + if (k.keyName == "Backspace") + { + buffer = buffer.replace (/.$/, ""); + if (buffer.length == 0) + buffer = current; + } + else + buffer += k.keyName.toLowerCase(); + i = 0; + while (i < fontnames.length-1 && fontnames[i].toLowerCase().indexOf (buffer) != 0) + {++i} + if (fontnames[i].toLowerCase().indexOf (buffer) == 0) + replacement_font.selection = i; + } + ); + + if (w.show() == 2) + exit(); + return {replace: replacefonts.value, replacement_font: replacement_font.selection.text} + } // get_data () + + + +function find_fonts () + { + var known = {}, + typefaces = [], + fontfamilies = app.fonts.everyItem().fontFamily; + + for (var i = 0; i < fontfamilies.length; i++) + { + if (!known[fontfamilies[i]]) + { + known[fontfamilies[i]] = true; + typefaces.push(fontfamilies[i]); + } + } + return typefaces; + } diff --git a/book/scripts/styles-to-missing-glyphs.jsx b/book/scripts/styles-to-missing-glyphs.jsx new file mode 100644 index 0000000..bb53ba5 --- /dev/null +++ b/book/scripts/styles-to-missing-glyphs.jsx @@ -0,0 +1,126 @@ +/** + * Apply missing glyphs with a specified Character Style. + * @author jonobr1 / http://jonobr1.com + * Based on Peter Kahrel's method -- www.kahrel.plus.com + * Which is based on Peter Baumgartner's method, see http://forums.adobe.com/thread/1037284?tstart=0 + */ + +if (parseInt (app.version) < 6) { + alert ('This script requires InDesign CS4 or later.'); + exit(); +} + +if (app.documents.length > 0) { + main (); +} + +function main () { + var data = get_data(); + replace_missing_glyphs(data.styleName); +} + +function replace_missing_glyphs (replacement_styles) { + + var j; + var found; + var errormsg = ''; + var docFonts = app.activeDocument.fonts.everyItem().getElements(); + + app.findGlyphPreferences = null; + var selectedStyles = app.activeDocument.characterStyles.item(replacement_styles); + for (var i = 0; i < docFonts.length; i++) { + if (docFonts[i].status == FontStatus.INSTALLED) { + app.findGlyphPreferences.glyphID = 0; + app.findGlyphPreferences.appliedFont = docFonts[i].fontFamily; + app.findGlyphPreferences.fontStyle = docFonts[i].fontStyleName; + found = app.activeDocument.findGlyph (); + for (j = 0; j < found.length; j++) { + found[j].applyCharacterStyle(selectedStyles); + } + } else { + errormsg += docFonts[i].fontFamily + '\r'; + } + } + if (errormsg.length > 1) { + errormsg = 'The following fonts are not installed\r(or have an illegal font style specified)\rand were skipped:\r\r' + errormsg; + alert (errormsg); + } +} + + +function get_data () { + + var styleNames = findCharacterStyles(); + var w = new Window('dialog { text: "Missing Glyphs", properties: { closeButton: false } }'); + var main = w.add('panel { alignChildren: "left" }'); + var group = main.add('group'); + var replacefonts = group.add('statictext { text: "Replace missing glyphs with Character Style:" }'); + var replacement_styles = group.add('dropdownlist', undefined, styleNames); + var buttons = w.add('group { alignment: "right" }'); + + buttons.add('button { text: "OK", name: "ok" }'); + buttons.add('button { text: "Cancel", name: "cancel" }'); + + replacement_styles.onChange = function () { + replacefonts.value = 1 + }; + + var defaultCharacterStyles = replacement_styles.find ('[None]'); + if (defaultCharacterStyles != null) { + replacement_styles.selection = defaultCharacterStyles; + } else { + replacement_styles.selection = 0; + } + + replacefonts.value = 0; + replacement_styles.active = true; + current = replacement_styles.selection.text; + + var i, buffer = ""; + replacement_styles.onActivate = function () { + buffer = ""; + current = replacement_styles.selection.text + }; + + replacement_styles.addEventListener("keydown", function (k) { + if (k.keyName == "Backspace") { + buffer = buffer.replace (/.$/, ""); + if (buffer.length == 0) { + buffer = current; + } + } else { + buffer += k.keyName.toLowerCase(); + } + i = 0; + while (i < styleNames.length - 1 && styleNames[i].toLowerCase().indexOf(buffer) != 0) { + ++i; + } + if (styleNames[i].toLowerCase().indexOf (buffer) == 0) { + replacement_styles.selection = i; + } + }); + + if (w.show() == 2) { + exit(); + } + + return { + styleName: replacement_styles.selection.text + }; +} + + + +function findCharacterStyles() { + var known = {}, + styles = [], + styleName = app.activeDocument.characterStyles.everyItem().name; + + for (var i = 0; i < styleName.length; i++) { + if (!known[styleName[i]]) { + known[styleName[i]] = true; + styles.push(styleName[i]); + } + } + return styles; +} diff --git a/index.html b/index.html index 5faa54f..4f1f5f9 100644 --- a/index.html +++ b/index.html @@ -88,13 +88,14 @@

var string = word.replace(/\W/g, '').toLowerCase(); var id = wordlist.latin.indexOf(string); - var elem = document.createElement('span'); + // var elem = document.createElement('span'); - domElement.appendChild(elem); + // domElement.appendChild(elem); if (id < 0) { // console.log('no emoji'); - elem.textContent = word; + // elem.textContent = word; + domElement.innerHTML += word + ' '; loop(j + 1); return; } @@ -106,7 +107,8 @@

word = word.replace(string, matches[0]); } - elem.textContent = word; + // elem.textContent = word; + domElement.innerHTML += word + ' '; loop(j + 1); diff --git a/word-occurrence.html b/word-occurrence.html index 4a2e84c..bd4c563 100644 --- a/word-occurrence.html +++ b/word-occurrence.html @@ -11,30 +11,64 @@ left: 0; right: 0; bottom: 0; + font-family: "Lucida Bright", "Times New Roman", Times, serif; + font-size: 20px; + line-height: 1.5; } - div#content { - width: 100%; + h1, h2, h3, h4, h5, h6 { + font-weight: 500; + } + #container { + display: flex; + flex-direction: row; + } + div#content, + div#output { position: relative; - text-align: center; + flex-grow: 1; + width: 50%; + } + div#output { + overflow: hidden; } div#content span { display: inline-block; - padding: 5px; - vertical-align: middle; - font-family: times; - font-style: italic; + padding: 2.5px; + vertical-align: baseline; line-height: 40px; } + div#output textarea { + width: 95%; + height: 250px; + } -
+

+ Cena Trimalchionis · Word Occurrence +

+

+ Word List +

+
+
+
+
+

+ Output JSON: +

+ +

+ Take this output and replace ../assets/word-occurrence.json with the output. +

+