stripit/striped/StripEd.svg

584 lines
22 KiB
XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:xlink="http://www.w3.org/1999/xlink"
id="svg">
<title>Geekscottes maker ALPHA</title>
<defs id="defs">
<style type="text/css">
<![CDATA[
.strip .fond {
fill:rgb(202,225,232);
stroke-width:10;
stroke:rgb(151,176,183);
visibility:hidden;
}
.strip:hover .fond {
visibility:visible;
}
.strip .outils {
visibility:hidden;
}
.strip:hover .outils {
visibility:visible;
}
]]>
</style>
<!--
TODO
defs :
Définir ici tous les icônes : croix, actualiser, plus, etc, etc
-->
<path id="croix" d="M 10 10 L 15 15 L 20 10 L 15 15 L 10 20 L 15 15 L 20 20" style="stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;"/>
<g id="actualiser">
<circle cx="5" cy="5" r="5" stroke="black" stroke-width="3" fill-opacity="0"/>
<path d="M 9 9 L 5 5" stroke="black" stroke-width="3" fill="none"/>
</g>
<g id="sauver">
<rect width="10" height="10" fill-opacity="0" stroke="black" stroke-width="3"/>
<circle cx="5" cy="5" r="5" stroke="black" stroke-width="3" fill-opacity="0"/>
</g>
</defs>
<g id="strip" >
</g>
<!--<g id="case_1" transform="translate(0,100)">
<g id="contenu" transform="translate(0,145)scale(0.7)">
<use id="personnage_g" xlink:href="#oldtux" display="inline"/>
<use id="personnage_d" xlink:href="#oldtux" display="inline" transform="scale(-1,1)translate(-880)"/>
<g id="bulle_1" transform="translate(280)">
<path style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 34.345187,41.199484 C 37.435469,13.765525 119.75324,16.680839 188.89853,17.460899 C 243.33906,18.075068 320.82456,6.6953948 328.29958,46.755323 C 338.7968,107.48398 250.19808,95.647905 205.56604,96.757874 C 160.9437,97.867602 128.80494,93.348698 81.317279,92.717264 C 70.761213,92.571352 34.728914,118.66279 11.616754,120.49646 C 26.610412,112.20373 39.510738,101.1199 46.467017,82.110663 C 45.764437,67.360926 31.254905,68.633443 34.345187,41.199484 z"
id="pathBulle_1" />
<text id="textebulle_1"></text>
</g>
<g id="bulle_2" transform="translate(280,250)">
<path style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 54,21 L 154,21 Q 174,21 174,41 L 174,101 Q 174,121 154,121 L 54,121 Q 34,121 34,101 L 34,41 Q 34,21 54,21 z"
id="pathBulle_2" />
<text id="textebulle_2"></text>
</g>
</g>
<rect
style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.91113186;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
id="cadre"
width="600"
height="480"
x="10" y="0" ry="0" />
</g>-->
<g id="formulaire" transform="translate(0,300)">
<switch>
<foreignObject width="1000" height="1000">
<body xmlns="http://www.w3.org/1999/xhtml">
<div>
<form method="post" action="javascript:chargerURL(document.getElementById('url').value)">
<fieldset style="" id="upload">
<legend>Charger un strip</legend>
<label for="url">Adresse du fichier : </label><input type="text" id="url" name="url" value="geekscottes_133.xml" size="50"/>
<input type="submit" value="Ouvrir"/>
</fieldset>
<fieldset>
<legend>Code XML</legend>
<label for="xml_area">nom</label>
<textarea id="xml_area" name="xml_area" rows="15" cols="130">code</textarea>
<input type="button" value="Envoyer"/>
</fieldset>
</form>
</div>
</body>
</foreignObject>
<text x="50" y="50">Votre navigateur ne supporte pas la balise ForeignObject, vous ne pourrez pas utiliser cet outil.</text>
</switch>
</g>
<script type="text/javascript">
<![CDATA[
const svgNS = "http://www.w3.org/2000/svg";
idstrip = 0;
// Point
function Point(x, y) {
this.x = x;
this.y = y;
}
// CurvePoint
function CurvePoint(type, pointList) {
this.type = type;
this.pointList = pointList;
this.setOffset = function(start, end, off_x, off_y) {
for(var i = start ; i < end ; i++) {
this.pointList[i].x += off_x;
this.pointList[i].y += off_y;
}
}
this.toString = function() {
var str = this.type + " ";
for(var i = 0 ; i < this.pointList.length ; i++) {
str += this.pointList[i].x + "," + this.pointList[i].y + " ";
}
return str;
}
}
function PM(x, y) {
return new CurvePoint("M", [new Point(x, y)]);
}
function PL(x, y) {
return new CurvePoint("L", [new Point(x, y)]);
}
function PQ(x1, y1, x2, y2) {
return new CurvePoint("Q", [new Point(x1, y1), new Point(x2, y2)]);
}
/*function PC(x1, y1, x2, y2, x3, y3) {
return new CurvePoint("C", [new Point(x1, y1), new Point(x2, y2), new Point(x3, y3)]);
}*/
// Curve
function Curve(points, closed) {
this.points = points;
this.setOffset = function(start,startP, end,endP, off_x, off_y) {
this.points[start].setOffset(startP,this.points[start].pointList.length, off_x, off_y);
for(var i = start+1 ; i < end ; i++) {
this.points[i].setOffset(0,this.points[i].pointList.length,off_x, off_y);
}
this.points[end].setOffset(0,endP, off_x, off_y);
}
this.toString = function() {
var str = "";
for(var i = 0 ; i < this.points.length ; i++) {
str += this.points[i].toString();
}
if(this.closed) {
str += "z"
}
return str;
}
this.closed = closed;
}
//Objet Case
function Case(num, width, fond) {
this.num = parseInt(num);
this.width = parseInt(width);
this.fond = fond;
this.persos = new Array();
this.bulles = new Array();
//var this.strip;
this.alert = function() {
alert("Taille: " + this.width + " Num: " + this.num);
}
this.ajouterPerso = function(perso) {
this.persos.push(perso);
perso.case = this;
}
this.ajouterBulle = function(bulle) {
this.bulles.push(bulle);
bulle.case = this;
}
this.getNoeud = function(height, left) {
var noeud_fond = document.createElementNS(svgNS, "use");
noeud_fond.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href", this.fond);
var noeud_croix = document.createElementNS(svgNS, "use");
noeud_croix.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href", "#croix");
noeud_croix.style.visibility = 'hidden';
noeud_croix.strip = this.strip;
noeud_croix.case = this;
noeud_croix.setAttribute("onclick","javascript:this.strip.supprimerCase(this.case.num);");
var noeud_case = document.createElementNS(svgNS, "g");
//noeud_case.strip = this.strip;
noeud_case.appendChild(noeud_fond);
noeud_case.setAttribute("id", "strip-"+this.strip.id+"-case-"+this.num);
noeud_case.setAttribute("class", "case");
noeud_case.setAttribute("transform", "translate("+left+")");
noeud_case.croix = noeud_croix;
noeud_case.setAttribute("onmouseover","javascript:this.croix.style.visibility = 'visible'");
noeud_case.setAttribute("onmouseout","javascript:this.croix.style.visibility = 'hidden'");
var noeud_cadre = document.createElementNS(svgNS, "rect");
noeud_cadre.setAttribute("style","fill: none; stroke: rgb(0, 0, 0); stroke-width: 4;");
noeud_cadre.setAttribute("width",this.width);
noeud_cadre.setAttribute("height",height);
noeud_cadre.setAttribute("x",0);
noeud_cadre.setAttribute("y",0);
// AJOUTER LES PERSOS
for(this.i=0;(this.i < this.persos.length);this.i++) {
noeud_case.appendChild(this.persos[this.i].getNoeud());
// AJOUTER LES BULLES DES PERSOS
for(this.j=0;(this.j < this.persos[this.i].bulles.length);this.j++) {
noeud_case.appendChild(this.persos[this.i].bulles[this.j].getNoeud());
}
}
// AJOUTER LES BULLES
for(this.i=0;(this.i < this.bulles.length);this.i++) {
noeud_case.appendChild(this.bulles[this.i].getNoeud());
}
noeud_case.appendChild(noeud_cadre); // le cadre est par dessus le reste
noeud_case.appendChild(noeud_croix);
return noeud_case;
}
this.getXML = function(tab) {
this.xml = tab+"<case fond=\""+this.fond+"\" width=\""+this.width+"\">\n"
// AJOUTER LES PERSOS
for(this.i=0;(this.i < this.persos.length);this.i++) {
this.xml += this.persos[this.i].getXML(tab+"\t");
}
// AJOUTER LES BULLES
for(this.i=0;(this.i < this.bulles.length);this.i++) {
this.xml += this.bulles[this.i].getXML(tab+"\t");
}
this.xml += tab+"</case>\n";
return this.xml;
}
}
//Objet Perso
function Perso(lien, x, y, pos) {
this.url = lien;
this.x = parseInt(x);
this.y = parseInt(y);
this.pos = pos;
this.bulles = new Array();
this.alert = function() {
alert("Position: " + this.x + ", " + this.y + " Url: " + this.url);
}
this.draw = function() {
document.getElementById("personnage_"+this.pos).setAttribute("xlink:href", this.url);
}
this.ajouterBulle = function(bulle) {
this.bulles.push(bulle);
bulle.perso = this;
}
this.getNoeud = function() {
noeud_perso = document.createElementNS(svgNS, "use");
noeud_perso.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href", this.url);
if(this.pos == "gauche") transform = "translate("+this.x+","+this.y+")";
if(this.pos == "droite") transform = "translate("+(this.x+250)+","+this.y+") scale(-1,1)"
noeud_perso.setAttribute("transform", transform);
return noeud_perso;
}
this.getXML = function(tab) {
this.xml = tab+"<personnage url=\""+this.url+"\" x=\""+this.x+"\" y=\""+this.y+"\" pos=\""+this.pos+"\">\n";
for(this.i=0;this.i < this.bulles.length;this.i++) {
this.xml += this.bulles[this.i].getXML(tab+"\t");
}
this.xml += tab+"</personnage>\n";
return this.xml;
}
}
function ajouteTSpan(parent, texte, x, y) {
noeud_span = document.createElementNS(svgNS, "tspan");
noeud_span.setAttribute("x", x);
noeud_span.setAttribute("y", y);
noeud_span.textContent = texte;
parent.appendChild(noeud_span);
}
// Objet Bulle
function Bulle(x, y, texte, w, size) {
this.x = parseInt(x);
this.y = parseInt(y);
this.w = parseInt(w);
this.size = parseInt(size);
this.h = 100;
this.texte = texte;
this.actuPath = function() {
this.path = new Curve([
PM((this.x+20),this.y),
PL((this.x+this.w-20),this.y), //haut de la bulle
PQ((this.x+this.w),this.y,(this.x+this.w),(this.y+20)),
PL((this.x+this.w),(this.y+this.h-20)), //droite de la bulle
PQ((this.x+this.w),(this.y+this.h),(this.x+this.w-20),(this.y+this.h)),
PL((this.x+20),(this.y+this.h)), //bas de la bulle
PQ(this.x,(this.y+this.h),this.x,(this.y+this.h-20)),
PL(this.x,(this.y+20)), //gauche de la bulle
PQ(this.x,this.y,(this.x+20),this.y)
], true);
}
this.alert = function() {
alert("Position: " + this.x + ", " + this.y + " Texte: " + this.texte);
}
/*this.delier = function() {
this.perso = null;
}*/
this.getNoeud = function() {
noeud_bulle = document.createElementNS(svgNS, "g");
noeud_texte = this.getNoeudTexte();
noeud_path = document.createElementNS(svgNS, "path");
this.actuPath();
noeud_path.setAttribute("d", this.path.toString());
noeud_path.setAttribute("style", "fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0); stroke-width: 3;");
noeud_bulle.appendChild(noeud_path);
noeud_bulle.appendChild(noeud_texte);
noeud_bulle.setAttribute("onmouseover","javascript:this.childNodes[0].setAttribute(\"style\",\"fill: rgb(255, 255, 255); stroke: red; stroke-width: 3;\");");
noeud_bulle.setAttribute("onmouseout","javascript:this.childNodes[0].setAttribute(\"style\",\"fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0); stroke-width: 3;\");");
return noeud_bulle;
}
this.getNoeudTexte = function() {
const espace_ligne = 20;
var noeud_texte = document.createElementNS(svgNS, "text");
if(!isNaN(this.size)) noeud_texte.setAttributeNS(null,"font-size", this.size);
const b_parent = document.getElementById("strip");
var mots = this.texte.split(" ");
var mot_act = 0;
var nb_mots = mots.length;
var num_ligne = 1;
// On crée un noeud <text> temporaire, pour les calculs de longueur
noeud_temp = document.createElementNS(svgNS, "text");
if(!isNaN(this.size)) noeud_temp.setAttributeNS(null,"font-size", this.size);
noeud_temp.textContent = "";
b_parent.appendChild(noeud_temp);
while (mot_act < nb_mots) {
// On sauvegarde la ligne actuelle
var texte_act = noeud_temp.textContent;
var taille_act = noeud_temp.getComputedTextLength();
// On tente l'insertion du mot suivant
if (noeud_temp.textContent != "")
noeud_temp.textContent += " ";
noeud_temp.textContent+= mots[mot_act];
var longueur = noeud_temp.getComputedTextLength();
if (longueur > this.w && texte_act != "") {
// Trop long (et il y avait déjà des mots sur la ligne)
x = this.x+(this.w-taille_act)/2;
y = this.y + num_ligne * espace_ligne + 5;
ajouteTSpan(noeud_texte, texte_act, x, y);
noeud_temp.textContent = "";
num_ligne++;
} else {
mot_act++;
}
}
if (noeud_temp.textContent != "") {
x = this.x+(this.w-noeud_temp.getComputedTextLength())/2;
y = this.y + num_ligne * espace_ligne + 5;
ajouteTSpan(noeud_texte, noeud_temp.textContent, x, y);
num_ligne++;
}
b_parent.removeChild(noeud_temp);
this.h = espace_ligne * (num_ligne);
return noeud_texte;
}
this.actuPath();
/*this.getXml = function() { //renvoi un objet XML contenant la bulle
noeud_bulle =
}*/
this.getXML = function(tab) {
return tab+"<bulle x=\""+this.x+"\" y=\""+this.y+"\" width=\""+this.w+"\" contour=\""+this.contour+"\">"+this.texte+"</bulle>\n";
}
}
//Objet Strip
function Strip(id, x, y, height, editable) {
this.noeud = document.getElementById(id);
this.id = idstrip++;
this.x = parseInt(x);
this.y = parseInt(y);
this.height = parseInt(height);
this.cases = new Array();
this.noeud.setAttribute("transform", "translate("+this.x+","+this.y+")");
this.editable = editable;
this.ajouterCase = function(c) {
this.cases.push(c);
c.strip = this;
}
this.supprimerCase = function(i) {
this.noeud.removeChild(document.getElementById("strip-"+this.id+"-case-"+i)); // suppression du nœud SVG de la case
for(var num=i+1;num<this.cases.length;num++) { // décalage des nœuds SVG des autres cases
document.getElementById("strip-"+this.id+"-case-"+num).setAttribute("transform", document.getElementById("strip-"+this.id+"-case-"+num).getAttribute("transform")+"translate(-"+(20+this.cases[i].width)+")");
}
this.fond.setAttribute("width",this.fond.getAttribute("width")-(20+this.cases[i].width)); // diminuer la taille du fond
this.cases.splice(i,1); // suppression de la case du tableau
for(var num=i;num<this.cases.length;num++) { // décalage des autres cases
document.getElementById("strip-"+this.id+"-case-"+this.cases[num].num).setAttribute("id","strip-"+this.id+"-case-"+num);
this.cases[num].num--;
}
if(this.cases.length <= 0) this.clear(); // s'il n'y a plus de cases, on supprime le strip.
}
this.draw = function() {
var x = 0;
this.noeud.setAttribute("transform", "translate("+this.x+","+this.y+")");
var noeud_fond = document.createElementNS(svgNS, "rect");
noeud_fond.setAttribute("height",this.height+40);
this.noeud.appendChild(noeud_fond);
this.fond = noeud_fond;
//noeud_fond.setAttribute("style","fill:rgb(202,225,232);stroke-width:10;stroke:rgb(151,176,183)");
noeud_fond.setAttribute("x",-10);
noeud_fond.setAttribute("y",-10);
//noeud_fond.setAttribute("opacity",0);
for(this.i=0;this.i < this.cases.length;this.i++) {
this.noeud.appendChild(this.cases[this.i].getNoeud(this.height,x));
x += 20 + this.cases[this.i].width;
}
noeud_fond.setAttribute("width",x);
var noeud_outils = document.createElementNS(svgNS, "g");
noeud_outils.setAttribute("transform","translate(0,"+(this.height+10)+")");
var noeud_clear = document.createElementNS(svgNS, "use");
noeud_clear.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href", "#croix");
noeud_clear.setAttribute("onclick","javascript:this.strip.clear();");
noeud_clear.setAttribute("transform","translate(-10,-10)");
noeud_clear.strip = this;
var noeud_actualiser = document.createElementNS(svgNS, "use");
noeud_actualiser.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href", "#actualiser");
noeud_actualiser.setAttribute("onclick","javascript:this.strip.redraw();");
noeud_actualiser.setAttribute("transform","translate(15)");
noeud_actualiser.strip = this;
var noeud_sauver = document.createElementNS(svgNS, "use");
noeud_sauver.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href", "#sauver");
noeud_sauver.setAttribute("onclick","javascript:document.getElementById('xml_area').value = this.strip.getXML();");
noeud_sauver.setAttribute("transform","translate(30)");
noeud_sauver.strip = this;
noeud_outils.appendChild(noeud_clear);
noeud_outils.appendChild(noeud_actualiser);
noeud_outils.appendChild(noeud_sauver);
this.noeud.appendChild(noeud_outils);
//this.noeud.setAttribute("onmouseover","javascript:if(this.in!='in') { this.noeud_outils.style.visibility = 'visible';this.noeud_fond.setAttribute('opacity',100);this.in='in'}");
//this.noeud.setAttribute("onmouseout","javascript:this.noeud_outils.style.visibility = 'hidden';this.noeud_fond.setAttribute('opacity',0);this.in='out'");
this.noeud.noeud_outils = noeud_outils;
this.noeud.noeud_fond = noeud_fond;
this.noeud.setAttribute("class","strip");
noeud_fond.setAttribute("class","fond");
noeud_outils.setAttribute("class","outils");
}
this.clear = function() {
while (this.noeud.firstChild) this.noeud.removeChild(this.noeud.firstChild);
}
this.redraw = function() {
this.clear();
this.draw();
}
this.genXML = function() {
document.implementation.createDocument("", "strip", null);
}
this.getXML = function() {
var xml = "<strip x=\""+this.x+"\" y=\""+this.y+"\" height=\""+this.height+"\">\n";
for(var i=0;i < this.cases.length;i++) {
xml += this.cases[i].getXML("\t");
}
xml += "</strip>\n";
return xml;
}
}
function chargerURL(url) {
alert("c'est parti...");
strip = parseStrip(url);
strip.draw();
alert("voilà");
}
/*var strip = new Strip("strip",10,100,480,true);
case1 = new Case(0,600,"");
perso = new Perso("gnu.svg#layer1",0,103,"gauche");
bulle = new Bulle(150,10,"coucou les amis",100,20);
perso.ajouterBulle(bulle);
case1.ajouterPerso(perso);
case2 = new Case(1,600,"");
strip.ajouterCase(case1);
strip.ajouterCase(case2);
strip.draw();
alert(strip.getXML());
strip.supprimerCase(0);
strip.clear();
strip.draw();*/
function parseStrip(xmlFile) {
var xmlDoc;
xmlDoc=new window.XMLHttpRequest();
xmlDoc.open("GET",xmlFile,false);
xmlDoc.send("");
for(i=0;xmlDoc.responseXML.childNodes[i].nodeType != 1;i++);
strip_node = xmlDoc.responseXML.childNodes[i];
//alert(strip_node.textContent);
strip = new Strip("strip",strip_node.getAttribute("x"),strip_node.getAttribute("y"),strip_node.getAttribute("height"),true);
strip.clear();
num = 0;
for(i=0;case_node = strip_node.childNodes[i];i++) {
if(case_node.nodeName == "case") {
kase = new Case(num,case_node.getAttribute("width"),case_node.getAttribute("fond")); //on peut pas utiliser "case" donc j'utilise "kase"
num++;
for(j=0;perso_node = case_node.childNodes[j];j++) {
if(perso_node.nodeName == "personnage") {
perso = new Perso(perso_node.getAttribute("url"),perso_node.getAttribute("x"),perso_node.getAttribute("y"),perso_node.getAttribute("pos"));
for(k=0;bulle_node = perso_node.childNodes[k];k++) {
if(bulle_node.nodeName == "bulle") {
bulle = new Bulle(bulle_node.getAttribute("x"),bulle_node.getAttribute("y"),bulle_node.textContent,bulle_node.getAttribute("width"),bulle_node.getAttribute("size"));
perso.ajouterBulle(bulle);
}
}
kase.ajouterPerso(perso);
} else if(perso_node.nodeName == "bulle") {
bulle = new Bulle(perso_node.getAttribute("x"),perso_node.getAttribute("y"),perso_node.textContent,perso_node.getAttribute("width"),perso_node.getAttribute("size"));
kase.ajouterBulle(bulle);
}
}
strip.ajouterCase(kase);
}
}
return strip;
}
//strip = parseStrip("geekscottes_133.xml");
//strip.draw();
//TODO
//ajouter des appels de fonctions permettant de modifier le strip actif (texte des bulles, positions, ...)
//ajouter l'interface graphique pour agir sur ces fonctions
//penser à ajouter du drag and drop
//normaliser les id des objets : strip-iddustrip-case-idcase-bulle-idbulle, ... => DONE je crois
//tout faire pour pouvoir gérer plusieurs strip éditables ou non
//flip du perso si demandé => fait mais à améliorer
//perso composé => postponed
//pouvoir modifier un élément du strip et actualiser l'affichage => replaceChild
//faire des fonctions générant un fichier xml
//avoir des valeurs par défaut pour certains arguments (coté xml => à tester => NE MARCHE PAS) + coté javascript, placement des bulles et des persos
//faire un DTD pour le xml => DONE
//faire l'éditeur :
//ajouter du cliquer glisser
//ajouter/éditer bulles et perso
]]>
</script>
</svg>