noris / jsoner
Requires
- php: >=5.6
- ext-curl: *
- ext-fileinfo: *
- ext-intl: *
- ext-mbstring: *
- composer/installers: ~1.0
- league/uri: 4.1.*
- rwillians/stingray: ^2.0
Requires (Dev)
- jakub-onderka/php-parallel-lint: 0.9.*
- mediawiki/mediawiki-codesniffer: 0.6.*
- phpunit/phpunit: 5.2.*
README
安装 curl, fileinfo, intl 和 mbstring 用于 PHP。将以下内容放入你的 composer.local.json
{
"require": {
"noris/jsoner": "~1.0"
}
}
然后运行 composer update。接着,将其添加到你的 LocalSettings.php
wfLoadExtension( 'Jsoner' );
$jsonerBaseUrl = 'https://example.com/api/';
$jsonerUser = '<your_user>';
$jsonerPass = '<your_pass>';
Jsoner
这是一个 MediaWiki 扩展,允许用户将外部 JSON 数据(例如来自 REST API)嵌入到文章中。
需求
此扩展需要至少 PHP >= 5.6 以及以下 PHP 扩展
- curl
- fileinfo
- intl
- mbstring
使用 Debian / Ubuntu,你可以这样安装扩展
sudo apt-get install php5-curl php5-intl
sudo service apache2 restart
要测试它们是否启用(使用你的 php.ini)
$ php5 --php-ini /etc/php5/apache2/php.ini -m | grep -E 'fileinfo|mbstring|intl|curl'
curl
fileinfo
intl
mbstring
安装
下载(推荐,使用 Composer)
将以下内容放入你的 composer.local.json
{
"require": {
"noris/jsoner": "~1.0"
}
}
然后运行 composer update(如果你还没有 composer.lock,则可以使用 composer install)。
下载(不推荐,手动)
下载扩展并将其放入你的 extension/ 文件夹。
添加到 MediaWiki
要启用此扩展,将以下内容添加到你的 LocalSettings.php
wfLoadExtension( 'Jsoner' );
这将启用 Jsoner 扩展,并添加以下功能到 MediaWiki 解析器
#jsoner带参数url和过滤器,见下文。
配置
扩展有多个设置。请将其放置在 wfLoadExtension( 'Jsoner' ); 之后。
$jsonerBaseUrl (默认 = null)
$jsonerBaseUrl = 'https://example.com/api/';
这可以用于在所有 #jsoner 调用(特别是 url 参数)前加上此 URL,这样你就不需要重复自己,如果你只从一个域名获取数据。如果省略,你必须在 url 中提供完整的域名。
$jsonerUser / $jsonerPass (默认 = null)
$jsonerUser = '<your_user>';
$jsonerPass = '<your_pass>';
如果两者都设置了,这将被传递到 cURL 进行认证。如果省略,cURL 将尝试未认证。
用法
Jsoner 具有管道和过滤器架构。首先,获取数据,然后应用过滤器,最后将数据转换为表示形式。
Fetch → [Filter ...] → Transformer
在 MediaWiki 语法中,这看起来像这样
// Fetch → Filter → Filter → Transformer
{{ #jsoner:url=… | f-SelectSubtree=foo | f-SelectKeys=name,email | t-JsonDump }}
让我们运行一些有趣的东西
{{ #jsoner:url=http://pokeapi.co/api/v2/pokemon/1/ | f-SelectSubtree=stats | t-JsonDump }}
↓
[
{
"base_stat": 45,
"effort": 0,
"stat": {
"name": "speed",
"url": "http://pokeapi.co/api/v2/stat/6/"
}
},
{
"base_stat": 65,
"effort": 0,
"stat": {
"name": "special-defense",
"url": "http://pokeapi.co/api/v2/stat/5/"
}
},
{
"base_stat": 65,
"effort": 1,
"stat": {
"name": "special-attack",
"url": "http://pokeapi.co/api/v2/stat/4/"
}
},
{
"base_stat": 49,
"effort": 0,
"stat": {
"name": "defense",
"url": "http://pokeapi.co/api/v2/stat/3/"
}
},
{
"base_stat": 49,
"effort": 0,
"stat": {
"name": "attack",
"url": "http://pokeapi.co/api/v2/stat/2/"
}
},
{
"base_stat": 45,
"effort": 0,
"stat": {
"name": "hp",
"url": "http://pokeapi.co/api/v2/stat/1/"
}
}
]
如你所见,过滤器以 f- 前缀,转换器以 t- 前缀。
可用过滤器
典型的调用如下
{{ #jsoner:url=… | f-SelectSubtree=foo | }}
CensorKeysFilter (f-CensorKeys)
在列表上运行并返回一个列表。用法: f-CensorKeys=key(,key)*,replacement
示例: f-CensorKeys=email,--protected--
[
{
"name": "Bob",
"email": "bob@example.com"
},
{
"name": "Tom",
"email": "tom@example.com"
}
]
↓
[
{
"name": "Bob",
"email": "--protected--"
},
{
"name": "Tom",
"email": "--protected--"
}
]
ReduceKeysFilter (f-Reduce)
在列表上运行并返回一个列表。用法: f-Reduce=(\w+),(\w+)(\.\w+)*
示例: f-Reduce=mail,data.email
[
{
"id": "1",
"data": {
"email": "bob@example.com",
"city": "Berlin"
}
},
{
"id": 2,
"data": {
"email": "tom@example.com",
"city": "Hamburg"
}
}
]
↓
[
{
"id": "1",
"data": {
"email": "bob@example.com",
"city": "Berlin"
},
"mail": "bob@example.com"
},
{
"id": 2,
"data": {
"email": "tom@example.com",
"city": "Hamburg"
},
"mail": "tom@example.com"
}
]
RemoveKeysFilter (f-RemoveKeys)
在列表上运行并返回一个列表。用法: f-RemoveKeys=key(,key)*
示例: f-RemoveKeys=email
[
{
"name": "Bob",
"email": "bob@example.com"
},
{
"name": "Tom",
"email": "tom@example.com"
}
]
↓
[
{
"name": "Bob"
},
{
"name": "Tom"
}
]
SelectKeysFilter (f-SelectKeys)
在列表上运行并返回一个列表。用法: f-SelectKeys=key(,key)*
示例: f-SelectKeys=email
[
{
"name": "Bob",
"email": "bob@example.com"
},
{
"name": "Tom",
"email": "tom@example.com"
}
]
↓
[
{
"email": "bob@example.com"
},
{
"email": "tom@example.com"
}
]
SelectSubtreeFilter (f-SelectSubtree)
在对象上运行并返回一个列表。用法: f-SelectSubtree=key
示例: f-SelectSubtree=records
{
"recordCount": 2,
"records": [
{
"name": "Bob",
"email": "bob@example.com"
},
{
"name": "Tom",
"email": "tom@example.com"
}
]
}
↓
[
{
"name": "Bob",
"email": "bob@example.com"
},
{
"name": "Tom",
"email": "tom@example.com"
}
]
SelectRecordFilter (f-SelectRecord)
在列表上运行并返回一个列表。用法: [f-SelectRecord=key:value]
示例:f-SelectRecord=email:test2@example.com
[
{
"name": "Bob",
"email": "test1@example.com"
},
{
"name": "Tom",
"email": "test2@example.com"
}
]
↓
[
{
"name": "Tom",
"email": "test2@example.com"
}
]
可用的转换器
管道的末尾必须始终有一个转换器。
InlineListTransformer(《t-InlineList》)
从列表创建一个以逗号分隔的值列表。
用法:t-InlineList=key
以列表作为输入,调用 t-InlineList=email
[
{
"name": "Bob",
"email": "bob@example.com"
},
{
"name": "Tom",
"email": "tom@example.com"
}
]
↓
bob@example.com, tom@example.com
非常适合列表!
JsonDumpTransformer(《t-JsonDump》)
将JSON数据输出到<pre>标签中。非常适合调试。
SingleElementTransformer(《t-SingleElement》)
从对象或列表中返回单个JSON值。如果输入是列表,SingleElementTransformer将使用列表中的第一个元素来显示内容。
用法:t-SingleElement=key
以列表作为输入,调用 t-SingleElement=name
[
{
"name": "Bob",
"email": "bob@example.com"
},
{
"name": "Tom",
"email": "tom@example.com"
}
]
↓
Bob
以对象作为输入,调用 t-SingleElement=name
{
"name": "Bob",
"email": "bob@example.com"
}
↓
Bob
非常适合像ID这样的单个值。
StackedElementTransformer(《t-StackedElement》)
从对象或列表中创建一个由<br />分隔的(堆叠在一起)堆栈。如果输入是列表,StackedElementTransformer将使用列表中的第一个元素并显示该元素。
以列表作为输入
[
{
"name": "Bob",
"email": "bob@example.com"
},
{
"name": "Tom",
"email": "tom@example.com"
}
]
↓
Bob
bob@example.com
以对象作为输入
{
"name": "Tom",
"email": "tom@example.com"
}
↓
Tom
tom@example.com
非常适合地址数据。
WikitextTableTransformer(《t-WikitextTable》)
从对象列表创建一个整洁且可排序的Wikitext表格。
[
{
"name": "Bob",
"email": "bob@example.com"
},
{
"name": "Tom",
"email": "tom@example.com"
}
]
↓
╔════════╦═════════════════╗
║ name ▼ ║ email ▼ ║
╠════════╬═════════════════╣
║ Bob ║ bob@example.com ║
║ Tom ║ tom@example.com ║
╚════════╩═════════════════╝
MediaWikiTemplateTransformer(《t-mwTemplate》)
根据给定的模板创建Wikitext。你可能需要为查询创建一个合适的模板。使用key=value对。
Wiki-字符串:{{ template |key=value }}
用法:t-mwTemplate=template
使用t-mwTemplate=jsoner-template
[
{
"name": "Bob",
"email": "bob@example.com"
"username": "bobexample"
},
{
"name": "Tom",
"email": "tom@example.com"
"username": "tomexample"
}
]
↓
╔════════╦═════════════════╦══════════════╗
║ name ▼ ║ email ▼ ║username ▼ ║
╠════════╬═════════════════╣══════════════╣
║ Bob ║ bob@example.com ║ bobexample ║
║ Tom ║ tom@example.com ║ tomexample ║
╚════════╩═════════════════╩══════════════╝
输出取决于你使用的模板。
MediaWikiTemplateTransformerAnonymous(《t-mwTemplateAnonymous》)
根据给定的模板创建Wikitext。你可能需要为查询创建一个合适的模板。不使用key=value对,使用MediaWiki的匿名模板。在此用例中的模板:template= {{{1}}} {{{2}}}
用法:t-mwTemplateAnonymous=template
[
{
"name": "Bob",
"email": "bob@example.com"
"username": "bobexample"
},
{
"name": "Tom",
"email": "tom@example.com"
"username": "tomexample"
}
]
↓
Bob bob@example.com Tom tom@example.com
输出取决于你使用的模板。
限制
- 如果你设置了
$jsonerUser和$jsonerPass,认证将用于每个请求。目前没有按域或按请求级别设置用户名和密码(也许这是正确的)。一个可能性是将一个单独的调用,如{{ #jsoner-unauth:url=… }}或类似的东西。
开发
此扩展正在开发中。任何内容都可能更改。
你可以使用以下命令克隆它:
git clone git@github.com:noris-network/Jsoner.git && cd Jsoner
make devenv
要将它安装到你的开发MediaWiki中,只需将其符号链接到你的extensions文件夹
# Assuming you are in Jsoner folder
cd /path/to/your/extensions/folder
ln -s /path/to/the/Jsoner/extension Jsoner
然后,按照上面描述的方式安装它。
要查看你可以做什么,运行以下之一:
make
make help
为了测试,你可以运行:
make test
为了修复来自make test的警告等,你可以运行:
make fix
为了清理,你可以运行:
make clean
许可
GPL v3