anti scroll

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

nehan.js version5.4.0のリリース

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

github.com

このバージョンから新しく追加された機能や、5.3.x系から消えた機能などがいくつかあるので、ご注意下さい。

変更点

  • Nehan.Documentが新たに定義されました。
  • onPageコールバックがサポートされました。
  • Nehan.setup, Nehan.createEngine, Nehan.PageStreamが廃止されました。

Nehan.Documentについて

Nehan.Documentは、paged media用のdocument環境を抽象化したクラスです。

こういう風に使います。

var doc = new Nehan.Document();
var target = document.querySelector("#target"); // 表示先

// 内容をセット
doc.setContent("<h1>hello, nehan.js!</h1>");

// ページサイズやスタイルをセット
doc.setStyle("body", {
  flow:"tb-rl", // or "lr-tb"
  width:600,
  height:400,
  fontSize:16
});

// 組版スタート
doc.render({
  // 各ページが完了する度に呼ばれる
  onPage:function(page, ctx){
    console.log("page:%o, pageNo:%d, percent:%d", page, page.pageNo, page.percent);
    page.element.style.marginBottom = "1em"; // ちょっと下にスペースを足しておく
    target.appendChild(page.element); // 組版結果を表示先に追加していく
  }
});

onPageコールバックについて

onPageコールバックを定義すると、ページ計算が都度DOMに変換しながらのパースになります。

なので、ページを遅延評価するonProgressコールバックを使う場合と比べると、全体のパーススピードは落ちるのですが、代わりにコードは簡略化されます。

これまでonProgress内でページオブジェクトを取得する場合、以下のようにする必要がありました。

doc.render({
  onProgress:function(tree, ctx){
    // この中でページが欲しい場合は、tree -> page する必要があった
    var page = ctx.getPage(tree.pageNo);
  }
});

onProgressに渡されるのはページではなく、ツリー(まだDOM化されていない中間オブジェクト)だからです。

しかし段組表示がしたい場合などは、即座にDOM変換された結果が欲しいわけですから、onPageが便利でしょう。

一方、ページ送りするビューアーを作る場合は、現在表示されていないページを変換する必要はないので、onProgressを使って遅延しておくと、全体のパーススピードが上がります。

Styleについて

作成した各Documentは、それぞれに独立したCSS環境を持ちます。

だからそれぞれを縦書きにしたり横書きにしたりできるのですが、全ドキュメントに共通のスタイルを定義したいときもあります。

そういう場合は、Nehan.seStyleを使ってください。

// 先にグローバルスタイルをセットしておく
Nehan.setStyle(".header", {
  margin:function(ctx){
    var em = ctx.style.getFontSize();
    var rem = ctx.style.getRootFont().size;
    return {
      before:Math.floor(2 * rem - 0.14285 * em),
      after:rem
    };
  }
});

// 縦書き組版環境
var vert_doc = new Nehan.Document()
  .setStyle("body", {flow:"tb-rl"})
  .setContent("<h1 class='header'>vert doc</h1>");

// 横書き組版環境
var hori_doc = new Nehan.Document()
  .setStyle("body", {flow:"lr-tb"})
  .setContent("<h1 class='header'>hori doc</h1>");

グローバルスタイルについては、各ドキュメントを作る「前に」セットしておく必要があることに注意してください。

nehan.jsでSemantic UIのようなヘッダースタイルを設定する

人気のCSSフレームワークSemantic-UI」ですが、ヘッダーの設定はこんな感じになっています。

.ui.header{
  margin: calc(2rem -  0.14285em) 0em 1rem;
}

各ヘッダー内での文字サイズ(em)と、bodyの文字サイズ(rem)を使って計算しています。

同じことをnehan.jsでやる場合は、こんな感じで設定します。

Nehan.setStyle(".ui.header", {
  margin:function(ctx){
    var em = ctx.style.getFontSize();
    var rem = ctx.style.getRootFont().size;
    return {
      before:Math.floor(2 * rem - 0.14285 * em),
      after:rem
    };
  }
});

Nehan Readerでも上記の設定でヘッダーをスタイリングしていますが、見出しの余白のバランスが良くなるだけで、けっこう全体の印象が変わるから不思議なものです。

「殿堂入り作品」を新設しました

f:id:convertical:20151016182240p:plain

本日より、ポイントが1000を超えた作品は、殿堂入り作品として表彰されるようになりました。

