项目作者: tategakibunko

项目描述 :
Dynamic html layout engine for paged-media written by Typescript
高级语言: TypeScript
项目地址: git://github.com/tategakibunko/nehan.git
创建时间: 2018-09-22T08:38:21Z
项目社区:https://github.com/tategakibunko/nehan

开源协议:Other

下载


nehan

Introduction

Dynamic html layout engine for paged-media written by Typescript.

Install

  1. npm install nehan

Demo

See Nehan Reader at Chrome Web Store.

Or nehan-player demo

How to use Nehan Reader

  1. Install Nehan Reader.
  2. Goto any site you want to read as paged-media.
  3. Click the browser action button
  4. Then you’ll see paged site.

Example

See example directory.

Usage

simple usage with no styling

  1. import { PagedNehanDocument } from 'nehan';
  2. const $result = document.querySelector("#result");
  3. new PagedNehanDocument("<h1>hello, nehan!</h1>", {}).render({
  4. onPage: (ctx) => {
  5. const evaluatedPage = ctx.caller.getPage(ctx.page.index);
  6. $result.appendChild(evaluatedPage.dom);
  7. $result.appendChild(document.createElement("hr"));
  8. },
  9. onComplete: (ctx) => {
  10. console.log(`finished! ${ctx.time}msec`);
  11. }
  12. });

render with style

  1. import { PagedNehanDocument, CssStyleSheet } from 'nehan';
  2. const $result = document.querySelector("#result");
  3. new PagedNehanDocument("<h1>hello, nehan!</h1>", {
  4. styleSheets:[
  5. new CssStyleSheet({
  6. "body":{
  7. writihgMode:"horizontal-tb", // or "vertical-rl"
  8. fontSize:"16px",
  9. padding: "1em",
  10. measure: "640px", // means 'width' in horizontal-tb, 'height' in vertical-rl.
  11. extent: "480px" // means 'height' in horizontal-tb, 'width' in vertical-rl.
  12. },
  13. "h1":{
  14. marginAfter: "1em", // means 'margin-bottom' in horizontal-tb, 'margin-left' in vertical-rl
  15. paddingStart: "0.5em" // means 'padding-left' in horizontal-tb, 'padding-top' in vertical-rl
  16. }
  17. }
  18. ]
  19. }).render({
  20. onPage: (ctx) => {
  21. const evaluatedPage = ctx.caller.getPage(ctx.page.index);
  22. $result.appendChild(evaluatedPage.dom);
  23. $result.appendChild(document.createElement("hr"));
  24. },
  25. onComplete: (ctx) => {
  26. console.log(`finished! ${ctx.time}msec`);
  27. }
  28. });

About logical size

To handle documents that are independent of the character direction, we use the logical size.

  • measure means the size in the inline direction.
  • extent means the size in the block direction.

logical-size - physical-size table

logical-size\writing-mode horizontal-tb vertical-rl vertical-lr
measure width height height
extent height width width

About logical direction

To handle documents that are independent of the character direction, we use the logical direction.

  • start means inline level heading direction.
  • end means inline level trailing direction.
  • before measn block level heading direction.
  • after means block level trailing direction.

Example1 (logical-margin - physical-margin table)

logical-direction\writing-mode horizontal-tb vertical-rl vertical-lr
margin-start margin-left margin-top margin-top
margin-end margin-right margin-bottom margin-bottom
margin-before margin-top margin-right margin-left
margin-after margin-bottom margin-left margin-right

The same is true for padding and border(border-xxx-width, border-xxx-color, border-xxx-style).

Example2 (logical-border-radius - physical-border-radius table)

logical-direction\writing-mode horizontal-tb vertical-rl vertical-lr
border-before-start-radius border-top-left-radius border-top-right-radius border-top-left-radius
border-before-end-radius border-top-right-radius border-bottom-right-radius border-bottom-left-radius
border-after-end-radius border-bottom-right-radius border-bottom-left-radius border-bottom-right-radius
border-after-start-radius border-bottom-left-radius border-top-left-radius border-top-right-radius

Shothanded logical property

If you set margin like margin:1em 2em 3em 4em, then it means margin-before:1em, margin-end:2em, margin-after:3em, margin-start:4em.

If you set margin like margin:1em 2em 3em, then it means margin-before:1em, margin-end:2em, margin-after:3em, margin-start:2em.

If you set margin like margin:1em 2em, then it means margin-before:1em, margin-end:2em, margin-after:1em, margin-start:2em.

If you set margin like margin:1em, then it means margin-before:1em, margin-end:1em, margin-after:1em, margin-start:1em.

The same is true for padding and border(border-xxx-width, border-xxx-color, border-xxx-style).

Dynamic Style

You can define functional value for each selector(css property name is !xxx).

In following example, all elements that matches .require-xx will cause page-break if rest block size(restExtent) is smaller than xxpx.

  1. import { CssStyleSheet, DynamicStyleContext, CssDeclarationBlock } from 'nehan';
  2. function requiredExtent(requiredSize: number) {
  3. return (ctx: DynamicStyleContext): CssDeclarationBlock | undefined => {
  4. if (!ctx.parentContext) {
  5. return undefined;
  6. }
  7. const restExtent = ctx.parentContext.restExtent;
  8. if (restExtent >= requiredSize) {
  9. return undefined; // enough block size is left!
  10. }
  11. // restExtent < requiredSize(not enough block size left)
  12. return { "page-break-before": "always" };
  13. };
  14. }
  15. const myStyleSheet = new CssStyleSheet({
  16. ".require-60": {
  17. "!dynamic": requiredExtent(60)
  18. }
  19. });

DOM generation hook

You can define dom generation hook for each selector element like this(css property name is @xxx).

  1. import { CssStyleSheet, DomCallbackContext } from 'nehan';
  2. const myStyleSheet = new CssStyleSheet({
  3. ".foo": {
  4. "@create": (ctx: DomCallbackContext) => {
  5. ctx.dom.onclick = (e) => {
  6. alert(`${ctx.selector} is clicked!`); // .foo is clicked!
  7. };
  8. }
  9. }
  10. });

Plugins

Development

npm run build and library is generated in dist directory.

License

MIT