Difference between revisions of "Ods2wiki.pl"

From Organic Design wiki
(create title for records)
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
#!/usr/bin/perl
+
{{lowercase}}{{svn|tools|osv2wiki.pl}}
# Imports rows from an OpenOffice spreadsheet file (*.ods) into wiki record articles{{perl}}
 
# - processes only the first sheet
 
# - ignores empty rows
 
use strict;
 
require('xml.pl');
 
require('wiki.pl');
 
  
 +
'''ods2wiki''' is a way to import data from a Open Office spreadsheet files into a MediaWiki.
  
 
+
[[Category:Tools]][[Category:PERL]]
# 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';
 
 
 
# Whether to append or prepend new records to existing articles
 
my $append = 0;
 
 
 
# Column names and regex to determine rows to extract (case insensitive)
 
my %filter = (
 
'type' => 'hours'
 
);
 
 
 
# Specify the column headers or leave empty to use data from first row
 
my @columns = ('Day', 'Month', 'Year', 'From', 'To', 'Reference', 'Description', 'Type', 'Amount', 'Balance');
 
 
 
 
 
 
 
# Log in to the wiki
 
wikiLogin($wiki, $user, $pass) or exit;
 
 
 
# Extract the content.xml file from the .ods archive
 
my $xml = $ARGV[0] or die "Please specify a .ods file to import rows from";
 
 
 
# Convert the XML to a hash tree (see http://www.organicdesign.co.nz/xml.pl)
 
$xml = xmlParse(join('', qx( unzip -p $xml content.xml )));
 
 
 
# Sort out column names and order
 
my %cols = ();
 
$cols{lc $columns[$_]} = $_ for 0..$#columns;
 
if ($#columns < 0) {
 
@columns = keys %cols;
 
while (my($k, $v) = each(%cols)) { $columns[$v] = $k }
 
}
 
 
 
# Extract the data from the hash tree and add to the wiki
 
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)
 
my @kc = keys %cols;
 
if ($#kc < 0) {
 
for (0..$#row) {
 
$cols{lc $row[$_]} = $_ if $row[$_];
 
}
 
} 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
 
my $title = wikiGuid();
 
 
 
# Get the current text of the article to be created/updated if any
 
my $text = wikiRawPage($wiki, $title, 0);
 
my $action = $text ? 'updated' : 'created';
 
 
 
# Build the record as wikitext template syntax
 
my $record  = "{{$tmpl\n";
 
$record .= "|$_ = ".$row[$cols{lc $_}]."\n" for @columns;
 
$record .= "}}";
 
 
 
# Replace, prepend or append the template into the current text
 
my ($pos, $len) = (0, 0);
 
for (wikiExamineBraces($text)) {
 
($pos, $len) = ($_->{OFFSET}, $_->{LENGTH}) if $_->{NAME} eq $tmpl;
 
}
 
if ($pos) { $text = substr $text, $pos, $len, $record }
 
else { $text = $append ? "$text\n$record" : "$record\n$text" }
 
 
 
# Update the article
 
$done = wikiEdit(
 
$wiki,
 
$title,
 
$record,
 
"[[Template:$tmpl|$tmpl]] record $action by [[OD:Ods2wiki.pl|ods2wiki.pl]]"
 
);
 
}
 
}
 
}
 
}
 
}
 
}
 
}
 
}
 
}
 
}
 

Latest revision as of 12:55, 8 December 2011

Info.svg This code is in our Git repository here.

Note: If there is no information in this page about this code and it's a MediaWiki extension, there may be something at mediawiki.org.

ods2wiki is a way to import data from a Open Office spreadsheet files into a MediaWiki.