noris/jsoner

安装: 179

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 17

分支: 2

类型:mediawiki-extension

1.1.10 2021-07-19 06:30 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:36:49 UTC


README

安装 curl, fileinfo, intlmbstring 用于 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