]> gitweb @ CieloNegro.org - Rakka.git/commitdiff
misc changes
authorpho <pho@cielonegro.org>
Fri, 13 Nov 2009 08:14:49 +0000 (17:14 +0900)
committerpho <pho@cielonegro.org>
Fri, 13 Nov 2009 08:14:49 +0000 (17:14 +0900)
Ignore-this: 769c83b20da5a6626be8d7270acd69e8

darcs-hash:20091113081449-62b54-96383cc5a2dd8a77beace8491f3661d38fc79342.gz

12 files changed:
Rakka/Resource.hs
Rakka/Resource/PageEntity.hs
Rakka/Resource/Render.hs
Rakka/Resource/TrackBack.hs
Rakka/Wiki/Interpreter/Base.hs
defaultPages/StyleSheet/CieloNegro.xml
defaultPages/StyleSheet/Default.xml
js/base.js
js/editPage.js
js/hashedParam.js
js/screen.js
js/systemConfig.js

index 0333d6f53068d9daff76eadb5eb4fa56d0e105f5..c589cecceb1cea38f9ada43cc13b73b6eb7d4ebd 100644 (file)
@@ -162,9 +162,11 @@ outputXmlPage tree formatters
                                         >>>
                                         formatter
                                         >>>
-                                        writeDocumentToString [ (a_indent, v_1) ]
+                                        writeDocumentToString [ (a_indent         , v_1 )
+                                                              , (a_output_encoding, utf8)
+                                                              , (a_no_xml_pi      , v_0 ) ]
                                       )
-         output $ UTF8.encodeString resultStr
+         output resultStr
 
 
 outputXmlPage' :: XmlTree -> IOSArrow XmlTree XmlTree -> Resource ()
@@ -179,9 +181,11 @@ outputXml tree
                                     >>>
                                     constA tree
                                     >>>
-                                    writeDocumentToString [ (a_indent, v_1) ]
+                                    writeDocumentToString [ (a_indent         , v_1 )
+                                                           , (a_output_encoding, utf8)
+                                                           , (a_no_xml_pi      , v_0 ) ]
                                   )
-        output $ UTF8.encodeString xmlStr
+        output xmlStr
 
 
 getUserID :: Environment -> Resource (Maybe String)
index bf7753ffba068984d7573d25260b200d384156e8..a9eff98ac6c1890741ca546d7e0028c935f157c5 100644 (file)
@@ -83,9 +83,11 @@ handleRedirect env
                                                                 >>>
                                                                 xmlizePage
                                                                 >>>
-                                                                writeDocumentToString [ (a_indent, v_1) ]
+                                                                writeDocumentToString [ (a_indent         , v_1 )
+                                                                                      , (a_output_encoding, utf8)
+                                                                                      , (a_no_xml_pi      , v_0 ) ]
                                                               )
-                                 output $ UTF8.encodeString resultStr
+                                 output resultStr
 
                        _   -> do BaseURI baseURI <- getSysConf (envSysConf env)
                                  let uri = mkPageFragmentURI
index fdb3d87afca2428192ce49aef855f91e81538a84..d99cb94ea11d858efb8a5bffcf9bfaff0e9a63a2 100644 (file)
@@ -3,7 +3,6 @@ module Rakka.Resource.Render
     )
     where
 
-import qualified Codec.Binary.UTF8.String as UTF8
 import           Control.Arrow
 import           Control.Arrow.ArrowIO
 import           Control.Arrow.ArrowList
@@ -83,9 +82,11 @@ handleRender env name
                                      >>>
                                      render env
                                      >>>
-                                     writeDocumentToString [ (a_indent, v_1) ]
+                                     writeDocumentToString [ (a_indent         , v_1)
+                                                           , (a_output_encoding, utf8)
+                                                           , (a_no_xml_pi      , v_0) ]
                                    )
-         output $ UTF8.encodeString xmlStr
+         output xmlStr
 
 
 render :: (ArrowXml a, ArrowChoice a, ArrowIO a) =>
index 45cf55c4f7379fbad2f84bbef3f661bd83f6396a..260d22298605a504269eba8e4b4605c0e6b10f1e 100644 (file)
@@ -116,9 +116,11 @@ outputResponse res
                                      >>>
                                      mkResponseTree
                                      >>>
