Protect utf8param() from undefined values.
[irspy-moved-to-github.git] / lib / ZOOM / IRSpy / Utils.pm
index 09f6b8f..2dbbe13 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: Utils.pm,v 1.29 2007-05-01 15:29:36 mike Exp $
+# $Id: Utils.pm,v 1.33 2007-06-27 10:44:57 mike Exp $
 
 package ZOOM::IRSpy::Utils;
 
@@ -7,7 +7,8 @@ use strict;
 use warnings;
 
 use Exporter 'import';
-our @EXPORT_OK = qw(isodate
+our @EXPORT_OK = qw(utf8param
+                   isodate
                    xml_encode 
                    cql_quote
                    cql_target
@@ -21,11 +22,26 @@ our @EXPORT_OK = qw(isodate
 
 use XML::LibXML;
 use XML::LibXML::XPathContext;
+use Encode;
+use Encode qw(is_utf8);
+
 
 our $IRSPY_NS = 'http://indexdata.com/irspy/1.0';
 
 
 # Utility functions follow, exported for use of web UI
+sub utf8param {
+    my($r, $key, $value) = @_;
+    die "utf8param() called with value '$value'" if defined $value;
+
+    my $raw = $r->param($key);
+    return undef if !defined $raw;
+    my $cooked = decode_utf8($raw);
+    warn "converted '$raw' to '", $cooked, "'\n" if $cooked ne $raw;
+    return $cooked;
+}
+
+
 sub isodate {
     my($time) = @_;
 
@@ -70,7 +86,7 @@ sub xml_encode {
 sub cql_quote {
     my($term) = @_;
 
-    $term =~ s/([""\\])/\\$1/g;
+    $term =~ s/([""\\*?])/\\$1/g;
     $term = qq["$term"] if $term =~ /[\s""\/]/;
     return $term;
 }
@@ -232,21 +248,23 @@ sub modify_xml_document {
                # we'll check whether the element is already
                # canonical, to determine whether our change is a
                # no-op.
-               my $old = "???";
+               my $old = "";
                my @children = $node->childNodes();
                if (@children == 1) {
                    my $child = $node->firstChild();
                    if (ref $child && ref $child eq "XML::LibXML::Text") {
                        $old = $child->getData();
-                       next if $value eq $old;
+                       print STDERR "child='$child', old=", _renderchars($old), "\n"
+                           if $key eq "title";
                    }
                }
+               next if $value eq $old;
 
                $node->removeChildNodes();
                my $child = new XML::LibXML::Text($value);
                $node->appendChild($child);
                push @changes, $ref;
-               #print "Elem $key: '$old' -> '$value' ($xpath)<br/>\n";
+               print STDERR "Elem $key ($xpath): ", _renderchars($old), " -> '", _renderchars($value), "\n";
            } else {
                warn "unexpected node type $node";
            }
@@ -264,6 +282,13 @@ sub modify_xml_document {
 }
 
 
+sub _renderchars {
+    my($text) = @_;
+
+    return "'" . $text . "'", " (", join(" ", map {ord($_)} split //, $text), "), is_utf8=" , is_utf8($text);
+}
+
+
 sub dom_add_node {
     my($xc, $ppath, $selector, $value, @addAfter) = @_;