vivliostyle / vivliostyle-cli

⚒ Supercharge command-line publication workflow.
https://docs.vivliostyle.org/#/vivliostyle-cli
GNU Affero General Public License v3.0
165 stars 25 forks source link

Can't load from Web URL #15

Closed MurakamiShinyu closed 3 years ago

MurakamiShinyu commented 5 years ago

When a web URL is specified to savepdf, it causes "Error: ENOENT: no such file or directory". e.g.

$ savepdf --output Alice.pdf --size A4 https://vivliostyle.github.io/vivliostyle.js/samples/gutenberg/Alice.html
fs.js:114
    throw err;
    ^

Error: ENOENT: no such file or directory, stat '/Users/shinyu/https:/vivliostyle.github.io/vivliostyle.js/samples/gutenberg/Alice.html'
    at Object.statSync (fs.js:850:3)
...
AyumuTakai commented 3 years ago

入力が/^https?:\/\//にマッチする場合にfs.ReadFileSyncでの読み込みではなくnode-fetchによるHTTP通信に切り替えることで 以下のテストケースが通りPDFの生成も成功しました。

    const response = await vivliostyleCLI([
      'build',
      '-s',
      'A4',
      '-o',
      outputPath,
      "https://vivliostyle.github.io/vivliostyle.js/samples/gutenberg/Alice.html",
    ]);

今の実装は関連するメソッドの内部で分岐して部分的な対応をしています。しかし煩雑になるのでentry.typeの種類をhtml,markdownの他にuriのような分類を追加して根本的に処理を分けてしまったほうが良いと思います。

developブランチからの差分は以下の通りです。(テスト用にいろいろなファイルが入ってしまっています) https://github.com/AyumuTakai/vivliostyle-cli/compare/develop...feature/input-url

MurakamiShinyu commented 3 years ago

@spring-raining これはv3.0に入れられないでしょうか?

現状では

$ vivliostyle preview https://vivliostyle.github.io/vivliostyle_doc/ja/vivliostyle-user-group-vol1/

を実行すると次のようにエラーになります:

✖ Error: Cannot find an input format for /Users/shinyu/viv/test/https:/vivliostyle.github.io/vivliostyle_doc/ja/vivliostyle-user-group-vol1
    at Object.detectInputFormat (/Users/shinyu/viv/vivliostyle-cli--develop/dist/input.js:26:11)
    at composeSingleInputConfig (/Users/shinyu/viv/vivliostyle-cli--develop/dist/config.js:271:27)
    at Object.mergeConfig (/Users/shinyu/viv/vivliostyle-cli--develop/dist/config.js:256:17)
    at preview (/Users/shinyu/viv/vivliostyle-cli--develop/dist/commands/preview.js:46:35)
    at Object.<anonymous> (/Users/shinyu/viv/vivliostyle-cli--develop/dist/commands/preview.js:20:5)
    at Module._compile (node:internal/modules/cjs/loader:1108:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1137:10)
    at Module.load (node:internal/modules/cjs/loader:973:32)
    at Function.Module._load (node:internal/modules/cjs/loader:813:14)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:12)

何かローカルのHTMLファイルを指定して vivliostyle preview を起動してから Chromium のアドレスバーの #src= のあとのURLをWebのURLに変えると、正常に組版表示されます(次の図)。なので、WebのURLをサポートするのは簡単なのでないかと思います。

Screen Shot 2021-02-06 at 22 51 42

spring-raining commented 3 years ago

こちらの機能追加はBreaking changeにならないので、v3リリース以降でも良いかと思い優先順位を下げていました。v3.1などで入れられると良さそうです!

MurakamiShinyu commented 3 years ago

v3.0 にぜひほしいと思うのですが、無理でしょうか?

AyumuTakai commented 3 years ago

以前、このIssueを解決できないかと試しに実装をすすめていたのですが、cssやWebフォントを読み込むlink要素が複数あった場合にどうすれば良いのか明確でないなど、限定的な対応にならざるを得ないということで中断していました。

現在は最初に見つかったlink rel="stylesheet"要素をテーマとして扱うということになっていたと思います。

これを解決するには、テーマを使った処理とはまったく別系統の処理に分岐させないと難しいのではないかと考えています。

MurakamiShinyu commented 3 years ago

Markdown+themeの扱いは、当面ローカルのファイルについてだけサポートでよいと思います。

AyumuTakai commented 3 years ago

内部的にconfigやthemeに該当する値が無いとエラーで落ちるという問題が以前はあった(現在はチェックしていませんが)ので、内部的にconfigやthemeをhttp/https用に用意してあげないといけない可能性があります。

もしくは、その前段階からバイパスルートを作るかです。

MurakamiShinyu commented 3 years ago

see https://github.com/vivliostyle/vivliostyle-cli/pull/116

MurakamiShinyu commented 3 years ago

すでに入力がHTMLファイルの場合にはthemeの処理をしないようになっているので問題はないと思います。

AyumuTakai commented 3 years ago

把握しました。 もう少し詳細にソースを見てみます。

AyumuTakai commented 3 years ago

config.tsのcomposeSingleInputConfig関数の処理がローカルファイル専用になってしまっている部分がありますね。

  const sourcePath = path.resolve(cliFlags.input);
  const workspaceDir = path.dirname(sourcePath);

https://vivliostyle.github.io/vivliostyle_doc/ja/vivliostyle-user-group-vol1/ を入力すると、 sourcePath = /Users/takaiayumu/IdeaProjects/vivliostyle-cli/https:/vivliostyle.github.io/vivliostyle_doc/ja/vivliostyle-user-group-vol1 workspaceDir = /Users/takaiayumu/IdeaProjects/vivliostyle-cli/https:/vivliostyle.github.io/vivliostyle_doc/ja になってしまいます。

このあたりを特別扱いしてあげれば良さそうです。試してみます。