import define1 from "./a33468b95d0b15b0@808.js"; function _1(md){return( md`# Commedia: Arc Diagram per marcatura sintattica Visualizzazione delle annotazione sintattiche della Commedia come grafi.` )} function _d3(require){return( require("d3@^6.0") )} function _3(md){return( md`### Import Data` )} function _links(FileAttachment){return( FileAttachment("parsint_mod_completo_pre_new_4-2.csv").csv({typed: true}) )} function _links2(FileAttachment){return( FileAttachment("parsint_mod_completo_pergrafi_5 (7).csv").csv({typed: true}) )} function _6(md){return( md`### Create Dataset` )} function _types(links){return( Array.from(new Set(links.map(d => d.type))) )} function _getFrasi(links2){return( function getFrasi(nfrase){ const mnode= [] const mlinks=[] const usednodes=[] //const ns=Array.from(new Set(links.flatMap(l => [l.source, l.target])), id => ({id})) links2.map(function(item) { var mysrc=item.source var mytgt=item.target var frase=item.frase var myval=''; if (!usednodes.includes(mysrc.replace(/\s/g, '')) && nfrase.includes(frase)){ console.log ('In sources, id : '+mysrc.replace(/\s/g, '')+' target: '+mytgt) var myvis=item.visibile.trim(); //if(myvis.indexOf('_v')==-1) // myvis=mysrc mnode.push({ "id" : mysrc, "type" : item.type, "rif" : item.frase, //"visible": item.visibile.trim(), "visible": myvis, "s_type" : item.tipo }); usednodes.push(mysrc.replace(/\s/g, '').replaceAll("-",'')) } if (!usednodes.includes(mytgt.replace(/\s/g, '')) && nfrase.includes(frase)){ console.log ('In target, id : '+mysrc+' target: '+mytgt.replace(/\s/g, '')) mnode.push({ "id" : mytgt, "type" : item.type, "rif" : item.frase, "visible": item.visibile.trim(), "s_type" : item.tipo }); usednodes.push(mytgt.replace(/\s/g, '')) } }) links2.map(function(item) { var mysrc=item.source var mytgt=item.target var frase=item.frase if (nfrase.includes(frase)){ mlinks.push({ "source" : mysrc, "target" : mytgt, "type" : item.type }); } }) var data_frase=({nodes: mnode, links: mlinks}) return data_frase; } )} function _getSid(){return( function getSid(ids){ ids= ids.replace(/\s/g,'') var setids= ids.split(",") return setids } )} function _listafrasi(getSid,lisid){return( getSid(lisid) )} function _getColor(sentenceFunctionsColor2){return( function getColor(st){ return sentenceFunctionsColor2(st) } )} function _clauseType(){return( 'subord I' )} function _col(getColor,clauseType){return( getColor(clauseType) )} function _data_frasi(getFrasi,listafrasi){return( getFrasi(listafrasi) )} function _sentenceTypes(data_frasi){return( data_frasi.nodes.slice(1).map(function(d){return d.s_type}) )} function _sentenceNodeNames(data_frasi){return( data_frasi.nodes.slice(1).map(function(d){return d.visible}) )} function _idToNode(data_frasi) { let dict = {}; data_frasi.nodes.slice(0).forEach(function(n) { dict[n.id] = n; }); return dict; } function _idToTargetNodes(data_frasi) { let dict = {}; data_frasi.nodes.slice(1).forEach(function (n) { dict[n.id] = []; data_frasi.links.slice(1).forEach(function (l) { if (l.source === n.id) { dict[n.id].push(l.target); } }); }); return dict; } function _syntactic_macrotypes(){return( { "avv": "Avversativa", "caus": "Causale", "compar": "Comparativa", "conces": "Concessiva", "consec": "Consecutiva", "dich": "Dichiarativa", "eccettu": "Eccettuativa", "epesege": "Epesegetica", "escl": "Esclamativa", "esclu": "Esclusiva", "finale": "Finale", "inter": "Interrogativa", "ipotet": "Ipotetica", "iussi": "Iussiva", "limitat": "Limitativa", "maniera": "Di Maniera", "modale": "Modale", "obliqua": "Obliqua", "oggettiva": "Oggettiva", "otta": "Ottativa", "pare mod": "ParenteticaModalizzante", "pare sub": "ParenteticaCon ValoreDiSubordinata", "pred": "Predicativa", "pseudo": "Pseudocoordinata", "rel": "Relativa", "sog": "Soggettiva", "strum": "Strumentale", "sub": "SubordinataConFunzioneDiRipresa", "temp": "Temporale", } )} function _syntactic_types(){return( {"avv caus": "Coordinata Avversativa Causale", "avv comp ug": "Coordinata Avversativa Comparativa Di Uguaglianza", "avv cons antec": "Coordinata Avversativa ConsecutivaCon Antecedente", "avv dich": "Coordinata Avversativa Dichiarativa", "avv fin": "Coordinata AvversativaFinale", "avv int x": "Coordinata Avversativa Interrogativa Di TipoX", "avv int x ret": "Coordinata Avversativa Interrogativa Di TipoX Retorica", "avv ipo caus": "Coordinata Avversativa Ipotetica Con Valore Causale", "avv iuss dir": "Coordinata AvversativaIussivaDiretta", "avv iuss indir": "Coordinata AvversativaIussivaIndiretta", "avv modaliz ott intr": "Coordinata Avversativa Modalizzante Ottativa Con Introduttore", "avv ogg": "Coordinata Avversativa Oggettiva", "avv ogg perc": "Coordinata Avversativa Oggettiva", "avv rel app": "Coordinata Avversativa Relativa Appositiva", "avv rel app comp ug": "Coordinata Avversativa Relativa Appositiva In Construtto Comparativo", "avv rel app cons antec": "Coordinata Avversativa Relativa Appositiva Con Valore Consecutivo", "avv rel giust": "Coordinata Avversativa Relativa Giustapposta", "avv rel ind": "Coordinata Avversativa Relativa Indipendente", "avv rel ind temp": "Coordinata Avversativa Relativa Indipendente Temporale", "avv rel restr": "Coordinata Avversativa Relativa Restrittiva", "avv rel restr comp ug": "Coordinata Avversativa Relativa Restrittiva In Costrutto Comparativo", "avv sogg": "Coordinata Avversativa Soggettiva", "avv temp": "Coordinata Avversativa Temporale", "comp disug": "Comparativa Di Disuguaglianza", "comp disug ipo": "Comparativa Di Disuguaglianza Con Valore Ipotetico", "comp fin": "Comparativa Con Valore Finale", "comp ipo": "Comparativa Con Valore Ipotetico", "comp lim": "Comparativa Con Valore Limitativo", "comp mod": "Comparativa Con Valore Modale", "comp temp": "Comparativa Con Valore Temporale", "comp ug": "Comparativa Di Uguaglianza", "comp ug rel ind temp": "Comparativa Di Uguaglianza Con Valore Di Relativa Indipendente Temporale", "conc acond": "Concessiva Acondizionale", "conc cond": "Concessiva Condizionale", "conc fatt": "Concessiva Fattuale", "cong asind comp ug": "Coordinata Asindetica Comparativa Di Uguaglianza", "cong asind cons antec": "Coordinata Asindetica Consecutiva Con Antecedente", "cong asind dich": "Coordinata Asindetica Dichiarativa", "cong asind epes": "Coordinata Asindetica Epesegetica", "cong asind esclam": "Coordinata Asindetica Esclamativa", "cong asind fin": "Coordinata Asindetica Finale", "cong asind int altern": "Coordinata Asindetica Interrogativa Alternativa", "cong asind int altern ret": "Coordinata Asindetica Interrogativa Alternativa Retorica", "cong asind int disg": "Coordinata Asindetica Interrogativa Disgiuntiva", "cong asind int x": "Coordinata Asindetica Interrogativa Di TipoX", "cong asind int x ret": "Coordinata Asindetica Interrogativa Di TipoX Retorica", "cong asind ipo": "Coordinata Asindetica Ipotetica", "cong asind iuss dir": "Coordinata Asindetica IussivaDiretta", "cong asind iuss indir": "Coordinata Asindetica IussivaIndiretta", "cong asind man": "Coordinata Asindetica Di Maniera", "cong asind ogg": "Coordinata Asindetica Oggettiva", "cong asind ogg perc": "Coordinata Asindetica Oggettiva", "cong asind ott intr": "Coordinata Asindetica Ottativa Con Introduttore", "cong asind ott libera": "Coordinata Asindetica OttativaLibera", "cong asind rel app": "Coordinata Asindetica Relativa Appositiva", "cong asind rel app comp disug": "Coordinata Asindetica Relativa Appositiva In Construtto Comparativo", "cong asind rel app giust": "Coordinata Asindetica Relativa Giustapposta", "cong asind rel ind": "Coordinata Asindetica Relativa Indipendente", "cong asind rel ind temp caus": "Coordinata Asindetica Relativa IndipendenteCon Valore Temporale Causale", "cong asind rel restr": "Coordinata Asindetica Relativa Restrittiva", "cong asind rel restr comp ug": "Coordinata Asindetica Relativa Restrittiva In Construtto Comparativo", "cong asind sogg soll": "Coordinata Asindetica SoggettivaASollevamento", "cong asind subord": "Coordinata Asindetica Subordinata", "cong asind temp": "Coordinata Asindetica Temporale", "cong caus": "Coordinata Congiuntiva Causale", "cong comp disug": "Coordinata Congiuntiva Comparativa Di Disuguaglianza", "cong comp ipo": "Coordinata Congiuntiva Comparativa Con Valore Ipotetico", "cong comp lim": "Coordinata Congiuntiva Comparativa Con Valore Limitativo", "cong comp mod": "Coordinata Congiuntiva Comparativa Con Valore Modale", "cong comp ug": "Coordinata Congiuntiva Comparativa Di Uguaglianza", "cong conc cond": "Coordinata Congiuntiva Concessiva Condizionale", "cong conc fatt": "Coordinata Congiuntiva Concessiva Fattuale", "cong concl cons antec": "Coordinata Conclusiva Consecutiva Con Antecedente", "cong concl dich": "Coordinata Conclusiva Dichiarativa", "cong concl dich ill": "Coordinata Conclusiva Dichiarativa Illocutiva", "cong concl iuss dir": "Coordinata Conclusiva Iussiva Diretta", "cong concl iuss dir perifr": "Coordinata Conclusiva Iussiva Diretta Perifrastica", "cong concl iuss indir": "Coordinata Conclusiva Iussiva Indiretta", "cong cons antec": "Coordinata Congiuntiva Consecutiva Con Antecedente", "cong cons antec epes": "Coordinata Congiuntiva Consecutiva Con Antecedente Episegetica", "cong cons antec fin": "Coordinata Congiuntiva Consecutiva Con Antecedente Con Valore Finale", "cong cons caus": "Coordinata Consecutiva Causale", "cong cons dich": "Coordinata Consecutiva Dichiarativa", "cong cons ell": "Coordinata Congiuntiva Consecutiva Ellittica", "cong cons libera": "Coordinata Congiuntiva Consecutiva Libera", "cong cons libera fin": "Coordinata Congiuntiva Consecutiva Libera Con Valore Finale", "cong cons post": "Coordinata Congiuntiva Consecutiva Posposta", "cong corr dich": "CoordinataCorRelativa Dichiarativa", "cong corr fin": "CoordinataCorRelativa Finale", "cong corr lim": "CoordinataCorRelativa Limitativa", "cong corr sogg infinitoprep": "CoordinataCorRelativa Soggettiva A Infinito Preposizionale", "cong dich": "Coordinata Congiuntiva Dichiarativa", "cong dich ill": "Coordinata Congiuntiva Dichiarativa Illocutiva", "cong eccett": "Coordinata Congiuntiva Eccettuativa", "cong epes": "Coordinata Congiuntiva Epesegetica", "cong esclam": "Coordinata Congiuntiva Esclamativa", "cong esclus": "Coordinata Congiuntiva Esclusiva", "cong espl dich": "CoordinataEsplicativa Dichiarativa", "cong espl obl": "Coordinata Esplicativa Obliqua", "cong espl ogg": "Coordinata Esplicativa Oggettiva", "cong espl rel app antec": "Coordinata Esplicativa Relativa Appositiva Con Antecedente", "cong espl rel ind mod": "Coordinata Esplicativa Relativa Indipendente Con Valore Modale", "cong fin": "Coordinata Congiuntiva Finale", "cong int altern": "Coordinata Congiuntiva Interrogativa Alternativa", "cong int x": "Coordinata Congiuntiva InterrogativaDi TipoX", "cong int x ret": "Coordinata Congiuntiva InterrogativaDi TipoX Retorica", "cong ipo": "Coordinata Congiuntiva Ipotetica", "cong ipo caus": "Coordinata Congiuntiva IpoteticaCon Valore Causale", "cong ipo sogg": "Coordinata Congiuntiva Ipotetica Soggettiva", "cong iuss dir": "Coordinata Congiuntiva Iussiva Diretta", "cong iuss indir": "Coordinata Congiuntiva Iussiva Indiretta", "cong lim": "Coordinata Congiuntiva Limitativa", "cong man": "Coordinata Congiuntiva Di Maniera", "cong modaliz ott intr": "Coordinata Congiuntiva Modalizzante Ottativa Con Introduttore", "cong obl": "Coordinata Congiuntiva Obliqua", "cong ogg": "Coordinata Congiuntiva Oggettiva", "cong ogg perc": "Coordinata Congiuntiva Oggettiva", "cong ott libera": "Coordinata Congiuntiva Ottativa Libera", "cong rel app": "Coordinata Congiuntiva Relativa Appositiva", "cong rel app comp disug": "Coordinata Congiuntiva Relativa Appositiva In Costrutto Comparativo Di Disuguaglianza", "cong rel app comp ug": "Coordinata Congiuntiva Relativa Appositiva In Costrutto Comparativo Di Uguaglianza", "cong rel app cons": "Coordinata Congiuntiva Relativa Appositiva Con Valore Consecutivo", "cong rel app epes": "Coordinata Congiuntiva Relativa Appositiva Con Valore Di Episegetica", "cong rel app fin": "Coordinata Congiuntiva Relativa Appositiva Con Valore Finale", "cong rel app giust": "Coordinata Congiuntiva Relativa Giustapposta", "cong rel app giust caus": "Coordinata Congiuntiva Relativa Giustapposta Con Valore Causale", "cong rel app temp": "Coordinata Congiuntiva Relativa Appositiva Con Valore Temporale", "cong rel impl": "Coordinata Congiuntiva Relativa Implicita", "cong rel impl lim": "Coordinata Congiuntiva Relativa ImplicitaCon Valore Limitativo", "cong rel ind": "Coordinata Congiuntiva Relativa Indipendente", "cong rel ind acond": "Coordinata Congiuntiva Relativa Indipendente Acondizionale", "cong rel ind ipo": "Coordinata Congiuntiva Relativa IndipendenteCon Valore Ipotetico", "cong rel ind mod": "Coordinata Congiuntiva Relativa IndipendenteCon Valore Modale", "cong rel ind mod comp ug": "Coordinata Congiuntiva Relativa Indipendente In Costrutto ComparativoModale", "cong rel ind temp": "Coordinata Congiuntiva Relativa Indipendente Temporale", "cong rel pseudo": "Coordinata Congiuntiva Pseudo Relativa ", "cong rel restr": "Coordinata Congiuntiva Relativa Restrittiva", "cong rel restr caus": "Coordinata Congiuntiva Relativa RestrittivaCon Valore Causale", "cong rel restr comp": "Coordinata Congiuntiva Relativa RestrittivaIn Costrutto Comparativo", "cong rel restr comp ug": "Coordinata Congiuntiva Relativa RestrittivaIn Costrutto Comparativo Di Uguaglianza", "cong rel restr cons": "Coordinata Congiuntiva Relativa RestrittivaCon Valore Consecutivo", "cong rel restr temp": "Coordinata Congiuntiva Relativa RestrittivaTemporale", "cong rip": "Coordinata CongiuntivaConFunzioneDiRipresa", "cong sogg": "Coordinata Congiuntiva Soggettiva", "cong spec": "Coordinata Congiuntiva Specificativa", "cong strum": "Coordinata Congiuntiva Strumentale", "cong subord": "Coordinata Congiuntiva Subordinata", "cong temp": "Coordinata Congiuntiva Temporale", "cong temp caus": "Coordinata Congiuntiva TemporaleCon Valore Causale", "cons antec": "Consecutiva Con Antecedente", "cons antec epes": "Consecutiva Con Antecedente Epesegetica", "cons antec fin": "Consecutiva Con Antecedente Con Valore Finale", "cons antec temp": "Consecutiva Con Antecedente Con ValoreTemporale", "cons ell": "Consecutiva Ellittica", "cons libera": "Consecutiva Libera", "cons libera fin": "Consecutiva Libera Con Valore Finale", "cons post": "Consecutiva Posposta", "dich": "Dichiarativa", "dich ill": "Dichiarativa Illocutiva", "disg comp disug temp": "Coordinata Disgiuntiva Comparativa Di Disuguaglianza Con Valore Temporale", "disg conc acond": "Coordinata Disgiuntiva Concessiva Acondizionale", "disg conc cond": "Coordinata Disgiuntiva Concessiva Condizionale", "disg cons libera": "Coordinata Disgiuntiva Consecutiva Libera", "disg corr dich": "Coordinata Disgiuntiva CorRelativa Dichiarativa", "disg dich": "Coordinata Disgiuntiva Dichiarativa", "disg epes": "Coordinata Disgiuntiva Epesegetica", "disg esclus": "Coordinata Disgiuntiva Esclusiva", "disg int altern": "Coordinata Disgiuntiva Interrogativa Alternativa", "disg int disg": "Coordinata Disgiuntiva Interrogativa Disgiuntiva", "disg int x": "Coordinata Disgiuntiva Interrogativa Di TipoX", "disg ipo": "Coordinata Disgiuntiva Ipotetica", "disg lim": "Coordinata Disgiuntiva Limitativa", "disg man": "Coordinata Disgiuntiva Di Maniera", "disg obl": "Coordinata Disgiuntiva Obliqua", "disg ogg": "Coordinata Disgiuntiva Oggettiva", "disg rel ind": "Coordinata Disgiuntiva Relativa Indipendente", "disg rel ind acond": "Coordinata Disgiuntiva Relativa Indipendente Acondizionale", "disg rel ind temp": "Coordinata Disgiuntiva Relativa Indipendente Temporale", "disg rel restr": "Coordinata Disgiuntiva Restrittiva", "disg rel restr cons": "Coordinata Disgiuntiva Restrittiva Con Valore Consecutivo", "disg sogg": "Coordinata Disgiuntiva Soggettiva", "disg temp": "Coordinata Disgiuntiva Temporale", "eccett": "Eccettuativa", "eccett comp ug": "EccettuativaCon Valore Di Comparativa Di Uguaglianza", "epes": "Epesegetica", "esclam": "Esclamativa", "esclus": "Esclusiva", "faltern": "FalsaAlternativa", "fcong": "FalsaCongiuntiva", "fin": "Finale", "fin ipo": "FinaleCon Valore Ipotetico", "fin rel giust": "Concorrenza Del Relativo In Frase Finale", "int altern": "Interrogativa Alternativa", "int altern ret": "Interrogativa Alternativa Retorica", "int disg": "Interrogativa Disgiuntiva", "int disg ret": "Interrogativa Disgiuntiva Retorica", "int x": "Interrogativa Di TipoX", "int x ret": "Interrogativa Di TipoX Retorica", "ipo": "Ipotetica", "ipo biaff": "Ipotetica Biaffermativa", "ipo caus": "Ipotetica Con Valore Causale", "ipo eccett": "Ipotetica Con Valore Eccettuativo", "ipo obl": "Ipotetica Obliqua", "ipo rel giust": "Ipotetica Relativa Giustapposta", "ipo sogg": "Ipotetica Soggettiva", "iuss aug": "Iussiva Augurativa", "iuss dir": "Iussiva Diretta", "iuss dir perifr": "Iussiva Diretta Perifrastica", "iuss indir": "Iussiva Indiretta", "lim": "Limitativa", "lim caus": "Limitativa Con Valore Causale", "lim caus eccett": "Limitativa Con Valore Causale Eccettuativo", "lim eccett": "Limitativa Con Valore Eccettuativo", "man": "Di Maniera", "man gerundioprep": "Di Maniera A Gerundio Preposizionale", "man rel giust": "Concorrenza Del Relativo In Frase Di Maniera", "mod": "Modale", "modaliz": "Modalizzante", "modaliz ott intr": "Modalizzante Ottativa Con Introduttore", "modalizz ott libera": "Modalizzante OttativaLibera", "obl": "Obliqua", "ogg": "Oggettiva", "ogg aci": "Oggettiva", "ogg perc": "Oggettiva", "ott intr": "Ottativa Con Introduttore", "ott libera": "OttativaLibera", "pred": "Predicativa", "rel app antec": "Relativa Appositiva Con Antecedente", "rel app antec caus": "Relativa Appositiva Con Antecedente Con Valore Causale", "rel app antec comp disug": "Relativa Appositiva Con AntecedenteIn Costrutto Comparativo Di Disuguaglianza", "rel app antec comp ug": "Relativa Appositiva Con Antecedente In Costrutto Comparativo Di Uguaglianza", "rel app antec comp ug": "Relativa Con Antecedente In Costrutto Comparativo Di Uguaglianza", "rel app antec cons": "Relativa Appositiva Con Antecedente Con Valore Consecutivo", "rel app antec eccett": "Relativa Appositiva Con Antecedente In Costrutto Eccettuativo", "rel app antec fin": "Relativa Appositiva Con Antecedente Con Valore Finale", "rel app antec fin cons": "Relativa Appositiva Con Antecedente Con Valore Consecutivo Finale", "rel app antec giust": "Relativa Appositiva Con Antecedente Giustapposta", "rel app antec giust cons": "Relativa Appositiva Giustapposta Con Valore Consecutivo", "rel app antec giust ipo": "Relativa Appositiva Giustapposta Con Valore Ipotetico", "rel app antec giust man": "Relativa Appositiva Giustapposta Con Valore Di Maniera", "rel app antec strum": "Relativa Appositiva Con Antecedente Con Valore Strumentale", "rel giust": "Relativa Giustapposta", "rel impl": "Relativa Implicita", "rel impl cons": "Relativa Implicita Con Valore Consecutivo", "rel impl deon": "Relativa Implicita Deontica", "rel impl fin": "Relativa Implicita Con Valore Finale", "rel impl lim": "Relativa Implicita Con Valore Limitativo", "rel ind": "Relativa Indipendente", "rel ind acond": "Relativa Indipendente Acondizionale", "rel ind caus": "Relativa Indipendente In Costrutto Causale", "rel ind comp": "Relativa Indipendente In Costrutto Comparativo", "rel ind ipo": "Relativa Indipendente Con Valore Ipotetico", "rel ind mod": "Relativa Indipendente Con Valor eModale", "rel ind mod comp ug": "Relativa Indipendente In Costrutto Comparativo Modale", "rel ind temp": "Relativa Indipendente Con Valore Temporale", "rel ind temp acond": "Relativa Indipendente Con Valore Temporale Acondizionale", "rel ind temp caus": "Relativa Indipendente Con Valore Temporale Causale", "rel ind temp comp ug": "Relativa Indipendente In Costrutto Comparativo Di Uguaglianza", "rel pseudo": "Pseudo Relativa", "rel pseudo fin": "Pseudo Relativa Con Valore Finale", "rel pseudo scissa": "Pseudo Relativa Scissa", "rel pseudo scissa temp": "Pseudo Relativa ScissaC on ValoreTemporale", "rel restr antec": "Relativa Restrittiva Con Antecedente", "rel restr antec caus": "Relativa Restrittiva Con Antecedente Con Valore Causale", "rel restr antec comp disug": "Relativa Restrittiva Con Antecedente In Costrutto Comparativo Di Disuguaglianza", "rel restr antec comp mod": "Relativa Restrittiva Con Antecedente In Costrutto Comparativo Modale", "rel restr antec comp ug": "Relativa Restrittiva Con Antecedente In Costrutto Comparativo Di Uguaglianza", "rel restr antec conc cond": "Relativa Restrittiva Con Antecedente Con Valore Di Concessiva Condizionale", "rel restr antec conc fatt": "Relativa Restrittiva Con Antecedente Con Valore Di Concessiva Fattuale", "rel restr antec cons": "Relativa Restrittiva Con Antecedente Con Valore Consecutivo", "rel restr antec eccett": "Relativa Restrittiva Con Antecedente In Costrutto Eccettuativo", "rel restr antec fin": "Relativa Restrittiva Con Antecedente Con Valore Finale", "rel restr antec ipo": "Relativa Restrittiva Con Antecedente Con Valore Ipotetico", "rel restr antec lim": "Relativa Restrittiva Con Antecedente In Costrutto Limitativo", "rel restr antec temp": "Relativa Restrittiva Con Antecedente Con Valore Temporale", "rip": "Funzione Di Ripresa", "sogg": "Soggettiva", "sogg aci": "Soggettiva", "sogg id": "Soggettiva", "sogg infinitoprep": "Soggettiva", "sogg scissa": "Soggettiva Scissa", "sogg soll": "Soggettiva A Sollevamento", "spec": "Specificativa", "spec aci": "Specificativa", "spec infinitoprep": "Specificativa", "strum": "Strumentale", "subord": "Subordinata", "temp": "Temporale", "temp comp ug": "TemporaleCon Valore Comparativo", "temp ipo": "TemporaleCon Valore Ipotetico", } )} function _getTypes(syntactic_macrotypes,syntactic_types){return( function name(mtype) { if(syntactic_macrotypes[mtype]) return syntactic_macrotypes[mtype] if(syntactic_types[mtype]) return syntactic_types[mtype] return mtype } )} function _clauseFunctions(){return( { "princ": "Principale", "coord": "Coordinata", "coord I": "Coordinata I grado", "coord II": "Coordinata II grado", "coord III": "Coordinata III grado", "coord IV": "Coordinata IV grado", "coord V": "Coordinata V grado", "subord": "Subordinata", "subord I": "Subordinata I grado", "subord II": "Subordinata II grado", "subord III": "Subordinata III grado", "subord IV": "Subordinata IV grado", "subord V": "Subordinata V grado", "subord VI": "Subordinata VI grado", "subord VII": "Subordinata VII grado", "parent": "Parentetica", "pcoord": "Coordinata alla parentetica", "pcoord I": "Coordinata alla parentetica I grado", "coord 0": "Pseudo-coordinata" } )} function _23(md){return( md`#### Creating SVG` )} function _margin(){return( {top: 20, bottom: 30, left: 5, right: 30} )} function _height(margin){return( 360 - margin.top - margin.bottom )} function _sentenceheight(sentenceNodeNames){return( (sentenceNodeNames.length+1) * 33 )} function _width(){return( 760 )} function _28(md){return( md`#### Create y scale function` )} function _yScale(d3,sentenceNodeNames,sentenceheight){return( d3.scalePoint() .domain(sentenceNodeNames) .range([0,sentenceheight]) )} function _syntfunction(data_frasi){return( new Set(data_frasi["links"].slice(1), d => d.type) )} function _sentenceFunctionsColor(d3,types) {return d3.scaleOrdinal(d3.schemePastel1).domain(types.values());} function _sentenceFunctionsColor2(d3,types) {return d3.scaleOrdinal(d3.schemeSet1).domain(types.values());} function _synttype(data_frasi){return( new Set(data_frasi["nodes"].slice(1), d=> d.s_type) )} function _sentenceSynttypeColor(d3,synttype) {return d3.scaleOrdinal(d3.schemePastel1).domain(synttype.values()); } function _colorssp(d3){return( d3.scaleQuantize() .domain([0,17]) .range(["#1f78b4", "#a6cee3", "#b2df8a", "#33a02c", "#fb9a99", "#e31a1c", "#fdbf6f", "#ff7f00", "#cab2d6", "#6a3d9a", "#ffff99", "#b15928", "#F46D43", "#D53E4F", "#9E0142", "#e377c2", "#7f7f7f", "#bcbd22"]) )} function _colorssp1(d3){return( d3.scaleQuantize() .domain([0,17]) .range(["#3288bd", "#66c2a5", "#e41a1c", "#4daf4a", "#984ea3", "#d53e4f", "#f46d43", "#ABDDA4", "#E6F598", "#FFFFBF", "#FEE08B", "#FDAE61", "#F46D43", "#D53E4F", "#9E0142", "#e377c2", "#7f7f7f", "#bcbd22"]) )} function _maptypestopalette(){return( {"princ": 0, "subord I": 1, "subord II": 3, "subord III": 4, "coord": 5, "coord I": 9, "coord II": 10, "subord IV": 5, "subord V": 6, "parent": 17, "coord III": 11, "pcoord":14, "coord 0": 16, "subord VI": 7 , "coord IV": 12, "coord V": 13, "pcoord I": 15, "subord VII": 8} )} function _38(md){return( md`## Struttura del periodo` )} function _lisid(){return( '3_1_1' )} function* _periodoscritto(html,periodo) { // for Observable Cell const wrapper = html`
`; const container = html`` const descriptionDiv = document.createElement('div'); descriptionDiv.setAttribute("style", "font-size:1em; text-align:justify; font-style: oblique; text-anchor:start width: 100px;") if (periodo==null) descriptionDiv.innerHTML =''; else descriptionDiv.innerHTML =periodo; container.setAttribute("style", "font-size:1.0em; text-align:justify;") wrapper.appendChild(descriptionDiv); wrapper.appendChild(container); yield wrapper; } function _42(swatches,sentenceFunctionsColor){return( swatches({ color: sentenceFunctionsColor }) )} function _periodo(data_frasi){return( data_frasi.nodes[0].visible )} function _sentenceStructArcs2(d3,DOM,width,margin,height,data_frasi,yScale,sentenceFunctionsColor,idToNode,sentenceFunctionsColor2,wrap_text_nchar) { const radius = 5 const container = d3.select(DOM.svg(width+margin.left+margin.right, height+margin.top+margin.bottom)) const arcGroup = container .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")") // create the nodes const nodes = arcGroup.selectAll("nodes") .data(data_frasi.nodes.slice(1)) .enter().append("circle") .attr("cx", margin.left+400) .attr("cy", d => yScale(d.visible)) .attr("r", radius) .attr("fill", d=> sentenceFunctionsColor(d.type)) .attr("id", d => d.visible) // create the node labels const nodeLabels = arcGroup.selectAll("nodeLabels") .data(data_frasi.nodes.slice(1)) .enter().append("text") .attr("x", margin.left+170) .attr("y", d => yScale(d.visible)+5) .attr("fill", "black") .style("font-size", "10") .style("font-style", "italic") .style("text-anchor", "start") .text(d => d.visible) // the synctatic function const syntfun = arcGroup.selectAll("syntfun") .data(data_frasi.nodes.slice(1)) .enter().append("text") .attr("x", margin.left-10) .attr("y", d => yScale(d.visible)+5) .attr("fill", "black") .style("font-size", "10") .style("text-anchor", "start") .text(d=> d.type+", "+d.s_type) // This code builds up the SVG path element; see nodesAndArcs for details function buildArc(d) { let start = yScale(idToNode[d.source].visible); let end = yScale(idToNode[d.target].visible); //console.log(start+' '+end) if (start==null) return const arcPath = ['M', margin.left+405, start, 'A', Math.abs(start - end)/2, ',', Math.abs(start-end)/2, 0,0,",", start < end ? 1: 0, margin.left+405, end].join(' '); return arcPath; } // create the arcs const arcs = arcGroup.selectAll("arcs") .data(data_frasi.links.slice(1)) .enter().append("path") .attr("d", d => buildArc(d)) .style("fill", "none") .style('stroke-width', 0.5) .attr("stroke", 'lightgray');//d => sentenceFunctionsColor(d.type)); // mouseover animations nodes.on('mouseover', function(d) { // Highlight selected node d3.select(this).style("fill", d=>sentenceFunctionsColor2(d.type)); var targetids=[] // Highlight arcs arcs .style('stroke', function (arcd) { if (arcd.source === d.id) { targetids.push(arcd.target)}; if (arcd.target === d.id) { targetids.push(arcd.source)}; return arcd.source === d.id || arcd.target === d.id ? d=> sentenceFunctionsColor2(d.type) : 'lightgray';})//d=> sentenceFunctionsColor(d.type);}) .style('stroke-width', function (arcd) { return arcd.source === d.id || arcd.target === d.id ? 2 : 0.5;}) // Show syntactic types syntfun .style('fill', function (syntfund) { //return syntfund.visible+syntfund.s_type === d.visible+d.s_type ? 'steelblue' : 'black' ;}); return (syntfund.visible+syntfund.s_type === d.visible+d.s_type || targetids.includes(syntfund.id)) ? 'steelblue' : 'black' ;}) .style('font-weight', function (syntfund) { //return syntfund.visible+syntfund.s_type === d.visible+d.s_type ? 'steelblue' : 'black' ;}); return (syntfund.visible+syntfund.s_type === d.visible+d.s_type || targetids.includes(syntfund.id)) ? 'bold' : 'normal' ;}); // Highlight node labels nodeLabels .style("fill", function (nodeLabeld){ return nodeLabeld.id == d.id || targetids.includes(nodeLabeld.id) ? 'black' : 'black';}) .style('font-weight', function (nodeLabeld) { return nodeLabeld.id == d.id || targetids.includes(nodeLabeld.id) ? 'bold' : 'normal';}) }); // remove highlighting when user mouse moves out of node by restoring default colors and thickness nodes.on('mouseout', function (d) { nodes.style("fill", d=> sentenceFunctionsColor(d.type)); arcs.style('stroke', 'lightgray')//d=>sentenceFunctionsColor(d.type)); arcs.style('stroke-width', 0.5); syntfun.style('fill','black'); syntfun.style('font-weight','normal'); nodeLabels.style('fill','black'); nodeLabels.style('font-weight','normal'); }); container.selectAll("text") .each(function(d, i) { wrap_text_nchar(d3.select(this), 40) }); return container.node(); } function _sentenceStructArcs(d3,DOM,width,margin,sentenceheight,lisid,data_frasi,yScale,colorssp,maptypestopalette,wrap_text_array,clauseFunctions,getTypes,idToNode,sentenceFunctionsColor2,wrap_text_nchar) { const radius = 6 const nodehpos=460 const labelhpos=nodehpos-300 const maxlabelwidth=40 const container = d3.select(DOM.svg(width+margin.left+margin.right, sentenceheight+margin.top+margin.bottom)) container.append("style").text(` .synt__info{ font-size: 12px; font-weight: normal; font-style: italic; font-family: -apple-system, BlinkMacSystemFont, “Helvetica Neue”, “Segoe UI”, “Roboto”, “Oxygen”, “Ubuntu”, “Cantarell”, “Fira Sans”, “Droid Sans”, sans-serif; } `) const arcGroup = container .attr ("id", "periodograph") .attr("width",null) .attr("height",null) .attr("name", lisid) .append("g") .style('pointer-events', 'all') .attr("transform", "translate(" + margin.left + "," + margin.top + ")") // create the nodes const nodes = arcGroup.selectAll("nodes") .data(data_frasi.nodes.slice(1)) .enter().append("circle") .attr("cx", margin.left+nodehpos) .attr("cy", d => yScale(d.visible)) .attr("r", radius) //.attr("fill", d=> sentenceFunctionsColor(d.type)) .attr("fill", d => colorssp(maptypestopalette[d.type])) .attr("id", d => d.visible) // create the node labels const nodeLabels = arcGroup.selectAll("nodeLabels") .data(data_frasi.nodes.slice(1)) .enter().append("text") .attr("x", margin.left+labelhpos) .attr("y", d => yScale(d.visible)) .attr("dominant-baseline", "middle") //.attr("y", d=>ypostxt(d.visible)) .attr("class","synt__info") //.style("font-style", "italic") .style("text-anchor", "start") .text(d => d.visible) function ypostxt(label){ //delta = (_fontsize * textarea.split("\n").length) / 2; const label_array = wrap_text_array(label, maxlabelwidth); return yScale(label)+ -(8 * label_array.length)/2 //return label_array.length<3? yScale(label)+3: yScale(label)-(5*(label_array.length-1)) } // the synctatic function and types const syntfun = arcGroup.selectAll("syntfun") .data(data_frasi.nodes.slice(1)) .enter().append("text") .attr("x", margin.left-10) .attr("y", d => yScale(d.visible))//+syntfunctype(clauseFunctions[d.type]+", "+getTypes(d.s_type))) .attr("dominant-baseline", "middle") .attr("class","f6 text-muted text-nowrap font-weight-normal") .style("font-size", "10") .style("text-anchor", "start") .style("letter-spacing", 0) .text(d=> clauseFunctions[d.type]+", "+getTypes(d.s_type)) function syntfunctype(funty){ const funty_array = wrap_text_array(funty, maxlabelwidth); return (funty_array.length<3? 0: -10) } // This code builds up the SVG path element; see nodesAndArcs for details function buildArc(d) { let start = yScale(idToNode[d.source].visible); let end = yScale(idToNode[d.target].visible); //console.log(start+' '+end) if (start==null) return const arcPath = ['M', margin.left+nodehpos+6, start, 'A', Math.abs(start - end)/2, ',', Math.abs(start-end)/2, 0,0,",", start < end ? 1: 0, margin.left+nodehpos+6, end].join(' '); return arcPath; } // create the arcs const arcs = arcGroup.selectAll("arcs") .data(data_frasi.links.slice(1)) .enter().append("path") .attr("d", d => buildArc(d)) .style("fill", "none") .style('stroke-width', 0.5) .attr("stroke", 'lightgray');//d => sentenceFunctionsColor(d.type)); // mouseover animations nodes.on('mouseover', function(event, d) { // Highlight selected node d3.select(this).style("fill", d=>colorssp(maptypestopalette[d.type]));//sentenceFunctionsColor2(d.type)); var targetids=[] // Highlight arcs arcs .style('stroke', function (arcd) { if (arcd.source === d.id) { targetids.push(arcd.target)}; if (arcd.target === d.id) { targetids.push(arcd.source)}; return arcd.source === d.id || arcd.target === d.id ? d=> sentenceFunctionsColor2(d.type) : 'lightgray';})//d=> sentenceFunctionsColor(d.type);}) .style('stroke-width', function (arcd) { return arcd.source === d.id || arcd.target === d.id ? 2 : 0.5;}) // Highlight syntactic types syntfun .style('fill', function (syntfund) { //return syntfund.visible+syntfund.s_type === d.visible+d.s_type ? 'steelblue' : 'black' ;}); return (syntfund.visible+syntfund.s_type === d.visible+d.s_type || targetids.includes(syntfund.id)) ? 'steelblue' : 'black' ;}) .style('font-weight', function (syntfund) { //return syntfund.visible+syntfund.s_type === d.visible+d.s_type ? 'steelblue' : 'black' ;}); return (syntfund.visible+syntfund.s_type === d.visible+d.s_type || targetids.includes(syntfund.id)) ? 'bold' : 'normal' ;}); // Highlight node labels nodeLabels .style("fill", function (nodeLabeld){ return nodeLabeld.id == d.id || targetids.includes(nodeLabeld.id) ? 'black' : 'black';}) .style('font-weight', function (nodeLabeld) { return nodeLabeld.id == d.id || targetids.includes(nodeLabeld.id) ? 'bold' : 'normal';}) }); // remove highlighting when user mouse moves out of node by restoring default colors and thickness nodes.on('mouseout', function (event, d) { nodes.style("fill", d=> colorssp(maptypestopalette[d.type]));//sentenceFunctionsColor(d.type)); arcs.style('stroke', 'lightgray')//d=>sentenceFunctionsColor(d.type)); arcs.style('stroke-width', 0.5); syntfun.style('fill','black'); syntfun.style('font-weight','normal'); //nodeLabels.style('fill','black'); nodeLabels.style('font-weight','normal'); nodeLabels.attr("class","synt__info") }); container.selectAll("text") .each(function(d, i) { wrap_text_nchar(d3.select(this), 50) }); return container.node(); } function _sentenceStructArcs_new(d3,DOM,width,margin,sentenceheight,lisid,data_frasi,yScale,colorssp,maptypestopalette,wrap_text_array,clauseFunctions,getTypes,idToNode,sentenceFunctionsColor2,darken,wrap_text_nchar) { const radius = 4 const nodehpos=460 const labelhpos=nodehpos-300 const maxlabelwidth=40 const container = d3.select(DOM.svg(width+margin.left+margin.right, sentenceheight+margin.top+margin.bottom)) /* container.append("style").text(` .synt__info{ font-size: 13px; font-weight: normal; font-style: italic; font-family: Palatino; } .synt__categ{ font-size: 10px; font-weight: normal; font-family: Palatino; } `) */ const arcGroup = container .attr ("id", "periodograph") .attr("width",null) .attr("height",null) .attr("name", lisid) .append("g") //.style('pointer-events', 'all') .attr("transform", "translate(" + margin.left + "," + margin.top + ")") // create the nodes const nodes = arcGroup.selectAll("nodes") .data(data_frasi.nodes.slice(1)) .enter().append("circle") .attr("cx", margin.left+nodehpos) .attr("cy", d => yScale(d.visible)) .attr("r", radius) //.attr("fill", d=> sentenceFunctionsColor(d.type)) .attr("fill", d => colorssp(maptypestopalette[d.type])) .attr("id", d => d.visible) // // create the node labels // const nodeLabels = arcGroup.selectAll("nodeLabels") // .data(data_frasi.nodes.slice(1)) // .enter().append("text") // .attr("x", margin.left+labelhpos) // //.attr("y", d => yScale(d.visible)) // .attr("dominant-baseline", "middle") // .attr("y", d=>yScale(d.visible)+syntfunctype(d.visible)) // .attr("class","synt__info") // //.style("font-style", "italic") // .style("text-anchor", "start") // .text(d => d.visible) function ypostxt(label){ //delta = (_fontsize * textarea.split("\n").length) / 2; const label_array = wrap_text_array(label, maxlabelwidth); return yScale(label)+ -(8 * label_array.length)/2 //return label_array.length<3? yScale(label)+3: yScale(label)-(5*(label_array.length-1)) } // the synctatic function and types const syntfun = arcGroup.selectAll("syntfun") .data(data_frasi.nodes.slice(1)) .enter().append("text") .attr("x", margin.left-10) .attr("y", d => yScale(d.visible)+syntfunctype(clauseFunctions[d.type]+", "+getTypes(d.s_type))) //.attr("y", d=>ypostxt(d.visible)) .attr("dominant-baseline", "middle") .attr("class","synt__categ") .style("text-anchor", "start") .style("letter-spacing", 0) .text(d=> clauseFunctions[d.type]+", "+getTypes(d.s_type)) function syntfunctype(funty){ const funty_array = wrap_text_array(funty, maxlabelwidth); return (funty_array.length<2? 0: -(2.5 * funty_array.length)) } // This code builds up the SVG path element; see nodesAndArcs for details function buildArc(d) { let start = yScale(idToNode[d.source].visible); let end = yScale(idToNode[d.target].visible); let lor=true; let nodeoffset=4 if (start==null) return const arcPath = ['M', margin.left+nodehpos+nodeoffset, start, 'A', (Math.abs(start - end)/2), ',', Math.abs(start-end)/2, 0,0,",", lor ? 1: 0, margin.left+nodehpos+nodeoffset, end].join(' '); return arcPath; } function buildReverseArc(d) { let start = yScale(idToNode[d.source].visible); let end = yScale(idToNode[d.target].visible); let lor=true; let nodeoffset=4 if (start < end && d.type.includes ('coord')){//.includes('coord')){ console.log('here') lor=false; nodeoffset=-4 } else return if (start==null) return const arcPath = ['M', margin.left+nodehpos+nodeoffset, start, 'A', Math.abs(start - end)/2, ',', Math.abs(start-end)/2, 0,0,",", lor ? 1: 0, margin.left+nodehpos+nodeoffset, end].join(' '); //console.log(start+' - '+end+', '+d.type+'; '+arcPath) return arcPath; } // create the arcs var arcs = arcGroup.selectAll("arcs") .data(data_frasi.links.slice(1)) .enter().append("path") .attr("d", d => buildArc(d)) .style("fill", "none") .style('stroke-width', 0.5) .attr("stroke", 'lightgray');//d => sentenceFunctionsColor(d.type)); // create the arcs for Coordinate var arcs_coord = arcGroup.selectAll("arcs") .data(data_frasi.links.slice(1)) .enter().append("path") .attr("d", d => buildReverseArc(d)) .style("fill", "none") .style('stroke-width', 0.5) .attr("stroke", 'lightgray');//d => sentenceFunctionsColor(d.type)); // create the node labels const nodeLabels = arcGroup.selectAll("nodeLabels") .data(data_frasi.nodes.slice(1)) .enter().append("text") .attr("x", margin.left+labelhpos) //.attr("y", d => yScale(d.visible)) .attr("dominant-baseline", "middle") .attr("y", d=>yScale(d.visible)+syntfunctype(d.visible)) .attr("class","synt__info") //.style("font-style", "italic") .style("text-anchor", "start") .text(d => d.visible) // mouseover animations nodes.on('mouseover', function(event, d) { // Highlight selected node d3.select(this).style("fill", d=>colorssp(maptypestopalette[d.type]));//sentenceFunctionsColor2(d.type)); var targetids=[] // Highlight arcs arcs .style('stroke', function (arcd) { if (arcd.source === d.id) { targetids.push(arcd.target)}; if (arcd.target === d.id) { targetids.push(arcd.source)}; return arcd.source === d.id || arcd.target === d.id ? d=> sentenceFunctionsColor2(d.type) : 'lightgray';})//d=> sentenceFunctionsColor(d.type);}) .style('stroke-width', function (arcd) { return arcd.source === d.id || arcd.target === d.id ? 2 : 0.5;}) //arcs_coord arcs_coord .style('stroke', function (arcd) { if (arcd.source === d.id) { targetids.push(arcd.target)}; if (arcd.target === d.id) { targetids.push(arcd.source)}; return arcd.source === d.id || arcd.target === d.id ? d=> sentenceFunctionsColor2(d.type) : 'lightgray';}) .style('stroke-width', function (arcd) { return arcd.source === d.id || arcd.target === d.id ? 2 : 0.5;}) // Highlight syntactic types syntfun .style('fill', function (syntfund) { //return syntfund.visible+syntfund.s_type === d.visible+d.s_type ? 'steelblue' : 'black' ;}); return (syntfund.visible+syntfund.s_type === d.visible+d.s_type || targetids.includes(syntfund.id)) ? darken('steelblue') : 'black' ;}) .style('font-weight', function (syntfund) { //return syntfund.visible+syntfund.s_type === d.visible+d.s_type ? 'steelblue' : 'black' ;}); return (syntfund.visible+syntfund.s_type === d.visible+d.s_type || targetids.includes(syntfund.id)) ? 'bold' : 'normal' ;}); // Highlight node labels nodeLabels .style("fill", function (nodeLabeld){ return nodeLabeld.id == d.id || targetids.includes(nodeLabeld.id) ? 'black' : 'black';}) .style('font-weight', function (nodeLabeld) { return nodeLabeld.id == d.id || targetids.includes(nodeLabeld.id) ? 'bold' : 'normal';}) }); // remove highlighting when user mouse moves out of node by restoring default colors and thickness nodes.on('mouseout', function (event, d) { nodes.style("fill", d=> colorssp(maptypestopalette[d.type]));//sentenceFunctionsColor(d.type)); arcs.style('stroke', 'lightgray') arcs.style('stroke-width', 0.5); arcs_coord.style('stroke', 'lightgray') arcs_coord.style('stroke-width', 0.5); syntfun.style('fill','black'); syntfun.style('font-weight','normal'); //nodeLabels.style('fill','black'); nodeLabels.style('font-weight','normal'); nodeLabels.attr("class","synt__info") }); container.selectAll("text") .each(function(d, i) { wrap_text_nchar(d3.select(this), 50) }); return container.node(); } function _47(md){return( md`### Utility` )} function _darken(d3){return( function darken(color, k = 1) { const {l, c, h} = d3.lch(color); return d3.lch(l - 18 * k, c, h); } )} function _wrap_text_nchar(wrap_text_array){return( (text_element, max_width, line_height, unit = "em") => { //console.log('te' +text_element) // use a default line_height if not provided if (!line_height) line_height = 1.0; if (text_element.text().length>150) line_height = 0.8 if (text_element.text().includes("ordinata") || text_element.text().includes("parentetica") || text_element.text().includes("principale")){ max_width=30 if (text_element.text().length>90) line_height = 0.9 } // wrap the text based on how many characters per line const text_array = wrap_text_array(text_element.text(), max_width); // append a tspan element for each line of text_array text_element.text(null) .selectAll("tspan") .data(text_array).enter() .append("tspan") .attr("x", text_element.attr("x")) .attr("y", text_element.attr("y")) .attr("dy", (d, i) => `${(i * line_height)}${unit}`) .text(d => d); } )} function _wrap_text_array(){return( (text, max_width) => { // split the text around spaces (to get individual words) const words = text.split(/\s+/).reverse(); // define vars to hold individual words, lines, and all lines let word, lines = [ ], line = [ ]; // add words to a line until we exceed the max_width (in characters) // when we reach width, add the line to lines and start a new line while (word = words.pop()) { line.push(word); if (line.join(" ").length > max_width || word[0]=='(') { line.pop() lines.push(line.join(" ")); line = [word]; } } lines.push(line.join(" ")); return lines; } )} function _wrap_node_text(){return( (text, width) => { // split the text around spaces (to get individual words) if (text==null) text=='' const words = text.split(/\s+/).reverse(); // define vars to hold individual words, lines, and all lines let word, lines = [ ], line = [ ]; // add words to a line until we exceed the max_width (in characters) // when we reach width, add the line to lines and start a new line while (word = words.pop()) { line.push(word); if (line.join(" ").length > width) { line.pop() lines.push(line.join(" ")); lines.push('\n