次のようなユーザー入力に取り組んでいます
- foo
- wikt:foo
- Bar#hiそこに
次のような入力のhttpsリンクを取得するには
- https://en.wikipedia.org/wiki/foo
- https://en.wiktionary.org/wiki/foo
- https://en.wikipedia.org/wiki/Bar#hi_there
私はこれを最小限の手動で、可能な限りクリーンな方法で実行しようとしているので、スクリプトをどこかにアップロードして、品質の低さを恥じることなく人々に見せることができます。これの意味は:
- httpsではなくhttpリンクを取得した場合、
s/^http/^https/
置換をハードコーディングしたくありません。 - 不完全なリンクを取得した場合、不足しているものを追加するために正規表現を使用したくありません。
これまでに2つの解決策を見つけましたが、それぞれに欠陥があります。
解析クエリ
canonicalurlマジックワードを使用して、{{canonicalurl:user_input_here}}で解析クエリを実行します。ただし、httpsリンクではなくhttpのみを提供します。
#!/usr/bin/perl
use strict;
use warnings;
use MediaWiki::API;
use Data::Dumper;
my $mw = MediaWiki::API->new();
$mw->{config}->{api_url} = 'https://en.wikipedia.org/w/api.php';
my $info_ref = $mw->api ( {
action => 'parse',
prop => 'text',
text => '{{canonicalurl:Hello}}',
} ) or die $mw->{error}->{code} . ': ' . $mw->{error}->{details};
my $html = $info_ref->{parse}{text}{'*'};
print Dumper $html;
情報クエリ
情報クエリを使用します。ただし、セクションでは機能しません。つまり、「Foo#bar」入力は「Foo」にリンクする出力を取得します。
#!/usr/bin/perl
use strict;
use warnings;
use MediaWiki::API;
my $mw = MediaWiki::API->new();
$mw->{config}->{api_url} = 'https://en.wikipedia.org/w/api.php';
sub get_url_by_title(){
my $title = shift;
my $info_ref = $mw->api ( {
action => 'query',
prop => 'info',
inprop => 'url',
iwurl => 1,
titles => $title,
} ) or die $mw->{error}->{code} . ': ' . $mw->{error}->{details};
if (exists $info_ref->{query}{pages}){
return (values $info_ref->{query}{pages})[0]{'fullurl'};
}
elsif (exists $info_ref->{query}{interwiki}){
return (values $info_ref->{query}{interwiki})[0]{'url'};
}
}