From f1016753ef45a4c25745ccb6e81e5acbc085cc42 Mon Sep 17 00:00:00 2001 From: pho Date: Sat, 16 Feb 2008 15:13:48 +0900 Subject: [PATCH] implemented language link editor (partly) darcs-hash:20080216061348-62b54-315575aae6948fbc80fea9079c16cb75eecbb17e.gz --- Rakka/Resource.hs | 3 +- Rakka/Storage/Repos.hs | 10 ++-- Rakka/SystemConfig.hs | 2 +- defaultPages/StyleSheet/Default.xml | 4 ++ js/editPage.js | 85 ++++++++++++++++++++++++++--- schemas/rakka-page-1.0.rng | 2 +- 6 files changed, 91 insertions(+), 15 deletions(-) diff --git a/Rakka/Resource.hs b/Rakka/Resource.hs index d0d9c48..5cbf188 100644 --- a/Rakka/Resource.hs +++ b/Rakka/Resource.hs @@ -8,6 +8,7 @@ module Rakka.Resource ) where +import qualified Codec.Binary.UTF8.String as UTF8 import Control.Arrow import Control.Arrow.ArrowList import Control.Monad @@ -113,7 +114,7 @@ getInputReader return $ readString [ (a_validate , v_0) , (a_check_namespaces , v_1) , (a_remove_whitespace, v_0) - ] req + ] (UTF8.decodeString req) getFailingReader code headers msg = return $ proc _ -> abortA -< (code, (headers, msg)) diff --git a/Rakka/Storage/Repos.hs b/Rakka/Storage/Repos.hs index 76889d7..b74f48c 100644 --- a/Rakka/Storage/Repos.hs +++ b/Rakka/Storage/Repos.hs @@ -179,10 +179,10 @@ loadPageInRepository repos name rev -> True , entityRevision = pageRev , entityLastMod = zonedTimeToUTC lastMod - , entitySummary = lookup "rakka:summary" props + , entitySummary = fmap decodeString (lookup "rakka:summary" props) , entityOtherLang = fromMaybe M.empty $ fmap - (M.fromList . fromJust . deserializeStringPairs) + (M.fromList . fromJust . deserializeStringPairs . decodeString) (lookup "rakka:otherLang" props) , entityContent = content , entityUpdateInfo = undefined @@ -315,13 +315,13 @@ putPageIntoRepository repos userID page setNodeProp path "rakka:isFeed" (encodeFlag $ entityIsFeed page) setNodeProp path "rakka:isLocked" (encodeFlag $ entityIsLocked page) setNodeProp path "rakka:isBinary" (encodeFlag $ entityIsBinary page) - setNodeProp path "rakka:summary" (entitySummary page) + setNodeProp path "rakka:summary" (fmap encodeString $ entitySummary page) setNodeProp path "rakka:otherLang" (let otherLang = entityOtherLang page in if M.null otherLang then Nothing else - Just (serializeStringPairs $ M.toList otherLang)) + Just (encodeString $ serializeStringPairs $ M.toList otherLang)) applyTextLBS path Nothing (entityContent page) encodeFlag :: Bool -> Maybe String @@ -409,7 +409,7 @@ loadAttachmentInRepository repos pName aName rev path = mkAttachmentPath pName aName loadAttachment' :: Rev a - loadAttachment' = getFileContents path >>= return . deserializeFromString + loadAttachment' = getFileContents path >>= return . deserializeFromString . decodeString putAttachmentIntoRepository :: Attachment a => diff --git a/Rakka/SystemConfig.hs b/Rakka/SystemConfig.hs index 11fe124..ecf608d 100644 --- a/Rakka/SystemConfig.hs +++ b/Rakka/SystemConfig.hs @@ -135,7 +135,7 @@ deserializeStringPairs :: String -> Maybe [(String, String)] deserializeStringPairs = sequence . map deserializePair' . lines where deserializePair' :: String -> Maybe (String, String) - deserializePair' s = case break (/= ' ') s of + deserializePair' s = case break (== ' ') s of (a, ' ':b) -> Just (a, b) _ -> Nothing diff --git a/defaultPages/StyleSheet/Default.xml b/defaultPages/StyleSheet/Default.xml index 790b74c..ef940d8 100644 --- a/defaultPages/StyleSheet/Default.xml +++ b/defaultPages/StyleSheet/Default.xml @@ -194,6 +194,10 @@ table.pageEditor { width: 97%; padding: 3px; } +.pageEditor input.smallField { + width: 50%; + margin-left: 1em; +} .pageEditor textarea.summary { height: 5em; } diff --git a/js/editPage.js b/js/editPage.js index c512fcc..e390a19 100644 --- a/js/editPage.js +++ b/js/editPage.js @@ -28,23 +28,30 @@ ; var lang = $page.attr("lang"); var isLocked = $page.attr("isLocked") == "yes"; + var otherLangs = (function () { + var obj = {}; + $page.find("otherLang > link").each(function () { + obj[this.getAttribute("lang")] = this.getAttribute("page"); + }); + return obj; + })(); var source = $page.attr("redirect") != null ? $page.attr("redirect") : $page.find("textData").text() ; var summary = $page.find("summary").text(); - displayPageEditor(pageName, oldRevision, defaultType, lang, isLocked, source, summary); + displayPageEditor(pageName, oldRevision, defaultType, lang, isLocked, otherLangs, source, summary); } else { - displayPageEditor(pageName, null, "rakka", null, false, null, ""); + displayPageEditor(pageName, null, "rakka", null, false, {}, null, ""); } }, error : function (req) { Rakka.hideWaitingMessage(); if (req.status == 404) { - displayPageEditor(pageName, null, "rakka", null, false, null, ""); + displayPageEditor(pageName, null, "rakka", null, false, {}, null, ""); } else { $area.text("Error: " + req.status + " " + req.statusText); @@ -54,10 +61,10 @@ }; Rakka.newPage = function () { - displayPageEditor("", null, "rakka", null, false, null, ""); + displayPageEditor("", null, "rakka", null, false, {}, null, ""); }; - var displayPageEditor = function (pageName, oldRevision, defaultType, lang, isLocked, source, summary) { + var displayPageEditor = function (pageName, oldRevision, defaultType, lang, isLocked, otherLangs, source, summary) { var $area = Rakka.switchScreen(); $previewHeader = $( $.H1({}, "Preview") ); @@ -149,6 +156,44 @@ $.TH({}, "Page language"), $.TD({}, selPageLang)); + var trOtherLangs = (function () { + var options = []; + + $.each(Rakka.getSystemConfig().languages, function (tag, name) { + options.push( + $.OPTION({value: tag}, name)); + }); + + var selLang = $.SELECT({}, options); + var fldLink = $.INPUT({type: "text", className: "smallField"}); + + $(selLang).change(function () { + var pageName = otherLangs[$(selLang).val()]; + $(fldLink).val( + pageName == null ? "" : pageName + ); + }).trigger("change"); + + var onLinkChanged = function () { + isDirty = true; + + var lang = $(selLang).val(); + var pageName = $(this).val(); + + if (pageName == "") { + delete otherLangs[lang]; + } + else { + otherLangs[lang] = pageName; + } + }; + $(fldLink).change(onLinkChanged).keyup(onLinkChanged); + + return $.TR({}, + $.TH({}, "Language links"), + $.TD({}, selLang, fldLink)); + })(); + var fldSummary = $.TEXTAREA({className: "summary"}, summary); @@ -213,6 +258,7 @@ chkIsLocked.checked, "text/x-rakka", $(selPageLang).val(), + otherLangs, fldSummary.value, fldRakkaSource.value); } @@ -224,6 +270,7 @@ chkIsLocked.checked, "text/css", $(selPageLang).val(), + otherLangs, fldSummary.value, fldCSSSource.value); } @@ -234,6 +281,7 @@ fldPageName.value, chkIsLocked.checked, $(selPageLang).val(), + otherLangs, fldSummary.value, fldUploadFile.value); } @@ -273,6 +321,7 @@ var updateTRContent = function () { if (btnTypeRakka.checked) { $(trPageLang).show(); + $(trOtherLangs).show(); $(trSummary).show(); $(trContent).find("th").text("Wiki source"); $(trContent).find("td").empty().append(fldRakkaSource); @@ -280,6 +329,7 @@ } else if (btnTypeCSS.checked) { $(trPageLang).show(); + $(trOtherLangs).show(); $(trSummary).show(); $(trContent).find("th").text("CSS source"); $(trContent).find("td").empty().append(fldCSSSource); @@ -287,6 +337,7 @@ } else if (btnTypeBinary.checked) { $(trPageLang).show(); + $(trOtherLangs).show(); $(trSummary).show(); $(trContent).find("th").text("File"); $(trContent).find("td").empty().append(fldUploadFile); @@ -294,6 +345,7 @@ } else if (btnTypeRedirect.checked) { $(trPageLang).hide(); + $(trOtherLangs).hide(); $(trSummary).hide(); $(trContent).find("th").text("Destination Page"); $(trContent).find("td").empty().append(fldRedirect); @@ -346,6 +398,7 @@ ) ), trPageLang, + trOtherLangs, trSummary, trContent, $.TR({}, @@ -431,7 +484,7 @@ Rakka.scrollToTopLeft(); }; - var submitTextPage = function (pageName, oldRevision, givenPageName, isLocked, mimeType, lang, summary, text) { + var submitTextPage = function (pageName, oldRevision, givenPageName, isLocked, mimeType, lang, otherLangs, summary, text) { var doc = document.implementation.createDocument( "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null); @@ -465,6 +518,15 @@ page.appendChild(s); } + var oLang = doc.createElement("otherLang"); + for (var tag in otherLangs) { + var link = doc.createElement("link"); + link.setAttribute("lang", tag); + link.setAttribute("page", otherLangs[tag]); + oLang.appendChild(link); + } + page.appendChild(oLang); + var textData = doc.createElement("textData"); textData.appendChild( doc.createTextNode(text)); @@ -495,7 +557,7 @@ }); }; - var submitBinaryPage = function (pageName, oldRevision, givenPageName, isLocked, lang, summary, path) { + var submitBinaryPage = function (pageName, oldRevision, givenPageName, isLocked, lang, otherLangs, summary, path) { var doc = document.implementation.createDocument( "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null); @@ -529,6 +591,15 @@ page.appendChild(s); } + var oLang = doc.createElement("otherLang"); + for (var tag in otherLangs) { + var link = doc.createElement("link"); + link.setAttribute("lang", tag); + link.setAttribute("page", otherLangs[tag]); + oLang.appendChild(link); + } + page.appendChild(oLang); + var bin = Rakka.loadLocalBinaryFile(path); var b64 = Rakka.encodeBase64(bin); diff --git a/schemas/rakka-page-1.0.rng b/schemas/rakka-page-1.0.rng index c9dd03b..15894bb 100644 --- a/schemas/rakka-page-1.0.rng +++ b/schemas/rakka-page-1.0.rng @@ -106,7 +106,7 @@ - + -- 2.40.0