Download

Forum

Evidenziatore

Anteprima links

Sitografia

Print by Id

Conflitti

Abbonati

Console

Area di notifica

Pseudo-finestre

Cookies

Introduzione

TakeNotes! è una libreria modulare per pagine Web scritta in linguaggio JavaScript. È una raccolta di poche utility – compatibili con il nuovo formato HTML5 – davvero piccole, ma utilissime. Si rivolge soprattutto a quei blog che pubblicano articoli di una certa lunghezza e spessore; che si basano sulla parola scritta, più che sulle immagini. Le funzioni principali che offre sono:

  1. Evidenziare porzioni di testo da una pagina web, estrarne il contenuto e condividerlo con altr* tramite un link generato (il link generato non modificherà eventuali altri parametri GET già presenti nell'URL).
  2. Estrarre la sitografia, ovvero la lista di quei link che puntano a pagine web (o a percorsi ftp) esterni al proprio dominio, se presenti nella pagina, e creare una simpatica anteprima dei link in un ToolTip per ciascuno di essi.
  3. Stampare il contenuto di un elemento della pagina conoscendone l'id, senza l'uso di finestre pop-up.

Inoltre, per i più intraprendenti, questa librearia si può integrare bene con altri progetti, offrendo la possibilità di:

  1. Notificare messaggi personalizzati in un'area di notifica in tutto simile a quella di Ubuntu (la resa grafica è quasi totalmente affidata al foglio di stile, quindi potrebbe essere trasformata in qualsiasi altra cosa…).
  2. Utilizzare i cookies in maniera innovativa per ottenere un'ottimizzazione della memoria allontanando così la possibilità di un errore da parte del server dovuto a un sovraccarico di informazioni.
  3. Creare infinite pseudo-finestre interne alla pagina, ovvero contenitori di testo (div) a forma di finestra.

La pima utility è la più corposa – ed è la funzione che dà il nome alla libreria – ma non gBFrecciantisce la pagina in quanto tutto il codice necessario viene caricato solo su richiesta. Le altre hanno peso praticamente nullo. Tutte queste funzioni sono oggetti figli della variabile iDoc, quindi non c'è pericolo che possano generare conflitti con altri script.

Il codice da includere in una pagina per poter rendere funzionante quanto detto si riduce al richiamo a uno script (takenotes.js), al richiamo ad un foglio di stile (takenotes.css), al controllo di nuove sottolineature al caricamento della pagina e/o alla creazione delle anteprime dei link (<body onload="iDoc.notes.search();iDoc.eLinks.createThumbs();">) e, soprattutto, ad un contenitore di testo con id="iBody". Il codice contenuto nello script takenotes.js è particolarmente leggero in proporzione alle funzioni che offre, in ogni caso è tutto orientato agli oggetti e poco ai calcoli. Quindi il carico che aggiungerà alla pagina in condizioni normali sarà abbastanza basso. E comunque, per ridurre ulteriormente il carico di dati associati alla pagina, la modularità con cui è stata concepita questa libreria agevola l'eliminazione di intere sezioni di codice ritenute non necessarie.

Attenzione. Non includere lo script notebook.js !!! Esso verrà caricato solo su richiesta.

Alcune informazioni utili sull'oggetto iDoc:

  • Il valore dei due oggetti iDoc.notes.mapArg e iDoc.notes.emphBmPfx dipende direttamente da due costanti dichiarate all'inizio dell'oggetto iDoc – per l'esattezza cMapArg e cEmphBmPfx – il cui valore può essere modificate a piacimento. Si tratta nel primo caso del nome del parametro di tipo GET che andrà a contenere la mappa delle evidenziazioni, nel secondo caso del prefisso che identificherà i segnalibri associati a ciascuna evidenziazione. Attualmente i valori di queste due costanti sono valori totalemente arbitrari, scelti per la scarsa probabilità di omonimia con eventuali altre componenti di un sito. cMapArg ha come valore di default 4x75k, mentre cEmphBmPfx di default ha h35p. Come dicevo, la possibilità di impostare questi valori a piacere consente di evitare che confliggano con eventuali altri valori necessari al funzionamento del sito, soprattutto nel caso si faccia uso di CMS. Va da sé che esse potranno contenere solo caratteri alfanumerici.
  • La variabile privata frGrndSill contiene il valore dello z-index al di sotto del quale non devono scendere le pseudo-finestre in secondo piano. Il valore predefinito è 1001. Questo valore dev'essere più alto di qualsiasi altro z-index presente nella pagina, eccetto quello stabilito per l'area di notifica, cui il foglio di stile assegna di default il valore 9999, quello scelto per il ToolTip di anteprima dei link, il cui valore è impostato su 9997 e quello del box “fantasma” che appare al trascinamento di una pseudo-finestra, il cui valore di default è 9998.

Lo script è in sé già bello che funzionante, ma si presta ad un'elevata personalizzazione. Purtroppo allo stato attuale alcune funzioni girano solo con quei browser che usano gli standard W3C, quindi Firefox, Safari, Chrome e altri (praticamente tutti tranne Internet Explorer). Credo sinceramente sia impossibile rendere funzionanti le evidenziazioni con Internet Explorer, almeno quanto è impossibile per quest'ultimo risalire all'anchorNode e al focusNode di una selezione. Ma del resto, se qualcun* ha qualche idea, si faccia pure avanti :)

Per chi voglia mettere mano al codice: per maggiore comprensione del codice JavaScript è consigliabile tenere presente anche il vecchio progetto JSMatita, da cui questo deriva, contenente in lingua italiana tutto il codice per le evidenziazioni (con alcune imperfezioni però!) ripreso da questa libreria.

È possibile comprimere il codice per alleggerire il carico di bytes.

Oggetto iDoc

La libreria è tutta contenuta all'interno della variabile iDoc, il che significa che difficilmente potranno esserci omonimie di variabili con altri script. Cercheremo adesso di spiegare nel dettaglio in cosa consiste questa libreria.

var iDoc:

Per analizzarne meglio il contenuto ho messo a disposizione una piccola console JavaScript.


Evidenzia, estrai, condividi

Clicca sui link qui in basso e inizia ad evidenziare col mouse quello che vuoi del testo di questa pagina…

[ Prendi appunti in una finestra separata | Prendi appunti in una finestra agganciata alla pagina ]

iDoc.notes

Oggetto contenente tutte le informazioni sulle evidenziazioni compiute nella pagina.

iDoc.notes.book

Questo valore è nullo se non è aperto il quaderno degli appunti. È pari alla finestra del quaderno degli appunti in caso contrario.

iDoc.notes.content

Stringa contenente le trascrizioni delle evidenziazioni effettuate.

iDoc.notes.map

Matrice tridimensionale contenente la mappa delle evidenziazioni effettuate tramite la chiamata del file notebook.js.

iDoc.notes.permss

Permessi rispettivamente di lettura, scrittura ed esecuzione - ovvero di compilazione della mappa presente nel link. I permessi vengono modificati dinamicamente, quindi è bene che l'assegnazione primitiva non venga alterata. L'esecuzione può avvenire una sola volta, tant'è che l'unica funzione a concederla è la funzione costruttrice anonima della variabile "iDoc". Compilare due volte una stessa mappa genererà quasi certamente un errore. Qualsiasi modifica a questo script dovrà perciò curare che non capiti più di una volta che la proprietà di esecuzione sia impostata su true all'apertura del quaderno degli appunti.

iDoc.notes.mapArg

Esprime, in maniera del tutto arbitraria, il parametro di tipo GET che conterrà la mappa [caratteri alfanumerici]

iDoc.notes.emphBmPfx

Prefisso arbitrario apposto a ciascun segnalibro facente capo a una sottolineatura [caratteri alfanumerici]

iDoc.notes.lock()

Funzione che blocca l'apertura del quaderno degli appunti. È gestita dinamicamente da altre funzioni. Ma può essere usata a proprio piacere.

iDoc.notes.unlock()

Funzione che sblocca l'apertura del quaderno degli appunti. È gestita dinamicamente da altre funzioni. Ma può essere usata a proprio piacere.

iDoc.notes.take(finestra_agganciata?)

Questa funzione crea una finestra di pop-up accessibile come "iDoc.notes.book". Se ci dovessero essere problemi nella corretta visualizzazione di essa, sarà necessario specificare per esteso all'interno di questa funzione la posizione dei file notebook.js e notebook.css. Attualmente la loro posizione è espressa in forma relativa. Del resto è assai probabile che si renda necessaria questa modifica se si vuol integrare questo script col template di un CMS. Il codice HTML generato da questa funzione puo' anche essere trasferito, in alternativa, su due file .html fisici.

Se dovessero esserci problemi nella visualizzazione della finestra di popup, sarà necessario specificare in forma assoluta la posizione dei file notebook.js, notebook.css e smallnotebook.css. Attualmente tale posizione è espressa in forma relativa.

iDoc.notes.search()

Controlla se il quaderno ha il permesso di esecuzione (eventualmente attribuitogli se è presente una mappa di sottolineature nell'URL al caricamento dello script) e in caso affermativo mostra una finestra di dialogo. Questa funzione, per come è costruita, trova la sua unica utilità solo se chiamata dall'onload della pagina.


Utilizzare i cookies

Questa libreria consente di utilizzare i cookies in maniera innovativa salvando tutte le coppie nome/valore su un unico cookie. Questo metodo consente un'ottimizzazione della memoria e allontana la possibilità di un eventuale errore del server dovuto a un sovraccarico di informazioni. È impossibile, per lo stesso motivo, assegnar loro una scadenza, come avviene normalmente coi cookies; del resto si tratta di un'esigenza normalmente poco frequente. L'accesso ai dati salvati è reso semplice dal fatto che verranno caricati in massa come oggetti figli (di tipo testo) degli oggetti iDoc.storage.gData e iDoc.storage.lData. Per accedere ad esempio alla chiave globale di nome test basterà richiamare l'oggetto iDoc.storage.gData.test. I cookies sono uno strumento utilissimo e immediato per salvare piccole informazioni che interagiscono con più pagine all'interno di un dominio. Per salvare informazioni più corpose e specifiche, HTML5 offre un nuovo strumento di nome HTML5 Storage, di cui ne consigliamo vivamente l'approfondimento.

iDoc.storage

Contenitore di proprietà e metodi per lavorare con i cookies

iDoc.storage.gData

Contenitore di tutte le coppie nome/valore salvate in un unico cookie di nome iDoc di pertinenza globale. Quando una chiave è inesistente, il richiamo a iDoc.storage.gData.nome_chiave restituirà undefined. Per verificare l'esistenza di una chiava, utilizzare la funzione iDoc.storage.gData.hasOwnProperty("nome_chiave").

iDoc.storage.lData

Contenitore di tutte le coppie nome/valore salvate in un unico cookie di nome iDocL di pertinenza locale. Le informazioni in esso salvate saranno accessibili solo dalla pagina che le abbia salvate o, in caso di pagine di default di una directory – ma solo se visualizzate dal browser come tali, come per esempio www.miodominio.org/directory/ (e non come normali pagine, come ad esempio www.miodominio.org/directory/index.html) – avranno pertinenza limitata a tutte le pagine e le directory in essa contenute. Quando una chiave è inesistente, il richiamo a iDoc.storage.lData.nome_chiave restituirà undefined. Per verificare l'esistenza di una chiava, utilizzare la funzione iDoc.storage.lData.hasOwnProperty("nome_chiave").

iDoc.storage.loadUp(da_archivio_locale?)

Questa funzione carica tutte le coppie nome/valore come oggetti figli (di tipo testo) degli oggetti iDoc.storage.gData e iDoc.storage.lData. Essa viene chiamata una sola volta per ciascuna pertinenza (globale, locale) dalla libreria stessa e non va chiamata ulteriormente, perché gli oggetti iDoc.storage.gData e iDoc.storage.lData vengono aggiornati in tempo reale ad ogni modifica dei cookies.

iDoc.storage.addKey(nome_chiave, valore_chiave, su_archivio_locale?)

Funzione che consente di salvare le nostre informazioni. Essa sovrascriverà il contenuto delle chiavi già esistenti con lo stesso nome. Le cancellerà invece nel caso in cui il secondo argomento fosse nullo (null).

iDoc.storage.delKey(nome_chiave, da_archivio_locale?)

Rimuove una singola chiave e tutto il suo contenuto

iDoc.storage.eraseData(archivio_locale?)

Rimuove tutto l'archivio scelto (locale o globale)

iDoc.charlie

Si tratta di una pseudo-finestra utilizzata per le evidenziazioni. Per maggiori informazioni sull'oggetto PseudoWindow vai alla sezione apposita.

iDoc.charlie.putDown(), iDoc.charlie.openUp(contenuto[, esegui, uscita_alternativa, larghezza, altezza, posizione_oriz, posizione_vert, conta_da_destra, conta_dal_basso]), iDoc.charlie.valueOf(), iDoc.charlie.toString()

Si tratta di tutte i metodi assegnati dal costruttore privato di pseudo-fineste all'oggetto iDoc.charlie. Per maggiori informazioni vai alla sezione apposita.


Notificare messaggi personalizzati

iDoc.notify(titolo/mittente, corpo[, durata_in_ms, ritardo_in_ms])

Questa funzione trae spunto dal demone di notifica di Gnome® sviluppato da Canonical per il suo Ubuntu. Nella modularità di questa libreria, questa funzione può essere rimossa insieme all'oggetto iDoc.msgs. Con essi bisognerà rimuovere però anche i tanti usi interni che di questa funzionalità fa la libreria stessa.

Si tratta di un'area di notifica che compare in alto a destra (ma può essere impostata su sei lati dello schermo modificando la seconda parte della proprietà class attribuita all'oggetto dalla funzione iDoc.notify; attualmente è impostata su top-right) che consente di accodare infiniti messaggi. L'esempio valga più di qualsiasi spiegazione…

I campi che seguono sono vanno compilati con codice HTML valido.

Titolo:
Corpo:
Durata (ms):
Ritardo (ms):


Pseudo-finestre

iDoc.createWindow(nome_della_finestra, prefisso_per_i_fogli_di_stile[, titolo_della_finestra])

Per creare una pseudo-finestra basterà scrivere: var miavariabile = iDoc.createWindow(nome_della_finestra, prefisso_per_i_fogli_di_stile[, titolo_della_finestra]). È bene che, nel caso si tratti di una variabile globale, sia accompagnata dal prefisso g. Si tratta di una pura formalità, ma ci sono almeno due buoni motivi per rispettarla:

  • indicare lo scope globale della variabile,
  • rendere più difficile la sovrapposizione con altre variabili locali non dichiarate.

Ecco un esempio di creazione di una pseudo-finestra. Solo per questo esempio le nuove pseudo-finestre create verranno notificate.

Nome della variabile globale che conterrà la finestra:
Prefisso per i fogli di stile:
Titolo:

pseudoWindow.openUp(contenuto, [esegui, uscita_alternativa, larghezza, altezza, posizione_oriz, posizione_vert, conta_da_destra, conta_dal_basso])

Una volta creata la variabile globale contenente la pseudo-finestra, questa è la funzione che dovremo chiamare per aprirla. Solo il primo argomento è obbligatorio, gli altri possono essere tranquillamente omessi o, il che è lo stesso, espressi con valore uguale a false.

Quando non è nullo, l'argomento esegui deve contenere codice JavaScript valido. Esso verrà eseguito subito dopo l'apertura della finestra e ripetuto ad ogni ripristino da una minimizzazione. Solitamente viene usato per assegnare il focus a un oggetto in essa contenuto.

L'argomento uscita_alternativa indica il comando cui deve puntare il pulsante di chiusura. Se espresso, sarà necessario ripetere, oltre agli altri comandi che si vuol eseguire, il comando: pseudoWindow.putDown(), senza il quale la finestra resterebbe aperta.

Gli ultimi due parametri sono di tipo booleano e fanno sì che se impostati su true la posizione venga misurata rispettivamente a partire da destra e dal basso.

Proviamo a fare una simulazione del comportamento della finestra

Nome della finestra da aprire:
Contenuto
Comando da eseguire a ogni apparizione:
Comando alternativo per l'uscita:
Larghezza:
Altezza:
Posizione orizzontale:
Posizione verticale

pseudoWindow.putDown()

Chiude la pseudo-finestra.

pseudoWindow.valueOf()

Restituisce un valore booleano indicante lo stato della finestra: true quando è aperta, false quando è chiusa.

pseudoWindow.toString()

Restituisce il titolo della finestra.


Estrarre la sitografia della pagina e creare un ToolTip di anteprima dei link

iDoc.eLinks

Oggetto contenente metodi e proprietà per lavorare con i collegamenti a domini terzi. Nella modularità di questa libreria, quest'oggetto può essere rimosso senza danno.

iDoc.eLinks.linksWin

È la finestra in cui viene mostrata la sitografia. Per maggiori informazioni sull'oggetto PseudoWindow vai alla sezione apposita.

iDoc.eLinks.createThumbs()

Questa funzione va caricata durante'onload della pagina. A ciascun collegamento ipertestuale a un dominio esterno verrà associato un ToolTip di anteprima della pagina di destinazione che si attiverà al passaggio del mouse (provare per vedere). Nel caso in cui l'anteprima del sito in questione non fosse disponibile, il server generatore di anteprime (io ho scelto questo: www.thumbalizr.com, ma in rete ce ne sono molti altri – per scegliere i quali basterà mettere mano a questa funzione) ne provvederà alla creazione permanente nel giro di un minuto.
Nella modularità di questa libreria, questa funzione può essere rimossa. Con essa cesserà di essere utile e quindi bisognerà rimuovere anche la dichiarazione della variabile privata dirctThmbCall e l'ultima riga della funzione iDoc.eLinks.show().

iDoc.eLinks.show()

Crea l'elenco completo dei collegamenti ipertestuali che puntano a domini esterni a quello da cui viene lanciato lo script, ignorando tutti gli altri (collegamenti interni, collegamenti ad indirizzi email, etc.). In caso di più rimandi allo stesso link, verrà utilizzato il testo del primo link a partire dall'alto verso il basso, ma saranno presenti in apice dei riferimenti a tutti i rimandi. Nella modularità di questa libreria, questa funzione può essere rimossa. Con essa cesserà di essere utile e quindi bisognerà rimuovere anche la dichiarazione dell'oggetto iDoc.eLinks.linksWin. Vediamo come ottenere la sitografia di questa pagina:

[ Mostra la sitografia di questa pagina ]


Stampare un oggetto conoscendone l'id

Nella modularità di questa libreria, i due oggetti seguenti possono essere rimossi senza danno. Con essi cesserà di essere utilizzabile e quindi bisognerà rimuovere anche il richiamo alla funzione iDoc.printById(…) contenuto nella funzione iDoc.eLinks.show() (il pulsante per stampare la sitografia, per intenderci). Purtroppo questa funzione non gira correttamente su Internet Explorer, il quale stampa la pagina intera invece del singolo nodo…

iDoc.docInPress

Oggetto con valore nullo o di tipo Element (iframe). Si tratta dell'iframe nascosto contenente il nodo della pagina che si vuol isolare e stampare.


iDoc.printById("id")

Stampa un singolo nodo della pagina in base al suo Id. Se dovessero esserci problemi nella resa grafica della stampa sarà necessario specificare in forma assoluta la posizione del file printhtml.css. Attualmente tale posizione è espressa in forma relativa. In ogni caso è quello il foglio di stile che gestisce la stampa di porzioni di testo.

Stampa oggetto di esempio (id=samplePrintable)


Metodi e proprietà secondari

Informazioni sulla pagina (iDoc.url, iDoc.path, iDoc.urlArgs, iDoc.bookmark, iDoc.siteUrl)

Lo script separa i parametri di tipo GET presenti nella URL destinati alle applicazioni lato server da quelli destinati agli script lato client. La stessa cosa fa con i segnalibri. Infine restituisce solo i valori lato server come proprietà di un oggetto. In questo caso il filtro riguarderà ovviamente solo il valore di tipo GET definito dal parametro iDoc.notes.mapArg e quei segnalibri che cominciano col valore definito dal parametro iDoc.notes.emphBmPfx. Questo perché sono gli unici usati lato client. Ma se lo script dovesse interagire con altre funzioni lato client che facciano uso della URL, sarà possibile rendere pià articolato il filtro. Il dominio invece è utilizzato dalla sitografia per poter selezionare solo i collegamenti esterni – ma come semplice firma, è utilizzato anche dal gestore delle evidenziazioni. Dipende dalla variabile privata baseUrl dichiarata all'inizio dell'oggetto iDoc, che può essere modificata a piacimento per poter ottimizzare meglio la scelta dei collegamenti esterni, soprattutto nel caso in cui il sito fosse ospitato in un sottodominio.

In sintesi abbiamo:

  1. la URL mondata degli argomenti di tipo GET usati lato client e dei segnalibri,
  2. il percorso mondato di tutti gli argomenti di tipo GET e dei segnalibri,
  3. tutti i parametri di tipo GET (senza il punto interrogativo iniziale),
  4. il segnalibro attuale, se non à stato generato dagli script,
  5. l'indirizzo di livello più alto (solitamente il dominio).

Altre proprietà potranno essere aggiunte in seguito modificando la funzione costruttrice anonima in base alle proprie esigenze.

Indirizzo completo (iDoc.url):
Percorso (iDoc.path):
Argomenti (iDoc.urlArgs):
Indirizzo del sito (iDoc.siteUrl):
[Segnalibro (iDoc.bookmark): #]

Attenzione. Il segnalibro viene aggiornato solo quando serve al gestora delle evidenziazioni. Quindi è da considerare inutile ad altri scopi.

Testo di esempio da sottolineare

[ Prendi appunti in una finestra separata | Prendi appunti in una finestra agganciata alla pagina ]

Lorem Ipsum

"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…"
"Non c’è nessuno a cui piaccia il dolore in sé, che lo ricerchi e che voglia riceverlo, semplicemente perché è dolore…"

Titolo 1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras nec tristique sem. Integer facilisis risus a dui rutrum in lobortis sapien auctor. Integer a erat sit amet diam dignissim malesuada sit amet et ante. Morbi at lacinia libero. Donec mollis mi in ipsum consectetur id scelerisque justo ultrices. Aliquam pretium nibh quis turpis iaculis sollicitudin ullamcorper quam ornare. Curabitur faucibus tristique massa. Proin et laoreet augue. Duis elementum enim odio. Quisque tempor, leo quis sollicitudin suscipit, felis turpis facilisis orci, a luctus sem erat quis massa. Aenean malesuada tempor ipsum et ultrices. Morbi fermentum porta dolor, eu cursus enim sollicitudin vitae. Ut eu pretium mauris.

Titolo 2

Proin commodo magna vitae dolor scelerisque in facilisis elit laoreet. Suspendisse sollicitudin eros at dolor tempus non blandit nunc commodo. Praesent tristique justo ut lorem accumsan euismod cursus dolor faucibus.

Immagine di esempio con sfondo trasparente

Suspendisse volutpat sollicitudin tortor sit amet scelerisque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed feugiat rutrum nisl sit amet ornare. In hac habitasse platea dictumst. Vivamus porta, tortor sit amet luctus interdum, lacus purus fringilla ipsum, at adipiscing turpis eros tincidunt nisl. Proin nunc libero, scelerisque ac elementum eu, accumsan vitae velit. In tellus nisi, tristique sit amet molestie eget, faucibus non diam. Maecenas porttitor varius nunc ut placerat. Sed non purus felis. Curabitur iaculis dignissim est nec tincidunt.

Suspendisse tempus tincidunt metus, vel aliquet libero euismod vel. Praesent id tellus quam, consectetur aliquam dui. Pellentesque lobortis orci eget felis convallis tincidunt. Vivamus sit amet nisl tincidunt velit suscipit suscipit. Sed elementum, sapien ac vulputate condimentum, nibh felis vestibulum augue, a consequat libero odio sed enim. Sed erat neque, faucibus eget porta ut, faucibus ut nibh. Integer non arcu mauris, quis malesuada lacus. Aliquam mattis, ipsum a consequat blandit, orci tortor molestie magna, nec sodales augue mi ac leo. Vestibulum dignissim, augue quis porta aliquam, lectus enim accumsan nibh, non placerat massa mauris in orci. Nam ut orci in leo convallis porta. Nulla facilisi. Quisque nisl nisi, aliquam in vulputate eget, tincidunt eu justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla magna sapien, gravida ac faucibus quis, imperdiet vel arcu. Praesent sed consequat quam. Sed in ipsum vulputate mauris malesuada porttitor eu nec erat. Nam a odio non nisi accumsan pulvinar at mattis arcu. Cras tincidunt sem vitae leo molestie dignissim.

Phasellus vel diam risus, eget luctus quam. In mollis vulputate ullamcorper. Aliquam erat volutpat. Nunc ultricies egestas augue a tempus. Sed sem nunc, sodales in tincidunt ac, tristique vel enim. Maecenas scelerisque leo vitae nibh cursus laoreet. Donec tempus, mi at facilisis blandit, ipsum libero varius felis, nec placerat augue orci ac quam. Integer id risus orci. Maecenas aliquet convallis urna, nec lobortis lorem tincidunt ut. Vestibulum quis magna eu enim aliquet varius sit amet in purus. Quisque sed leo est, vel sodales justo. Sed eleifend sem nec eros vestibulum euismod.


Titolo 3

Cras sem leo, volutpat sit amet viverra mollis, tempus ut nibh. Duis auctor semper libero vitae adipiscing. Sed non orci sed ipsum rutrum euismod id sit amet libero. Proin eu nunc sed metus pharetra blandit. Integer lacus sapien, elementum sit amet porttitor vel, consequat vitae magna. Aenean eu tellus arcu, volutpat porttitor quam. Curabitur tellus metus, posuere vel tincidunt sit amet, laoreet id ipsum. Donec vitae libero quis sem scelerisque placerat in vitae nunc. Ut placerat euismod turpis eget venenatis. Donec elit metus, placerat consequat ultrices vehicula, dapibus non nisl. Etiam at nulla ante, eget rhoncus lectus. Cras sollicitudin accumsan odio, eu molestie dui commodo pellentesque. Phasellus vitae aliquam sem. Etiam eget leo nulla, et lacinia augue. Fusce ligula magna, auctor ut feugiat sed, scelerisque ut massa. Ut sodales, lacus quis dictum malesuada, elit augue gravida erat, ac viverra lacus quam a libero.

Immagine di esempioEtiam in consectetur leo. Cras vitae suscipit est. Vivamus gravida purus at dolor porta convallis. Fusce quis leo a mi rutrum mollis a non elit. Maecenas accumsan ullamcorper sem, vel dapibus nibh scelerisque in. Vivamus iaculis mi at magna facilisis ornare. Pellentesque ornare sem eget nisi posuere condimentum. Morbi vel risus lorem. Quisque dapibus congue orci, sed sodales purus congue in. Nam dapibus ultricies quam, sed blandit velit porttitor nec. Proin lobortis viverra elementum. Donec ac sem sit amet enim cursus aliquam. In ullamcorper molestie nisl, eget imperdiet arcu ullamcorper at. Pellentesque quis libero vitae sem laoreet interdum. Aliquam posuere quam nec libero convallis iaculis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In blandit, tellus ut laoreet posuere, urna arcu volutpat arcu, vestibulum vehicula orci lectus eget risus. Morbi laoreet eros et felis porta eu accumsan dui molestie. Cras rhoncus massa quis nibh ornare eget dignissim dui venenatis.

Nunc et est justo, quis volutpat metus. Morbi congue interdum arcu at vehicula. Curabitur dictum, massa eu condimentum condimentum, quam nisi ullamcorper justo, nec bibendum odio nibh porttitor erat. Nullam lacus enim, vehicula ac rhoncus sit amet, tempor vitae nulla. Ut risus nunc, mollis non faucibus nec, pellentesque at mauris. Aliquam erat volutpat. Aliquam sed nibh tortor, gravida porta nisl. Quisque faucibus est a mauris auctor sit amet pulvinar mauris feugiat. Morbi ut metus dui. Integer diam nulla, varius ac interdum vel, vulputate a erat. Donec condimentum aliquet quam in condimentum. Phasellus nec mattis arcu. Aenean non mauris odio. Vestibulum euismod faucibus turpis sit amet dictum. Praesent semper nunc nec dui fermentum eget bibendum quam congue. Sed quis nibh velit, a commodo nisi.

Mauris vel mauris lorem, a vestibulum augue. Etiam sollicitudin nunc a est venenatis tempus. Donec eget purus nisl. Proin orci est, ultrices sed fermentum vitae, ultricies vitae ante. Cras porttitor mi ut metus porta quis accumsan turpis feugiat. Pellentesque sed tellus magna, ac imperdiet odio. Sed sed ligula vitae felis condimentum tincidunt at id odio. Maecenas lacus sapien, porta in aliquam nec, dignissim nec magna. Mauris gravida gravida pellentesque. Phasellus eu eros orci, ac sodales orci. Donec ut lacus nec justo venenatis fringilla eget vel libero. Etiam eget metus erat, vitae consequat erat.

Curabitur placerat turpis in tortor elementum fermentum. Ut lacus eros, consequat et consequat quis, fermentum eget justo. Vestibulum varius massa at ligula dignissim et placerat massa placerat. Phasellus vehicula luctus augue nec congue. Nullam in arcu sit amet nibh dignissim volutpat vitae et neque. Proin non lacus lorem. Aliquam erat volutpat. Vivamus non diam leo. Quisque eget justo id dui posuere malesuada ut sed eros. Nullam vulputate scelerisque odio, et rhoncus leo gravida vitae. Etiam urna nisl, tristique at ornare quis, aliquet sed nunc.

Vestibulum ac ante tellus. Donec mauris elit, blandit sed venenatis in, ultricies non enim. In pellentesque, nisi at dictum adipiscing, sapien augue hendrerit diam, a commodo elit libero sit amet tortor. Mauris sit amet justo nec justo malesuada consequat. Phasellus ornare sodales fringilla. Quisque suscipit iaculis molestie. Ut consequat dictum mauris in dignissim. Ut eget lacus augue, a hendrerit nisi. Phasellus laoreet consequat elit, nec lobortis massa feugiat id. Fusce ut dolor ac est condimentum ullamcorper nec elementum neque.

Etiam id ante eget erat ultrices vulputate. Sed eget dolor dui, condimentum feugiat odio. Donec semper varius neque eget auctor. In eu risus libero. Curabitur vitae gravida est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Etiam vel nibh nibh, sit amet convallis dui. Nam facilisis, orci vel aliquet pellentesque, magna erat pretium felis, at vulputate libero augue a tortor. Ut odio lectus, tincidunt ut dictum nec, mattis id odio. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut ullamcorper nisi in sem adipiscing in condimentum nibh ultrices. Proin nec augue tortor, eget elementum tellus. Maecenas varius justo a justo mollis sed sagittis nunc vestibulum. In hac habitasse platea dictumst. Phasellus vel est orci. Sed risus neque, vehicula vel egestas eu, imperdiet vel orci. Maecenas gravida magna eget est condimentum consectetur. Nullam elit dui, eleifend quis adipiscing ac, pulvinar ut mi. Phasellus aliquam nulla sed ipsum semper vehicula.

Mauris ornare nisi at enim viverra in pharetra leo blandit. Curabitur id nisi vitae lorem tempus accumsan. In semper mauris id dui posuere sit amet blandit turpis imperdiet. Sed porta, lorem accumsan rhoncus varius, dui tortor pharetra ante, sed lacinia mauris nisi eget ante. Vestibulum aliquam porta mauris, ut eleifend libero dapibus ut. In posuere dictum nulla a eleifend. Aliquam justo sapien, rutrum eget porta sed, sollicitudin id leo. In consectetur fermentum libero eget interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas risus metus, sollicitudin sed ultricies nec, blandit id risus. Mauris ac nisi id nibh bibendum dapibus. Quisque dapibus lobortis porta. Aenean consequat, nisl vel viverra hendrerit, massa est blandit neque, non dignissim odio turpis et lacus. Phasellus mollis aliquam tellus et porta. Maecenas auctor purus lacus, sit amet adipiscing orci. Integer ut lacinia est. Vivamus non dolor interdum risus fringilla pharetra sit amet vel ipsum. Ut aliquet mi id metus posuere facilisis.

Fusce adipiscing libero ut quam tristique convallis at id ante. Proin sapien risus, pellentesque vitae facilisis et, laoreet eu urna. Nullam suscipit mattis ultrices. Donec rutrum bibendum odio, ut interdum tellus suscipit ut. Aenean ac urna id dolor dapibus blandit. Maecenas at congue eros. Donec imperdiet tristique facilisis. Proin scelerisque tincidunt metus, et gravida turpis elementum quis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec mollis sagittis commodo. Suspendisse interdum commodo tortor, vitae elementum nisl ullamcorper quis. Vivamus sodales tristique ultrices. Curabitur sed mattis enim. Vestibulum elit diam, laoreet sagittis mattis eu, aliquam ut est. Vivamus non massa ac lorem ultrices lobortis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam at diam non purus tincidunt interdum. Fusce laoreet blandit ipsum in ornare. Praesent non dolor non lectus mollis molestie vitae vel tellus.


Titolo 4

Phasellus lectus est, ornare eu sodales ut, porttitor id turpis. Sed venenatis tempor ante, non euismod ipsum hendrerit a. Cras erat erat, condimentum non convallis ut, vestibulum sed massa. Mauris et scelerisque purus. Aenean sodales nisi enim. Morbi nec leo ultricies eros hendrerit sollicitudin. Cras a orci eros, in ultrices metus. Phasellus gravida interdum porta. Sed suscipit neque tincidunt orci vulputate ut elementum lectus ultrices. Etiam tristique mi quis mi hendrerit vitae scelerisque massa fringilla. Curabitur imperdiet lorem non turpis faucibus id elementum augue dapibus. Vestibulum non accumsan felis. Nullam iaculis, est eget sagittis ullamcorper, quam augue venenatis eros, ac luctus orci quam ut mauris. Donec varius enim vel dolor scelerisque accumsan.

Nullam accumsan faucibus tellus at lacinia. Ut nunc mi, fermentum at fermentum sit amet, ultricies sed neque. Cras ultricies tincidunt mi et pretium. Donec ac sapien turpis, vel malesuada justo. Fusce at lorem at nisl vulputate lacinia nec a diam. Praesent ultrices dui in libero tincidunt mattis varius est eleifend. Nullam ipsum nisl, egestas quis consequat ac, varius nec massa. Vivamus convallis tincidunt elementum. Sed nec lectus ac mauris pharetra sollicitudin sed venenatis elit. Maecenas nibh lacus, hendrerit ac fermentum ut, sollicitudin ut odio. Fusce ullamcorper, turpis a pharetra bibendum, quam nisi tristique dolor, quis euismod metus lacus a urna. Vivamus euismod sollicitudin libero, eget lobortis urna gravida sit amet. Nulla id bibendum dolor. Curabitur augue enim, posuere ac feugiat id, imperdiet non elit.

Mauris non lorem ante, eget mollis tellus. Nam ullamcorper, felis ut commodo ullamcorper, arcu nulla bibendum massa, a venenatis dui velit eu justo. Nullam pellentesque erat ac magna eleifend vitae pharetra urna condimentum. Fusce ut nibh sapien. Fusce convallis odio in sem dictum ac varius urna dapibus. Mauris aliquam lectus sit amet nisi ornare eu mattis turpis rutrum. Curabitur mattis turpis ac lacus accumsan varius. Quisque ornare scelerisque sem at sagittis. Duis sodales velit porta orci dapibus ut varius velit aliquam. Vestibulum et risus ut nulla viverra blandit et eget libero. Nullam vehicula, libero rhoncus dignissim pharetra, nunc dui interdum dolor, vel lobortis justo enim eu lacus. Nullam scelerisque, tortor vel porta accumsan, dui risus vulputate nulla, sit amet iaculis mi lectus a eros. Donec porttitor nisi eget metus viverra sed consectetur velit porttitor. Morbi eu est eros. Donec in risus massa, at viverra nibh. Integer mollis convallis mi, sed varius velit fringilla vitae. Quisque vitae erat quis neque blandit rhoncus. Suspendisse posuere dolor sed lacus tempor quis lobortis lacus pretium. Fusce nec lectus nisi. Mauris rutrum commodo accumsan. In hac habitasse platea dictumst. Quisque in massa nunc, eget pharetra odio. Praesent blandit, orci vel aliquet aliquam, libero tortor rutrum nibh, non adipiscing justo tortor feugiat risus. Fusce ullamcorper, neque molestie ullamcorper lobortis, felis orci sollicitudin ipsum, at pretium turpis augue et elit. In dictum egestas pretium. Vivamus augue quam, lacinia sit amet aliquam a, tincidunt vitae mi. Donec facilisis dolor id nisl commodo luctus. Aliquam laoreet bibendum mi, at laoreet quam commodo vitae. Aliquam erat volutpat.

Morbi lacus diam, rhoncus id porta eget, pellentesque non purus. Nam a mi volutpat leo auctor interdum. Curabitur faucibus orci sapien, et interdum metus. Quisque commodo molestie risus in sagittis. Nulla vulputate mi vel odio ornare a sollicitudin felis facilisis. Nunc urna quam, malesuada ut convallis at, imperdiet malesuada nisl. In libero nibh, porttitor nec dictum quis, tempus sit amet erat. Duis tortor dui, auctor sed ornare sed, placerat tristique orci. Pellentesque ut dui et neque pharetra dignissim ac quis erat. Nam nulla nulla, gravida eget porttitor ac, viverra id arcu. Praesent lorem odio, cursus nec viverra non, euismod in ligula. Praesent rutrum egestas feugiat. Curabitur quis diam eget massa luctus accumsan id commodo neque. Ut quis nunc tortor, at gravida velit. Integer eget leo non lectus faucibus blandit. Phasellus posuere sagittis nunc quis interdum. Ut tortor elit, mollis sed sodales quis, dapibus in sapien. Praesent ut erat ipsum. In massa leo, consectetur id volutpat nec, sollicitudin eget nunc. Ut vulputate justo et orci semper nec tincidunt libero placerat.

Ut ultricies lectus vitae mi elementum sodales. Maecenas id justo nulla, a fermentum augue. Integer tempus dolor eget purus aliquet sodales consequat velit posuere. Sed vel enim sem. Ut arcu eros, vulputate non tempor sit amet, pretium ut tortor. Sed elementum eros nec mauris commodo et pellentesque neque pharetra. Nulla facilisi. Aliquam aliquam lorem at mauris fringilla ac egestas nunc vehicula. In hac habitasse platea dictumst. Nunc vehicula ultricies massa a volutpat.

Nullam ut nisi mauris. Sed ullamcorper enim est, quis vulputate elit. Vivamus vel est tellus, sed iaculis arcu. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Phasellus pretium nibh ut ligula interdum quis dapibus odio lobortis. Nunc mauris neque, laoreet vel interdum eget, pulvinar eu augue. Pellentesque mattis mollis elementum. Etiam id dui nisi. Nullam ac lacus mauris, et commodo lacus. Nullam pulvinar ante at augue porttitor non accumsan eros adipiscing. Vivamus at dui libero, in imperdiet metus. Curabitur et nisl erat.

Possibili conflitti

 Ecco che cosa potrebbe generare conflitto con lo script.

  1. L'assegnazione di un cursore per l'oggetto iBody: verrebbe sovrascritto dalle funzioni iDoc.notes.book.makeActive() e iDoc.notes.book.makeInctive().
  2. L'assegnazione dell'evento onbeforeunload per l'oggetto window: verrebbe sovrascritto dalle funzioni iDoc.notes.book.terminate() e iDoc.notes.book.makeActive(). Quest'evento viene modificato in momenti ben circoscritti, quindi il conflitto non sussiste se altre funzioni assegnano lo stesso evento in momenti diversi e altrettanto circoscritti.

Attenzione! Mai usare le tante funzioni che circolano in rete che evidenziano le parole chiave con cui si è giunti al sito dai motori di ricerca. Esse creano dei nuovi nodi che scompaiono al successivo ritorno nella pagina, compromettendo così le eventuali mappe generate dal quaderno degli appunti. In generale questo script è incompatibile con tutto ciò che modifica dinamicamente i nodi contenuti all'interno del nodo genitore iBody (col resto della pagina si potrà fare invece quel che si vorrà!).