-                                     writeDocumentToString [ (a_indent, v_1) ]
+                                     writeDocumentToString [ (a_indent         , v_1 )
+                                                           , (a_output_encoding, utf8)
+                                                           , (a_no_xml_pi      , v_0 ) ]
                                    )
-         output $ UTF8.encodeString xmlStr
+         output xmlStr
     where
       mkResponseTree :: ArrowXml a => a b XmlTree
       mkResponseTree 
index 5daba841ae7021abeabcff9ade57fc75baa29737..8a3ada996290f8e1e1e2c00e7932974b52b50d95 100644 (file)
@@ -103,7 +103,7 @@ otherLangsInterp
 -- <input type="button"
 --        value="Create new page"
 --        onclick="Rakka.newPage()"
---        class="newButton" />
+--        class="newButton controls" />
 newPageInterp :: Interpreter
 newPageInterp 
     = InlineCommandInterpreter {
@@ -114,7 +114,7 @@ newPageInterp
                 attrs = [ ("type"   , "button")
                         , ("value"  , label)
                         , ("onclick", "Rakka.newPage()")
-                        , ("class"  , "newButton")
+                        , ("class"  , "newButton controls")
                         ]
             in
               return (Input attrs)
@@ -124,7 +124,7 @@ newPageInterp
 -- <input type="button"
 --        value="Edit"
 --        onclick="Rakka.editPage(\"Foo\")"
---        class="editButton" />
+--        class="editButton controls" />
 editPageInterp :: Interpreter
 editPageInterp 
     = InlineCommandInterpreter {
@@ -136,7 +136,7 @@ editPageInterp
                 attrs = [ ("type"   , "button")
                         , ("value"  , label)
                         , ("onclick", "Rakka.editPage(\"" ++ name ++ "\")")
-                        , ("class"  , "editButton")
+                        , ("class"  , "editButton controls")
                         ]
             in
               return (Input attrs)
@@ -145,7 +145,7 @@ editPageInterp
 
 -- <input type="button"
 --        value="Login"
---        class="loginButton" />
+--        class="loginButton controls" />
 loginInterp :: Interpreter
 loginInterp 
     = InlineCommandInterpreter {
@@ -154,7 +154,7 @@ loginInterp
           = \ _ _ ->
             let attrs = [ ("type" , "button")
                         , ("value", "Login")
-                        , ("class", "loginButton")
+                        , ("class", "loginButton controls")
                         ]
             in
               return (Input attrs)
@@ -178,7 +178,7 @@ searchFieldInterp
 
 -- <input type="button"
 --        value="Configuration"
---        class="configButton" />
+--        class="configButton controls" />
 configurationInterp :: Interpreter
 configurationInterp 
     = InlineCommandInterpreter {
@@ -187,7 +187,7 @@ configurationInterp
           = \ _ _ ->
             let attrs = [ ("type" , "button")
                         , ("value", "Configuration")
-                        , ("class", "configButton")
+                        , ("class", "configButton controls")
                         ]
             in
               return (Input attrs)
index 9e808ea2cf5e75dd45e02db16a101705a39a0c7b..e2b10b43b6809941e99a346069b0d4d1833ec650 100644 (file)
@@ -596,13 +596,43 @@ img {
     content: "Error: "
 }
 
+/* sidebar mask ***************************************************************/
+.sideBarMask {
+    position: fixed;
+
+    background-color: black;
+    color: white;
+    opacity: 0.7;
+
+    z-index: 1;
+}
+
+.sideBarMask .content {
+    padding: 40px 0;
+}
+
+.sideBarMask .content input[type="button"] {
+    font-size: 120%;
+    font-weight: bold;
+
+    background-color: #f5f5f5;
+    color: #000055;
+
+    border-color: #dddddd;
+    border-width: 2px;
+    border-style: solid;
+
+    border-radius: 10px;
+    -moz-border-radius: 10px;
+}
+
 /* waiting message ************************************************************/
 .waitingMessageBoard {
     position: fixed;
     left: 0;
     top: 0;
-    width: 100%;
-    height: 100%;
+    right: 0;
+    bottom: 0;
 
     background-color: black;
     color: white;
index 5f2126aaf4d2dfb685bdc57016daeaff93b34d08..a14bc76249b4836932dea03c7526b69200bf1c17 100644 (file)
@@ -566,13 +566,33 @@ img {
     content: "Error: "
 }
 
+/* sidebar mask ***************************************************************/
+.sideBarMask {
+    position: fixed;
+
+    background-color: black;
+    color: white;
+    opacity: 0.7;
+
+    z-index: 1;
+}
+
+.sideBarMask .content {
+    padding: 40px 0;
+}
+
+.sideBarMask .content input[type="button"] {
+    font-size: 120%;
+    font-weight: bold;
+}
+
 /* waiting message ************************************************************/
 .waitingMessageBoard {
     position: fixed;
     left: 0;
     top: 0;
-    width: 100%;
-    height: 100%;
+    right: 0;
+    bottom: 0;
 
     background-color: white;
     color: black;
index a46d8ee7bc3d0a0640510e5a0a7f05243b6cd122..4286630c9e1968c6bb0d87e6ceda58741690d866 100644 (file)
@@ -1,9 +1,11 @@
 /* Namespace Rakka */
 var Rakka = {};
 
+/* These are constants that may be overwritten by HTML itself. */
 Rakka.baseURI        = null;
 Rakka.isLocked       = false;
 Rakka.isGlobalLocked = false;
 Rakka.isSpecialPage  = false;
 
+/* Common regular expressions */
 Rakka.rePageName = /^[^ a-z.|#\[\]][^ .|#\[\]]*$/;
index eb5097c54da1fc3bd7fa524bb8d7e7a13a36824b..26b68ce7a7e4542c3411e2cbb5242255b4512580 100644 (file)
@@ -35,9 +35,9 @@
                         return obj;
                     })();
                     var source
-                        = $page.attr("redirect") != null ? $page.attr("redirect")
-                        : $page.attr("isBinary") != null ? Rakka.decodeBase64($page.find("binaryData").text())
-                        :                                  $page.find("textData").text()
+                        = $page.attr("redirect") != null  ? $page.attr("redirect")
+                        : $page.attr("isBinary") == "yes" ? Rakka.decodeBase64($page.find("binaryData").text())
+                        :                                   $page.find("textData").text()
                         ;
                     var summary     = $page.find("summary").text();
 
             }
         });
 
-        var btnCancel
-            = $.INPUT({type: "button", value: "Cancel editing"});
-
-        $(btnCancel).click(function () {
-            if (isDirty) {
-                if (window.confirm("Do you really want to discard changes?")) {
-                    Rakka.restoreScreen();
-                }
-            }
-            else {
-                Rakka.restoreScreen();
-            }
-        });
-
         var updateTRContent = function () {
             if (btnTypeRakka.checked) {
                 $(trPageLang).show();
                               trContent,
                               $.TR({},
                                    $.TH({}),
-                                   $.TD({}, btnPreview, btnSubmit, btnDelete, btnCancel)
+                                   $.TD({}, btnPreview, btnSubmit, btnDelete)
                                   )
                              )
                      );
index 89426268496ab7cac35f7622babd0b0db16c5999..bfb3c77e1e383d2e8a3006c5e96d0c2b26eb71eb 100644 (file)
@@ -10,17 +10,35 @@ $(document).ready(function () {
     var cached_rawHash;
     var cached_map;
 
-    Rakka.getRawHash = function () {
-        // Don't use window.location.hash as it isn't portable.
-        var r = window.location.hash;
+    /*
+    var re_key   = /^[^:|]+$/;
+    var re_value = /^[^|]*$/;
+     */
+
+    var getRawHash = function () {
+        /* Don't use window.location.hash as it isn't portable due to
+         * an ambiguous specification.
+         */
+        var r = window.location.href;
         var i = r.indexOf("#");
         return (i >= 0
                 ? r.substr(i + 1)
                 : "");
     };
 
-    Rakka.getHashedParamMap = function () {
-        var raw = Rakka.getRawHash();
+    /*
+    var setRawHash = function (hash) {
+        var r = window.location.href;
+        var i = r.indexOf("#");
+        var b = (i >= 0
+                 ? r.substr(0, i)
+                 : r);
+        window.location.href = b + "#" + hash;
+    };
+     */
+
+    var getHashedParamMap = function () {
+        var raw = getRawHash();
 
         if (cached_rawHash != raw) {
             var src = decodeURIComponent(raw);
@@ -29,13 +47,16 @@ $(document).ready(function () {
             cached_map = {};
             $.each(src.split("|"), function () {
                 // tuple ::= key ':' value
-                //         | key           (value is empty)
+                //         | key           (value is the same as key)
                 var i = this.indexOf(":");
                 if (i >= 0) {
-                    cached_map[this.substr(0, i)] = this.substr(i + 1);
+                    var key = this.substr(0, i);
+                    var val = this.substr(i + 1);
+                    cached_map[key] = val;
                 }
                 else {
-                    cached_map[this.substr(0, i)] = "";
+                    var key = this;
+                    cached_map[key] = key;
                 }
             });
 
@@ -46,10 +67,63 @@ $(document).ready(function () {
     };
 
     Rakka.getHashedParam = function (key) {
-        return Rakka.getHashedParamMap()[key];
+        return getHashedParamMap()[key];
+    };
+
+    /*
+    var setHashedParamMap = function (map) {
+        var tuples = "";
+
+        $.each(map, function(key, val) {
+            var tuple = (key == val
+                         ? key
+                         : key + ":" + val);
+
+            tuples = (tuples == ""
+                      ? tuple
+                      : tuples + "|" + tuple);
+        });
+
+        cached_map = map;
+        cached_raw = encodeURIComponent(tuples);
+
+        setRawHash(cached_raw);
     };
 
-    Rakka.setHashedParamMap = function (map) {
-        //////////
+    Rakka.setHashedParam = function (key, value) {
+        var diff = {};
+        diff[key] = value;
+        Rakka.setHashedParams(diff);
+    };
+
+    Rakka.setHashedParams = function (diff) {
+        var orig = getHashedParamMap();
+        var next = {};
+
+        // Copy 'orig' to 'next'.
+        $.each(orig, function (key, val) {
+            next[key] = val;
+        });
+
+        // Overwrite the content of 'next' with 'diff'.
+        $.each(diff, function (key, val) {
+
+            if (!key.match(re_key)) {
+                throw new Error("Invalid key: " + key);
+            }
+            if (!val.match(re_value)) {
+                throw new Error("Invalid value: " + val);
+            }
+
+            if (diff[key] == null) {
+                delete next[key];
+            }
+            else {
+                next[key] = val;
+            }
+        });
+
+        setHashedParamMap(next);
     };
+     */
 });
\ No newline at end of file
index 95ee043d486123c4a8c1e55630a668ef25cf64b2..a850104252716f3832bb072401f75996f7c49d97 100644 (file)
@@ -1,11 +1,11 @@
 (function () {
-    
+
     var switchedArea = null;
 
     Rakka.switchScreen = function () {
         if (switchedArea == null) {
             switchedArea = $.DIV({});
-            
+
             $("div.sideBar div.outline").hide();
 
             $("p.redirection").hide();
                     .hide()
                 .end()
                 .append(switchedArea);
+
+            $("body").append(
+                $.DIV({className: "left sideBarMask"}));
+
+            var btnClose
+                = $.INPUT({type     : "button",
+                           className: "closeButton",
+                           value    : "Close"});
+            $("body").append(
+                $.DIV({className: "right sideBarMask"},
+                      $.DIV({className: "content"},
+                            btnClose)));
+
+            $(btnClose).click(function () {
+                Rakka.restoreScreen();
+            });
         }
         else {
             $(switchedArea).empty();
         }
-        
+
         return $(switchedArea);
     };
 
@@ -32,6 +48,8 @@
             $(switchedArea).remove();
             switchedArea = null;
 
+            $("div.sideBarMask").remove();
+
             $("div.body").children().show();
         }
         return null;
@@ -56,7 +74,7 @@
         waitingMessageBoard
             = $.P({className: "waitingMessageBoard"},
                   $.P({}, msg));
-        
+
         $("body").append(waitingMessageBoard);
     };
 
@@ -66,5 +84,5 @@
             waitingMessageBoard = null;
         }
     };
-    
+
 })();
index 82abaeeb9dbfc587fbc5739121fc70fb6afa252b..ef3a2e8da9a4054dab2b15e7589ef6d4673b5c9a 100644 (file)
         var lines = src.split(/\n/);
 
         $.each(lines, function () {
-           var m = this.match(/^(\S+)\s+(\S+)$/);
+            var m = this.match(/^(\S+)\s+(\S+)$/);
 
-                   map[ m[1] ] = m[2];
-               });
+            if (m) {
+                map[ m[1] ] = m[2];
+            }
+        });
 
         return map;
     };
     };
 
     var appendConfigPanel = function ($area) {
-        var conf  = Rakka.getSystemConfig();
         $area.append($.H1({}, "Configuration"));
 
         var fldSiteName
-            = $.INPUT({type: "text", value: conf.siteName});
+            = $.INPUT({type: "text"});
 
         var fldBaseURI
-            = $.INPUT({type: "text", value: conf.baseURI});
+            = $.INPUT({type: "text"});
 
         var fldDefaultPage
-            = $.INPUT({type: "text", value: conf.defaultPage});
+            = $.INPUT({type: "text"});
 
         var fldStyleSheet
-            = $.INPUT({type: "text", value: conf.styleSheet});
+            = $.INPUT({type: "text"});
 
         var fldLanguages
-            = $.TEXTAREA({value: encoder_of.languages(conf.languages)});
+            = $.TEXTAREA({});
 
         var chkGlobalLock
-            = $.INPUT({type: "checkbox", checked: conf.globalLock});
+            = $.INPUT({type: "checkbox"});
 
         var btnSave
-            = $.INPUT({type: "button", value: "Save changes", disabled: "disabled"});
+            = $.INPUT({type: "button", value: "Save changes"});
+
+        var btnRevert
+            = $.INPUT({type: "button", value: "Revert changes"});
+
+        var makeClean = function () {
+            $(btnSave).attr({disabled: "disabled"});
+            $(btnRevert).attr({disabled: "disabled"});
+        };
+
+        var updateConfig = function () {
+            var conf  = Rakka.getSystemConfig();
+
+            fldSiteName.value     = conf.siteName;
+            fldBaseURI.value      = conf.baseURI;
+            fldDefaultPage.value  = conf.defaultPage;
+            fldStyleSheet.value   = conf.styleSheet;
+            fldLanguages.value    = encoder_of.languages(conf.languages);
+            chkGlobalLock.checked = conf.globalLock;
+
+            makeClean();
+        };
+        updateConfig();
+
+        var validate = function () {
+            var isValid = (function () {
+                               if (!isValidBaseURI(fldBaseURI.value)) {
+                                   return false;
+                               }
+
+                               if (fldDefaultPage.value.match(Rakka.rePageName) == null) {
+                                   return false;
+                               }
+
+                               if (fldStyleSheet.value.match(Rakka.rePageName) == null) {
+                                   return false;
+                               }
+
+                               if (!isValidMap(fldLanguages.value)) {
+                                   return false;
+                               }
+
+                               return true;
+                           })();
+
+            $(btnSave).attr({disabled: (isValid ? "" : "disabled")});
+        };
+
+        var makeDirty = function () {
+            $(btnRevert).attr({disabled: ""});
+            validate();
+        };
 
         $(btnSave).click(function () {
             var NS  = "http://cielonegro.org/schema/Rakka/Config/1.0";
                      success    : function () {
                          cachedConf = null;
                          Rakka.hideWaitingMessage();
-                         Rakka.restoreScreen();
+                         makeClean();
                      },
                      error      : function (req) {
                          Rakka.hideWaitingMessage();
 
+                         // FIXME: better error handling
                          var $area = Rakka.switchScreen();
                          $area.text("Error: " + req.status + " " + req.statusText);
                      }
             });
         });
 
