e098a7d9bee557aa8e4c6b8da2d150c916160457
[redakcja.git] / platforma / static / js / xslt.js
1 var MARGIN = {
2     dramat_wierszowany_l: 4,
3     dramat_wierszowany_lp: 4,
4     dramat_wspolczesny: 4,
5     wywiad: 4,
6     opowiadanie: 4,
7     powiesc: 4,
8     liryka_l: 4,
9     liryka_lp: 4,
10     naglowek_czesc: 4,
11     naglowek_akt: 4,
12     naglowek_rozdzial: 4,
13     naglowek_osoba: 4,
14     lista_osob: 4,
15     
16     akap: 3,
17     akap_cd: 3,
18     akap_dialog: 3,
19     strofa: 3,
20     motto: 3, 
21     miejsce_czas: 3,
22         
23     autor_utworu: 2,
24     nazwa_utworu: 2,
25     dzielo_nadrzedne: 2,
26     didaskalia: 2,
27     motto_podpis: 2,
28     naglowek_listy: 2,
29     
30     kwestia: 1,
31     lista_osoba: 1
32 }
33
34 MARGIN['rdf:RDF'] = 3;
35 MARGIN['rdf:Description'] = 2;
36
37 function elementType(element) {
38     if ($.inArray(element.tagName, ['akap', 'akap_cd', 'akap_dialog', 'strofa', 'didaskalia', 'wers', 'wers_cd', 'wers_akap', 'wers_wciety', 'autor_utworu', 'nazwa_utworu', 'dzielo_nadrzedne', 'podpis'])) {
39         return 'inline';
40     } else {
41         return 'block';
42     }
43 }
44
45 // Serializuje XML, wstawiając odpowiednie ilości białych znaków między elementami
46 function serialize(element, mode) {
47     if (!mode) {
48         mode = 'block';
49     }
50     
51     if (element.nodeType == 3) { // tekst
52         if (mode == 'block') {
53             return [$.trim(element.nodeValue)];
54         } else {
55             return [element.nodeValue];
56         }
57     } else if (element.nodeType != 1) { // pomijamy węzły nie będące elementami XML ani tekstem
58         return [];
59     }
60     
61     var result = [];
62     var hasContent = false;
63     
64     if (MARGIN[element.tagName]) {
65         for (var i=0; i < MARGIN[element.tagName]; i++) {
66             result.push('\n');
67         };
68     } else if (element.tagName.indexOf('dc:') != -1) {
69         result.push('\n');
70     }
71     
72     result.push('<');
73     result.push(element.tagName);
74     
75     // Mozilla nie uważa deklaracji namespace za atrybuty
76     var ns = element.tagName.indexOf(':');
77     if (ns != -1 && $.browser.mozilla) {
78         result.push(' xmlns:');
79         result.push(element.tagName.substring(0, ns));
80         result.push('="');
81         result.push(element.namespaceURI);
82         result.push('"');
83     }
84     
85     if (element.attributes) {
86         for (var i=0; i < element.attributes.length; i++) {
87             var attr = element.attributes[i];
88             result.push(' ');
89             result.push(attr.name);
90             result.push('="');
91             result.push(attr.value);
92             result.push('"');
93             hasContent = true;
94         }
95     }
96     
97     if (element.childNodes.length == 0) {
98         result.push(' />');
99     } else {
100         result.push('>');
101
102         for (var i=0; i < element.childNodes.length; i++) {
103             result = result.concat(serialize(element.childNodes[i], 
104                 mode == 'inline' ? 'inline' : elementType(element.childNodes[i])));
105         }
106
107         result.push('</');
108         result.push(element.tagName);
109         result.push('>');
110     }
111     
112     return result;
113 };
114
115
116 function createXSLT(xsl) {
117     var p = new XSLTProcessor();
118     p.importStylesheet(xsl);
119     return p;
120 }
121
122
123 var xml2htmlStylesheet = null;
124 var html2xmlStylesheet = null;
125
126
127 // Wykonuje block z załadowanymi arkuszami stylów
128 function withStylesheets(block, onError) {
129     if (xml2htmlStylesheet && html2xmlStylesheet) {
130         block();
131         return;
132     }
133     $.blockUI({message: 'Ładowanie arkuszy stylów...'});
134     $.ajax({
135         url: STATIC_URL + 'xsl/wl2html_client.xsl',
136         dataType: 'xml',
137         success: function(data) {
138             xml2htmlStylesheet = createXSLT(data);
139             $.ajax({
140                 url: STATIC_URL + 'xsl/html2wl_client.xsl',
141                 dataType: 'xml',
142                 success: function(data) {
143                     html2xmlStylesheet = createXSLT(data);
144                     $.unblockUI();
145                     block();
146                 },
147                 error: onError
148             })
149         },
150         error: onError
151     })
152 }
153
154
155 function xml2html(options) {
156     withStylesheets(function() {
157         var xml = options.xml.replace(/\/\s+/g, '<br />');
158         var parser = new DOMParser();
159         var serializer = new XMLSerializer();
160         var doc = parser.parseFromString(xml, 'text/xml');
161         var error = $('parsererror', doc);
162         
163         if (error.length == 0) {
164             doc = xml2htmlStylesheet.transformToFragment(doc, document);
165             error = $('parsererror', doc);
166         }
167         
168         if (error.length > 0 && options.error) {
169             options.error(error.text());
170         } else {
171             options.success(doc.firstChild);
172         }
173     }, function() { options.error && options.success('Nie udało się załadować XSLT'); });
174 }
175
176
177 function html2xml(options) {
178     withStylesheets(function() {
179         var xml = options.xml;
180         var parser = new DOMParser();
181         var serializer = new XMLSerializer();
182         var doc = parser.parseFromString(xml, 'text/xml');
183         var error = $('parsererror', doc.documentElement);
184         
185         if (error.length == 0) {
186             doc = html2xmlStylesheet.transformToDocument(doc, document);
187             error = $('parsererror', doc.documentElement);
188         }
189         
190         if (error.length > 0 && options.error) {
191             options.error(error.text());
192             console.log(error);
193             $('#source-editor').html('<p>Wystąpił błąd:</p>' + error.text());
194         } else {
195             options.success(serialize(doc.documentElement).join(''));                              
196         }
197     }, function() { options.error && options.success('Nie udało się załadować XSLT'); });
198 };
199