commit 6fd76778e93e7e17a57dc74ad32fd69b7fc21e89
parent a77679d78dec56b5a557ea79c6061996e29f9367
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date: Wed, 1 Sep 2010 04:07:00 +0200
Pseudo-code...
Diffstat:
| M | editeur.js | | | 121 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- |
1 file changed, 114 insertions(+), 7 deletions(-)
diff --git a/editeur.js b/editeur.js
@@ -1,10 +1,117 @@
-var typesAutorisés = [
- 'document',
- 'titre',
- 'paragraphe',
- 'important',
- 'texte'
-];
+var MULTI_LIGNE = 0;
+var MONO_LIGNE = 1;
+var EN_LIGNE = 2;
+var typesNoeud = {
+ document: { catégorie: MULTI_LIGNE, enfants: ['titre', 'paragraphe'] },
+ titre: { catégorie: MONO_LIGNE, enfants: ['important', 'texte'] },
+ paragraphe: { catégorie: MULTI_LIGNE, enfants: ['important', 'texte'] },
+ important: { catégorie: EN_LIGNE, enfants: ['texte'] },
+ lien: { catégorie: EN_LIGNE, enfants: ['texte'], 'propriétés': ['cible'] },
+ texte: { catégorie: EN_LIGNE, enfants: [] },
+
+ lien: {
+ aperçu: function(n) {
+ return aperçu_noeud(n)
+ .children(".étiquette")
+ .append('<img src="..." alt="">');
+ },
+ édition: function(n) {
+ return édition_noeud(n).prepend('<input type="text" value="propriété <cible>"/>')
+ },
+ propriétés: {
+ 'interne': false,
+ 'cible': 'http://example.com/'
+ }
+ },
+ texte: {
+ aperçu: function(n) {
+ return $("<span/>").bind_text(n.texte);
+ },
+ édition: function(n) {
+ return $("<textarea/>").bind_val(n.texte);
+ },
+ propriétés: {
+ texte: new valeur("")
+ }
+ }
+};
+
+/* Modèle :
+
+{ document, noeudActif, pressePapiers }
+
+nouveauNoeud()
+
+insérerAvant(n)
+insérerAprès(n)
+insérerDébut(n)
+insérerFin(n)
+insérerAutour(n)
+
+supprimer()
+remplacer(n1, n2, ...) // remplacer par n1, ... nn
+supprimer_en_gardant_le_contenu() // TODO : trouver un nom meilleur.
+
+modifierType(nouveau_type); // TODO ! lien -> texte ou important ou ... doit préserver le texte du lien !
+
+*/
+
+function valeur(v) { // TODO : voir si ça peut marcher aussi pour des éléments complets (pas que du texte).
+ var valeur = v;
+ var écouteurs = [];
+ var f = function(v) {
+ if (typeof v == "undefined") {
+ return valeur;
+ } else {
+ var oldv = v;
+ valeur = v;
+ $(écouteurs).each(function(i,f){
+ f(v, oldv);
+ });
+ }
+ };
+ f.ajouterÉcouteur = function(rappel) {
+ écouteurs.push(rappel);
+ }
+ /* TODO : piquer le code de : http://github.com/jsmaniac/2010-ide-langage-grunt-flin607/blob/master/jside4/callbacks.js */
+ return f;
+}
+
+function aperçu_noeud(n) {
+ switch (noeud.type.catégorie) {
+ case MULTI_LIGNE:
+ var tag='div';
+ var cat='multi-ligne';
+ break;
+ case MONO_LIGNE:
+ var tag='div';
+ var cat='mono-ligne';
+ break;
+ case EN_LIGNE:
+ var tag='span';
+ var cat='en-ligne';
+ break;
+ }
+
+ var html = $('<' + tag + ' class="noeud"/>');
+ html.addClass(n.type.classe).addClass(cat);
+ $('<span class="étiquette"/>').text(n.type.étiquette).appendTo(html);
+ $('<span class="contenu"/>').text(n.type.étiquette).appendTo(html);
+
+ return html;
+}
+
+function unique_enfant_texte(n) {
+ return (n.enfants().length == 1 && n.enfants(0).type == 'texte')
+}
+
+function édition_noeud_texte(n) {
+ return $("<textarea/>");
+}
+
+
+
+
$(function() {
$(".éditeur-semantique").each(function(i,e) {