Dodanie funkcji do ulepszonej serializacji XMLa.
[redakcja.git] / platforma / templates / wiki / document_details.html
index ebb7242..e4c69ed 100644 (file)
@@ -3,7 +3,62 @@
 {% block extrahead %}
     <script src="{{STATIC_URL}}js/lib/codemirror/codemirror.js" type="text/javascript" charset="utf-8"></script>
     <script src="{{STATIC_URL}}js/lib/jquery.splitter.js" type="text/javascript" charset="utf-8"></script>
+    <script src="{{STATIC_URL}}js/lib/jquery.form.js" type="text/javascript" charset="utf-8"></script>
     <script type="text/javascript" charset="utf-8">
+    
+        function serialize(element) {
+            if (element.nodeType == 3) {
+                return [$.trim(element.nodeValue)];
+            }
+            
+            var result = [];
+            
+            result.push('<');
+            result.push(element.tagName);
+            
+            var ns = element.tagName.indexOf(':');
+            if (ns != -1 && $.browser.mozilla) {
+                result.push(' xmlns:');
+                result.push(element.tagName.substring(0, ns));
+                result.push('="');
+                result.push(element.namespaceURI);
+                result.push('"');
+            }
+            
+            if (element.attributes) {
+                for (var i=0; i < element.attributes.length; i++) {
+                    var attr = element.attributes[i];
+                    result.push(' ');
+                    result.push(attr.name);
+                    result.push('="');
+                    result.push(attr.value);
+                    result.push('"');
+                }
+            }
+            
+            result.push('>');
+    
+            for (var i=0; i < element.childNodes.length; i++) {
+                var child = element.childNodes[i];
+                result = result.concat(serialize(child));
+            }
+    
+            result.push('</');
+            result.push(element.tagName);
+            result.push('>');
+    
+            if (element.tagName == 'akap') {
+                result.push('\n\n\n');
+            } else if (element.tagName == 'rdf:RDF') {
+                result.push('\n\n\n\n\n');
+            } else if (element.tagName.indexOf('dc:') != -1) {
+                result.push('\n');
+            }
+            
+            return result;
+        };
+        
+
         $(function() {
             var editor = CodeMirror.fromTextArea('id_text', {
                 parserfile: 'parsexml.js',
             });
             
             $(window).resize();
+            
+            $('.vsplitbar').dblclick(function() {
+                if ($('#sidebar').width() == 0) {
+                    $('#splitter').trigger('resize', [$(window).width() - 480]);
+                } else {
+                    $('#splitter').trigger('resize', [$(window).width()]);
+                }
+            });
+
+            loadSuccess = function() {
+                if (this.get('state') != 'loading') {
+                    alert('erroneous state:', this.get('state'));
+                }
+
+                // prepare text
+                var doc = null;
+
+                messageCenter.addMessage('success', 'xmlload', 'Wczytałem HTML :-)');
+            }
+                        
+            function createXSLT(xsl) {
+                var p = new XSLTProcessor();
+                p.importStylesheet(xsl);
+                return p;
+            }
+            
+            function transform() {
+                $.ajax({
+                    url: '{{ STATIC_URL }}xsl/wl2html_client.xsl',
+                    dataType: 'xml',
+                    success: function(data) {
+                        var doc = null;
+                        var parser = new DOMParser();
+                        var serializer = new XMLSerializer();
+                        var htmlXSL = createXSLT(data);
+                        
+                        doc = editor.getCode().replace(/\/\s+/g, '<br />');
+                        doc = parser.parseFromString(doc, 'text/xml');
+                        console.log('xml', doc);
+                        doc = htmlXSL.transformToFragment(doc, document);
+                        console.log('after transform', doc);
+                        $('#simple-editor').html(doc.firstChild);
+                    },
+                    error: function() {alert('Error loading XSL!')}
+                });        
+            };
+            
+            function reverseTransform () {
+                $.ajax({
+                    url: '{{ STATIC_URL }}xsl/html2wl_client.xsl',
+                    dataType: 'xml',
+                    success: function(data) {
+                        var doc = null;
+                        var parser = new DOMParser();
+                        var serializer = new XMLSerializer();
+                        var xsl = createXSLT(data);
+                        
+                        doc = serializer.serializeToString($('#simple-editor div').get(0))
+                        doc = parser.parseFromString(doc, 'text/xml');
+                        console.log('xml',doc, doc.documentElement);
+                        doc = xsl.transformToDocument(doc);
+                        console.log('after transform', doc, doc.documentElement);
+                        doc = serialize(doc.documentElement).join('');
+                        // doc = serializer.serializeToString(doc.documentElement)
+                        editor.setCode(doc);
+                    },
+                    error: function() {alert('Error loading XSL!')}
+                });
+            };
+            
+            $('#save-button').click(function(event) {
+                event.preventDefault();
+                console.log(editor.getCode(), $('form input[name=text]').get(0));
+                $('form textarea[name=text]').val(editor.getCode());
+                $('form').ajaxSubmit(function() {
+                    alert('Udało się!');
+                });
+            });
+            
+            $('#simple-view-tab').click(function() {
+                $(this).addClass('active');
+                $('#source-view-tab').removeClass('active');
+                $('#source-editor').hide();
+                $('#simple-editor').show();
+                transform();
+            });
+            
+            $('#source-view-tab').click(function() {
+                $(this).addClass('active');
+                $('#simple-view-tab').removeClass('active');
+                $('#simple-editor').hide();
+                $('#source-editor').show();
+                reverseTransform();
+            });
         });
     </script>
     
     
         body {
             margin: 0;
+            overflow: hidden;
+            padding: 0;
         }
