Date:   Saturday January 4, 2003 @ 0:39
Author: matt

Update of /home/cvs/AxKit-XSP-Wiki/lib/AxKit/XSP
In directory ted.sergeant.org:/home/matt/Perl/AxKit-XSP-Wiki/lib/AxKit/XSP

Modified Files:
        Wiki.pm 
Log Message:
Lots of cleanup and added stuff
Log:
PR:

Index: Wiki.pm
===================================================================
RCS file: /home/cvs/AxKit-XSP-Wiki/lib/AxKit/XSP/Wiki.pm,v
retrieving revision 1.7
retrieving revision 1.8
diff -b -u -r1.7 -r1.8
--- Wiki.pm     2002/12/29 17:47:05     1.7
+++ Wiki.pm     2003/01/04 00:39:06     1.8
@@ -14,6 +14,7 @@
 
 @EXPORT_TAGLIB = (
     'display_page($dbpath,$db,$page,$action;$id):as_xml=1',
+    'preview_page($dbpath,$db,$page,$text,$texttype):as_xml=1',
 );
 
 use DBI;
@@ -62,6 +63,68 @@
     }
 }
 
+sub preview_page ($$$$$) {
+    my ($dbpath, $dbname, $page, $text, $texttype) = @_;
+    my $db = _mkdb($dbpath, $dbname);
+    my $sth = $db->prepare(<<'EOT');
+  SELECT Formatter.module
+  FROM Formatter
+  WHERE Formatter.id = ?
+EOT
+    $sth->execute($texttype);
+    
+    my $output = '';
+    my $handler = XML::SAX::Writer->new(Output => \$output);
+    while ( my $row = $sth->fetch ) {
+        # create the parser
+        my $parser = $row->[0]->new(Handler => $handler);
+        eval {
+            $parser->parse_string($text);
+        };
+        if ($@) {
+            $output = '<pod>
+  <para>
+    Error parsing the page: ' . xml_escape($@) . '
+  </para>
+</pod>
+  ';
+        }
+        last;
+    }
+    if (!$output) {
+        $output = <<'EOT';
+<pod>
+  <para>
+Eek.
+  </para>
+</pod>
+EOT
+    }
+
+    $output =~ s/^<\?xml\s.*?\?>//s;
+
+    # Now add edit stuff
+    $output .= '<edit><text>';
+    $output .= xml_escape($text);
+    $output .= '</text><texttypes>';
+    
+    $sth = $db->prepare(<<'EOT');
+  SELECT Formatter.id, Formatter.name
+  FROM Formatter
+EOT
+    $sth->execute();
+    while (my $row = $sth->fetch) {
+        $output .= '<texttype id="'. xml_escape($row->[0]) . 
+          ($texttype == $row->[0] ? '" selected="selected">' : '">') . 
+          xml_escape($row->[1]) . '</texttype>';
+    }
+    $sth->finish;
+    
+    $output .= '</texttypes></edit>';
+
+    return $output;
+} # preview
+
 sub view_page {
     my ($db, $page) = @_;
     my $sth = $db->prepare(<<'EOT');
@@ -92,15 +155,11 @@
     }
     if (!$output) {
        $output = <<'EOT';
-<pod>
-  <para>
-New page
-  </para>
-</pod>
+<newpage/>
 EOT
     }
     $output =~ s/^<\?xml\s.*?\?>//s;
-AxKit::Debug(1, "Wiki Got: $output");
+    AxKit::Debug(10, "Wiki Got: $output");
     return $output;
 }
 
@@ -108,6 +167,7 @@
     my $text = shift;
     $text =~ s/&/&amp;/g;
     $text =~ s/</&lt;/g;
+    $text =~ s/]]>/]]&gt;/g;
     return $text;
 }
 
@@ -149,14 +209,14 @@
 }
 
 sub save_page {
-    my ($dbpath, $dbname, $page, $contents, $texttype, $ip) = @_;
-    
+    my ($dbpath, $dbname, $page, $contents, $texttype, $ip, $rss) = @_;
+    $rss = [$rss, _mkrssheader($dbname)];
     my $db = _mkdb($dbpath, $dbname);
-    _save_page($db, $page, $contents, $texttype, $ip);
+    _save_page($db, $page, $contents, $texttype, $ip, $rss);
 }
 
 sub _save_page {
-    my ($db, $page, $contents, $texttype, $ip) = @_;
+    my ($db, $page, $contents, $texttype, $ip, $rss) = @_;
     # NB fix hard coded formatterid
     my $last_modified = time;
     my (@row) = $db->selectrow_array("SELECT * FROM Page WHERE name = ?", {}, $page);
@@ -166,6 +226,27 @@
         $db->do('INSERT INTO History (name, formatterid, content, modified, 
ip_address)
                  VALUES (?, ?, ?, ?, ?)', {}, @row);
     }
+    else {
+        # New page
+        if ($rss->[0]) {
+            use Fatal qw(open close);
+            open(RSS, ">$rss->[0]");
+            flock(RSS, 2); # lock ex
+            print RSS $rss->[1];
+            my $sth = $db->prepare('SELECT * FROM Page ORDER BY last_modified DESC');
+            $sth->execute;
+            while (my $row = $sth->fetch) {
+                print RSS <<"EOT";
+<item>
+<title>$row->[1]</title>
+</item>
+EOT
+            }
+            print RSS "</rdf:RDF>\n";
+            flock(RSS, 8); # unlock
+            close(RSS);
+        }
+    }
     my $sth = $db->prepare(<<'EOT');
   INSERT OR REPLACE INTO Page ( name, formatterid, content, last_modified, ip_address 
)
   VALUES ( ?, ?, ?, ?, ? )
@@ -174,6 +255,25 @@
     $db->commit;
 }
 
+sub _mkrssheader {
+    my ($dbname) = @_;
+    return <<"EOT";
+<rdf:RDF
+  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+  xmlns:dc="http://purl.org/dc/elements/1.1/";
+  xmlns="http://purl.org/rss/1.0/";
+>
+
+ <channel rdf:about="http://take23.org/view/$dbname";>
+   <title>$dbname</title>
+   <link>http://take23.org/view/$dbname</link>
+   <description>
+     Take23 $dbname
+   </description>
+
+EOT
+}
+
 sub show_history {
     my ($db, $page) = @_;
     my $sth = $db->prepare('SELECT * FROM History WHERE name = ? ORDER BY modified 
DESC');
@@ -291,6 +391,24 @@
        insert into Formatter (module, name) values ('XML::LibXML::SAX::Parser', 'xml 
(freeform)')
             });
     $db->commit;
+}
+
+sub extract_page_info {
+    my ($path_info) = @_;
+    $path_info =~ s/^\///;
+    my ($db, $page) = split("/", $path_info, 2);
+    $page ||= ''; # can't have page named 0. Ah well.
+
+    if (!$db) {
+      return ('', '');
+    }
+    elsif ($db !~ /^[A-Z][A-Za-z0-9:_-]+$/) {
+      die "Invalid db name: $db";
+    }
+    elsif (length($page) && $page !~ /^[A-Z][A-Za-z0-9:_-]+$/) {
+      die "Invalid page name: $page";
+    }
+    return ($db, $page);
 }
 
 1;

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to