つまり殿堂入り作品は、月のポイント数にかかわらず、常に露出される形になります。

その代わり、月別ランキングからは除外されるようになりました。

ちなみに1000ポイントを条件にしたのは、ちょうどその辺りで一般投稿の殿堂入り作品の数が10になったからです。

問題点

現状、スマホのUIでは横幅が足りず、殿堂入り作品のタブが表示できていません。

なんとか画面に収めたいのですが、UIについては検討中です。

カルマ値に関する仕様を追加しました。

縦書き文庫では、作品を読めば読むほど「カルマ」という値が上昇するようになっていますが、このカルマに関する仕様を少し更新しました。

縦書き文庫ヘルプ - カルマについて

既存のルール(そのまま)

  • カルマ100オーバーでプロフィールページから広告が消える
  • カルマが高いと、ゲストユーザーによる読書であっても、作品に加算されるポイントの減少幅が小さくなる
  • 作品がお気に入り登録されたとき、登録者のカルマの高さに応じて、作品の評判値が上がる

新しく追加されたルール

  • お気に入り登録を利用できるのは、カルマ1以上のユーザーのみ
  • コメントを投稿できるのは、カルマ10以上のユーザーのみ
  • コメントにプラス評価を投稿できるのは、カルマ10以上のユーザーのみ
  • コメントにマイナス評価を投稿できるのはは、カルマ100以上のユーザーのみ

ルール追加の経緯

今回の仕様追加のきっかけは、以下のブログでstack overflowの仕組みを知って「なるほど!」と思ったからです。

blog.jnito.com

縦書き文庫は今でこそログインユーザーしかコメントを許可していませんが、はるか昔は匿名でのコメントを許可していました。

たまに発言者が「anonymous」となっているコメントがありますが、その当時の名残です。

それが元でコメント欄やコメント評価が乱れ、それに凹んで退会するユーザーがチラホラ…という時期もあったのです。

しかしカルマ値で機能を解放するようにすれば、多少はコメントの質を良くする効果があるのではないかな、と思った次第です。

段落のリアルタイムプレビュー機能を追加しました

編集中の段落をリアルタイムでプレビューする機能を追加しました。

カーソルのある位置の段落だけがプレビューされるので、そこそこ高速です。

f:id:convertical:20150927105549p:plain f:id:convertical:20150927105604p:plain

「字下げ」の誤変換は、キャプチャをとった後に気づきました。

しかし「それでも重い!」という方は、エディタの下部にある以下のチェックボックスで、有効と無効を切り替えることができます。

f:id:convertical:20150927105614p:plain

Firefoxでもversion41以降で縦書き字形が表示されるようになりました

昨日リリースされたFirefoxのversion41から縦書きの字形が出力できるようになりましたので、縦書き文庫nehan.jsもこれに対応しました。

これまでFirefoxのときだけ、一部の文字を画像で代替表示する処理をしていたのですが、これからはそれらがちゃんとした縦書き字形で表示されます。

またFirefoxが対応したことにより、ほぼ全ての主要ブラウザ(の最新版)で、こうした文字画像が不要になりそうです。

サーバーの転送量も大幅に減るでしょうし、嬉しい限りです。

とはいえmobile safari(<= version 4)とか、IE10以下では未だに文字画像で表示するわけですが…今やこうしたブラウザからのアクセスは微々たるものです。

良い時代になりました。

トップページなどから直接しおりを開くことができるようになりました

f:id:convertical:20150922194901p:plain

PCページだけですが、トップページなどのヘッダーバーから、直接しおりを開くことができるようになりました。

スマホで無効化されているのは、単に画面のサイズに収まりにくかったからです…

なにか良いレイアウトを思いついたら、スマホからも使えるようにしたいと思います。

ビューアーにページ送りのシークバーが付きました

ビューアーにシークバーが付きました。

つまんで動かしてページ移動できます。

f:id:convertical:20150920132136p:plain

縦書きの時は右から左に、横書きの時は左から右に動かします。

ただしIEだと、縦書きの時に変な数字がポップアップします。

どういうことかというと、html5rangeは左がminで右がmaxという仕様で固定化されているので、縦書きの時はこれを逆にするために「逆順の数値」を内部的にセットしているのですが、これがそのままポップ・アップされてしまうんですね。

その他のブラウザだと、こういう数値は表に出てこないのですが…

今のところ、この表示を制御する方法はなさそうなので、なんともかんとも、という感じです。