-        var btnRevert
-            = $.INPUT({type: "button", value: "Revert changes", disabled: "disabled"});
-
         $(btnRevert).click(function () {
             if (window.confirm("Do you really want to discard changes?")) {
-                // FIXME: implement this
+                updateConfig();
             }
         });
 
                                    $.TH({}),
                                    $.TD({}, btnSave, btnRevert))));
 
-        var validate = function () {
-            var isValid = (function () {
-                               if (!isValidBaseURI(fldBaseURI.value)) {
-                                   return false;
-                               }
-
-                               if (fldDefaultPage.value.match(Rakka.rePageName) == null) {
-                                   return false;
-                               }
-
-                               if (fldStyleSheet.value.match(Rakka.rePageName) == null) {
-                                   return false;
-                               }
-
-                               if (!isValidMap(fldLanguages.value)) {
-                                   return false;
-                               }
-
-                               return true;
-                           })();
-
-             $(btnSave).attr({disabled: (isValid ? "" : "disabled")});
-         };
-
-         var isDirty = null;
-         var makeDirty = function () {
-             if (!isDirty) {
-                 $(btnRevert).attr({disabled: ""});
-                 isDirty = true;
-             }
-             validate();
-         };
-
          $(fldSiteName)
              .add(fldBaseURI)
              .add(fldDefaultPage)