compressedData[]=$feedArrayRow;$newOffset=strlen(implode("",$this->compressedData));$addCentralRecord="\x50\x4b\x01\x02";$addCentralRecord.="\x00\x00";$addCentralRecord.="\x0a\x00";$addCentralRecord.="\x00\x00";$addCentralRecord.="\x00\x00";$addCentralRecord.="\x00\x00\x00\x00";$addCentralRecord.=pack("V",0);$addCentralRecord.=pack("V",0);$addCentralRecord.=pack("V",0);$addCentralRecord.=pack("v",strlen($directoryName));$addCentralRecord.=pack("v",0);$addCentralRecord.=pack("v",0);$addCentralRecord.=pack("v",0);$addCentralRecord.=pack("v",0);$ext="\x00\x00\x10\x00";$ext="\xff\xff\xff\xff";$addCentralRecord.=pack("V",16);$addCentralRecord.=pack("V",$this->oldOffset);$this->oldOffset=$newOffset;$addCentralRecord.=$directoryName;$this->centralDirectory[]=$addCentralRecord;} function addFile($data,$directoryName){$directoryName=str_replace("\\","/",$directoryName);$feedArrayRow="\x50\x4b\x03\x04";$feedArrayRow.="\x14\x00";$feedArrayRow.="\x00\x00";$feedArrayRow.="\x08\x00";$feedArrayRow.="\x00\x00\x00\x00";$uncompressedLength=strlen($data);$compression=crc32($data);$gzCompressedData=gzcompress($data);$gzCompressedData=substr(substr($gzCompressedData,0,strlen($gzCompressedData)-4),2);$compressedLength=strlen($gzCompressedData);$feedArrayRow.=pack("V",$compression);$feedArrayRow.=pack("V",$compressedLength);$feedArrayRow.=pack("V",$uncompressedLength);$feedArrayRow.=pack("v",strlen($directoryName));$feedArrayRow.=pack("v",0);$feedArrayRow.=$directoryName;$feedArrayRow.=$gzCompressedData;$feedArrayRow.=pack("V",$compression);$feedArrayRow.=pack("V",$compressedLength);$feedArrayRow.=pack("V",$uncompressedLength);$this->compressedData[]=$feedArrayRow;$newOffset=strlen(implode("",$this->compressedData));$addCentralRecord="\x50\x4b\x01\x02";$addCentralRecord.="\x00\x00";$addCentralRecord.="\x14\x00";$addCentralRecord.="\x00\x00";$addCentralRecord.="\x08\x00";$addCentralRecord.="\x00\x00\x00\x00";$addCentralRecord.=pack("V",$compression);$addCentralRecord.=pack("V",$compressedLength);$addCentralRecord.=pack("V",$uncompressedLength);$addCentralRecord.=pack("v",strlen($directoryName));$addCentralRecord.=pack("v",0);$addCentralRecord.=pack("v",0);$addCentralRecord.=pack("v",0);$addCentralRecord.=pack("v",0);$addCentralRecord.=pack("V",32);$addCentralRecord.=pack("V",$this->oldOffset);$this->oldOffset=$newOffset;$addCentralRecord.=$directoryName;$this->centralDirectory[]=$addCentralRecord;} function getZippedfile(){$data=implode("",$this->compressedData);$controlDirectory=implode("",$this->centralDirectory);return$data.$controlDirectory.$this->endOfCentralDirectory.pack("v",sizeof($this->centralDirectory)).pack("v",sizeof($this->centralDirectory)).pack("V",strlen($controlDirectory)).pack("V",strlen($data))."\x00\x00";} function forceDownload($archiveName){$headerInfo='';if(ini_get('zlib.output_compression')){ini_set('zlib.output_compression','Off');}$data=$this->getZippedFile();header("Pragma:public");header("Expires:0");header("Cache-Control:must-revalidate,post-check=0,pre-check=0");header("Cache-Control:private",false);header("Content-Type:application/zip");header("Content-Disposition:attachment;filename={$archiveName}.xpi;");header("Content-Transfer-Encoding:binary");header("Content-Length:".strlen($data));print("$data");exit;} } // from http://jasonfarrell.com/misc/guid.php // Generates a random GUID per http://www.ietf.org/rfc/rfc4122.txt // e.g. output: 372472a2-d557-4630-bc7d-bae54c934da1 // word*2-, word-, (w)ord-, (w)ord-, word*3 function genGUID(){$guidstr="";for($i=1;$i<=16;$i++){$b=(int)rand(0,0xff);if($i==7){$b&=0x0f;$b|=0x40;}if($i==9){$b&=0x3f;$b|=0x80;}$guidstr.=sprintf("%02s",base_convert($b,10,16));if($i==4||$i==6||$i==8||$i==10){$guidstr.='-';}}return$guidstr;} function insertValues(&$str, $data) { foreach ($data as $k=>$v) { $str=str_replace( '$'.$k, $v, $str ); } return $str; } function convertToRegExp($str) { $str=preg_replace('/([][\\/.?^$+{\|)(])/', '\\\\\1', $str); $str=str_replace('*', '.*', $str); return $str; } if (!empty($_POST)) { error_reporting(E_ALL); //undo magic quotes if necessary if (get_magic_quotes_gpc()) { $_POST=array_map('stripslashes', $_POST); } //build data .. start from post $data=array( 'guid' => genGUID(), 'shortname' => uniqid('script'), 'name' => 'Compiled User Script', 'description' => '', 'creator' => 'Anonymous', 'homepage' => '', 'version' => '0.1', 'include' => array(), 'exclude' => array(), 'minVersion' => '1.5', 'maxVersion' => '2.0.0.*' ); foreach (array( 'guid', 'creator', 'homepage', 'version', 'minVersion', 'maxVersion' ) as $k) { if (!empty($_POST[$k])) $data[$k]=$_POST[$k]; } //continue build data .. grok values from script $m=array(); $start=strpos($_POST['script'], '==UserScript=='); $end=strpos($_POST['script'], '==/UserScript=='); if ($start>0 && $end>$start) { $scriptData=substr($_POST['script'], $start+15, $end-$start-15); $scriptData=preg_split('/[\n\r]+/', $scriptData); foreach ($scriptData as $line) { $m=array(); if (preg_match('/@name\b(.*)/', $line, $m)) { $data['name']=trim($m[1]); } if (preg_match('/@description\b(.*)/', $line, $m)) { $data['description']=trim($m[1]); } if (preg_match('/@include\b(.*)/', $line, $m)) { $data['include'][]=trim($m[1]); } if (preg_match('/@exclude\b(.*)/', $line, $m)) { $data['exclude'][]=trim($m[1]); } } } //make short name from name $data['shortname']=strtolower(substr( preg_replace('/[^a-zA-Z]/', '', $data['name']), 0, 32 )); //convert includes/excludes $data['include']=array_map('convertToRegExp', $data['include']); $data['exclude']=array_map('convertToRegExp', $data['exclude']); //js-ify includes/excludes if (empty($data['include'])) { $data['include']='true'; } else { $data['include']='( /'.implode('/.test(href) || /', $data['include']).'/.test(href) )'; } if (empty($data['exclude'])) { $data['exclude']='true'; } else { $data['exclude']='!( /'.implode('/.test(href) || /', $data['exclude']).'/.test(href) )'; } $xmlProlog=''; //stuff the files that will go in the xpi into an array $xpi=array(); $xpi['chrome.manifest']=<<{\$guid}\$shortname\$version\$description\$creatorGreasemonkey Compiler by Anthony Lieuallen;http://www.arantius.com/\$homepage{ec8030f7-c20a-464f-9b0e-13a3a9e97384}\$minVersion\$maxVersion QQ; $xpi['content/script-compiler-overlay.xul']=<< QQ; $xpi['content/script-compiler.js']=<<addDirectory('chrome/'); foreach ($xpi as $k=>$v) { $zip->addFile($v, $k); } $zip->forceDownload($data['shortname']); print_r($_FILES['script']); } else { ?> 用户脚本编译器 User Script Compiler

你可以使用这个工具,将GreaseMonkey脚本转换为Firefox扩展(.xpi)。

在下面输入合适的内容。如果你没有GUID,可以保留系统自动随机生成的GUID。也可以替换为你自己的值,如果你想要升级一个已存在的扩展,就必须这么做。

粘贴脚本源代码时,请保留 ==UserScript== 部分,编辑器会读取这些数据(name, description, includes/excludes)。

GUID:
创建者:
该扩展的主页:
该扩展的版本号:
Firefox最小版本号:
Firefox最大版本号:
用户脚本代码:

查看源代码

原作者的网站