commit 1a2140e52aa2e4d5fa85a3e53a5a5372312f447e
parent 7dc8c060a091e16483ffe86bfeeff0beabd09eb0
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date: Sun, 5 Sep 2010 22:20:03 +0200
Encore un peu de refactor.
Chaque vue de noeud (html) contient maintenant .étiquette et .contenu (sauf les noeuds texte).
Diffstat:
| M | editeur.css | | | 75 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------- |
| M | editeur.html | | | 2 | +- |
| M | editeur.js | | | 55 | ++++++++++++++++++++++++------------------------------- |
3 files changed, 81 insertions(+), 51 deletions(-)
diff --git a/editeur.css b/editeur.css
@@ -1,3 +1,17 @@
+/* Hacks :
+ *
+ * Si on fait <span class="important">un truc</span> avec
+ * .important { background-color: pink; }
+ * .important:before { background-color: red; font-size: x-small; content: "Important"; }
+ * alors le "Important" est sur fond rouge, mais la ligne est moins haute, donc on voit du rose an haut et en bas.
+ * Par contre, en faisant <span class="important"><span class="étiquette"></span>un truc</span> et avec
+ * .important { background-color: pink; }
+ * .important.étiquette { background-color: red;}
+ * .important.étiquette:before { font-size: x-small; content: "Important"; }
+ * on a l'effet désiré (le .étiquette est en rouge, et le "important" est sur une ligne moins haute _à l'intérieur_
+ * du .étiquette, donc on ne remarque pas qu'elle est moins haute.
+ */
+
.conteneur-esem {
border: thin solid black;
}
@@ -25,9 +39,10 @@
display:block;
margin-bottom: 0.3em;
}
-
-.conteneur-esem .noeud.multi-ligne:before {
+.conteneur-esem .noeud.multi-ligne .étiquette {
display:block;
+}
+.conteneur-esem .noeud.multi-ligne .étiquette:before {
font-size: smaller;
}
@@ -36,23 +51,25 @@
display: block;
margin-bottom: 0.3em;
}
-
-.conteneur-esem .noeud.mono-ligne:before {
+.conteneur-esem .noeud.mono-ligne .étiquette {
border-right: medium solid white;
padding: 0 0.3em;
display: inline-block;
}
+.conteneur-esem .noeud.mono-ligne .étiquette:before {
+}
/* Noeuds En-ligne */
.conteneur-esem .noeud.en-ligne {
display: inline;
}
-
-.conteneur-esem .noeud.en-ligne:before {
+.conteneur-esem .noeud.en-ligne .étiquette {
padding: 0 0.3em;
- font-size: smaller;
display: inline-block;
}
+.conteneur-esem .noeud.en-ligne .étiquette:before {
+ font-size: smaller;
+}
/* Titre */
.conteneur-esem .noeud.titre {
@@ -60,39 +77,59 @@
font-size: large;
border: thick solid #ddd;
}
-
-.conteneur-esem .noeud.titre:before {
+.conteneur-esem .noeud.titre .étiquette {
+ background-color: #ddd;
+}
+.conteneur-esem .noeud.titre .étiquette:before {
content: "Titre";
font-weight: bold;
- background-color: #ddd;
}
/* Paragraphe */
.conteneur-esem .noeud.paragraphe {
border: thick solid #ddd;
}
-
-.conteneur-esem .noeud.paragraphe:before {
- content: "Paragraphe";
+.conteneur-esem .noeud.paragraphe .étiquette {
background-color: #ddd;
}
+.conteneur-esem .noeud.paragraphe .étiquette:before {
+ content: "Paragraphe";
+}
/* Important */
.conteneur-esem .noeud.important {
background-color: mistyrose;
}
-
-.conteneur-esem .noeud.important:before {
- content: "Important";
+.conteneur-esem .noeud.important .étiquette {
background-color: pink;
+ border: thin solid pink;
+}
+.conteneur-esem .noeud.important .étiquette:before {
+ content: "Important";
+}
+.conteneur-esem .noeud.important .contenu {
+ border: thin solid pink;
}
/* Lien */
.conteneur-esem .noeud.lien {
background-color: #ddf;
}
-
-.conteneur-esem .noeud.lien:before {
- content: "Lien";
+.conteneur-esem .noeud.lien .étiquette {
background-color: #aaf;
+ border: thin solid #aaf;
+}
+.conteneur-esem .noeud.lien .étiquette:before {
+ content: "Lien";
+}
+.conteneur-esem .noeud.lien .cible {
+ border: thin solid #aaf;
+ padding: 0 0.2em;
+ color: blue;
+ background-color: #eef;
+}
+.conteneur-esem .noeud.lien .texte {
+ border: thin solid #aaf;
+ border-left: none;
+ padding: 0 0.2em;
}
\ No newline at end of file
diff --git a/editeur.html b/editeur.html
@@ -13,7 +13,7 @@
<body>
<textarea class="éditeur-semantique" cols="70" rows="15">
<titre><texte>Test</texte></titre>
-<paragraphe><important><texte>hello world</texte></important><texte>, bonjour </texte><lien interne="false" cible="http://www.example.com/">monde</lien><texte> !</texte></paragraphe>
+<paragraphe><important><texte>hello world</texte></important><texte>, bonjour </texte><lien interne="false" cible="http://www.example.com/" texte="monde"></lien><texte> !</texte></paragraphe>
</textarea>
</body>
</html>
diff --git a/editeur.js b/editeur.js
@@ -7,6 +7,7 @@ $.fn.extend({
for (var i = 0; i < modèle.contenu.length; i++) {
this.append(modèle.contenu[i].créerVue(typeVue));
}
+ return this;
}
});
@@ -16,9 +17,7 @@ var typesNoeud = {
enfants: ['titre', 'paragraphe'],
// surcharge de la _fonction_ "vue" (pas le tableau "vues").
vue: function() {
- var ret = $('<div class="conteneur-esem"/>');
- ret.appendVuesEnfants(this, 'aperçu');
- return ret;
+ return $('<div class="conteneur-esem"/>').appendVuesEnfants(this, 'aperçu');
}
},
titre: {
@@ -38,9 +37,9 @@ var typesNoeud = {
enfants: ['texte'],
vues: {
aperçu: function() {
- var ret = $('<span class="noeud lien en-ligne"/>');
- $('<span class="cible"/>').text(this.propriétés.cible).appendTo(ret);
- $('<span class="texte"/>').text(this.texte).appendTo(ret);
+ var ret = squeletteAperçuNoeud(this);
+ $('<span class="cible"/>').text(this.propriétés.cible).appendTo(ret.children(".contenu"));
+ $('<span class="texte"/>').text(this.propriétés.texte).appendTo(ret.children(".contenu"));
return ret;
},
édition: function() {
@@ -48,8 +47,9 @@ var typesNoeud = {
},
},
propriétés: {
- 'interne': false,
- 'cible': 'http://example.com/'
+ interne: false,
+ cible: 'http://example.com/',
+ texte: 'texte du lien'
}
},
texte: {
@@ -68,22 +68,26 @@ var typesNoeud = {
}
};
+function squeletteAperçuNoeud(noeud) {
+ var ct = {};
+ ct[MULTI_LIGNE] = { tag: 'div', tagc: 'div', cat: 'multi-ligne' };
+ ct[MONO_LIGNE] = { tag: 'div', tagc: 'span', cat: 'mono-ligne' };
+ ct[EN_LIGNE] = { tag: 'span', tagc: 'span', cat: 'en-ligne' };
+ ct = ct[typesNoeud[noeud.type].catégorie];
+
+ var html = $('<' + ct.tag + ' class="noeud"/>').addClass(noeud.type).addClass(ct.cat);
+ var étiquette = $('<span class="étiquette"/>').appendTo(html);
+ var contenu = $('<' + ct.tagc + ' class="contenu"/>').appendTo(html);
+ return html;
+}
+
var typeNoeudDéfaut = {
catégorie: EN_LIGNE,
enfants: ['texte'],
vues: {
aperçu: function() {
- var ct = {};
- ct[MULTI_LIGNE] = { tag: 'div', cat: 'multi-ligne' };
- ct[MONO_LIGNE] = { tag: 'div', cat: 'mono-ligne' };
- ct[EN_LIGNE] = { tag: 'span', cat: 'en-ligne' };
- ct = ct[typesNoeud[this.type].catégorie];
-
- var html = $('<' + ct.tag + ' class="noeud"/>');
- html.addClass(this.type);
- html.addClass(ct.cat);
- html.appendVuesEnfants(this, 'aperçu');
- return html;
+ return squeletteAperçuNoeud(this)
+ .children(".contenu").appendVuesEnfants(this, 'aperçu').end();
},
edition: function() {
return $('<div class="info">Cliquez sur du texte pour le modifier.</div>');
@@ -210,18 +214,7 @@ function xmlVersModèle(xml) {
// Vue
créerVue: function(typeVue) {
- surcharge = typesNoeud[tag].vue;
- if (typeof surcharge == "function") {
- return surcharge.call(this, typeVue);
- } else if (typeof surcharge == "object" && typeof surcharge[typeVue] == "function") {
- return surcharge[typeVue].call(this);
- } else {
- var ret = $('<div/>').text("" + typeVue);
- for (var i = 0; i < this.contenu.length; i++) {
- ret.append(this.contenu[i].créerVue('aperçu'));
- }
- return ret;
- }
+ return typesNoeud[tag].vue.call(this, typeVue);;
}
};