Yahoo!APIを使ったルビ振り


Yahoo!のテキスト解析:ルビ振りを使ってHTMLおよびWordのルビ振りを書いてみた。ただ、Yahoo!のルビ振り自体に誤読が多少ある。Wordのルビ振りの方がレベルは高いです。

Yahoo!のサイトhttps://developer.yahoo.co.jp/webapi/jlp/furigana/v1/furigana.html

画像1

FileName:ruby.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="copyright" content="Copyright &copy; 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>

この記事が気に入ったらサポートをしてみませんか?