Togglateを使ってRuby Quizを作ったよ!
翻訳ドキュメント作成支援ツール「togglate
」というものを作ったのですが、これはWeb単語帳とか問題集とかの、一部を見せたり隠したりするページを作るのにも使えるのです。
それで早速「Ruby Quiz」なるものを作ってみたので、時間が許す人は挑戦してください。まあどれもRubyの基礎的な他愛のない問題なので、時間の無駄になるかもしれませんが。「答え」をクリックすると答えと簡単な解説が表示されます。
問題の作り方は下のほうに書きましたので、問題づくりに興味のある方はどうぞ。
Ruby Quiz
Rubyバージョンは2.1。
問1.xの値は何か。
x = [1,2,3].push *[4,*[5,*[6,7]]]
問2.xの値は何か。
x = [1,2,3] * ([4, 5] * '6')
問3.xの値は何か。
x = ('a'..'c').size == ('c'..'f').size
問4.xの値は何か。
x = 3
x = *x..x**2
問5.xの値は何か。
a = (a=[1,2,3]).push a
x = a[3][3][3][0]
問6.xの値は何か。
a = (a=[1,2,3]).push *a
x = a[3][3][3][0]
問7.xの値は何か。
x = !:false.!
問8.xの値は何か。
x = :->:+, :======:===
問9.xの値は何か。
x = send(def d(n); n * 2 end, 3)
問10.xの値は何か。
x = "R" << 117 << 98 << 121
全問正解しましたか?ええ、もちろんそうでしょうとも!
Togglateを使った問題の作り方
まず、ruby_quiz_original.md
として以下のようなファイルを用意します。各問は前に4スペース空けます(コメントブロックで囲まれないようにするため)。
問1.xの値は何か。
```ruby
x = [1,2,3].push *[4,*[5,*[6,7]]]
```
答え:[1, 2, 3, 4, 5, 6, 7]
解説:*(splat)により配列が展開されて、Array#pushには複数の引数として渡される。
問2.xの値は何か。
```ruby
x = [1,2,3] * ([4, 5] * '6')
```
答え:"146524653"
解説:Array#*にStringオブジェクトを渡すと#joinとして機能する。
(以下省略)
gem install togglate
でtogglateをインストールすると、togglate
コマンドが使えるようになります。
togglate create
サブコマンドにいくつかのオプションを適用して、結果の出力をruby_quiz.md
に格納します。
% togglate create ruby_quiz_original.md -m=toggle -c --toggle-link-text '答え' '隠す' > ruby_quiz.md
-c
オプション(–code-block)はコードブロックをコメントで囲まないようにします。次のようなruby_quiz.md
ファイルが得られます。
問1.xの値は何か。
```ruby
x = [1,2,3].push *[4,*[5,*[6,7]]]
```
[translation here]
<!--original
答え:[1, 2, 3, 4, 5, 6, 7]
解説:*(splat)により配列が展開されて、Array#pushには複数の引数として渡される。
-->
問2.xの値は何か。
```ruby
x = [1,2,3] * ([4, 5] * '6')
```
[translation here]
<!--original
答え:"146524653"
解説:Array#*にStringオブジェクトを渡すと#joinとして機能する。
-->
(中略)
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script>
$(function() {
$("*").contents().filter(function() {
return this.nodeType==8 && this.nodeValue.match(/^original/);
}).each(function(i, e) {
var tooltips = e.nodeValue.replace(/^original *[\n\r]|[\n\r]$/g, '');
var link = "<span><a href='#' onclick='javascript:return false;' class='toggleLink'>" + "答え" + "</a></span>";
$(this).prev().append(link);
$(this).prev().after("<pre style='display:none'>"+ tooltips + "</pre>");
});
$('.toggleLink').click(
function() {
if ($(this).text()=="答え") {
$(this).parent().parent().next('pre').slideDown(200);
$(this).text("隠す");
} else {
$(this).parent().parent().next('pre').slideUp(200);
$(this).text("答え");
};
});
});
</script>
答えのブロックがコメントで囲まれ、末尾にそれをトグルするコードが追加されます。
このファイルに対して、各問いの前のスペースと、[translation here]
の文字を削除します。
問1.xの値は何か。
```ruby
x = [1,2,3].push *[4,*[5,*[6,7]]]
```
<!--original
答え:[1, 2, 3, 4, 5, 6, 7]
解説:*(splat)により配列が展開されて、Array#pushには複数の引数として渡される。
-->
問2.xの値は何か。
```ruby
x = [1,2,3] * ([4, 5] * '6')
```
<!--original
答え:"146524653"
解説:Array#*にStringオブジェクトを渡すと#joinとして機能する。
-->
(以下省略)
gem install github-markdown
して、gfm
コマンドを使ってこのMarkdownファイルをHTMLに変換します(gfmコマンドはパスを通す必要があります)。
% gfm ruby_quiz.md > ruby_quiz.html
以上で先のRuby Quizが出来上がります。
関連記事: 英語圏のオープンソースプロジェクトにおける翻訳ドキュメントの問題点とその解決のための一方策(仕切り直し版)
=== Ruby関連電子書籍100円〜で好評発売中! ===
blog comments powered by Disqus