anti scroll

ブラウザと小説の新しい関係を模索する

Nehan Readerにて、オプションからフォントを自由に設定できるようになりました。

Nehan Readerのversion 2.2.37より、オプションからフォントを自由に設定できるようになりました。

Nehan Reader - Chrome ウェブストア

「涅」のボタンを右クリックして「オプション」へと進んでください。

以下のように、cssfont-familyの値をダイレクトに設定できます。

f:id:convertical:20160312201208p:plain

設定すると、常にこの値が使用されるようになるため、右メニューにあった「明朝」とか「ゴシック」の設定スイッチが表示されなくなります。

設定値を空白に戻すと、また有効になります。

小説家になろうとカクヨムのテキストを縦書きページ送りで表示する

Nehan Reader(ver2.2.35)をリリースしました。

実はMacでしか確認していないので、Windowsで読みにくくなってるかも。もしそうなら、どんな状態か教えてくだされば善処します。

[2017/01/24追記] Windowsで表示が崩れる問題が修正されました!

chrome.google.com

Nehan Readerを使うと、例えばWikipediaなんかも、こんな感じで縦書きに。

f:id:convertical:20160405181831p:plain

もちろん横書きにすることもできます。

f:id:convertical:20160405181918p:plain

横書きの場合は「見開き」にすると読みやすいかも(設定から Two Page Spreads を選択)。

f:id:convertical:20160405181932p:plain

更新内容

小説家になろうカクヨムといったサイトの場合は、特別に幾つかのスタイルを設定するように修正しました。

  • 間に入る空白行が詰めて表示されるようになりました。
  • どちらのサイトも(理由はよくわかりませんが)タイトルやサブタイトルなどにヘッダータグが使われていないので、これらをヘッダ扱いしてテキスト内の目次として表示させるようにしました。

余談

カクヨムの段落は、それぞれに固有のidが割り振られているのが興味深いです。

ひょっとしたら段落別のフィードバック機能を考えているのかも?

実は自分もそういう機能を実装したことがあるのですが、あんまり利用してもらえなかったのは苦い思い出…

そういえばMediumも、いつのまにか段落コメントじゃなくなってる気が。なにかあったんでしょうか?

シリーズの目次とテキスト内の目次

シリーズの目次と、テキスト内の目次が、両方サイドバーに表示されるようになりました。

シリーズの目次

シリーズの目次は、同一シリーズ内のコンテンツを行き来するための目次です。

f:id:convertical:20160304150535p:plain

テキスト内の目次

テキスト内の目次は、本文の中で見出し(ヘッダー)が設定された箇所にジャンプするための目次です。

シリーズの目次とは違い、クリックするとその見出しのあるページにジャンプします。

f:id:convertical:20160304150546p:plain

数式の組版に対応しました

まだ実験的な機能なのですが、数式の組版に対応しました。

使い方

エディター画面の「数式」をクリックします。

f:id:convertical:20160201142249p:plain

数式エディターが開くので、MathJax形式で入力します。

f:id:convertical:20160201142259p:plain

プレビューすると、こんな風に表示されます。

横書きのとき

f:id:convertical:20160201145929p:plain

縦書きのとき

f:id:convertical:20160201145921p:plain

数式の書き方について

詳しくはMathJaxのドキュメントを見ていただくとして、大雑把に言うと\[\] で囲むか、$$$$ で囲みます。

$$ E = mc^2 $$
\[ e^{i\theta} = \cos\theta + i\sin\theta \]

数式を組み込むと、MathJaxの組版が完了するまで、先頭ページの表示が少し遅くなります。ご注意ください。

作品ページから執筆ページに移動できるようになりました

作品ページから執筆ページ(エディターページ)に移動できるようになりました。

f:id:convertical:20160122115132p:plain

自分の作品であれば、タイトル脇に「編集する」というボタンが表示されます。

nehan.js 5.5.0

nehan.js 5.5.0をリリースしました。

github.com

以下、5.4.x系列からの変更点です。

変更点

  • pseudo-classの:matches, :not, :langをサポートしました。
  • MathJaxを試験的にサポートしました。demo
  • サロゲートペアに対応しました。これにより、emoji等が文字化けせず、そのまま出力できるようになりました。demo
  • ブラウザがサポートしてる場合は、ネイティブなtext-combine-uprightが使用されるようになりました。demo
  • text-orientationの値にsideways, upright, mixedが指定できるようになりました。demo
  • list-style-positionの値に、insideが指定できるようになりました。
  • cssのfont値をshorthand形式でも指定できるようになりました。
  • Nehan.Preloadsモジュールの追加。サイズ未設定のimgmathなどのサイズが動的に取得されるようになりました。
  • selector-keyの値に関数を指定した場合、当該セレクタonloadフックとして評価されるようになりました。
  • nehan.jsによる組版から除外して、外部ソースをそのまま取り込むための属性値の名前がpastedからlazyに変更されました。
  • Nehan.PagedElementが削除されました。今後はNehan.Documentを使用して下さい。
  • Nehan.LexingRuleが削除されました。今後、シングルタグの定義にはNehan.setSingleTagNameを使用して下さい。
  • Nehan.Rgb, Nehan.Palette, Nehan.Colorsモジュールが削除されました。

Nehan.PagedElementの削除について

v5.5.0から、Nehan.PagedElementが削除されました。

これの中身は、単なるNehan.Documentのラッパで、やってることはページ状態と表示先DOMをDocumentクラスと一緒に管理しているだけのものです。

Nehan.Documentと役割が被ることが多いので、今回のバージョンアップで削除してしまうことにしました。

MathJaxについて

MathJaxのサポートですが、現時点では本ソースへの取り込みではなく、プラグインでの対応です。

詳しくは以下のリンクから確認して下さい。

https://github.com/tategakibunko/nehan.js/tree/master/plugins

Unicode Hyphen覚え書き

例えばHTMLで「F-15」のような「-」(ハイフン)を含むboxを90度回転して表示させようとすると、ハイフンの後で改行されてしまいます。

f:id:convertical:20151231091605p:plain

なぜこんなことが起きてしまうのでしょうか。

理由

フォントサイズが16と仮定して「F-15」という横書きのwordを囲むサイズが、32x16(横x縦)だとします。

これを縦書き用に90度回転させると、このwordを囲むサイズは、32x16から16x32になります。

このときFの後のハイフンが、回転前の横幅(32)ではなく、回転後の横幅(16)を前提にして解釈されるのが、改行が発生する原因です。

「F-」まで描画したところでインラインの描画位置が、回転後における横幅の限界(すなわち16)に届くのですが、この位置で発生したハイフンが、line-break-pointとブラウザに判断されるため、改行が発生してしまうわけです。

Unicodeの中でline-break-pointと解釈されるハイフンは他にも色々(*注1)ありますが、よく使われるのはHYPHEN MINUS(U+002D)や、HYPHEN(U+2010)です。

*注1 U+002D, U+2010, U+2012, U+2013とかもそう。調べたらもっとあるかも。

というわけで、nehan.js内では英数字を縦書き用に回転させるときだけ、U+002DU+2010(U+2012,U+2013なども)を、あらかじめnon-breaking-hyphen(U+2011)に変換して、この問題を回避しています。

white-space:preでも解決できるかもしれないです。

もちろんこれはベストな解決方法ではありません。

こうしたHyphenの動きをコントロールするため、CSSにはhyphensというプロパティが定義されているのですが、なぜかChromeではまだ未実装(その他のブラウザは殆ど実装されている)なので、仕方なくこういう回避策をとっています。