r9418 - in apps/gobi/trunk/code: Page Updates

[email protected]
Newsgroups gmane.comp.java.helma.cvs
Message-ID <[email protected]>
Author: hannes
Date: 2008-12-12 15:15:17 +0100 (Fri, 12 Dec 2008)
New Revision: 9418

Modified:
   apps/gobi/trunk/code/Page/Calendar.js
   apps/gobi/trunk/code/Updates/Updates.js
   apps/gobi/trunk/code/Updates/body.skin
Log:
Reimplement and clean up calendar and updates features.

Details at http://dev.helma.org/trac/helma/changeset/9418

Modified: apps/gobi/trunk/code/Page/Calendar.js
===================================================================
--- apps/gobi/trunk/code/Page/Calendar.js	2008-12-12 14:08:16 UTC (rev 9417)
+++ apps/gobi/trunk/code/Page/Calendar.js	2008-12-12 14:15:17 UTC (rev 9418)
@@ -1,32 +1,34 @@
 /**
- * macro renders a calendar
- * version 3b
+ * macro to render a calendar
  */
 function calendar_macro(param) {
 
-    var Calendar = java.util.Calendar;
-    
     // create new tablewriter with 7 columns
     var table = new Html.TableWriter(7, {
-        table: { "class": "cal2Table"  },
-        td:    { "class": "cal2Header" }
+        table: { "class": "calTable"  },
+        td:    { "class": "calDefault" }
     });
+
     table.writeHeader = true;
-   
+    this.writeCalendar(param, table);
+    table.close();
+}
+
+function writeCalendar(param, table) {
+
+    var Calendar = java.util.Calendar;
     // create new calendar-object
     var cal = Calendar.getInstance();
     var symbols = this.getDateSymbols();
    
     cal.set(Calendar.DATE, 1);
     
-    var linkpattern = param.linkpattern ? 
-        param.linkpattern+":" : "update:";
-    var items = this.getLinks(new RegExp("^"+linkpattern), "out");
-    
+    var linkpattern = param.linkpattern ? param.linkpattern+":" : "^update:";
+
     // check whether there's a day or a story in path
     // if so, use it to determine the month to render
-    var today = new Date().format("yyyy.MM.dd");
-    var month = req.data.month;
+    var today = req.data.day || new Date().format("yyyy.MM.dd");
+    var month = req.data.day ? req.data.day.substring(0, 7) : req.data.month;
     if (month) {
         // instead of using String.toDate
         // we do it manually here to avoid that a day like 20021001
@@ -37,7 +39,8 @@
 
     // pre-render the year and month so we only have to append the days as we loop
     var currMonth = new Date(cal.getTimeInMillis()).format("yyyy.MM.");
-    var href = this.href()+"?month=";
+    var monthHref = this.href() + "?month=";
+    var dayHref = this.href() + "?day=";
 
     // links to previous and next month, if available
     var cal2 = cal.clone();
@@ -47,169 +50,47 @@
     var nextMonth = new Date(cal2.getTimeInMillis()).format("yyyy.MM");
 
     // write out calendar header: prev-month link, month header, next-month link
-    var month = symbols.getMonths()[cal.get(Calendar.MONTH)];
+    month = symbols.getMonths()[cal.get(Calendar.MONTH)];
     var year =  cal.get(Calendar.YEAR);
-    table.write(Html.A({ href: href+prevMonth }, "&lt;"));
-    table.write(month+" "+year, { colspan: 5 });
-    table.write(Html.A({ href: href+nextMonth }, "&gt;"));
+    table.write(Html.A({ href: monthHref + prevMonth }, "&lt;"));
+    table.write(month + " " + year, { colspan: 5 });
+    table.write(Html.A({ href: monthHref + nextMonth }, "&gt;"));
       
     // write out a row containing the week day names
     var firstDayOfWeek = cal.getFirstDayOfWeek();
     var weekdays = symbols.getShortWeekdays();
 
-    for (var i=0; i<7; i++) {
+    for (var i = 0; i < 7; i++) {
         table.write(weekdays[(i+firstDayOfWeek-1)%7+1]);
     }
    
     // nr. of empty days in rendered calendar before the first day of month appears
-    var pre = (7-firstDayOfWeek+cal.get(Calendar.DAY_OF_WEEK)) % 7;
+    var pre = (7 - firstDayOfWeek + cal.get(Calendar.DAY_OF_WEEK)) % 7;
     var days = cal.getActualMaximum(Calendar.DATE);
-    var cells = Math.ceil((pre + days) / 7); 
+    var cells = Math.ceil((pre + days) / 7) * 7;
    
-    // set up constants we need in the loop
-    var defaultAttr = {"class": "cal2Default"};
-    var highlightAttr = {"class": "cal2Highlighted"};
-    var headerAttr = {"class": "cal2DayHeader"};
+    // table classes
+    var defaultAttr = {"class": "calDefault"};
+    var highlightAttr = {"class": "calSelected"};
 
-    for (var i=0; i<cells; i++) {
-        for (var j=i*7; j<i*7+7; j++) {
-            if (j < pre || j >= pre + days) 
-                table.write ("&nbsp;");
-            else {
-                var day = 1 + j - pre;
-                var currDay = currMonth + day.format("00");
-                var linkText = day < 10 ? "&nbsp;" + day + "&nbsp;" : day.toString();
-                table.write(linkText, currDay == today ? highlightAttr : headerAttr);
-            }
-        }
-        for (var j=i*7; j<i*7+7; j++) {
-            if (j < pre || j >= pre + days) {
-                table.write("&nbsp;");
-            } else {
-                var day = 1 + j - pre;
-                var currDay = currMonth + day.format("00");
-                if (this.links_out.get(linkpattern+currDay)) {
-                    res.push();
-                    this.linklist_macro({type: linkpattern+currDay});
-                    var links = res.pop();
-                    table.write(links, defaultAttr);
-                } else {
-                    table.write("&nbsp;", defaultAttr);
-                }
-            }
-        }
-    }
-   
-    table.close();
-}
-
-
-/**
- * macro renders a small calendar
- * version 3
- */
-function smallcalendar_macro(param) {
-
-    // create new tablewriter with 7 columns
-    var table = new Html.TableWriter(7, 
-        { table: { "class": "calTable"  }, td: { "class":"calDefault" }});
-    table.writeHeader = true;
-   
-    // create new calendar-object
-    var cal = java.util.Calendar.getInstance();
-    var symbols = this.getDateSymbols();
-   
-    cal.set(java.util.Calendar.DATE, 1);
-    
-    var linkpattern = param.linkpattern ? 
-        param.linkpattern+":" : "update:";
-    var items = this.getLinks(RegExp("^"+linkpattern), "out");
-    
-    // check whether there's a day or a story in path
-    // if so, use it to determine the month to render
-    var today = req.data.day;
-    if (!today && items.length > 0) {
-        // if no explicit day selected get last day in collection
-        var linktype = items[items.length-1].type;
-        today = linktype.substring(linktype.length-10);
-    }
-    if (today) {
-        // instead of using String.toDate
-        // we do it manually here to avoid that a day like 20021001
-        // would be changed to 20020930 in some cases
-        cal.set(java.util.Calendar.YEAR, parseInt(today.substring(0, 4), 10));
-        cal.set(java.util.Calendar.MONTH, parseInt(today.substring(5, 7), 10)-1);
-    }
-   
-    // pre-render the year and month so we only have to append the days as we loop
-    var currMonth = new Date(cal.getTime().getTime()).format("yyyy.MM.");
-    var href = this.href()+"?day=";
-
-    // links to previous and next month, if available
-    var prevMonth = null;
-    var nextMonth = null;
-    var firstDay = currMonth+"01";
-    var lastDay = currMonth+"31";
-    
-    var l = this.links_out.list();
-    for (var i in items) {
-        var datestring = items[i].type.substring(items[i].type.length-10);
-        if (datestring < firstDay)
-            prevMonth = datestring;
-        if (!nextMonth && datestring > lastDay)
-            nextMonth = datestring;
-    }
-
-    // write out calendar header: prev-month link, month header, next-month link
-    var month = symbols.getMonths()[cal.get(java.util.Calendar.MONTH)];
-    var year =  cal.get(java.util.Calendar.YEAR);
-    table.write(prevMonth ? Html.A({href: href+prevMonth}, "&lt;") : "");
-    table.write("<b>"+month+" "+year+"</b>", {align: "center", colspan: 5});
-    table.write(nextMonth ? Html.A({href: href+nextMonth}, "&gt;") : "");
-      
-    // write out a row containing the week day names
-    var firstDayOfWeek = cal.getFirstDayOfWeek();
-    var weekdays = symbols.getShortWeekdays();
-
-    for (var i=0; i<7; i++) {
-        table.write("<i>"+weekdays[(i+firstDayOfWeek-1)%7+1]+"</i>");
-    }
-   
-    // nr. of empty days in rendered calendar before the first day of month appears
-    var pre = (7-firstDayOfWeek+cal.get(java.util.Calendar.DAY_OF_WEEK)) % 7;
-    var days = cal.getActualMaximum(java.util.Calendar.DATE);
-    var cells = Math.ceil((pre + days) / 7) * 7; 
-   
-    // set up constants we need in the loop
-    var defaultAttr = {"class":"calDefault"};
-    var highlightAttr = {"class":"calSelected"};
-
-    for (var i=0; i<cells; i++) {
-        if (i < pre || i >= pre + days) 
+    for (var i = 0; i < cells; i++) {
+        if (i < pre || i >= pre + days) {
             table.write ("&nbsp;");
-        else {
+        } else {
             var day = 1 + i - pre;
+            var currDay = currMonth + day.format("00");
+            var linkText = day < 10 ? "&nbsp;" + day + "&nbsp;" : day.toString();
             var currGroupname = currMonth + day.format("00");
             var cellAttr = (currGroupname == today) ? highlightAttr : defaultAttr;
-            var linkText = day < 10 ? "&nbsp;" + day + "&nbsp;" : day.toString();
 
-            if (this.links_out.get("update:"+currGroupname)) {
-                var link = Html.A({href: href+currGroupname}, linkText);
+            if (this.getLinks(new RegExp(linkpattern + currDay), Link.OUT).length > 0) {
+                var link = Html.A({href: dayHref + currGroupname}, linkText);
                 table.write(link, cellAttr);
             } else {
                 table.write(linkText, cellAttr);
             }
         }
     }
-   
-    table.close();
-   
-    // list selected day
-    if (today) {
-        this.linklist_macro({type: linkpattern+today});
-    } else if (today) {
-        res.write("No items found for "+today+".");
-    }
 }
 
 

Modified: apps/gobi/trunk/code/Updates/Updates.js
===================================================================
--- apps/gobi/trunk/code/Updates/Updates.js	2008-12-12 14:08:16 UTC (rev 9417)
+++ apps/gobi/trunk/code/Updates/Updates.js	2008-12-12 14:15:17 UTC (rev 9418)
@@ -25,43 +25,42 @@
 /**
  * Set of prototypes to be included in RSS feed.
  */
-Updates.rssPrototypes = ["WeblogPosting", "WikiPage"];
+Updates.rssPrototypes = ["WeblogPosting", "WikiPage", "Page"];
 Updates.rssLength = 10;
 
 /**
  * Renders this page as RSS feed.
  */
 function main_rss_action() {
-    var groups = this.getLinkGroups(new RegExp("^update:"), "out", {reverse: true, limit: 100});
+    var pages = this.getLinkedPages(new RegExp("^update:"), "out",
+        {reverse: true, limit: 100, unique: true});
     RssWriter.openChannel({title: root.name, link: root.href(),
         description: "Updates for " + root.name });
     var count = 0;
-    var seenPages = {};
-    function addGroup(group) {
-        for each (var link in group.list().reverse()) {
-            var page = link.target;
-            if (!page || !page.checkAccess("main")
-                    || !Updates.rssPrototypes.contains(page.prototype)
-                    || seenPages[page._id])
-                continue;
-            seenPages[page._id] = page;
-            RssWriter.writeItem({title: page.getPathName(), link: page.href(),
-                description: WikiMarkup.renderAsString(page.body, page)});
-            if (count++ >= Updates.rssLength)
-                break;
+    for each (var page in pages) {
+        if (!page || !page.checkAccess("main") ||
+                !Updates.rssPrototypes.contains(page.prototype)) {
+            continue;
         }
-    };
-    for each (var group in groups) {
-        addGroup(group);
-        if (count >= Updates.rssLength)
+        RssWriter.writeItem({
+            title: page.getPathName(),
+            link: page.href(),
+            description: WikiMarkup.renderAsString(page.body, page)
+        });
+        if (++count >= Updates.rssLength) {
             break;
+        }
     }
     RssWriter.closeChannel();
 }
 
-function main_action() {
+function body_macro(param) {
+    if (param && param.size == "small") {
+        this.calendar_macro(param);
+        return;
+    }
     var items = this.getLinks(new RegExp("^update:"), Link.OUT, {reverse: true});
-    res.push();
+    var pattern = new RegExp(req.data.day || req.data.month || "");
     // style for listing table
     var tableStyle = {
         table: {"class": "list", border:"0", cellspacing:"0", cellpadding:"0" },
@@ -74,19 +73,31 @@
         timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT);
     }
     var table = new Html.TableWriter(4, tableStyle);
-    var i, date, lastDay;
-    var start = parseInt(req.data.start) || 0;
-    if (start > 0)
-        Html.p({style: "text-align: right;"},
-            Html.A({href: this.href() + "?start=" + Math.max(0, start - 20)}, "later updates"));
-    for (i = start; i < items.length; i++) {
+    var i, date, lastDay, month, first = true;
+    for (i = 0; i < items.length; i++) {
         var link = items[i];
-        if (!link.target || !link.target.checkAccess || !link.target.checkAccess("main"))
-            continue;
         var day = link.type.substring(7, 17);
+        if (!pattern.test(day) || !link.target ||
+            !link.target.checkAccess || !link.target.checkAccess("main")) {
+            lastDay = day;
+            if (!first) {
+                break;
+            } else {
+                continue;
+            }
+        }
+        if (first) {
+            month = day.substring(0, 7);
+            first = false;
+            if (i > 0) {
+                Html.p({style: "text-align: right;"},
+                    Html.A({href: this.href() + "?day=" + lastDay}, "later updates"));
+            }
+        }
+        if (day.indexOf(month) != 0) {
+            break;
+        }
         if (day != lastDay) {
-            if (i - start > 20)
-                break;
             date = day.toDate("yyyy.MM.dd");
             lastDay = day;
             with (JavaImporter(java.text.DateFormat)) {
@@ -133,11 +144,10 @@
         }
     }
     table.close();
-    if (i <= items.length)
+    if (i < items.length) {
         Html.p({style: "text-align: right;"},
-                Html.A({href: this.href() + "?start=" + i}, "earlier updates"));
-    res.data.body = res.pop();
-    this.renderSkin("page");
+                Html.A({href: this.href() + "?day=" + lastDay}, "earlier updates"));
+    }
 }
 
 /**

Modified: apps/gobi/trunk/code/Updates/body.skin
===================================================================
--- apps/gobi/trunk/code/Updates/body.skin	2008-12-12 14:08:16 UTC (rev 9417)
+++ apps/gobi/trunk/code/Updates/body.skin	2008-12-12 14:15:17 UTC (rev 9418)
@@ -1,9 +1,9 @@
-<p>
+<p style="float: left;">
 <a href="<% this.href action="main.rss" %>" title="RSS 2.0 feed for updates to this site"
     style="text-decoration:none;"><img
-        src="<% staticUrl %>xmlbutton.gif" border="0" width="36" height="14"
+        src="<% staticUrl %>../xmlbutton.gif" border="0" width="36" height="14"
         alt="RSS 2.0 feed for updates to this site" />
         &nbsp; RSS 2.0 feed for updates to this site</a>
 </p>
 
-<% this.calendar %>
+<% this.body %>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.