手册:标签扩展

来自MyaWiki.Org
跳转到导航 跳到搜索

OOJS UI图标 扩展 发展 ·标记扩展 ·解析器函数 ·挂钩 ·专版 · ·魔法词 ·应用程序接口 ·内容模型
MeimaWiKi扩展

个别项目往往会对它有用。扩展内置wiki标记具有附加功能,无论是简单的字符串处理,还是全面的信息检索。标签扩展允许用户创建新的定制标签。例如,可以使用标记扩展来介绍简单的<捐赠/ >标签,它将捐赠形式注入页面。扩展,以及解析器函数挂钩是最有效的方法来改变或增强MeaWiKi的功能。你应该在开始工作之前检查矩阵,确保其他人没有做你想做的事情。

一个简单的标记扩展包括回调函数,即钩住的在解析器中,当解析器运行时,它将查找并替换特定标记的所有实例,调用相应的标记。回调函数来呈现实际的HTML。

例子

在扩展.jSON中,设置钩子:


  “钩子” {
    “PARSerFistCalimIT” “示例扩展::OnPrSerFistCalimIt”
   }

并将钩子添加到PHP文件中

<?PHP

 扩展实例 {
	/用解析器注册任何呈现回调
	公共 静止的 功能 OnPrServestCalimIt 语法分析器 $语法分析器  {
		//当分析器看到标签时,它执行ReNeltAgTest样(见下文)
		$语法分析器>塞图克 “样本” [ 自己:: “ReNeDigabaseSt样” ] 
	}

	//渲染<样本>
	公共 静止的 功能 渲染样本 美元投入 数组 $ARGS 语法分析器 $语法分析器 pp帧 $帧  {
		//这里没有什么令人兴奋的,只是逃避用户提供的输入,然后再把它扔掉(例如)
		退货 HTMLPrimeCARS 美元投入 
	}
}

此示例注册一个回调函数<样本>标签当用户将此标签添加到这样的页面时:<样本ARG1=“xxx”ARG2=“xxx”>…输入…<样本>解析器将调用ReNeDigabsSAMPLE()函数,传递四个参数:

美元投入
输入之间<样本>< /样本>标签,或无效的如果标签是“关闭”,即<样本>
$ARGS
标签参数,它像HTML标签属性一样输入;这是一个由属性名称索引的关联数组。
$分析器
父解析器(解析器对象);更高级的扩展使用此来获取上下文标题、解析Wiki文本、展开括号、注册链接关系和依赖关系等。
$帧
父帧(PPFraskObject)。这与$解析器一起使用,为解析器提供了在调用扩展的上下文中更完整的信息。

有关更详细的示例,请参见标签扩展示例


特性

让我们再来看看另一个例子:

<?PHP

