You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
2.8 KiB
PHP

<?php
namespace LatinizeUrl;
class Patcher {
private $file;
private $content;
private $tag;
private $version;
public function __construct($file, $tag, $version){
$this->file = $file;
$this->content = file_get_contents($file);
$this->tag = $tag;
$this->version = $version;
}
public function findPatchVersion($name){
$regex = '/\/\/ Start ' . $this->tag . ' ([0-9\.\-]+) ' . $name . ' Patch\n.*?\/\/ End ' . $this->tag . ' [0-9\.\-]+ ' . $name . ' Patch/is';
if(preg_match($regex, $this->content, $matches, PREG_OFFSET_CAPTURE)){
$ret = [];
$ret['start'] = $matches[0][1];
$ret['end'] = $ret['start'] + strlen($matches[0][0]);
$ret['version'] = $matches[1][0];
return $ret;
} else {
return false;
}
}
public function patchInitializeParseTitleHook(){
$patchName = 'InitializeParseTitleHook';
$patchContent = ['Hooks::run( \'InitializeParseTitle\', [ &$ret, $request ] );'];
$patchFinalContent = $this->makePatchContent($patchName, $patchContent, 2);
$currentPatch = $this->findPatchVersion($patchName);
if($currentPatch){
if($currentPatch['version'] != $this->version){ //需要更新
$this->content = substr($this->content, 0, $currentPatch['start'] - 2)
. $patchFinalContent
. substr($this->content, $currentPatch['end'] + 1);
}
} else { //打新的补丁
$regex = '/(?!private function parseTitle\(\) \{(.*?))(?=[\t ]+return \$ret;)/is';
if(preg_match($regex, $this->content, $matches, PREG_OFFSET_CAPTURE)){
$splitPos = $matches[0][1];
$this->content = substr($this->content, 0, $splitPos)
. $patchFinalContent
. substr($this->content, $splitPos);
}
}
}
public function makePatchContent($name, $content, $indent = 0, $indentChar = "\t"){
if(!is_array($content)) $content = explode("\n", $content);
$lines = array_merge([
'// Start ' . $this->tag . ' ' . $this->version . ' ' . $name . ' Patch',
'// This code is added by ' . $this->tag . ', Donnot remove this code untill you uninstall ' . $this->tag . '.',
], $content, [
'// End ' . $this->tag . ' ' . $this->version . ' ' . $name . ' Patch',
]);
$contentText = '';
foreach($lines as $line){
$contentText .= str_repeat($indentChar, $indent) . $line . "\n";
}
return $contentText;
}
public function save($file = null){
if(!$file) $file = $this->file;
file_put_contents($file, $this->content);
}
}