Difference between revisions of "Extension:FileSync.php"
m (Extension:FileSync.php moved to Foo:FileSync.php) |
(formatting) |
||
Line 19: | Line 19: | ||
'url' => 'http://www.organicdesign.co.nz/Extension:FileSync', | 'url' => 'http://www.organicdesign.co.nz/Extension:FileSync', | ||
'version' => FILESYNC_VERSION | 'version' => FILESYNC_VERSION | ||
− | + | ); | |
class FileSync { | class FileSync { | ||
Line 34: | Line 34: | ||
$this->args = array(); | $this->args = array(); | ||
$this->paths = array(); | $this->paths = array(); | ||
− | + | } | |
# Reduce the magic and obtain the args and paths | # Reduce the magic and obtain the args and paths | ||
Line 46: | Line 46: | ||
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]; | ||
else $this->paths[] = $arg; | else $this->paths[] = $arg; | ||
− | + | } | |
# Display the file updated message if sent | # Display the file updated message if sent | ||
Line 53: | Line 53: | ||
$wgSiteNotice .= '{'."{warning|$filesync: $comment}".'}'; | $wgSiteNotice .= '{'."{warning|$filesync: $comment}".'}'; | ||
return ''; | return ''; | ||
− | + | } | |
# Exit now if not a normal view request | # Exit now if not a normal view request | ||
Line 69: | Line 69: | ||
$article->doEdit($ftext,$comment); | $article->doEdit($ftext,$comment); | ||
$wgOut->redirect($wgTitle->getLocalURL("filesyncupdated=$comment")); | $wgOut->redirect($wgTitle->getLocalURL("filesyncupdated=$comment")); | ||
− | |||
} | } | ||
+ | } | ||
else $wgSiteNotice .= '{'."{warning|$filesync: File '''$file''' does not exist!}".'}'; | else $wgSiteNotice .= '{'."{warning|$filesync: File '''$file''' does not exist!}".'}'; | ||
return ''; | return ''; | ||
− | + | } | |
# Update any associated files with the new content | # Update any associated files with the new content | ||
Line 92: | Line 92: | ||
$ftext = trim(file_get_contents($file)); | $ftext = trim(file_get_contents($file)); | ||
if ($atext !== $ftext) file_put_contents($file,$atext); | if ($atext !== $ftext) file_put_contents($file,$atext); | ||
− | + | } | |
return true; | return true; | ||
− | + | } | |
# Get any filepaths before deleting the article (can only delete if sysop) | # Get any filepaths before deleting the article (can only delete if sysop) | ||
Line 103: | Line 103: | ||
$this->preprocess($article); | $this->preprocess($article); | ||
$wgHooks['ArticleDeleteComplete'][] = $this; | $wgHooks['ArticleDeleteComplete'][] = $this; | ||
− | + | } | |
return true; | return true; | ||
− | + | } | |
# If the delete completes properly, delete the associated file | # If the delete completes properly, delete the associated file | ||
Line 113: | Line 113: | ||
if (file_exists($file)) unlink($file); | if (file_exists($file)) unlink($file); | ||
return true; | return true; | ||
− | + | } | |
# Preprocess the text so that the paths are evaluated and templates expanded ready for writing to files | # Preprocess the text so that the paths are evaluated and templates expanded ready for writing to files | ||
Line 122: | Line 122: | ||
$opt = new ParserOptions; | $opt = new ParserOptions; | ||
return $parser->preprocess($text,$title,$opt); | return $parser->preprocess($text,$title,$opt); | ||
− | + | } | |
# Needed in some versions to prevent Special:Version from breaking | # Needed in some versions to prevent Special:Version from breaking | ||
function __toString() { return 'FileSync'; } | function __toString() { return 'FileSync'; } | ||
− | + | } | |
# Called from $wgExtensionFunctions array when initialising extensions | # Called from $wgExtensionFunctions array when initialising extensions | ||
Line 132: | Line 132: | ||
global $wgFileSync; | global $wgFileSync; | ||
$wgFileSync = new FileSync(); | $wgFileSync = new FileSync(); | ||
− | + | } | |
# Needed in MediaWiki >1.8.0 for magic word hooks to work properly | # Needed in MediaWiki >1.8.0 for magic word hooks to work properly | ||
Line 139: | Line 139: | ||
$magicWords[$wgFileSyncMagic] = array(0,$wgFileSyncMagic); | $magicWords[$wgFileSyncMagic] = array(0,$wgFileSyncMagic); | ||
return true; | return true; | ||
− | + | } | |
− |
Revision as of 01:36, 18 August 2008
<?php
- Extension:FileSync
- - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
- - Author: User:NadCategory:Extensions created with Template:Extension
- - Started: 2007-08-02
if (!defined('MEDIAWIKI')) die('Not an entry point.');
define('FILESYNC_VERSION','0.0.3, 2007-09-03');
$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) { global $wgTitle,$wgOut,$wgSiteNotice; $parser->mOutput->mCacheTime = -1; $filesync = "FileSync";
# 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; }
# Display the file updated message if sent if (isset($_REQUEST['filesyncupdated'])) { $comment = $_REQUEST['filesyncupdated']; $wgSiteNotice .= '{'."{warning|$filesync: $comment}".'}'; return ; }
# Exit now if not a normal view request if (isset($_REQUEST['action']) || isset($_REQUEST['oldid'])) return ;
# Check if master file has changed and if so, update the article $file = $this->paths[0]; if (file_exists($file)) { $wgSiteNotice .= '{'."{info|$filesync: This article is automatically synchronised with the file $file}".'}'; $article = new Article($wgTitle); $atext = trim($article->getContent()); $ftext = trim(file_get_contents($file)); if ($atext !== $ftext) { $comment = "Article updated from file $file"; $article->doEdit($ftext,$comment); $wgOut->redirect($wgTitle->getLocalURL("filesyncupdated=$comment")); } } else $wgSiteNotice .= '{'."{warning|$filesync: File $file does not exist!}".'}';
return ; }
# Update any associated files with the new content # - templates are expanded so that filepaths are known function onArticleSaveComplete(&$article,&$user,&$text) {
# Don't do any processing of files unless sysop if (!in_array('sysop',$user->getGroups())) return true;
# Preprocess the text so that the paths are evaluated $this->preprocess($article);
# If the article content is now different than the file, update the file $file = $this->paths[0]; if (file_exists($file)) { $atext = trim($text); $ftext = trim(file_get_contents($file)); if ($atext !== $ftext) file_put_contents($file,$atext); }
return true; }
# Get any filepaths before deleting the article (can only delete if sysop) function onArticleDelete(&$article,&$user,$reason) { global $wgHooks; if (in_array('sysop',$user->getGroups())) { $this->preprocess($article); $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(&$article) { $title = $article->getTitle(); $text = $article->getContent(); $parser = new Parser; $opt = new ParserOptions; return $parser->preprocess($text,$title,$opt); }
# Needed in some versions to prevent Special:Version from breaking function __toString() { return 'FileSync'; } }
- Called from $wgExtensionFunctions array when initialising extensions
function wfSetupFileSync() { global $wgFileSync; $wgFileSync = new FileSync(); }
- 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; }