# JS Notebook JS Notebookとは,主にJavaScriptの自主学習で使用することを想定した,説明中に挿入されているコードをそのまま実行するノートブックです.説明とソースコードと実行結果を比べながら学習でき,さらにソースコードを編集して違いを見ることもできます.説明の作成にはMarkdownフォーマットを使用できるので,HTMLをべた書きするのと比べて楽に書けると思います. ## 基本的な記述方法 Markup言語よりも簡潔に記述したいとの要望が多いことから,技術者の間で徐々に広まりつつあるのがMarkdownです.基本的には,```jsn-md```タグ内にMarkdownに従って説明文を記述します.Markdownには方言が多いのでお気をつけください.こちらではGithub Flavorという方言(GFM : Github Flavored Markdownと呼ばれています)を採用しています. Markdownの強みは,表も書きやすいことです. 比較 | HTML | Markdown --|--|-- 記述量 | 多い | 少ない 細かい記述制御 | それなりにできる | 殆どできない 詳しいことは以下のページなどをご覧ください. [訳 GitHub Help - GitHub Flavored Markdown](https://qiita.com/qurage/items/a2f3f52c60d7c64b2e08) [Markdownで行こう!](https://gist.github.com/wate/7072365) Markdownに慣れるまでは,Markdownに対応したエディタを利用するのが良いと思われます.AtomやSublimeText用のプラグインが配布されており,編集画面とプレビューをウィンドウの左右に分けて表示できます.(ただし,**方言が異なる**可能性があります.ご了承ください) ## プログラムの記述と実行 HTMLファイル内に```jsn-md```タグを配置し,その中にプログラムなどを記載できます.```jsn-md```はJSNotebook MarkDownの略です. ソースコードは,Markdownの流儀に従い,開始と終了の行にバッククオートを3個並べます.バッククオートを表示する方法が分からないので,書式についてはソースコードを見てください.バッククオートに続いてタグとして```javascript```と入力しておくと,プログラムと認識してくれます.(なぜか先頭行だけ1文字空いてしまいます.原因は調査中です.1行目はコメント専用としておくことで回避しても良いかな・・・と思っています) また,```javascript```に続くタグとして,```runnable```,```once```,```sandbox```を指定可能です.それぞれ,「通常の実行(別の枠まで変数を持ち越す)」「一度だけ実行可能(別の枠まで変数を持ち越す)」「sandbox内で実行」を意味します.それ以外に,```console```タグを付けておくと,実行ボタンの下にコンソールが付きます. ```javascript runnable console var x1 = 20; console.log( "x1は" + x1 + "です" ); ``` 同様に,バッククオートに続いてeditableを入力しておくと,プログラムを編集可能になります. 編集できる場合は背景色を変更する予定です. 分かりにくいですが,以下のプログラムの数値を変更してRunをクリックしてみてください. ```javascript runnable editable console // 編集可能です var x2 = 20; console.log( "x2は" + x2 + "です" ); ``` 実行しないくて良いプログラムには,```hl```タグを付けることでSyntax Highliteを付けることも可能です.残念ながら,```hl```と```runnable```の共存はできません. ```javascript hl // Syntax Highliteの例 var x3 = 20; console.log( "x3は" + x3 + "です" ); ``` ## 変数を受け継ぐとは? 先に書いた「変数を受け継ぐ」とは,複数のプログラムコード間で変数を共有する機能です.これにより,CanvasやWebAudioなど長くなるプログラムを,ステップごとに説明することができます.以下の例で説明します. ```javascript runnable editable console // sinとcosの値を計算する var theta = 30; // 30° var r = 100; // 半径100 var x = r * Math.cos( theta / 180 * Math.PI ); var y = r * Math.sin( theta / 180 * Math.PI ); console.log( " x = " + x ); console.log( " y = " + y ); ``` 上記プログラムは,単純に正弦と余弦を計算するプログラムです.runnableタグを付けているので,別の枠と変数を共有します.例えば,以下のプログラムを実行させてみてください. ```javascript runnable editable console // 変数を受け継ぎます.必ず上のプログラムを先に実行してください. console.log( "上のプログラムで代入されたxは " + x + "です" ); ``` xの内容が表示されたと思います.当然,副作用も出てきますが(「2回実行してはダメ」や「必ず上から順番に実行」など),割り切ることにします. ## タグ一覧 プログラムの記述(バッククオート3つによるブロック)に使用できるタグを以下に示します. タグ | 機能 --|-- javascript | JSのプログラムの記述 html | HTMLの記述(ただし不等号はエスケープさせること) hl | SyntaxHighlighを付ける runnable | 実行可能 once | 1度だけ実行可能 sandbox | 外に副作用を出さずに実行可能 editable | 編集可能 console | コンソールを表示 ## 図形の描画について 簡単な図形を掲載するために,Mermaid記法を利用できるようにしています. バッククオート3つによるブロックに```mermaid```というタグを付けておいてください. 以下に例を示します.例によってバッククオートを表記する方法が不明のため,ソースコードを参照してください. ```mermaid graph LR Markdow -- showdown.js --> HTML Mermaid -- mermaid.js --> diagram ``` ## 利用しているライブラリ JSNotebookでは,以下のライブラリを利用しています.なお,CDNなどを使用せずに,サイト内にファイルを置いています. 名称 | 機能 --|-- [highlight.js](https://highlightjs.org/) | シンタックスハイライタ [showdown.js](https://showdownjs.com/) | Markdown to HTMLコンバータ [mermaid.js](https://mermaid-js.github.io/mermaid/#/) | 図表レンダラ ## 現在分かっているバグ 現在,以下のバグの存在を認識しています. 1. JavaScriptのコード内で < の後ろにスペースがないとタグとみなされて,それ以降のレンダリングがおかしくなる 1. プログラムブロックの先頭の行頭にスペースが挿入される 1. editable領域で編集してしまうとconsoleに表示されなくなる ## リポジトリ 以下のリポジトリで管理しています. [JSNotebook](https://github.com/sudahiroshi/jsnotebook)