Difference between revisions of "Ods2wiki.pl"

From Organic Design wiki
(filter done)
 
(start the wiki part)
Line 5: Line 5:
 
use strict;
 
use strict;
 
require('xml.pl');
 
require('xml.pl');
 +
require('wiki.pl');
  
# Column names and regex to determine rows imported (case insensitive)
+
# The details of the wiki to add the records to
 +
my $wiki = 'http://svn.localhost/wiki/index.php';
 +
my $user = 'foo';
 +
my $pass = 'bar';
 +
 
 +
# The name of the record template
 +
my $tmpl = 'Activity';
 +
 
 +
# Column names and regex to determine rows to extract (case insensitive)
 
my %filter = (
 
my %filter = (
 
'type' => 'hours'
 
'type' => 'hours'
 
);
 
);
  
# Names of columns to include from source and their target names
+
# Names of columns to include from source data and their target template parameter names
 
my @mapcols = (
 
my @mapcols = (
 
);
 
);
  
# Additional columns to add and a default value
+
# Additional parameters and default values to add
 
my @addcols = (
 
my @addcols = (
 
);
 
);
 +
 +
# Log in to the wiki
 +
wikiLogin($::wiki,$::user,$::pass) or exit;
  
 
# Extract the content.xml file from the .ods archive
 
# Extract the content.xml file from the .ods archive
 
my $xml = $ARGV[0] or die "Please specify a .ods file to import rows from";
 
my $xml = $ARGV[0] or die "Please specify a .ods file to import rows from";
  
# Convert the XML text to a hash tree (see http://www.organicdesign.co.nz/xml.pl)
+
# Convert the XML to a hash tree (see http://www.organicdesign.co.nz/xml.pl)
 
$xml = xmlParse(join('', qx( unzip -p $xml content.xml )));
 
$xml = xmlParse(join('', qx( unzip -p $xml content.xml )));
  
# Process the rows of the first sheet
+
# Extract the data from the hash tree and add to the wiki
my %cols = ();
+
my %cols = ();
 
my $first = 1;
 
my $first = 1;
 
for (@{$$xml{-content}}) {
 
for (@{$$xml{-content}}) {
Line 72: Line 84:
 
# Process this row if it passed
 
# Process this row if it passed
 
unless ($fail) {
 
unless ($fail) {
 +
 +
# Create record article title
 +
 +
# Get the current text of the article to be created/updated if any
 +
$text = wikiRawPage($wiki, $title, 0);
 +
$action = $text ? 'updated' : 'created';
 +
 +
# Replace, prepend or append the template into the current text
 +
for (wikiExamineBraces($text)) { ($pos, $len) = ($_->{OFFSET}, $_->{LENGTH}) if $_->{NAME} eq $tmpl }
 +
if (defined $pos) { $text = substr $text, $pos, $len, $tmpl }
 +
else { $text = $append ? "$text\n$tmpl" : "$tmpl\n$text" }
 +
 +
# Update the article
 +
$done = wikiEdit(
 +
$wiki,
 +
$title,
 +
$text,
 +
"[[Template:$tmpl|$tmpl]] record $action by [[OD:Ods2wiki.pl|ods2wiki.pl]]"
 +
);
 
 
 
print join("\t", @row)."\n";
 
print join("\t", @row)."\n";

Revision as of 10:59, 26 February 2009

  1. !/usr/bin/perl
  2. Imports rows from an OpenOffice spreadsheet file (*.ods) into wiki record articlesOur Perl scripts.
  3. - processes only the first sheet
  4. - ignores empty rows

use strict; require('xml.pl'); require('wiki.pl');

  1. The details of the wiki to add the records to

my $wiki = 'http://svn.localhost/wiki/index.php'; my $user = 'foo'; my $pass = 'bar';

  1. The name of the record template

my $tmpl = 'Activity';

  1. Column names and regex to determine rows to extract (case insensitive)

my %filter = ( 'type' => 'hours' );

  1. Names of columns to include from source data and their target template parameter names

my @mapcols = ( );

  1. Additional parameters and default values to add

my @addcols = ( );

  1. Log in to the wiki

wikiLogin($::wiki,$::user,$::pass) or exit;

  1. Extract the content.xml file from the .ods archive

my $xml = $ARGV[0] or die "Please specify a .ods file to import rows from";

  1. Convert the XML to a hash tree (see http://www.organicdesign.co.nz/xml.pl)

$xml = xmlParse(join(, qx( unzip -p $xml content.xml )));

  1. Extract the data from the hash tree and add to the wiki

my %cols = (); my $first = 1; for (@{$$xml{-content}}) { for (@{$$_{-content}}) { if ($$_{-name} eq 'office:body') { for (@{$$_{-content}}) { my $done = 0; for (@{$$_{-content}}) {

# Only process rows for the first sheet if ($$_{-name} eq 'table:table' && $done == 0) { $done++;

# Loop through the rows of this sheet for (@{$$_{-content}}) { my @row = (); for (@{$$_{-content}}) {

# Add this cell's content to the row my $cell = ; $cell = $$_{-content}[0] for @{$$_{-content}}; push @row, $cell;

# Handle the table:number-columns-repeated attribute if (defined $$_{'table:number-columns-repeated'} && $$_{'table:number-columns-repeated'} < 100) { push @row, $cell while --$$_{'table:number-columns-repeated'}; } }

# Process this row (unless empty) if (join(, @row)) {

# Process this data row (or define cols if first row) if ($first) { for (0..$#row) { $cols{lc $row[$_]} = $_ } $first = 0; } else {

# Check if it passes through the filter my $fail = 0; while (my ($col, $pat) = each(%filter)) { $fail = 1 unless $row[$cols{lc $col}] =~ /$pat/i; }

# Process this row if it passed unless ($fail) {

# Create record article title

# Get the current text of the article to be created/updated if any $text = wikiRawPage($wiki, $title, 0); $action = $text ? 'updated' : 'created';

# Replace, prepend or append the template into the current text for (wikiExamineBraces($text)) { ($pos, $len) = ($_->{OFFSET}, $_->{LENGTH}) if $_->{NAME} eq $tmpl } if (defined $pos) { $text = substr $text, $pos, $len, $tmpl } else { $text = $append ? "$text\n$tmpl" : "$tmpl\n$text" }

# Update the article $done = wikiEdit( $wiki, $title, $text, "$tmpl record $action by ods2wiki.pl" );

print join("\t", @row)."\n";

} } } } } } } } } }