Difference between revisions of "Extension:FileSync.php"

From Organic Design wiki
(Add onArticleDeleteComplete and preprocessing)
(fill in some code)
Line 30: Line 30:
 
global $wgHooks,$wgParser,$wgFileSyncMagic;
 
global $wgHooks,$wgParser,$wgFileSyncMagic;
 
$wgParser->setFunctionHook($wgFileSyncMagic,array($this,'magicFilesync'));
 
$wgParser->setFunctionHook($wgFileSyncMagic,array($this,'magicFilesync'));
$wgHooks['ArticleSaveComplete'][]   = $this;
+
$wgHooks['ArticleSaveComplete'][] = $this;
$wgHooks['ArticleDeleteComplete'][] = $this;
+
$wgHooks['ArticleDelete'][]       = $this;
 
$this->args  = array();
 
$this->args  = array();
 
$this->paths = array();
 
$this->paths = array();
 
}
 
}
 
   
 
   
# Process the filesync-magic
+
# Reduce the magic and obtain the args and paths
 
function magicFilesync(&$parser) {
 
function magicFilesync(&$parser) {
  
# Populate $argv with both named and numeric parameters
+
# Extract paths and args
 
foreach (func_get_args() as $arg) if (!is_object($arg)) {
 
foreach (func_get_args() as $arg) if (!is_object($arg)) {
 
if (preg_match('/^(.+?)\\s*=\\s*(.+)$/',$arg,$match)) $this->args[$match[1]] = $match[2];
 
if (preg_match('/^(.+?)\\s*=\\s*(.+)$/',$arg,$match)) $this->args[$match[1]] = $match[2];
Line 45: Line 45:
 
}
 
}
  
# Check if file has changed,
+
# Check if master file has changed and if so, update the article
# if so, update article revision with an edit summary
+
$file = $this->paths[0];
 +
if (file_exists($file)) {
 +
if ( file has changed ) {
 +
# File has changed, update article
 +
$text = file_get_contents($file);
 +
$article = new Article($wgTitle);
 +
$article->doEdit($text,"Updated from $file");
 +
}
 +
}
  
 
return '';
 
return '';
Line 58: Line 66:
 
$content = $this->preprocess($text);
 
$content = $this->preprocess($text);
  
# Process each file in paths list
+
if (file_exists($file)) {
foreach ($files as $i => $files) {
+
# If content changed, write the new content to the file (add a msg to site-notice if possible)
 
+
}
if (file_exists($file)) {
+
else {
# If content changed, write the new content to the file (add a msg to site-notice if possible)
+
# Master (first) file has been deleted from source, delete article (and later other files)
}
 
else {
 
# Master (first) file has been deleted from source, delete article (and later other files)
 
}
 
 
 
 
}
 
}
  
Line 73: Line 76:
 
}
 
}
  
# Delete any associated files
+
# Get any filepaths before deleting the article
function onArticleDeleteComplete(&$article,&$user,$reason) {
+
function onArticleDelete(&$article,&$user,$reason) {
 
+
global $wgHooks;
# Preprocess the text so that the paths are evaluated
 
 
$text = $article->getContent();
 
$text = $article->getContent();
 
$this->preprocess($text);
 
$this->preprocess($text);
 +
$wgHooks['ArticleDeleteComplete'][] = $this;
 +
return true;
 +
}
  
 +
# If the delete completes properly, delete the associated file
 +
function onArticleDeleteComplete(&$article,&$user,&$reason) {
 +
$file  = $this->paths[0];
 +
$reason = "(also deleting $file) $reason";
 +
if (file_exists($file)) unlink($file);
 
return true;
 
return true;
 
}
 
}

Revision as of 10:29, 31 August 2007

<?php

  1. Extension:FileSync
Info.svg These are the MediaWiki extensions we're using and/or developing. Please refer to the information on the mediawiki.org wiki for installation and usage details. Extensions here which have no corresponding mediawiki article are either not ready for use or have been superseded. You can also browse our extension code in our local Subversion repository or our GitHub mirror.

Template:Php

  1. - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
  2. - Author: User:NadCategory:Extensions created with Template:Extension
  3. - Started: 2007-08-02

if (!defined('MEDIAWIKI')) die('Not an entry point.');

define('FILESYNC_VERSION','0.0.0, 2007-08-31');

$wgFileSyncMagic = "filesync"; $wgExtensionFunctions[] = 'wfSetupFileSync'; $wgHooks['LanguageGetMagic'][] = 'wfFileSyncLanguageGetMagic';

$wgExtensionCredits['parserhook'][] = array( 'name' => 'FileSync', 'author' => 'User:Nad', 'description' => 'A template which can be added to an article to make it synchronise with a file', 'url' => 'http://www.organicdesign.co.nz/Extension:FileSync', 'version' => FILESYNC_VERSION );

class FileSync {

var $args; var $paths;

# Constructor - add hooks and initialise class function FileSync() { global $wgHooks,$wgParser,$wgFileSyncMagic; $wgParser->setFunctionHook($wgFileSyncMagic,array($this,'magicFilesync')); $wgHooks['ArticleSaveComplete'][] = $this; $wgHooks['ArticleDelete'][] = $this; $this->args = array(); $this->paths = array(); }

# Reduce the magic and obtain the args and paths function magicFilesync(&$parser) {

# Extract paths and args foreach (func_get_args() as $arg) if (!is_object($arg)) { if (preg_match('/^(.+?)\\s*=\\s*(.+)$/',$arg,$match)) $this->args[$match[1]] = $match[2]; else $this->paths[] = $arg; }

# Check if master file has changed and if so, update the article $file = $this->paths[0]; if (file_exists($file)) { if ( file has changed ) { # File has changed, update article $text = file_get_contents($file); $article = new Article($wgTitle); $article->doEdit($text,"Updated from $file"); } }

return ; }

# Update any associated files with the new content # - templates are expanded so that filepaths are known function onArticleSaveComplete(&$article,&$user,&$text) {

# Preprocess the text so that the paths are evaluated $content = $this->preprocess($text);

if (file_exists($file)) { # If content changed, write the new content to the file (add a msg to site-notice if possible) } else { # Master (first) file has been deleted from source, delete article (and later other files) }

return true; }

# Get any filepaths before deleting the article function onArticleDelete(&$article,&$user,$reason) { global $wgHooks; $text = $article->getContent(); $this->preprocess($text); $wgHooks['ArticleDeleteComplete'][] = $this; return true; }

# If the delete completes properly, delete the associated file function onArticleDeleteComplete(&$article,&$user,&$reason) { $file = $this->paths[0]; $reason = "(also deleting $file) $reason"; if (file_exists($file)) unlink($file); return true; }

# Preprocess the text so that the paths are evaluated and templates expanded ready for writing to files function preprocess(&$text) { $parser = new Parser; $opt = ParserOptions::newFromUser($user); $title = $article->getTitle(); return $parser->preprocess($text,$title,$opt); }

# Needed in some versions to prevent Special:Version from breaking function __toString() { return 'FileSync'; } }

  1. Called from $wgExtensionFunctions array when initialising extensions

function wfSetupFileSync() { global $wgFileSync; $wgFileSync = new FileSync(); }

  1. Needed in MediaWiki >1.8.0 for magic word hooks to work properly

function wfFileSyncLanguageGetMagic(&$magicWords,$langCode = 0) { global $wgFileSyncMagic; $magicWords[$wgFileSyncMagic] = array(0,$wgFileSyncMagic); return true; } ?>