Skip to content

Commit

Permalink
Laid out text in Book Form
Browse files Browse the repository at this point in the history
  • Loading branch information
jonobr1 committed Nov 4, 2018
1 parent e268fb9 commit 9ba28f0
Show file tree
Hide file tree
Showing 8 changed files with 393 additions and 14 deletions.
4 changes: 2 additions & 2 deletions assets/cena-trimalchionis.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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. <Vitalia Trimalchio accepit> 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."
}
]
Expand Down
Binary file added book/cena-trimalchionis.indd
Binary file not shown.
Binary file added book/cena-trimalchionis.pdf
Binary file not shown.
Binary file added book/cena-trimalchionis.ps
Binary file not shown.
216 changes: 216 additions & 0 deletions book/scripts/missing_glyphs.jsx
Original file line number Diff line number Diff line change
@@ -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;
}
126 changes: 126 additions & 0 deletions book/scripts/styles-to-missing-glyphs.jsx
Original file line number Diff line number Diff line change
@@ -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;
}
10 changes: 6 additions & 4 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,14 @@ <h1>

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;
}
Expand All @@ -106,7 +107,8 @@ <h1>
word = word.replace(string, matches[0]);
}

elem.textContent = word;
// elem.textContent = word;
domElement.innerHTML += word + ' ';

loop(j + 1);

Expand Down
Loading

0 comments on commit 9ba28f0

Please sign in to comment.