From f19a294d54f38faaeab0027ecb5d85388243b924 Mon Sep 17 00:00:00 2001 From: pho Date: Fri, 13 Nov 2009 17:14:49 +0900 Subject: [PATCH] misc changes Ignore-this: 769c83b20da5a6626be8d7270acd69e8 darcs-hash:20091113081449-62b54-96383cc5a2dd8a77beace8491f3661d38fc79342.gz --- Rakka/Resource.hs | 12 ++- Rakka/Resource/PageEntity.hs | 6 +- Rakka/Resource/Render.hs | 7 +- Rakka/Resource/TrackBack.hs | 6 +- Rakka/Wiki/Interpreter/Base.hs | 16 ++-- defaultPages/StyleSheet/CieloNegro.xml | 34 +++++++- defaultPages/StyleSheet/Default.xml | 24 +++++- js/base.js | 2 + js/editPage.js | 22 +---- js/hashedParam.js | 96 ++++++++++++++++++--- js/screen.js | 28 ++++-- js/systemConfig.js | 115 ++++++++++++++----------- 12 files changed, 262 insertions(+), 106 deletions(-) diff --git a/Rakka/Resource.hs b/Rakka/Resource.hs index 0333d6f..c589cec 100644 --- a/Rakka/Resource.hs +++ b/Rakka/Resource.hs @@ -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) diff --git a/Rakka/Resource/PageEntity.hs b/Rakka/Resource/PageEntity.hs index bf7753f..a9eff98 100644 --- a/Rakka/Resource/PageEntity.hs +++ b/Rakka/Resource/PageEntity.hs @@ -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 diff --git a/Rakka/Resource/Render.hs b/Rakka/Resource/Render.hs index fdb3d87..d99cb94 100644 --- a/Rakka/Resource/Render.hs +++ b/Rakka/Resource/Render.hs @@ -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) => diff --git a/Rakka/Resource/TrackBack.hs b/Rakka/Resource/TrackBack.hs index 45cf55c..260d222 100644 --- a/Rakka/Resource/TrackBack.hs +++ b/Rakka/Resource/TrackBack.hs @@ -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 diff --git a/Rakka/Wiki/Interpreter/Base.hs b/Rakka/Wiki/Interpreter/Base.hs index 5daba84..8a3ada9 100644 --- a/Rakka/Wiki/Interpreter/Base.hs +++ b/Rakka/Wiki/Interpreter/Base.hs @@ -103,7 +103,7 @@ otherLangsInterp -- +-- 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 -- +-- 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 -- +-- 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 -- +-- 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) diff --git a/defaultPages/StyleSheet/CieloNegro.xml b/defaultPages/StyleSheet/CieloNegro.xml index 9e808ea..e2b10b4 100644 --- a/defaultPages/StyleSheet/CieloNegro.xml +++ b/defaultPages/StyleSheet/CieloNegro.xml @@ -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; diff --git a/defaultPages/StyleSheet/Default.xml b/defaultPages/StyleSheet/Default.xml index 5f2126a..a14bc76 100644 --- a/defaultPages/StyleSheet/Default.xml +++ b/defaultPages/StyleSheet/Default.xml @@ -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; diff --git a/js/base.js b/js/base.js index a46d8ee..4286630 100644 --- a/js/base.js +++ b/js/base.js @@ -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.|#\[\]][^ .|#\[\]]*$/; diff --git a/js/editPage.js b/js/editPage.js index eb5097c..26b68ce 100644 --- a/js/editPage.js +++ b/js/editPage.js @@ -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(); @@ -344,20 +344,6 @@ } }); - 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(); @@ -458,7 +444,7 @@ trContent, $.TR({}, $.TH({}), - $.TD({}, btnPreview, btnSubmit, btnDelete, btnCancel) + $.TD({}, btnPreview, btnSubmit, btnDelete) ) ) ); diff --git a/js/hashedParam.js b/js/hashedParam.js index 8942626..bfb3c77 100644 --- a/js/hashedParam.js +++ b/js/hashedParam.js @@ -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 diff --git a/js/screen.js b/js/screen.js index 95ee043..a850104 100644 --- a/js/screen.js +++ b/js/screen.js @@ -1,11 +1,11 @@ (function () { - + var switchedArea = null; Rakka.switchScreen = function () { if (switchedArea == null) { switchedArea = $.DIV({}); - + $("div.sideBar div.outline").hide(); $("p.redirection").hide(); @@ -15,11 +15,27 @@ .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; } }; - + })(); diff --git a/js/systemConfig.js b/js/systemConfig.js index 82abaee..ef3a2e8 100644 --- a/js/systemConfig.js +++ b/js/systemConfig.js @@ -13,10 +13,12 @@ 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; }; @@ -134,29 +136,79 @@ }; 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"; @@ -191,23 +243,21 @@ 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(); } }); @@ -239,39 +289,6 @@ $.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) -- 2.40.0