www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 6fd76778e93e7e17a57dc74ad32fd69b7fc21e89
parent a77679d78dec56b5a557ea79c6061996e29f9367
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Wed,  1 Sep 2010 04:07:00 +0200

Pseudo-code...

Diffstat:
Mediteur.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) {