美元挂钩[“PrSerFiestCalimIt”[] = “OnPARServestCalimIt”

功能 OnPrServestCalimIt 语法分析器 $语法分析器  {
	$语法分析器>塞图克 “样本” “WfSAMPLER” 
}

功能 吸尘器 美元投入 数组 $ARGS 语法分析器 $语法分析器 pp帧 $帧  {
	$ATTR = [];    
	//这次,列出属性和它们的值,并将它们与用户输入一起转储。
	前额 $ARGS 作为 美元名称 = > 美元价值  {
		$ATTR[] = “<强>” . HTMLPrimeCARS 美元名称  . < <强> > . HTMLPrimeCARS 美元价值 
	}
	退货 内爆 'BR/> $ATTR  . \n . HTMLPrimeCARS 美元投入 

/**
*下面的行可以用来直接获得变量值:
* $to=$ARGS [ 'to ' ];
*电子邮件= $ARGS [电子邮件];
*/
}

此示例将传递给标记的属性连同它们的值一起转储。很明显,这允许灵活地定制新的、定制的标签。例如,您可以定义一个标记扩展,允许用户使用类似的东西在用户页面上输入联系人窗体。“电子邮件”=“用户”电子邮件=“USER @ FooCo”/>.

对于MealaWiKi来说,有一个名副其实的标签扩展,其中一些是本网站上市其他可以通过快速的网络搜索找到。虽然其中一些是非常专门为其用例,有很多深受欢迎和充分使用的扩展提供不同程度的功能。

公约

手册:开发扩展 对于总体布局和扩建的设置。

发布扩展

  1. 在这个名为扩展名的wiki上创建一个新页面:与扩展有关的信息、如何安装它以及使用它的截图。已经创建了一个方便的模板来保存这个信息。模板:扩展 . 有关更多信息,请参阅模板页。您还应该尽可能多地添加页面的正文,明智的做法是定期检查相关的谈话页面上的用户问题。另外,确保页面属于类别:扩展名 .
  2. 创建新的扩展名挂钩在扩展代码中应该注册它们扩展钩子注册表.
  3. 通知麦迪维基L通讯名单

也见发布您的扩展名.

常见问题

安全关切

你会注意到上面例子中的输入是使用的。HTMLTraceCARSH()在返回之前。至关重要的是,所有的用户输入都以这种方式处理,然后将其回传给客户端,以避免引入任意向量。HTML注入,这可能导致跨站点脚本漏洞。

加载模块

为扩展提供模块的正确方法是将它们附加到PARServices而不是$WGOUT。模块列表将自动从PARServices对象中获取,并在页面呈现预缓存时添加到$WGOUT中。如果直接将模块添加到$WGOUT,它们可能不会被缓存在解析器输出中。

功能 迈克勒霍克 美元文本 数组 $PARAMS 语法分析器 $语法分析器 pp帧 $帧  {
	/…做些事情…
	$语法分析器>获得输出()>附加模块 Ext MyCaleExt 
	$语法分析器>获得输出()>附加模块式 “Ext.MyCalutExx.Stand” 
	/…做更多的事情…
}


时序与扩展

如果更改扩展的代码,则使用扩展的所有页面将在理论上立即反映新代码的结果。从技术上讲,这意味着每次包含扩展的页面都要执行代码。

在实践中,由于页面缓存(通常由MyaWiKi软件、浏览器或中介代理或防火墙),情况往往不是这样。

要绕过MeaWiKi的解析器缓存并确保页面的新版本生成,单击“编辑”,用“action =清除”在浏览器地址栏中显示的URL中替换“ActudieEdage”,并提交新URL。该页及其引用的所有模板将被重新生成,而忽略所有缓存的数据。·如果主页本身未被修改,则需要清除动作,但是必须渲染的方式已经改变(扩展被修改,或者仅修改了参考模板)。

如果这还不足以给你一个新的页面拷贝,你可以通过添加“Rand and SAMEANDOMTEXT”来绕过中间缓存。确保每次“SAMEANDOMTEX”都是不同的。

如何使用我的扩展来禁用页面缓存?

自从MyaWiKi 1.5,解析器作为第三个参数传递给扩展。这个解析器可以用来使缓存失效,像这样:

功能 WfSAMPPLS函数 美元文本 数组 $ARGS 语法分析器 $语法分析器 pp帧 $帧  {
	$语法分析器>脱臼();
	/…
}

编辑另一页时重新生成页面

也许您不想完全禁用缓存,只希望在编辑另一个页面时重新生成页面,类似于处理模板转换的方式。这可以通过传递给钩子函数的解析器对象来完成。下列方法从核函数 似乎是为了这个目的而工作。

/**使被解析的页面通过TeMeleleNKS表依赖于$PAGE。
*/
功能 依赖关系 语法分析器 $语法分析器 $PAGE   {
	美元头衔 = 头衔::新文本 $PAGE 
	$Rev = 修订::新标题 美元头衔 
	美元身份证 = $Rev  $Rev>GETPAGE()  
	//Tabelelink中的寄存器依赖性
	$语法分析器>获得输出()>添加模板 美元头衔 美元身份证 $Rev  $Rev>盖蒂德()   
}

缓存行为的细粒度调整

可以通过使用缓存键来区分扩展输出的不同版本,可以为扩展使用细粒度缓存。在渲染时,可以通过将AdExtReKEY方法添加到钩子函数中来为每个特征添加缓存键,例如:

功能 WfSAMPPLS函数 美元文本 数组 $ARGS 语法分析器 $语法分析器 pp帧 $帧  {
	$1= int $语法分析器>获取用户()>获得期权“设置1”
	$语法分析器>获取选项()>选择使用 “设置1” 
	美元结算2= int $语法分析器>获取用户()>获得期权“设置2”
	$语法分析器>获取选项()>选择使用 “设置2” 
	
}

但是,在解析过程中修改$PARSER -> GETopOpStudio()意味着在试图获得缓存页时不包括额外的选项键,只有当呈现页面进入缓存时,才能使用该选项。分页哈希钩子设置额外选项。当将页面放入缓存中并将其取出时,Page ReNeDrimhhash都会运行,因此仅在哈希尚未存在时只添加新的密钥非常重要。例如:

美元挂钩[“PrimeEndReun-HASH”[] = “WfMyExtPoPrReNeNeDungHASH”

功能 WFMyExtPoPrReNeNeDunkHASH &美元价格 $用户 美元期权  {
	如果  铟数组 “设置1” 美元期权   {
		美元价格 = “!设置1= . $用户>获得期权“设置1”
	}
	如果  铟数组 “设置2” 美元期权   {
		美元价格 = “!设置2= . $用户>获得期权“设置2”
	}
}

有关这方面的一些重要注意事项:

  • 使用“!设置1= $value“而不是仅仅”!在COFSTR中的$value确保如果不同的扩展被安装或它们的加载顺序改变,解析器高速缓存不会被弄乱。用于不同渲染选项的分隔符
  • 有些人使用$分析器-> GETopTeX()-> AdExtRebug()而不是$分析器-> GoopOpjsTo()-> opTouSud(). 请注意,AdExtReKEY不告诉解析器缓存使用额外的密钥,因此如果您不小心,很容易导致中断缓存。

如何在扩展中呈现WiKiTeXT?

自1.16版以来

MIDAWIKI版本: ±一点一六

分析器钩子函数被传递给解析器对象和框架对象,这些应该用于解析WiKiTeXT。

功能 WFSAMPLE奇妙钩 美元文本 数组 $ARGS 语法分析器 $语法分析器 pp帧 $帧  {
	美元产量 = $语法分析器>递归式分析器 美元文本 $帧 
	退货 'div类=“奇妙”> . 美元产量 . 
}

解析::自从1.8版本以来就一直存在。它的优点包括简单性(只需要一个参数并返回一个字符串),以及它解析扩展标记的事实。美元文本因此,可以嵌套扩展标记。

第二个参数为RealsivEtAgPARSE,$帧,是在MW 1.16阿尔法(RC5668)中引入的可选参数。

  • 如果$帧提供(使用值$帧传递到扩展名,然后在模板中输入任何模板参数美元文本将扩大。换句话说,内容如{{{ 1 }}}将被识别和转换成适当的值。
  • 如果$帧未提供(例如$Pasel-> RealsivEtAgPARSE($text)),或者,如果$帧如果设置为false,则模板参数将不被扩展;{{{ 1 }}}不会更改。虽然这不可能是期望的行为,但这是MW 1.16之前可用的唯一选择。

但是,即使在使用RealsivEtAgPARSE时,仍然跳过用于标签的解析的一个步骤是解析器:PrimaveTochange。PravaEffic是解析的第一步,负责对即将被保存的WiKiTeXT进行永久性更改,例如:

  • 转换签名(~~~~~~~~~~~~~~)
  • 扩展链接标签,也称为管戏法(例如,[ [帮助:内容] ]变成[ [帮助:内容>内容] ]。如果没有这一步,诸如[[帮助:内容> ]的速记链接被认为是无效的,并且在解析时保留在WiKiTeXT窗体中。
  • 展开{{SuST:}}模板。

PrimaveTror的原始调用有意跳过所有扩展标记中的此类转换。如果需要预保存转换,应该考虑使用解析器函数相反。所有标签扩展也可以被称为使用语法分析器的函数{{标签:TAGNONT}输入}属性名称=值}将应用预保存变换。

如何在扩展标记中传递XML样式参数?

自1.5版以来

由于MeIaWiKi 1.5,支持XML样式参数(标签属性)。参数作为挂钩函数作为第二个参数作为关联数组传递。值字符串已经为你解码了HTML字符实体,所以如果你将它们释放回HTML,请不要忘记使用HTMLPrimeCARS($CODETO编码,EnthQues)避免HTML注入的风险。

如何避免对扩展的HTML输出进行修改?

标记扩展的返回值被考虑。几乎解析文本,这意味着它不被视为纯HTML,但仍略微修改。有两个主要的事情是做一个标签扩展的输出(连同一些其他小的事情):

  • 替换条带标记. 条形标记是在WiKiTeXT处理的各个阶段插入的某些项目,作为标记以在稍后的时间重新插入删除的内容。这不是通常需要担心的扩展。
  • 解析器:dBROCK级它将**转换成列表,并将从一个前导空间开始的任何一行转换为这在某些扩展中有时可能是一个问题。

标记扩展还支持返回数组而不是仅返回字符串(类似于解析器函数),以便更改返回值的解释方式。数组的零个值必须是HTML。·“MARKEYTYPE”键可以设置为诺维基以便停止进一步解析。做某事返回数组($HTML,“标记类型”=> Noiki);将确保$HTML值不被进一步修改,并被视为纯HTML。

如何让我的扩展显示在特殊版本上?

为了在MIDAWIKI上显示您的扩展名特殊:版本页中,必须在PHP代码中指定扩展信用。

为此,添加一个$WGREST 变量作为钩子行或函数定义之前的第一个可执行代码行。

扩展信贷的一个例子是:

<?PHP
/**
*ExpExtExp-这个扩展是一个不做任何事的例子。
*
*激活此扩展,将以下内容添加到LoalalStutsP.PHP文件中:
*要求一次(‘$IP/扩展/示例.php’);
*
*@群内扩展
*@作者某个身份不明的人.Jo.doe@ ExpPul.com >
*@版本1
*@链接http://www. MyaWiki .org/wiki /扩展:MyExpDebug文档
*@许可证HTTP//www. GNUGOR/CopeLtt/GPL.HTML GNU通用公共许可证2或更高版本
*/

/**
*防止注册全局漏洞。
*在引用任何全局变量之前,该行必须存在。
*/
如果 定义 “MiaWiKi”   {
	回声 “这是对MyaWiKi包的扩展,不能单独运行。\n 
	死亡 - 
}

/扩展信用卡将显示在特殊版本:
$WGREST[“ValdIxxTrand类”[] = 数组
	“路径”           = > 一个文件
	“名字”           = > “榜样”
	“版本”        = > “1”
	“作者”         = > “某个身份不明的人” 
	“URL”            = > http://www. MeaWiki .org/wiki /扩展:MyExtRe'
	“描述MSG” = > 示例DESC /I18N文件中的消息键。
	“描述”    = > 这个扩展是一个例子,没有任何可辨别的函数。


$WGExchange消息文件[] = 第二代 . '/iph.i18n.php’

这里是我们扩建的地方。
功能 WF-示例(){
	/…
}

替换瓦楞纸板类用下列之一(除非你的扩展属于多个类,然后创建一个信用每个班级):

  • “专页”-保留添加到MyaWiKi特殊页面;
  • 如果您的扩展修改、补充或替换MealaWiKi中的解析器函数,则使用“PARSECORE”;
  • “变量”扩展,向MeaWiWi添加多个功能;
  • “媒体”-如果你的扩展是某种类型的媒体处理程序,则使用
  • “其他”-所有其他扩展。

这个肌扩张接口/i18n消息的名称,描述扩展的I18n.PHP文件中需要定义的扩展名。如果你省略了这个字段,描述将使用字段代替。

检索回调中的标记名称

假设您有几个标签< Fo><酒吧>共享相同的回调函数,并且在回调函数内部,您希望获得标签名称调用回调。

美元挂钩[“PrSerFiestCalimIt”[] = “OnPARServestCalimIt”

……

公共 功能 OnPrServestCalimIt 语法分析器 $语法分析器  {
	$语法分析器>塞图克 “福” “共享功能” 
	$语法分析器>塞图克 “酒吧” “共享功能” 
}

……

公共 功能 共享功能 美元投入 数组 $ARGS 语法分析器 $语法分析器 pp帧 $帧  {
	如何区分“Fo”和“Bar”的调用?
}

简短的回答是:标签名称(酒吧不存在于任何回调的参数中。但是,您可以通过为每个标签动态构造单独的回调来解决此问题:

美元挂钩[“PrSerFiestCalimIt”[] = “OnPARServestCalimIt”

……

公共 功能 OnPrServestCalimIt 语法分析器 $语法分析器  {
	//用于每个标签名
	前额  [ “福” “酒吧” ] 作为 $TAG名称  {
		/动态创建回调函数
		回调 = 功能 美元投入 $ARGS $语法分析器 $帧  使用  $TAG名称  {
			//回调调用共享函数。
			//现在我们将标签名作为参数传递。
			退货 共享功能 美元投入 $ARGS $语法分析器 $帧 $TAG名称 
		};
		/将回调赋值给标签
		$语法分析器>塞图克 $TAG名称 回调 
	}
}

……

公共 功能 共享功能 美元投入 数组 $ARGS 语法分析器 $语法分析器 pp帧 $帧 $TAG名称 {
	/现在我们可以检索标签名并为该标签执行自定义操作。
	开关  $TAG名称  {
		/…
	}
}


也见

扩展 多类别 ·全部 ·请求·标记扩展 ·扩展常见问题解答 ·扩展钩子注册表·扩展默认命名空间
从“检索”HTTPS://www. MyaWikI.Org/W/Delix.PHP?标题=手册:TAGIO扩展和OLDID=3276718