+        
         .vsplitbar {
-            width: 15px;
-            background: #C1C1C1 url(/static/img/gallery.png) no-repeat scroll 2px 2px;
-            border-left: 1px solid #777;
+            width: 14px;
+            background: #EEE url(/static/img/gallery.png) no-repeat scroll center center;
+            border-left: 1px solid #999;
+            cursor: col-resize;
         }
         
         .active {
             background-color: #DDD;
         }
         
-        #splitter {
-/*          height: 200px;*/
-/*          width: 500px;*/
-/*          border: 2px solid #B3B3B3;*/
+        #simple-editor {
+            overflow: auto;
+            height: 100%;
         }
         
         #sidebar {
             overflow: auto;
+            padding: 5px;
         }
         
-        #sidebar {
-            background: #989944;
+        #header {
+            margin: 0;
+            padding: 0;
+            background-color: #C1C1C1;
+            background-image: -webkit-gradient(linear, left top, left bottom, from(#C1C1C1), color-stop(0.9, #A2A2A2));
+            font: 11px Helvetica, Verdana, sans-serif;
+            font-weight: bold;
+        }
+        
+        #header h1 {
+            margin: 0;
+            padding: 0;
+            font: 17px Helvetica, Verdana, sans-serif;
+            font-weight: bold;
+            float: left;
+            padding: 3px 6px 2px 6px;
+            color: #222;
         }
         
         #tabs {
             margin: 0;
             padding: 0;
-            background-color: #C1C1C1;
+            
             width: 100%;
             height: 22px;
             padding-top: 2px;
         }
         
         #tabs li {
+            -webkit-user-select: none;
+            cursor: default;
             display: block;
             float: left;
-/*            width: 140px;*/
             padding: 5px 12px 3px 12px;
             border: 1px solid #999;
             -webkit-border-radius: 4px;
             -webkit-border-bottom-left-radius: 0;
             -webkit-border-bottom-right-radius: 0;
-            font: 11px Helvetica, Verdana, sans-serif;
             font-weight: bold;
             color: #222;
 /*            text-shadow: #CCC 1px 1px 1px;*/
             height: 13px;
-            background-color: #A2A2A2;
-            background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0.25, #A2A2A2), to(#C1C1C1));
-/*            -webkit-box-shadow: 2px 0px 2px #888;*/
+            background-color: #C1C1C1;
+            -webkit-box-shadow: 1px -1px 2px rgba(127, 127, 127, 0.25);
             margin-left: 4px;
             margin-bottom: -1px;
         }
 {% endblock %}
 
 {% block maincontent %}
-    <div id="header">
-        <ol id="tabs">
-            <li>Widok prosty</li>
-            <li class="active">Widok zaawansowany</li>
-        </ol>
-        <div style="clear: both"></div>
-    </div>
-    <div id="splitter">
-        <div id="editor">
-            <form action="{% url wiki.views.document_detail document.name|urlencode %}" method="post" accept-charset="utf-8">
-                {{ form.text }}
-                {#  #}
-                {# <p>Autor: {{ form.author }}</p> #}
-                {# <p>Komentarz: {{ form.comment }}</p> #}
-                {# <p><input type="submit" value="Continue &rarr;"></p> #}
-            </form>
+    <form action="{% url wiki.views.document_detail document.name|urlencode %}" method="post" accept-charset="utf-8">
+        <div id="header">
+            <div id="tools" style="float: right;">Wersja: {{ document.revision }}<button style="margin-left: 6px" id="save-button">Zapisz</button></div>
+            <h1>{{ document.name }}</h1>
+            <ol id="tabs">
+                <li id="simple-view-tab">Widok prosty</li>
+                <li id="source-view-tab" class="active">Widok zaawansowany</li>
+            </ol>
+            <div style="clear: both"></div>
         </div>
+        <div id="splitter">
+            <div id="editor">
+                <div id="source-editor">
+                    {{ form.text }}
+                    <input type="hidden" name="name" value="{{ document.name }}" />
+                    <input type="hidden" name="author" value="annonymous" />
+                    <input type="hidden" name="comment" value="no comment" />
+                    <input type="hidden" name="revision" value="{{ document.revision }}" />
+                </div>
+                <div id="simple-editor" style="display: none">
+                </div>
+            </div>
 
-        <div id="sidebar" style="width: 200px">
-            <p>Cokolwiek tutaj :-)</p>
+            <div id="sidebar" style="width: 200px">
+                <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+                <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+            </div>
         </div>
-    </div>
+    </form>
 {% endblock %}
\ No newline at end of file