Yahoo!APIを使ったルビ振り
Yahoo!のテキスト解析:ルビ振りを使ってHTMLおよびWordのルビ振りを書いてみた。ただ、Yahoo!のルビ振り自体に誤読が多少ある。Wordのルビ振りの方がレベルは高いです。
Yahoo!のサイトhttps://developer.yahoo.co.jp/webapi/jlp/furigana/v1/furigana.html
FileName:ruby.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="copyright" content="Copyright © 2019 Kazuo Yamanoi. All Rights Reserved.">
<title>ルビ振り</title>
<style>
#prt,#src {
display:block;
border: blue 4px double;
border-radius: 5px;
padding: 1em 0.8em 0.8em 0.8em;
}
</style>
<script>
function textcopy() {
let text = document.getElementById('prt');
let listener = function(e){
e.clipboardData.setData( 'text/plain' , text.innerHTML);
e.preventDefault();
document.removeEventListener('copy', listener);
}
document.addEventListener('copy' , listener);
document.execCommand('copy');
alert('コピーしました。');
}
function htmlcopy() {
let prt = document.getElementById('prt');
let text = prt.cloneNode(true);
let styletag = document.createElement("style");
let styledata = document.createTextNode("rt{font-size:0.5em;}\n");
styletag.appendChild(styledata);
text.insertBefore(styletag,text.firstChild);
let listener = function(e){
e.clipboardData.setData( 'text/html' , text.innerHTML);
e.preventDefault();
document.removeEventListener('copy', listener);
}
document.addEventListener('copy' , listener);
document.execCommand('copy');
alert('コピーしました。');
}
</script>
</head>
<body>
<h1>ルビ振り</h1>
<p>本サイトのルビ振りには、<a href="https://developer.yahoo.co.jp/webapi/jlp/furigana/v1/furigana.html" target="_blank" alt="">Yahoo!のルビ振り</a>を使っていま す。</p>
<?php
ini_set("display_errors",1);
$src=isset($_POST["src"])?$_POST["src"]:'';
$opt=isset($_POST["level"])?$_POST["level"]+0:1;
?>
<form action="ruby.php" method="post">
<label><input type="radio" name="level" value="1"<?=$opt<2?' checked="checked"':''?>>1年生</label>
<label><input type="radio" name="level" value="2"<?=$opt==2?' checked="checked"':''?>>2年生</label>
<label><input type="radio" name="level" value="3"<?=$opt==3?' checked="checked"':''?>>3年生</label>
<label><input type="radio" name="level" value="4"<?=$opt==4?' checked="checked"':''?>>4年生</label>
<label><input type="radio" name="level" value="5"<?=$opt==5?' checked="checked"':''?>>5年生</label>
<label><input type="radio" name="level" value="6"<?=$opt==6?' checked="checked"':''?>>6年生</label>
<label><input type="radio" name="level" value="7"<?=$opt==7?' checked="checked"':''?>>中学生</label>
<label><input type="radio" name="level" value="8"<?=$opt==8?' checked="checked"':''?>>一般向け</label>
<br>
<textarea cols="90" rows="20" name="src"><?=$src?></textarea><br>
<input type="submit" value="送信">
</form>
<?php
$appid = "Yahoo!からAPPIDを取得して入れる";
if(!empty($src)) {
$src = strip_tags($src);
$opt = $opt+0;
$url = "https://jlp.yahooapis.jp/FuriganaService/V1/furigana";
$patterns = array(
urldecode('%E2%80%93'),
urldecode('%C2%B7'),
);
$replacements = array(
'-',
'・',
);
$src = str_replace($patterns,$replacements,$src);
$data = "grade={$opt}&sentence=".urlencode($src);
$header = array(
"User-Agent: Yahoo AppID:".$appid,
"Content-Type: application/x-www-form-urlencoded",
"Content-Length: ".strlen($data)
);
$context = array(
"http" => array(
"method" => "POST",
"header" => implode("\r\n", $header),
"content" => $data
)
);
$xml = file_get_contents($url, false, stream_context_create($context));
$dom = new DOMDocument('1.0','UTF-8');
$dom->loadXML($xml);
$e = $dom->documentElement;
$e->removeAttributeNS($e->getAttributeNode("xmlns")->nodeValue,"");
$dom->loadXML($dom->saveXML($dom));
$xpath = new DOMXPath($dom);
$out="";
foreach($xpath->query('//Word') as $node){
$surface = $node->getElementsByTagName('Surface');
$furigana = $node->getElementsByTagName('Furigana');
if($furigana->length==0) {
if($surface->length>0){
$out .= $surface[0]->nodeValue;
}
} else {
$surface = $surface[0]->nodeValue;
$furigana = $furigana[0]->nodeValue;
$out .= "<ruby>{$surface}<rp>(</rp><rt>{$furigana}</rt><rp>)</rp></ruby>";
}
}
$out = str_replace("\n\n","\n",$out);
$prt = nl2br($out);
print <<<EOD
<p>出力結果:
<button onClick="textcopy()">HTML用にコピー</button>
<button onCLick="htmlcopy()")>Word用にコピー</button></p>
<div id="prt">{$prt}</div>
EOD;
}
?>
</body>
</html>