@foxycape/core 1.2.1 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../kernal/EventNames.cjs"),t=require("../../../kernal/common/uuid.cjs"),n=require("../../../kernal/Options.cjs"),r=require("../../../kernal/Theme.cjs"),i=require("../../../kernal/web/scheduler.cjs"),a=require("../../../kernal/html/events.cjs"),o=require("../HtmlOptions.cjs"),s=require("./navigator/HtmlCoreNavigator.cjs"),c=require("./layout/resolveLayoutRoute.cjs"),l=require("./navigator/HtmlPagingNavigator.cjs"),u=require("./navigator/HtmlNavPointNavigator.cjs"),d=require("./navigator/HtmlNavPointProvider.cjs"),f=require("./progress/HtmlProgressTracker.cjs"),p=require("./location/scrollActivity.cjs"),m=require("./documents/HtmlDocumentsProvider.cjs"),h=require("./layout/HtmlRendererLayout.cjs"),g=require("./style/HtmlStyleProvider.cjs"),_=require("./style/HtmlThemeApplier.cjs"),v=require("./documents/HtmlDocumentsResizeObserver.cjs"),y=require("./html/HtmlContentProcessor.cjs"),b=require("./image/HtmlImageLoader.cjs"),x=require("./image/HtmlImageObserver.cjs");var S=class extends m.HtmlDocumentsProvider{constructor(e,r,a,c){super(e,r,a,c),this.isInitRenderer=!1,this.injectProcessHandlers=()=>{this.addDocumentPreprocess(this.preprocessHandler)},this.preprocessHandler=async e=>{await this.contentProcessor.preprocess(e),await this.styleProvider.injectStyles(e);let t=await this.resolveCurrentTheme();t&&await this.themeApplier.applyToDocument(e,t),await this.rendererLayout.applyDocStyles(e),await this.imageLoader.preprocessImages(e);let n=await this.getHighlighter();n&&await n.highlight(e)},this.onPageChange=async()=>{this.progressTracker.notifyProgressChange()},this.onDocumentSizeChange=async()=>{this.owner.context.userChangedProgress||p.isProgrammaticScroll()||p.isUserScrollSettling()||await this.delayRestoreReadingPosition()},this.onOptionsChange=async e=>{let t=this.getRendererContainer();if(!(!t||!t.ownerDocument.defaultView)&&(n.isOptionKey(e)||o.isHtmlOptionKey(e))){let t=o.isHtmlOptionKey(e);if(t){if(!this.owner.context.currentLocation?.precise){let e=await this.progressTracker.getProgress(!0);e&&(this.owner.context.currentLocation=e.location)}this.owner.context.setUserChangedProgress(!1)}if(this.rendererViewport.applyCssVariables(),await i.yieldToMain(),t){for(let e of this.getLoadedDocuments())await this.rendererLayout.applyDocStyles(e);this.owner.context.userChangedProgress||await this.reload()}}},this.progressTracker=new f.HtmlProgressTracker(e,this,c),this.rendererLayout=new h.HtmlRendererLayout(e,this,this.rendererViewport,this.progressTracker,c),this.navPointProvider=new d.HtmlNavPointProvider(this,c),this.navigator=new s.HtmlCoreNavigator(this,c),this.navPointNavigator=new u.HtmlNavPointNavigator(e.locale,e.notifier,this,this.navigator,this.navPointProvider),this.pagingNavigator=new l.HtmlPagingNavigator(this,this.navigator,c),this.styleProvider=new g.HtmlStyleProvider(this),this.currentInstanceId=t.getRandomId(!0),this.themeApplier=new _.HtmlThemeApplier(this),this.documentsResizeObserver=new v.HtmlDocumentsResizeObserver(this,this.rendererViewport,this.progressTracker,this.rendererLayout),this.contentProcessor=new y.HtmlContentProcessor(r),this.imageLoader=this.createImageLoader(),this.imageObserver=new x.HtmlImageObserver(this,c),this.bindEvents(),this.bindScrollWatch(),this.injectProcessHandlers()}get id(){return this.currentInstanceId}createImageLoader(){return new b.HtmlImageLoader(this,this.rendererViewport,this.htmlOptions)}async resolveCurrentTheme(){return(await this.owner.services.get(`themeProvider`))?.getCurrentTheme()??new r.Theme}async getHighlighter(){if(this.htmlOptions.enableFormatCodeBlock){if(!this.languageHighlighter){let{LanguageHighlighter:e}=await Promise.resolve().then(()=>require("./style/LanguageHighlighter.cjs"));this.languageHighlighter=new e(this)}return this.languageHighlighter}}bindEvents(){this.owner.events.on(e.EventNames.OptionsChange,this.onOptionsChange),this.owner.events.on(e.EventNames.PageChange,this.onPageChange),this.owner.events.on(e.EventNames.DocumentSizeChange,this.onDocumentSizeChange)}unbindEvents(){this.owner.events.off(e.EventNames.OptionsChange,this.onOptionsChange),this.owner.events.off(e.EventNames.PageChange,this.onPageChange),this.owner.events.off(e.EventNames.DocumentSizeChange,this.onDocumentSizeChange)}bindScrollWatch(){let t=this.owner.getHostViewport();this.scrollWatchTarget=t.mode==`window`?t.scrollWatchTarget:this.getScrollElement(),this.scrollWatchTarget&&(this.scrollWatchState=a.watchScroll(this.scrollWatchTarget,this.owner.options.calcScrollDirection,async(t,n)=>{this.owner.events.emit(e.EventNames.ReaderDebounceScroll,t,n),this.progressTracker.notifyProgressChange()},t=>{p.isProgrammaticScroll()||!t.isTrusted||(this.owner.onProgressChangeGuard&&this.owner.context?.progress?.current&&(this.owner.onProgressChangeGuard(this.owner.context.progress.current)||t.preventDefault()),p.markUserScroll(),p.releaseAbsoluteLocate(),this.owner.events.emit(e.EventNames.ReaderOriginalScroll,t))}))}async load(e,t){e||=this.owner.context.progress?.location,this.isInitRenderer||(this.isInitRenderer=!0,this.documentsResizeObserver.register(),this.imageObserver.register()),await super.load(e,t)}getFileParser(){return this.fileParser}get writingMode(){return this.htmlOptions.writingMode??`horizontal-tb`}get direction(){return c.resolveHtmlTextDirection(this.htmlOptions)}get layout(){return this.rendererLayout}async applyTheme(e){await this.themeApplier.applyTheme(e);let t=await this.getHighlighter();t&&await t.applyTheme(e)}async dispose(){this.unbindEvents();let e=this.scrollWatchTarget??this.getScrollElement();e&&this.scrollWatchState?._eventHandler&&(e.removeEventListener(`scroll`,this.scrollWatchState._eventHandler,!0),this.scrollWatchState=void 0,this.scrollWatchTarget=void 0),await this.progressTracker.dispose(),await this.imageObserver.dispose(),await this.imageLoader.dispose(),await super.dispose(),await this.styleProvider?.dispose(),await this.languageHighlighter?.dispose(),this.languageHighlighter=void 0,await this.navPointProvider?.dispose(),await this.pagingNavigator?.dispose(),await this.documentsResizeObserver.dispose(),await this.contentProcessor.dispose()}};exports.HtmlRenderer=S;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../kernal/EventNames.cjs"),t=require("../../../kernal/common/uuid.cjs"),n=require("../../../kernal/Options.cjs"),r=require("../../../kernal/Theme.cjs"),i=require("../../../kernal/web/scheduler.cjs"),a=require("../../../kernal/html/events.cjs"),o=require("../HtmlOptions.cjs"),s=require("./navigator/HtmlCoreNavigator.cjs"),c=require("./layout/resolveLayoutRoute.cjs"),l=require("./navigator/HtmlPagingNavigator.cjs"),u=require("./navigator/HtmlNavPointNavigator.cjs"),d=require("./navigator/HtmlNavPointProvider.cjs"),f=require("./progress/HtmlProgressTracker.cjs"),p=require("./location/scrollActivity.cjs"),m=require("./documents/HtmlDocumentsProvider.cjs"),h=require("./layout/HtmlRendererLayout.cjs"),g=require("./style/HtmlStyleProvider.cjs"),_=require("./style/HtmlThemeApplier.cjs"),v=require("./documents/HtmlDocumentsResizeObserver.cjs"),y=require("./html/HtmlContentProcessor.cjs"),b=require("./image/HtmlImageLoader.cjs"),x=require("./image/HtmlImageObserver.cjs");var S=class extends m.HtmlDocumentsProvider{constructor(e,r,a,c){super(e,r,a,c),this.isInitRenderer=!1,this.injectProcessHandlers=()=>{this.addDocumentPreprocess(this.preprocessHandler)},this.preprocessHandler=async e=>{await this.contentProcessor.preprocess(e),await this.styleProvider.injectStyles(e);let t=await this.resolveCurrentTheme();t&&await this.themeApplier.applyToDocument(e,t),await this.rendererLayout.applyDocStyles(e),await this.imageLoader.preprocessImages(e);let n=await this.getHighlighter();n&&await n.highlight(e)},this.onPageChange=async()=>{this.progressTracker.notifyProgressChange()},this.onDocumentSizeChange=async()=>{this.owner.context.userChangedProgress||p.isProgrammaticScroll()||p.isUserScrollSettling()||await this.delayRestoreReadingPosition()},this.onOptionsChange=async e=>{let t=this.getRendererContainer();if(!(!t||!t.ownerDocument.defaultView)&&(n.isOptionKey(e)||o.isHtmlOptionKey(e))){let t=o.isHtmlOptionKey(e);if(t){if(!this.owner.context.currentLocation?.precise){let e=await this.progressTracker.getProgress(!0);e&&(this.owner.context.currentLocation=e.location)}this.owner.context.setUserChangedProgress(!1)}if(this.rendererViewport.applyCssVariables(),await i.yieldToMain(),t){for(let e of this.getLoadedDocuments())await this.rendererLayout.applyDocStyles(e);this.owner.context.userChangedProgress||await this.reload()}}},this.progressTracker=new f.HtmlProgressTracker(e,this,c),this.rendererLayout=new h.HtmlRendererLayout(e,this,this.rendererViewport,this.progressTracker,c),this.navPointProvider=new d.HtmlNavPointProvider(this,c),this.navigator=new s.HtmlCoreNavigator(this,c),this.navPointNavigator=new u.HtmlNavPointNavigator(e.locale,e.notifier,this,this.navigator,this.navPointProvider),this.pagingNavigator=new l.HtmlPagingNavigator(this,this.navigator,c),this.styleProvider=new g.HtmlStyleProvider(this),this.currentInstanceId=t.getRandomId(!0),this.themeApplier=new _.HtmlThemeApplier(this),this.documentsResizeObserver=new v.HtmlDocumentsResizeObserver(this,this.rendererViewport,this.progressTracker,this.rendererLayout),this.contentProcessor=new y.HtmlContentProcessor(r),this.imageLoader=this.createImageLoader(),this.imageObserver=new x.HtmlImageObserver(this,c),this.bindEvents(),this.bindScrollWatch(),this.injectProcessHandlers()}get id(){return this.currentInstanceId}createImageLoader(){return new b.HtmlImageLoader(this,this.rendererViewport,this.htmlOptions)}async resolveCurrentTheme(){return(await this.owner.services.get(`themeProvider`))?.getCurrentTheme()??new r.Theme}async getHighlighter(){}bindEvents(){this.owner.events.on(e.EventNames.OptionsChange,this.onOptionsChange),this.owner.events.on(e.EventNames.PageChange,this.onPageChange),this.owner.events.on(e.EventNames.DocumentSizeChange,this.onDocumentSizeChange)}unbindEvents(){this.owner.events.off(e.EventNames.OptionsChange,this.onOptionsChange),this.owner.events.off(e.EventNames.PageChange,this.onPageChange),this.owner.events.off(e.EventNames.DocumentSizeChange,this.onDocumentSizeChange)}bindScrollWatch(){let t=this.owner.getHostViewport();this.scrollWatchTarget=t.mode==`window`?t.scrollWatchTarget:this.getScrollElement(),this.scrollWatchTarget&&(this.scrollWatchState=a.watchScroll(this.scrollWatchTarget,this.owner.options.calcScrollDirection,async(t,n)=>{this.owner.events.emit(e.EventNames.ReaderDebounceScroll,t,n),this.progressTracker.notifyProgressChange()},t=>{p.isProgrammaticScroll()||!t.isTrusted||(this.owner.onProgressChangeGuard&&this.owner.context?.progress?.current&&(this.owner.onProgressChangeGuard(this.owner.context.progress.current)||t.preventDefault()),p.markUserScroll(),p.releaseAbsoluteLocate(),this.owner.events.emit(e.EventNames.ReaderOriginalScroll,t))}))}async load(e,t){e||=this.owner.context.progress?.location,this.isInitRenderer||(this.isInitRenderer=!0,this.documentsResizeObserver.register(),this.imageObserver.register()),await super.load(e,t)}getFileParser(){return this.fileParser}get writingMode(){return this.htmlOptions.writingMode??`horizontal-tb`}get direction(){return c.resolveHtmlTextDirection(this.htmlOptions)}get layout(){return this.rendererLayout}async applyTheme(e){await this.themeApplier.applyTheme(e);let t=await this.getHighlighter();t&&await t.applyTheme(e)}async dispose(){this.unbindEvents();let e=this.scrollWatchTarget??this.getScrollElement();e&&this.scrollWatchState?._eventHandler&&(e.removeEventListener(`scroll`,this.scrollWatchState._eventHandler,!0),this.scrollWatchState=void 0,this.scrollWatchTarget=void 0),await this.progressTracker.dispose(),await this.imageObserver.dispose(),await this.imageLoader.dispose(),await super.dispose(),await this.styleProvider?.dispose(),await this.navPointProvider?.dispose(),await this.pagingNavigator?.dispose(),await this.documentsResizeObserver.dispose(),await this.contentProcessor.dispose()}};exports.HtmlRenderer=S;
@@ -6,6 +6,7 @@ import { HtmlOptions } from '../HtmlOptions';
6
6
  import { IHtmlProgressTracker } from './progress/IHtmlIProgressTracker';
7
7
  import { IHtmlRendererLayout } from './layout/IHtmlRendererLayout';
8
8
  import { IHtmlDocument } from './IHtmlDocument';
9
+ import { ILanguageHighlighter } from './style/ILanguageHighlighter';
9
10
  import { IHtmlImageLoader } from './image/IHtmlImageLoader';
10
11
 
11
12
  export declare class HtmlRenderer extends HtmlDocumentsProvider implements IHtmlRenderer {
@@ -31,8 +32,7 @@ export declare class HtmlRenderer extends HtmlDocumentsProvider implements IHtml
31
32
  private injectProcessHandlers;
32
33
  private resolveCurrentTheme;
33
34
  protected preprocessHandler: (doc: IHtmlDocument) => Promise<void>;
34
- private languageHighlighter?;
35
- private getHighlighter;
35
+ protected getHighlighter(): Promise<ILanguageHighlighter | undefined>;
36
36
  protected bindEvents(): void;
37
37
  protected unbindEvents(): void;
38
38
  private bindScrollWatch;
@@ -62,15 +62,7 @@ var T = class extends _ {
62
62
  async resolveCurrentTheme() {
63
63
  return (await this.owner.services.get("themeProvider"))?.getCurrentTheme() ?? new r();
64
64
  }
65
- async getHighlighter() {
66
- if (this.htmlOptions.enableFormatCodeBlock) {
67
- if (!this.languageHighlighter) {
68
- let { LanguageHighlighter: e } = await import("./style/LanguageHighlighter.mjs");
69
- this.languageHighlighter = new e(this);
70
- }
71
- return this.languageHighlighter;
72
- }
73
- }
65
+ async getHighlighter() {}
74
66
  bindEvents() {
75
67
  this.owner.events.on(e.OptionsChange, this.onOptionsChange), this.owner.events.on(e.PageChange, this.onPageChange), this.owner.events.on(e.DocumentSizeChange, this.onDocumentSizeChange);
76
68
  }
@@ -108,7 +100,7 @@ var T = class extends _ {
108
100
  async dispose() {
109
101
  this.unbindEvents();
110
102
  let e = this.scrollWatchTarget ?? this.getScrollElement();
111
- e && this.scrollWatchState?._eventHandler && (e.removeEventListener("scroll", this.scrollWatchState._eventHandler, !0), this.scrollWatchState = void 0, this.scrollWatchTarget = void 0), await this.progressTracker.dispose(), await this.imageObserver.dispose(), await this.imageLoader.dispose(), await super.dispose(), await this.styleProvider?.dispose(), await this.languageHighlighter?.dispose(), this.languageHighlighter = void 0, await this.navPointProvider?.dispose(), await this.pagingNavigator?.dispose(), await this.documentsResizeObserver.dispose(), await this.contentProcessor.dispose();
103
+ e && this.scrollWatchState?._eventHandler && (e.removeEventListener("scroll", this.scrollWatchState._eventHandler, !0), this.scrollWatchState = void 0, this.scrollWatchTarget = void 0), await this.progressTracker.dispose(), await this.imageObserver.dispose(), await this.imageLoader.dispose(), await super.dispose(), await this.styleProvider?.dispose(), await this.navPointProvider?.dispose(), await this.pagingNavigator?.dispose(), await this.documentsResizeObserver.dispose(), await this.contentProcessor.dispose();
112
104
  }
113
105
  };
114
106
  //#endregion
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../../kernal/html/injector.cjs"),t=require("../../../../kernal/html/realm.cjs"),n=require("../../HtmlSettings.cjs"),r=require("./ViewportCssVariableNames.cjs"),i=require("./resolveLayoutRoute.cjs"),a=require("./HtmlLayoutMetrics.cjs"),o=require("../documents/HtmlContainerBuilder.cjs"),s=require("./applyLayoutClasses.cjs"),c=require("./resolveContentWrapperMinWidth.cjs");var l=class{constructor(t,r,i,a){this.owner=t,this.readerContainer=r,this.getColumnWidth=()=>this.htmlOptions.maxColumnWidth?Math.abs(this.htmlOptions.maxColumnWidth):768,this.options=this.owner.options,this.device=this.owner.device,this.optionsProvider=i,this.htmlOptions=a,this.containerBuilder=new o.HtmlContainerBuilder(a);let{rendererContainer:s,rendererCss:c,otherCss:l}=this.containerBuilder.createContainers();e.injectCssContent(this.readerContainer.ownerDocument,c+l,!0,`html-renderer-style`),this.readerContainer.appendChild(s),this.rendererContainer=s,this.scrollElement=this.rendererContainer,this.contentsShadowContainer=this.rendererContainer.querySelector(`.`+n.HtmlSettings.ContentsShadowContainerCssName),this.rendererContainer.setAttribute(n.HtmlSettings.HostViewportModeAttribute,this.owner.getHostViewport().mode)}getRendererContainer(){return this.rendererContainer}getScrollElement(){let e=this.owner.getHostViewport();return e.mode==`window`?e.scrollElement:this.rendererContainer}getLayoutMetrics(){return this.layout||=(this.internlApplyCssVariables(),this.buildLayoutMetrics()),this.layout}applyCssVariables(){this.internlApplyCssVariables(),this.layout=this.buildLayoutMetrics()}internlApplyCssVariables(){this.owner.refreshHostViewport();let e=i.getLayoutGeometry(this.htmlOptions),t=this.getScrollElement(),n=e.flipMode==`scroll`&&t?{left:t.scrollLeft,top:t.scrollTop}:void 0;this.applyFlowClasses(e),this.syncPageTransformSign(e);let a=this.prepareRendererCssVariables(),o=this.prepareOtherCssVariables(),s=new Map;a.forEach((e,t)=>{s.set(t,e)}),o.forEach((e,t)=>{s.set(t,e)});let c=this.owner.getRootContainer();c.style.setProperty(`direction`,`var(${r.ViewportCssVariableNames.ReaderViewportDirection})`),s.forEach((e,t)=>{c.style.setProperty(t,e)}),n&&t&&t.scrollTo(n.left,n.top)}syncPageTransformSign(e){let r=this.rendererContainer.querySelector(`.`+n.HtmlSettings.TransformContainerCssName);if(!t.isHtmlElement(r))return;if(e.flipMode!=`page`){r.style.removeProperty(`transition`),r.style.removeProperty(`transform`),r.removeAttribute(`data-target-transform`);return}if(r.hasAttribute(n.HtmlSettings.PageMovingAttributeName))return;let i=r.getAttribute(`data-target-transform`);if(i==null||i===``)return;let a=parseFloat(i);Number.isFinite(a)&&(r.style.removeProperty(`transition`),r.style.transform=e.getPageTranslateCss(a))}prepareRendererCssVariables(){let e=i.getLayoutGeometry(this.htmlOptions),t=e.flipMode;this.rendererContainer.setAttribute(n.HtmlSettings.HostViewportModeAttribute,this.owner.getHostViewport().mode);let a=new Map,o=e.viewport.zeroWrapperMargins?0:this.htmlOptions.contentWrapperMarginBottom??10,s=e.viewport.zeroWrapperMargins?0:this.htmlOptions.contentWrapperMarginTop??10,c=e.viewport.zeroWrapperMargins?0:this.htmlOptions.contentWrapperGap??10;a.set(r.ViewportCssVariableNames.ContentWrapperMarginTop,s+`px`),a.set(r.ViewportCssVariableNames.ContentWrapperMarginBottom,o+`px`),a.set(r.ViewportCssVariableNames.ContentWrapperGap,c+`px`);let l=this.htmlOptions.enableContentWrapperBorderRadius&&t==`scroll`?this.htmlOptions.contentWrapperBorderRadius??0:0;a.set(r.ViewportCssVariableNames.ContentWrapperBorderRadius,l+`px`);let u=this.owner.getHostViewport().mode==`window`&&t==`scroll`;return a.set(r.ViewportCssVariableNames.ScrollElementOverflow,u?`visible`:e.overflowY),a.set(r.ViewportCssVariableNames.ScrollElementOverflowX,u?`visible`:e.overflowX),a.set(r.ViewportCssVariableNames.ReaderViewportDirection,e.direction==`ltr`?`unset`:e.direction),a}applyFlowClasses(e){s.applyRootDirectionClass(this.owner.getRootContainer(),e),s.applyRendererLayoutClass(this.rendererContainer,e)}prepareOtherCssVariables(){let e=this.owner.getRootContainer(),t=i.getLayoutGeometry(this.htmlOptions),n=t.flipMode;n==`page`&&this.scrollElement?.scrollTo(0,0);let a=this.htmlOptions.columnGap??40,o=this.contentsShadowContainer,s=this.rendererContainer.clientWidth||this.owner.getHostViewport().width,l=this.getViewportHeight();this.rendererContainer.setAttribute(`data-client-width`,`${s}`),this.rendererContainer.setAttribute(`data-client-height`,`${l}`);let u=this.getContentsContainerWidth(),d=t.viewport.contentsContainerWidthMode==`max-content`?`max-content`:u+`px`,f=this.rendererContainer.offsetWidth-this.rendererContainer.clientWidth,p=this.rendererContainer.offsetHeight-this.rendererContainer.clientHeight,m=new Map;m.set(r.ViewportCssVariableNames.ScrollElementVerticalScrollBarWidth,f+`px`),m.set(r.ViewportCssVariableNames.ScrollElementHorizontalScrollBarHeight,p+`px`),m.set(r.ViewportCssVariableNames.ReaderViewportWidth,s+`px`),m.set(r.ViewportCssVariableNames.ReaderViewportHeight,l+`px`),e.style.setProperty(r.ViewportCssVariableNames.ContentsContainerWidth,d),m.set(r.ViewportCssVariableNames.ContentsContainerWidth,d);let h=0;n==`page`&&(h=0),s-u-2<2*h&&(h=0);let g=``;g=h>0?``+h+`px 0`:`0`,e.style.setProperty(r.ViewportCssVariableNames.ContentsContainerPadding,g),m.set(r.ViewportCssVariableNames.ContentsContainerPadding,g);let _=t.viewport.forceSingleColumn?1:this.calculateColumns(u);t.viewport.forceSingleColumn||(this.htmlOptions.columns=_);let{marginInline:v,marginBlock:y}=this.getContentsShadowMargin(u),{columnWidth:b}=this.getFinalColumnWidth(u-v*2,_,a),x=v,S=y;n==`scroll`&&(x=0,S=0),o.style=n==`scroll`?`margin: ${S}px ${x}px;`:`margin: ${S}px ${x}px;height: ${l-2*y}px;`;let C=o.getBoundingClientRect().width,w=_*b+Math.max(0,_-1)*a,{contentWrapperPaddingBottomNumber:T,contentWrapperPaddingTopNumber:E,contentWrapperPadding:D,contentWrapperPaddingTopBottom:O}=this.getContentWrapperPadding(u,a),k=l-E-T,A=t.getPageMoveLength(w,k,a);this.rendererContainer.setAttribute(`data-transform-length`,A.toString()),this.rendererContainer.setAttribute(`data-shadow-width`,C.toString()),this.rendererContainer.setAttribute(`data-column-width`,b.toString()),this.rendererContainer.setAttribute(`data-column-gap`,a.toString()),this.rendererContainer.setAttribute(`data-page-width`,`${w}`),this.rendererContainer.setAttribute(`data-page-height`,`${k}`),m.set(r.ViewportCssVariableNames.ContentWrapperWidth,t.viewport.contentWrapperWidthMode==`auto`?`auto`:C+`px`),m.set(r.ViewportCssVariableNames.ContentWrapperMinWidth,c.resolveContentWrapperMinWidth(t.viewport.contentWrapperMinWidthMode,{shadowWidth:C,columnWidth:b,columnGap:a,viewportWidth:s})),m.set(r.ViewportCssVariableNames.ContentWrapperHeight,this.getContentWrapperHeight()),m.set(r.ViewportCssVariableNames.ContentWrapperMinHeight,l+`px`),m.set(r.ViewportCssVariableNames.ContentWrapperMaxHeight,t.viewport.contentWrapperMaxHeightMode==`none`?`none`:l+`px`),m.set(r.ViewportCssVariableNames.ContentWrapperPadding,D),t.viewport.contentContainerWidthMode==`auto`?m.set(r.ViewportCssVariableNames.ContentContainerWidth,`auto`):t.viewport.contentContainerWidthMode==`column`?m.set(r.ViewportCssVariableNames.ContentContainerWidth,b+`px`):m.set(r.ViewportCssVariableNames.ContentContainerWidth,`100%`);let j=t.viewport.contentContainerHeightMode==`page`?k+`px`:`calc(var(${r.ViewportCssVariableNames.ContentWrapperHeight}) - ${O})`;return m.set(r.ViewportCssVariableNames.ContentContainerHeight,j),m.set(r.ViewportCssVariableNames.ContentColumnGap,a+`px`),m}buildLayoutMetrics(){let e=this.getFlipMode(),t=new a.HtmlLayoutMetrics,n=this.rendererContainer,{clientWidth:r}=n,i=parseFloat(n.getAttribute(`data-transform-length`));t.clientWidth=r||this.owner.getHostViewport().width;let o;return o=e==`scroll`?this.getViewportHeight():parseFloat(n.getAttribute(`data-page-height`)),t.clientHeight=this.getViewportHeight(),t.pageHeight=o,t.columnHeight=o,t.columnGap=parseFloat(n.getAttribute(`data-column-gap`)),t.columnWidth=parseFloat(n.getAttribute(`data-column-width`)),t.pageWidth=parseFloat(n.getAttribute(`data-page-width`)),t.pageMoveLength=i,t.shadowWidth=parseFloat(n.getAttribute(`data-shadow-width`)),t}getContentWrapperHeight(){let e=i.getLayoutGeometry(this.htmlOptions);return e.viewport.contentWrapperHeightMode==`auto`?`auto`:e.viewport.contentWrapperHeightMode==`viewport`?`${this.getViewportHeight()}px`:this.owner.inIframe?`100%`:`auto`}getContentsShadowMargin(e){let t=this.htmlOptions.contentsShadowMargin??20,n=this.getContentPaddingFactor(),r=this.device.getDeviceType()==`mobile`?Math.round(t*.6):t;return{marginBlock:r,marginInline:r+Math.min(10,e*n)}}getContentWrapperPadding(e,t){let n=this.getFlipMode(),r=n==`scroll`?30:0,{marginBlock:i,marginInline:a}=this.getContentsShadowMargin(e);n==`page`&&(r+=i);let o=r+`px`,s=n==`scroll`?30:0;n==`page`&&(s+=i);let c=s+`px`;return{contentWrapperPaddingTop:o,contentWrapperPaddingLeft:n==`scroll`?`${a}px`:`0`,contentWrapperPaddingRight:n==`scroll`?`${a}px`:`0`,contentWrapperPaddingBottom:c,contentWrapperPaddingLeftRight:n==`scroll`?`${t}px`:`0`,contentWrapperPaddingTopBottom:`${r+s}px`,contentWrapperPadding:n==`scroll`?`${r}px ${a}px ${s}px ${a}px`:`0px`,contentWrapperPaddingTopNumber:r,contentWrapperPaddingBottomNumber:s}}getContentsContainerWidth(){let{width:e}=this.rendererContainer.getBoundingClientRect(),t=e;if(this.device.getDeviceType()==`mobile`&&t<=768)return t;if(this.getFlipMode()==`scroll`)return this.htmlOptions.enableAutoFitPageWidth?t:this.htmlOptions.maxScrollContentWidth?Math.min(t,Math.abs(this.htmlOptions.maxScrollContentWidth)):Math.min(t,this.htmlOptions.columnWidth);let n=this.htmlOptions.columns,r=this.getColumnWidth();if(this.htmlOptions.autoColumns){if(!this.htmlOptions.maxColumns)return t;n=t<=r?1:this.htmlOptions.maxColumns}let i=this.getMultiColumnWidthFactor();return n>1?Math.min(t,n*r*i):Math.min(t,r)}calculateColumns(e){let t=this.htmlOptions.columns??1,n=this.getColumnWidth();if(this.htmlOptions.autoColumns){if(e<=n)t=1;else{t=Math.floor(e/n);let r=e%n;(r>n/5||r>t*50)&&(t+=1),this.htmlOptions.maxColumns&&t>this.htmlOptions.maxColumns&&(t=this.htmlOptions.maxColumns)}}return t}getFinalColumnWidth(e,t,n){let r=n*(t-1),i=(e-r)/t,a=0,o=Math.round(i);return o!=i&&(i=o,a=e-(t*o+r)),{columnWidth:i,remainder:a}}getContentPaddingFactor(){return this.device.getDeviceType()==`mobile`?.01:.05}getMultiColumnWidthFactor(){let e=this.htmlOptions.multiColumnWidthFactor;return e||=.8,e=Math.abs(e),e<.5&&(e=.5),e>1&&(e=1),e}getViewportHeight(){let e=this.owner.getHostViewport();if(e.mode==`host`){let e=this.rendererContainer.clientHeight;if(e>=80&&e<33554400)return Math.round(e)}return e.height}getFlipMode(){return i.getLayoutGeometry(this.htmlOptions).flipMode}async dispose(){this.updateCssVariablesTimeoutId&&=(clearTimeout(this.updateCssVariablesTimeoutId),null)}};exports.HtmlRendererViewport=l;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../../kernal/html/injector.cjs"),t=require("../../../../kernal/html/realm.cjs"),n=require("../../HtmlSettings.cjs"),r=require("./ViewportCssVariableNames.cjs"),i=require("./resolveLayoutRoute.cjs"),a=require("./HtmlLayoutMetrics.cjs"),o=require("../documents/HtmlContainerBuilder.cjs"),s=require("./applyLayoutClasses.cjs"),c=require("./resolveContentWrapperMinWidth.cjs");var l=class{constructor(t,r,i,a){this.owner=t,this.readerContainer=r,this.getColumnWidth=()=>this.htmlOptions.maxColumnWidth?Math.abs(this.htmlOptions.maxColumnWidth):768,this.options=this.owner.options,this.device=this.owner.device,this.optionsProvider=i,this.htmlOptions=a,this.containerBuilder=new o.HtmlContainerBuilder(a);let{rendererContainer:s,rendererCss:c,otherCss:l}=this.containerBuilder.createContainers();e.injectCssContent(this.readerContainer.ownerDocument,c+l,!0,`html-renderer-style`),this.readerContainer.appendChild(s),this.rendererContainer=s,this.scrollElement=this.rendererContainer,this.contentsShadowContainer=this.rendererContainer.querySelector(`.`+n.HtmlSettings.ContentsShadowContainerCssName),this.rendererContainer.setAttribute(n.HtmlSettings.HostViewportModeAttribute,this.owner.getHostViewport().mode)}getRendererContainer(){return this.rendererContainer}getScrollElement(){let e=this.owner.getHostViewport();return e.mode==`window`?e.scrollElement:this.rendererContainer}getLayoutMetrics(){return this.layout||=(this.internlApplyCssVariables(),this.buildLayoutMetrics()),this.layout}applyCssVariables(){this.internlApplyCssVariables(),this.layout=this.buildLayoutMetrics()}internlApplyCssVariables(){this.owner.refreshHostViewport();let e=i.getLayoutGeometry(this.htmlOptions),t=this.getScrollElement(),n=e.flipMode==`scroll`&&t?{left:t.scrollLeft,top:t.scrollTop}:void 0;this.applyFlowClasses(e),this.syncPageTransformSign(e);let a=this.prepareRendererCssVariables(),o=this.prepareOtherCssVariables(),s=new Map;a.forEach((e,t)=>{s.set(t,e)}),o.forEach((e,t)=>{s.set(t,e)});let c=this.owner.getRootContainer();c.style.setProperty(`direction`,`var(${r.ViewportCssVariableNames.ReaderViewportDirection})`),s.forEach((e,t)=>{c.style.setProperty(t,e)}),n&&t&&t.scrollTo(n.left,n.top)}syncPageTransformSign(e){let r=this.rendererContainer.querySelector(`.`+n.HtmlSettings.TransformContainerCssName);if(!t.isHtmlElement(r))return;if(e.flipMode!=`page`){r.style.removeProperty(`transition`),r.style.removeProperty(`transform`),r.removeAttribute(`data-target-transform`);return}if(r.hasAttribute(n.HtmlSettings.PageMovingAttributeName))return;let i=r.getAttribute(`data-target-transform`);if(i==null||i===``)return;let a=parseFloat(i);Number.isFinite(a)&&(r.style.removeProperty(`transition`),r.style.transform=e.getPageTranslateCss(a))}prepareRendererCssVariables(){let e=i.getLayoutGeometry(this.htmlOptions),t=e.flipMode;this.rendererContainer.setAttribute(n.HtmlSettings.HostViewportModeAttribute,this.owner.getHostViewport().mode);let a=new Map,o=e.viewport.zeroWrapperMargins?0:this.htmlOptions.contentWrapperMarginBottom??10,s=e.viewport.zeroWrapperMargins?0:this.htmlOptions.contentWrapperMarginTop??10,c=e.viewport.zeroWrapperMargins?0:this.htmlOptions.contentWrapperGap??10;a.set(r.ViewportCssVariableNames.ContentWrapperMarginTop,s+`px`),a.set(r.ViewportCssVariableNames.ContentWrapperMarginBottom,o+`px`),a.set(r.ViewportCssVariableNames.ContentWrapperGap,c+`px`);let l=this.htmlOptions.enableContentWrapperBorderRadius&&t==`scroll`?this.htmlOptions.contentWrapperBorderRadius??0:0;a.set(r.ViewportCssVariableNames.ContentWrapperBorderRadius,l+`px`);let u=this.owner.getHostViewport().mode==`window`&&t==`scroll`;return a.set(r.ViewportCssVariableNames.ScrollElementOverflow,u?`visible`:e.overflowY),a.set(r.ViewportCssVariableNames.ScrollElementOverflowX,u?`visible`:e.overflowX),a.set(r.ViewportCssVariableNames.ReaderViewportDirection,e.direction==`ltr`?`unset`:e.direction),a}applyFlowClasses(e){s.applyRootDirectionClass(this.owner.getRootContainer(),e),s.applyRendererLayoutClass(this.rendererContainer,e)}prepareOtherCssVariables(){let e=this.owner.getRootContainer(),t=i.getLayoutGeometry(this.htmlOptions),n=t.flipMode;n==`page`&&this.scrollElement?.scrollTo(0,0);let a=this.htmlOptions.columnGap??40,o=this.contentsShadowContainer,s=this.rendererContainer.clientWidth||this.owner.getHostViewport().width,l=this.getViewportHeight();this.rendererContainer.setAttribute(`data-client-width`,`${s}`),this.rendererContainer.setAttribute(`data-client-height`,`${l}`);let u=this.getContentsContainerWidth(),d=t.viewport.contentsContainerWidthMode==`max-content`?`max-content`:u+`px`,f=this.rendererContainer.offsetWidth-this.rendererContainer.clientWidth,p=this.rendererContainer.offsetHeight-this.rendererContainer.clientHeight,m=new Map;m.set(r.ViewportCssVariableNames.ScrollElementVerticalScrollBarWidth,f+`px`),m.set(r.ViewportCssVariableNames.ScrollElementHorizontalScrollBarHeight,p+`px`),m.set(r.ViewportCssVariableNames.ReaderViewportWidth,s+`px`),m.set(r.ViewportCssVariableNames.ReaderViewportHeight,l+`px`),e.style.setProperty(r.ViewportCssVariableNames.ContentsContainerWidth,d),m.set(r.ViewportCssVariableNames.ContentsContainerWidth,d);let h=0;n==`page`&&(h=0),s-u-2<2*h&&(h=0);let g=``;g=h>0?``+h+`px 0`:`0`,e.style.setProperty(r.ViewportCssVariableNames.ContentsContainerPadding,g),m.set(r.ViewportCssVariableNames.ContentsContainerPadding,g);let _=t.viewport.forceSingleColumn?1:this.calculateColumns(u);t.viewport.forceSingleColumn||(this.htmlOptions.columns=_);let{marginInline:v,marginBlock:y}=this.getContentsShadowMargin(u),{columnWidth:b}=this.getFinalColumnWidth(u-v*2,_,a),x=v,S=y;n==`scroll`&&(x=0,S=0),o.style=n==`scroll`?`margin: ${S}px ${x}px;`:`margin: ${S}px ${x}px;height: ${l-2*y}px;`;let C=o.getBoundingClientRect().width,w=_*b+Math.max(0,_-1)*a,{contentWrapperPaddingBottomNumber:T,contentWrapperPaddingTopNumber:E,contentWrapperPadding:D,contentWrapperPaddingTopBottom:O}=this.getContentWrapperPadding(u,a),k=l-E-T,A=t.getPageMoveLength(w,k,a);this.rendererContainer.setAttribute(`data-transform-length`,A.toString()),this.rendererContainer.setAttribute(`data-shadow-width`,C.toString()),this.rendererContainer.setAttribute(`data-column-width`,b.toString()),this.rendererContainer.setAttribute(`data-column-gap`,a.toString()),this.rendererContainer.setAttribute(`data-page-width`,`${w}`),this.rendererContainer.setAttribute(`data-page-height`,`${k}`),m.set(r.ViewportCssVariableNames.ContentWrapperWidth,t.viewport.contentWrapperWidthMode==`auto`?`auto`:C+`px`),m.set(r.ViewportCssVariableNames.ContentWrapperMinWidth,c.resolveContentWrapperMinWidth(t.viewport.contentWrapperMinWidthMode,{shadowWidth:C,columnWidth:b,columnGap:a,viewportWidth:s})),m.set(r.ViewportCssVariableNames.ContentWrapperHeight,this.getContentWrapperHeight()),m.set(r.ViewportCssVariableNames.ContentWrapperMinHeight,l+`px`),m.set(r.ViewportCssVariableNames.ContentWrapperMaxHeight,t.viewport.contentWrapperMaxHeightMode==`none`?`none`:l+`px`),m.set(r.ViewportCssVariableNames.ContentWrapperPadding,D),t.viewport.contentContainerWidthMode==`auto`?m.set(r.ViewportCssVariableNames.ContentContainerWidth,`auto`):t.viewport.contentContainerWidthMode==`column`?m.set(r.ViewportCssVariableNames.ContentContainerWidth,b+`px`):m.set(r.ViewportCssVariableNames.ContentContainerWidth,`100%`);let j=t.viewport.contentContainerHeightMode==`page`?k+`px`:`calc(var(${r.ViewportCssVariableNames.ContentWrapperHeight}) - ${O})`;return m.set(r.ViewportCssVariableNames.ContentContainerHeight,j),m.set(r.ViewportCssVariableNames.ContentColumnGap,a+`px`),m}buildLayoutMetrics(){let e=this.getFlipMode(),t=new a.HtmlLayoutMetrics,n=this.rendererContainer,{clientWidth:r}=n,i=parseFloat(n.getAttribute(`data-transform-length`));t.clientWidth=r||this.owner.getHostViewport().width;let o;return o=e==`scroll`?this.getViewportHeight():parseFloat(n.getAttribute(`data-page-height`)),t.clientHeight=this.getViewportHeight(),t.pageHeight=o,t.columnHeight=o,t.columnGap=parseFloat(n.getAttribute(`data-column-gap`)),t.columnWidth=parseFloat(n.getAttribute(`data-column-width`)),t.pageWidth=parseFloat(n.getAttribute(`data-page-width`)),t.pageMoveLength=i,t.shadowWidth=parseFloat(n.getAttribute(`data-shadow-width`)),t}getContentWrapperHeight(){let e=i.getLayoutGeometry(this.htmlOptions);return e.viewport.contentWrapperHeightMode==`auto`?`auto`:e.viewport.contentWrapperHeightMode==`viewport`?`${this.getViewportHeight()}px`:this.owner.inIframe?`100%`:`auto`}getContentsShadowMargin(e){let t=this.htmlOptions.contentsShadowMargin??20,n=this.getContentPaddingFactor(),r=this.device.getDeviceType()==`mobile`?Math.round(t*.6):t;return{marginBlock:r,marginInline:r+Math.min(10,e*n)}}getContentWrapperPadding(e,t){let n=this.getFlipMode(),r=n==`scroll`?30:0,{marginBlock:i,marginInline:a}=this.getContentsShadowMargin(e);n==`page`&&(r+=i);let o=r+`px`,s=n==`scroll`?30:0;n==`page`&&(s+=i);let c=s+`px`;return{contentWrapperPaddingTop:o,contentWrapperPaddingLeft:n==`scroll`?`${a}px`:`0`,contentWrapperPaddingRight:n==`scroll`?`${a}px`:`0`,contentWrapperPaddingBottom:c,contentWrapperPaddingLeftRight:n==`scroll`?`${t}px`:`0`,contentWrapperPaddingTopBottom:`${r+s}px`,contentWrapperPadding:n==`scroll`?`${r}px ${a}px ${s}px ${a}px`:`0px`,contentWrapperPaddingTopNumber:r,contentWrapperPaddingBottomNumber:s}}getContentsContainerWidth(){let e=this.rendererContainer.clientWidth||this.owner.getHostViewport().width;if(this.device.getDeviceType()==`mobile`&&e<=768)return e;if(this.getFlipMode()==`scroll`)return this.htmlOptions.enableAutoFitPageWidth?e:this.htmlOptions.maxScrollContentWidth?Math.min(e,Math.abs(this.htmlOptions.maxScrollContentWidth)):Math.min(e,this.htmlOptions.columnWidth);let t=this.htmlOptions.columns,n=this.getColumnWidth();if(this.htmlOptions.autoColumns){if(!this.htmlOptions.maxColumns)return e;t=e<=n?1:this.htmlOptions.maxColumns}let r=this.getMultiColumnWidthFactor();return t>1?Math.min(e,t*n*r):Math.min(e,n)}calculateColumns(e){let t=this.htmlOptions.columns??1,n=this.getColumnWidth();if(this.htmlOptions.autoColumns){if(e<=n)t=1;else{t=Math.floor(e/n);let r=e%n;(r>n/5||r>t*50)&&(t+=1),this.htmlOptions.maxColumns&&t>this.htmlOptions.maxColumns&&(t=this.htmlOptions.maxColumns)}}return t}getFinalColumnWidth(e,t,n){let r=n*(t-1),i=(e-r)/t,a=0,o=Math.round(i);return o!=i&&(i=o,a=e-(t*o+r)),{columnWidth:i,remainder:a}}getContentPaddingFactor(){return this.device.getDeviceType()==`mobile`?.01:.05}getMultiColumnWidthFactor(){let e=this.htmlOptions.multiColumnWidthFactor;return e||=.8,e=Math.abs(e),e<.5&&(e=.5),e>1&&(e=1),e}getViewportHeight(){let e=this.owner.getHostViewport();if(e.mode==`host`){let e=this.rendererContainer.clientHeight;if(e>=80&&e<33554400)return Math.round(e)}return e.height}getFlipMode(){return i.getLayoutGeometry(this.htmlOptions).flipMode}async dispose(){this.updateCssVariablesTimeoutId&&=(clearTimeout(this.updateCssVariablesTimeoutId),null)}};exports.HtmlRendererViewport=l;
@@ -132,16 +132,16 @@ var u = class {
132
132
  };
133
133
  }
134
134
  getContentsContainerWidth() {
135
- let { width: e } = this.rendererContainer.getBoundingClientRect(), t = e;
136
- if (this.device.getDeviceType() == "mobile" && t <= 768) return t;
137
- if (this.getFlipMode() == "scroll") return this.htmlOptions.enableAutoFitPageWidth ? t : this.htmlOptions.maxScrollContentWidth ? Math.min(t, Math.abs(this.htmlOptions.maxScrollContentWidth)) : Math.min(t, this.htmlOptions.columnWidth);
138
- let n = this.htmlOptions.columns, r = this.getColumnWidth();
135
+ let e = this.rendererContainer.clientWidth || this.owner.getHostViewport().width;
136
+ if (this.device.getDeviceType() == "mobile" && e <= 768) return e;
137
+ if (this.getFlipMode() == "scroll") return this.htmlOptions.enableAutoFitPageWidth ? e : this.htmlOptions.maxScrollContentWidth ? Math.min(e, Math.abs(this.htmlOptions.maxScrollContentWidth)) : Math.min(e, this.htmlOptions.columnWidth);
138
+ let t = this.htmlOptions.columns, n = this.getColumnWidth();
139
139
  if (this.htmlOptions.autoColumns) {
140
- if (!this.htmlOptions.maxColumns) return t;
141
- n = t <= r ? 1 : this.htmlOptions.maxColumns;
140
+ if (!this.htmlOptions.maxColumns) return e;
141
+ t = e <= n ? 1 : this.htmlOptions.maxColumns;
142
142
  }
143
- let i = this.getMultiColumnWidthFactor();
144
- return n > 1 ? Math.min(t, n * r * i) : Math.min(t, r);
143
+ let r = this.getMultiColumnWidthFactor();
144
+ return t > 1 ? Math.min(e, t * n * r) : Math.min(e, n);
145
145
  }
146
146
  calculateColumns(e) {
147
147
  let t = this.htmlOptions.columns ?? 1, n = this.getColumnWidth();
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../kernal/common/text.cjs"),t=require("../../../kernal/IFileParser.cjs"),n=require("../../../kernal/nav/Nav.cjs"),r=require("../../../kernal/io/IByteSource.cjs"),i=require("../../../kernal/io/BlobByteSource.cjs"),a=require("../../../kernal/io/MemoryByteSource.cjs"),o=require("../loadPdfDocument.cjs"),s=require("../ensurePdfWebWorker.cjs"),c=require("../../base/fileParser/BaseFileParser.cjs"),l=require("./PdfTextDocument.cjs"),u=require("./PdfPasswordProvider.cjs");var d=class extends c.BaseFileParser{constructor(e,t,n,r,i,a,o,s,c,l){super(e,t,n,r,s,c),this.events=i,this.locale=a,this.context=o,this.url=s,this.extension=c,this.options=l,this.ownedSources=[],this.pdfDocs=new Map,this.passwordProvider=new u.PdfPasswordProvider(i,a,o),this.bindDefaultPasswordFlow()}bindDefaultPasswordFlow(){this.options.standardPasswordProvider||(this.options.standardPasswordProvider=this.passwordProvider.getPassword)}async buildLocation(t,r){let i=typeof t==`string`?new n.NavPoint(``,t):t,a=await super.buildLocation(t,r);return(i.startPageNumber??0)>0&&(a.current=i.startPageNumber,a.unit=`page`),e.isNullOrWhiteSpace(i.pdfDest)||(a.pdfDest=i.pdfDest),a}async getCover(e,t){return null}async getTextDocuments(){if(this.textDocuments)return this.textDocuments;this.textDocuments=[];let e=await this.getSpineFiles();for(let t=0;t<e.length;t++){let n=e[t],r=new l.PdfTextDocument(this,n);this.textDocuments.push(r)}return this.textDocuments}async captureInitialSource(e){if(e.data&&e.data.byteLength>0){let t=e.byteSource;e.byteSource=void 0,await t?.close();return}if(e.byteSource){if(e.byteSource instanceof a.MemoryByteSource){e.data=await r.materialize(e.byteSource);let t=e.byteSource;e.byteSource=void 0,await t.close();return}this.sharedSource=e.byteSource,this.ownedSources.push(e.byteSource),e.byteSource=void 0}}trackSource(e){return this.ownedSources.push(e),e}async resolveSpineInput(e){if(e.data instanceof ArrayBuffer&&e.data.byteLength>0)return new Uint8Array(e.data);if(e.data instanceof Blob&&e.data.size>0)return this.trackSource(new i.BlobByteSource(e.data));if(this.sharedSource)return this.sharedSource;if(!e.url)return new Uint8Array;let t=await this.fileUrlParser.parse(e.url,{requireFullFile:!1});if(t.data&&t.data.byteLength>0){let e=t.byteSource;return t.byteSource=void 0,await e?.close(),new Uint8Array(t.data)}if(t.byteSource instanceof a.MemoryByteSource){let e=new Uint8Array(await r.materialize(t.byteSource));return await t.byteSource.close(),e}return t.byteSource?this.trackSource(t.byteSource):new Uint8Array}async getPdfDocument(e){let t=this.pdfDocs.get(e.url);return t&&!t.loadingTask.destroyed?t:(t=await this.internalGetPdfDocumentProxy(e),this.pdfDocs.set(e.url,t),t)}async internalGetPdfDocumentProxy(e){let t;this.options.standardPasswordProvider&&(t=await this.options.standardPasswordProvider(this,e));let n=await this.resolveSpineInput(e);return await o.loadPdfDocument(n,{password:t,cMapUrl:this.options.cMapUrl,standardFontDataUrl:this.options.standardFontDataUrl,wasmUrl:this.options.wasmUrl,iccUrl:this.options.iccUrl,showPasswordPrompt:this.options.showPasswordPrompt,passwordPrompt:this.passwordProvider.onPasswordPrompt,internalUrlBuilder:this.options.internalUrlBuilder,documentInitParametersCallback:this.options.documentInitParametersCallback})}async load(e){let t=await this.parseUrl(this.url,{requireFullFile:!1});await this.initializeDatas(t),e?.measureFilePercentage&&await this.measureFilePercentage(t.spineFiles??[],t.requireCalculateFileSymbolCount)}async parseUrl(e,n){let r=await super.parseUrl(e,n);if(r.spineFiles||=[],!r.isMultiFiles){await this.captureInitialSource(r);let e=new t.SpineFile(r.data,r.mainUrl,this.extension),n=await this.internalGetPdfDocumentProxy(e);r.data=void 0,e.data=void 0;for(let e=0;e<n.numPages;e++){let i=`${e+1}.pdf`,a=new t.SpineFile(null,i,this.extension);r.spineFiles.push(a),this.pdfDocs.set(i,n)}r.nav=await this.initNav(n)}return r}async measureFilePercentage(e,t){if(!e)return;if(!e.find(e=>e.symbolCount==null)){e[0]?.ratio!=null&&this.applyProgressRanges(e);return}let n=0;e.forEach(e=>{(e.symbolCount==null||e.symbolCount<=0)&&(e.symbolCount=1),n+=e.symbolCount}),n<=0&&(n=1),e.forEach(e=>{e.ratio??=e.symbolCount/n}),this.applyProgressRanges(e)}async getNav(){return await super.getNav()||null}async dispose(){await super.dispose();for(let[,e]of this.pdfDocs.entries())try{await e.cleanup(),await s.destroyPdfLoadingTask(e.loadingTask),await e.destroy()}catch{await s.destroyPdfLoadingTask(e.loadingTask)}this.pdfDocs.clear(),this.sharedSource=void 0;let e=this.ownedSources.splice(0);for(let t of e)try{await t.close()}catch{}if(this.textDocuments){for(let e of this.textDocuments)await e.dispose();this.textDocuments.splice(0)}}async initNav(e){let t=new n.Nav;if(!e)return t;let r=await e.getOutline();if(r==null||r.length==0)return t;for(let n=0;n<r.length;n++){let i=r[n],a=await this.getPageNumber(e,i.dest),o=await this.formatPdfDest(e,i.dest),s=await this.getNavPoint(e,i.title,a,o,i.items);t.navPoints.push(s)}return t}async getNavPoint(e,t,r,i,a){t=t?.trim().replace(/[\x00-\x1f]/gi,``);let o=r.toString()+`.pdf`,s=new n.NavPoint(t,o,r,i);if(a!=null&&a.length>0)for(let t=0;t<a.length;t++){let n=await this.getPageNumber(e,a[t].dest),r=await this.formatPdfDest(e,a[t].dest),i=await this.getNavPoint(e,a[t].title,n,r,a[t].items);s.children.push(i)}return s}async formatPdfDest(e,t){let n;return n=typeof t==`string`?await e.getDestination(t):t,JSON.stringify(n)}async getPageNumber(e,t){let n,r=0;try{if(n=typeof t==`string`?await e.getDestination(t):t,Array.isArray(n)){let[t]=n;typeof t==`object`&&t?r=await e.getPageIndex(t)+1:Number.isInteger(t)&&(r=t+1)}}catch{}return r}};exports.PdfFileParser=d;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../kernal/common/text.cjs"),t=require("../../../kernal/IFileParser.cjs"),n=require("../../../kernal/nav/Nav.cjs"),r=require("../../../kernal/io/IByteSource.cjs"),i=require("../../../kernal/io/BlobByteSource.cjs"),a=require("../../../kernal/io/MemoryByteSource.cjs"),o=require("../../base/fileParser/BaseFileParser.cjs"),s=require("../loadPdfDocument.cjs"),c=require("../ensurePdfWebWorker.cjs"),l=require("./PdfTextDocument.cjs"),u=require("./PdfPasswordProvider.cjs");var d=class extends o.BaseFileParser{constructor(e,t,n,r,i,a,o,s,c,l){super(e,t,n,r,s,c),this.events=i,this.locale=a,this.context=o,this.url=s,this.extension=c,this.options=l,this.ownedSources=[],this.pdfDocs=new Map,this.passwordProvider=new u.PdfPasswordProvider(i,a,o),this.bindDefaultPasswordFlow()}bindDefaultPasswordFlow(){this.options.standardPasswordProvider||(this.options.standardPasswordProvider=this.passwordProvider.getPassword)}async buildLocation(t,r){let i=typeof t==`string`?new n.NavPoint(``,t):t,a=await super.buildLocation(t,r);return(i.startPageNumber??0)>0&&(a.current=i.startPageNumber,a.unit=`page`),e.isNullOrWhiteSpace(i.pdfDest)||(a.pdfDest=i.pdfDest),a}async getCover(e,t){return null}async getTextDocuments(){if(this.textDocuments)return this.textDocuments;this.textDocuments=[];let e=await this.getSpineFiles();for(let t=0;t<e.length;t++){let n=e[t],r=new l.PdfTextDocument(this,n);this.textDocuments.push(r)}return this.textDocuments}async captureInitialSource(e){if(e.data&&e.data.byteLength>0){let t=e.byteSource;e.byteSource=void 0,await t?.close();return}if(e.byteSource){if(e.byteSource instanceof a.MemoryByteSource){e.data=await r.materialize(e.byteSource);let t=e.byteSource;e.byteSource=void 0,await t.close();return}this.sharedSource=e.byteSource,this.ownedSources.push(e.byteSource),e.byteSource=void 0}}trackSource(e){return this.ownedSources.push(e),e}async resolveSpineInput(e){if(e.data instanceof ArrayBuffer&&e.data.byteLength>0)return new Uint8Array(e.data);if(e.data instanceof Blob&&e.data.size>0)return this.trackSource(new i.BlobByteSource(e.data));if(this.sharedSource)return this.sharedSource;if(!e.url)return new Uint8Array;let t=await this.fileUrlParser.parse(e.url,{requireFullFile:!1});if(t.data&&t.data.byteLength>0){let e=t.byteSource;return t.byteSource=void 0,await e?.close(),new Uint8Array(t.data)}if(t.byteSource instanceof a.MemoryByteSource){let e=new Uint8Array(await r.materialize(t.byteSource));return await t.byteSource.close(),e}return t.byteSource?this.trackSource(t.byteSource):new Uint8Array}async getPdfDocument(e){let t=this.pdfDocs.get(e.url);return t&&!t.loadingTask.destroyed?t:(t=await this.internalGetPdfDocumentProxy(e),this.pdfDocs.set(e.url,t),t)}async internalGetPdfDocumentProxy(e){let t;this.options.standardPasswordProvider&&(t=await this.options.standardPasswordProvider(this,e));let n=await this.resolveSpineInput(e);return await s.loadPdfDocument(n,{password:t,cMapUrl:this.options.cMapUrl,standardFontDataUrl:this.options.standardFontDataUrl,wasmUrl:this.options.wasmUrl,iccUrl:this.options.iccUrl,showPasswordPrompt:this.options.showPasswordPrompt,passwordPrompt:this.passwordProvider.onPasswordPrompt,internalUrlBuilder:this.options.internalUrlBuilder,documentInitParametersCallback:this.options.documentInitParametersCallback})}async load(e){let t=await this.parseUrl(this.url,{requireFullFile:!1});await this.initializeDatas(t),e?.measureFilePercentage&&await this.measureFilePercentage(t.spineFiles??[],t.requireCalculateFileSymbolCount)}async parseUrl(e,n){let r=await super.parseUrl(e,n);if(r.spineFiles||=[],!r.isMultiFiles){await this.captureInitialSource(r);let e=new t.SpineFile(r.data,r.mainUrl,this.extension),n=await this.internalGetPdfDocumentProxy(e);r.data=void 0,e.data=void 0;for(let e=0;e<n.numPages;e++){let i=`${e+1}.pdf`,a=new t.SpineFile(null,i,this.extension);r.spineFiles.push(a),this.pdfDocs.set(i,n)}r.nav=await this.initNav(n)}return r}async measureFilePercentage(e,t){if(!e)return;if(!e.find(e=>e.symbolCount==null)){e[0]?.ratio!=null&&this.applyProgressRanges(e);return}let n=0;e.forEach(e=>{(e.symbolCount==null||e.symbolCount<=0)&&(e.symbolCount=1),n+=e.symbolCount}),n<=0&&(n=1),e.forEach(e=>{e.ratio??=e.symbolCount/n}),this.applyProgressRanges(e)}async getNav(){return await super.getNav()||null}async dispose(){await super.dispose();for(let[,e]of this.pdfDocs.entries())try{await e.cleanup(),await c.destroyPdfLoadingTask(e.loadingTask),await e.destroy()}catch{await c.destroyPdfLoadingTask(e.loadingTask)}this.pdfDocs.clear(),this.sharedSource=void 0;let e=this.ownedSources.splice(0);for(let t of e)try{await t.close()}catch{}if(this.textDocuments){for(let e of this.textDocuments)await e.dispose();this.textDocuments.splice(0)}}async initNav(e){let t=new n.Nav;if(!e)return t;let r=await e.getOutline();if(r==null||r.length==0)return t;for(let n=0;n<r.length;n++){let i=r[n],a=await this.getPageNumber(e,i.dest),o=await this.formatPdfDest(e,i.dest),s=await this.getNavPoint(e,i.title,a,o,i.items);t.navPoints.push(s)}return t}async getNavPoint(e,t,r,i,a){t=t?.trim().replace(/[\x00-\x1f]/gi,``);let o=r.toString()+`.pdf`,s=new n.NavPoint(t,o,r,i);if(a!=null&&a.length>0)for(let t=0;t<a.length;t++){let n=await this.getPageNumber(e,a[t].dest),r=await this.formatPdfDest(e,a[t].dest),i=await this.getNavPoint(e,a[t].title,n,r,a[t].items);s.children.push(i)}return s}async formatPdfDest(e,t){let n;return n=typeof t==`string`?await e.getDestination(t):t,JSON.stringify(n)}async getPageNumber(e,t){let n,r=0;try{if(n=typeof t==`string`?await e.getDestination(t):t,Array.isArray(n)){let[t]=n;typeof t==`object`&&t?r=await e.getPageIndex(t)+1:Number.isInteger(t)&&(r=t+1)}}catch{}return r}};exports.PdfFileParser=d;
@@ -4,13 +4,13 @@ import { Nav as n, NavPoint as r } from "../../../kernal/nav/Nav.mjs";
4
4
  import { materialize as i } from "../../../kernal/io/IByteSource.mjs";
5
5
  import { BlobByteSource as a } from "../../../kernal/io/BlobByteSource.mjs";
6
6
  import { MemoryByteSource as o } from "../../../kernal/io/MemoryByteSource.mjs";
7
- import { loadPdfDocument as s } from "../loadPdfDocument.mjs";
8
- import { destroyPdfLoadingTask as c } from "../ensurePdfWebWorker.mjs";
9
- import { BaseFileParser as l } from "../../base/fileParser/BaseFileParser.mjs";
7
+ import { BaseFileParser as s } from "../../base/fileParser/BaseFileParser.mjs";
8
+ import { loadPdfDocument as c } from "../loadPdfDocument.mjs";
9
+ import { destroyPdfLoadingTask as l } from "../ensurePdfWebWorker.mjs";
10
10
  import { PdfTextDocument as u } from "./PdfTextDocument.mjs";
11
11
  import { PdfPasswordProvider as d } from "./PdfPasswordProvider.mjs";
12
12
  //#region mediaTypes/pdf/fileParser/PdfFileParser.ts
13
- var f = class extends l {
13
+ var f = class extends s {
14
14
  constructor(e, t, n, r, i, a, o, s, c, l) {
15
15
  super(e, t, n, r, s, c), this.events = i, this.locale = a, this.context = o, this.url = s, this.extension = c, this.options = l, this.ownedSources = [], this.pdfDocs = /* @__PURE__ */ new Map(), this.passwordProvider = new d(i, a, o), this.bindDefaultPasswordFlow();
16
16
  }
@@ -77,7 +77,7 @@ var f = class extends l {
77
77
  let t;
78
78
  this.options.standardPasswordProvider && (t = await this.options.standardPasswordProvider(this, e));
79
79
  let n = await this.resolveSpineInput(e);
80
- return await s(n, {
80
+ return await c(n, {
81
81
  password: t,
82
82
  cMapUrl: this.options.cMapUrl,
83
83
  standardFontDataUrl: this.options.standardFontDataUrl,
@@ -126,9 +126,9 @@ var f = class extends l {
126
126
  async dispose() {
127
127
  await super.dispose();
128
128
  for (let [, e] of this.pdfDocs.entries()) try {
129
- await e.cleanup(), await c(e.loadingTask), await e.destroy();
129
+ await e.cleanup(), await l(e.loadingTask), await e.destroy();
130
130
  } catch {
131
- await c(e.loadingTask);
131
+ await l(e.loadingTask);
132
132
  }
133
133
  this.pdfDocs.clear(), this.sharedSource = void 0;
134
134
  let e = this.ownedSources.splice(0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foxycape/core",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "description": "Browser-side multi-format reader kernel with pluggable parsers, renderers, services, and plugins.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -78,8 +78,6 @@
78
78
  ],
79
79
  "dependencies": {
80
80
  "events": "^3.3.0",
81
- "highlight.js": "^11.12.0",
82
- "hotkeys-js": "^4.0.4",
83
81
  "js-base64": "^3.9.2",
84
82
  "js-logger": "^1.6.1",
85
83
  "perfect-debounce": "^2.1.0",
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../EventNames.cjs"),n=require("../PluginCore.cjs");let r=require("hotkeys-js");r=e.__toESM(r,1);let i=require("perfect-debounce");var a=`left,up,pageup`,o=`right,down,pagedown`,s=class extends n.PluginCore{constructor(e,t){super(e,t),this.bindedFlipPageElements=[],this.bindedDocuments=[],this.heldKeys={},this.currentPauseFlipPageOnPressKey=!1,this.documentKeydownHandlers=new Map,this.documentKeyupHandlers=new Map,this.onDocumentLoad=async e=>{await this.bindDocument(e)},this.onPressPreviousKey=(e,t)=>{if(this.pluginOptions.flipMode==`page`){if(this.heldKeys[e.keyCode]>1)return;this.currentPauseFlipPageOnPressKey||(e.preventDefault(),e.stopImmediatePropagation(),this.reader.context.setUserChangedProgress(!0,`keyboard`),this.delayGotoPreviousPage(this.reader.getRenderer()))}else this.reader.context.setUserChangedProgress(!0,`keyboard`)},this.onPressNextKey=(e,t)=>{if(this.pluginOptions.flipMode==`page`){if(this.heldKeys[e.keyCode]>1)return;this.currentPauseFlipPageOnPressKey||(e.preventDefault(),e.stopImmediatePropagation(),this.reader.context.setUserChangedProgress(!0,`keyboard`),this.delayGotoNextPage(this.reader.getRenderer()))}else this.reader.context.setUserChangedProgress(!0,`keyboard`)},this.delayGotoPreviousPage=(0,i.debounce)(async e=>{if(e?.pagingNavigator){await e.pagingNavigator.gotoPreviousPage({trigger:`user`,triggerType:`keyboard`});return}await e?.gotoPreviousPage?.({trigger:`user`,triggerType:`keyboard`})},64),this.delayGotoNextPage=(0,i.debounce)(async e=>{if(e?.pagingNavigator){await e.pagingNavigator.gotoNextPage({trigger:`user`,triggerType:`keyboard`});return}await e?.gotoNextPage?.({trigger:`user`,triggerType:`keyboard`})},64),this.pluginOptions={flipMode:t?.flipMode??`page`,flipPagePreviousKeys:t?.flipPagePreviousKeys??a,flipPageNextKeys:t?.flipPageNextKeys??o}}get name(){return`keyboard-page-turning`}get title(){return`Keyboard Page Turning`}get description(){return`Keyboard page flip navigation`}get version(){return`1.0.0`}get supportedVersion(){return`>=1.0.0`}get supportedExtensions(){return[`.xml`,`.xhtml`,`.html`,`.epub`,`.mobi`,`.azw3`,`.fb2`,`.txt`,`.md`]}get supportedLanguages(){return[`*`]}get isUIPlugin(){return!1}getContainer(){}set pauseFlipPageOnPressKey(e){this.currentPauseFlipPageOnPressKey=e}get pauseFlipPageOnPressKey(){return this.currentPauseFlipPageOnPressKey}async load(){let e=this.reader.getReaderContainer();e&&(await this.bindFlipPageKeys(e.ownerDocument.documentElement),e.ownerDocument!==document&&await this.bindFlipPageKeys(document.documentElement));let n=this.reader.getRenderer()?.getLoadedDocuments?.()??this.reader.getRenderer()?.getDocuments?.()??[];for(let e of n)await this.bindDocument(e);this.reader.events.on(t.EventNames.DocumentLoad,this.onDocumentLoad)}async dispose(){this.reader.events.off(t.EventNames.DocumentLoad,this.onDocumentLoad);let e=this.pluginOptions.flipPagePreviousKeys,n=this.pluginOptions.flipPageNextKeys;this.bindedFlipPageElements.length>0&&(e&&r.default.unbind(e,`all`,this.onPressPreviousKey),n&&r.default.unbind(n,`all`,this.onPressNextKey));for(let e of this.bindedDocuments){let t=this.documentKeydownHandlers.get(e),n=this.documentKeyupHandlers.get(e);t&&e.removeEventListener(`keydown`,t,!0),n&&e.removeEventListener(`keyup`,n,!0)}this.documentKeydownHandlers.clear(),this.documentKeyupHandlers.clear(),this.bindedFlipPageElements=[],this.bindedDocuments=[],this.heldKeys={},this.currentPauseFlipPageOnPressKey=!1}async bindDocument(e){let t=e.getContentContainer()?.ownerDocument?.documentElement;t&&await this.bindFlipPageKeys(t)}async bindFlipPageKeys(e){if(this.bindedFlipPageElements.includes(e))return;let t=this.pluginOptions.flipPagePreviousKeys,n=this.pluginOptions.flipPageNextKeys;t&&(0,r.default)(t,{element:e,scope:`all`},this.onPressPreviousKey),n&&(0,r.default)(n,{element:e,scope:`all`},this.onPressNextKey);let i=e.ownerDocument;if(!this.bindedDocuments.includes(i)){this.bindedDocuments.push(i);let e=e=>{this.heldKeys[e.keyCode]=(this.heldKeys[e.keyCode]??0)+1},t=e=>{this.heldKeys[e.keyCode]=0};this.documentKeydownHandlers.set(i,e),this.documentKeyupHandlers.set(i,t),i.addEventListener(`keydown`,e,!0),i.addEventListener(`keyup`,t,!0)}this.bindedFlipPageElements.push(e)}};exports.KeyboardPageTurning=s;
@@ -1,39 +0,0 @@
1
- import { PluginCore } from '../PluginCore';
2
- import { Reader } from '../../Reader';
3
- import { FlipMode } from '../../types';
4
-
5
- export type KeyboardPageTurningOptions = {
6
- flipPagePreviousKeys?: string;
7
- flipPageNextKeys?: string;
8
- flipMode?: FlipMode;
9
- };
10
- export declare class KeyboardPageTurning extends PluginCore {
11
- private readonly pluginOptions;
12
- private bindedFlipPageElements;
13
- private bindedDocuments;
14
- private heldKeys;
15
- private currentPauseFlipPageOnPressKey;
16
- private readonly documentKeydownHandlers;
17
- private readonly documentKeyupHandlers;
18
- constructor(reader: Reader, options?: KeyboardPageTurningOptions);
19
- get name(): string;
20
- get title(): string;
21
- get description(): string;
22
- get version(): string;
23
- get supportedVersion(): string;
24
- get supportedExtensions(): string[];
25
- get supportedLanguages(): string[];
26
- get isUIPlugin(): boolean;
27
- getContainer(): HTMLElement | undefined;
28
- set pauseFlipPageOnPressKey(value: boolean);
29
- get pauseFlipPageOnPressKey(): boolean;
30
- load(): Promise<void>;
31
- dispose(): Promise<void>;
32
- private onDocumentLoad;
33
- private bindDocument;
34
- private bindFlipPageKeys;
35
- private onPressPreviousKey;
36
- private onPressNextKey;
37
- private delayGotoPreviousPage;
38
- private delayGotoNextPage;
39
- }
@@ -1,136 +0,0 @@
1
- import { EventNames as e } from "../../EventNames.mjs";
2
- import { PluginCore as t } from "../PluginCore.mjs";
3
- import { asyncDebounce as n } from "../../web/debounce.mjs";
4
- import r from "hotkeys-js";
5
- //#region kernal/plugins/keyboard/KeyboardPageTurning.ts
6
- var i = "left,up,pageup", a = "right,down,pagedown", o = class extends t {
7
- constructor(e, t) {
8
- super(e, t), this.bindedFlipPageElements = [], this.bindedDocuments = [], this.heldKeys = {}, this.currentPauseFlipPageOnPressKey = !1, this.documentKeydownHandlers = /* @__PURE__ */ new Map(), this.documentKeyupHandlers = /* @__PURE__ */ new Map(), this.onDocumentLoad = async (e) => {
9
- await this.bindDocument(e);
10
- }, this.onPressPreviousKey = (e, t) => {
11
- if (this.pluginOptions.flipMode == "page") {
12
- if (this.heldKeys[e.keyCode] > 1) return;
13
- this.currentPauseFlipPageOnPressKey || (e.preventDefault(), e.stopImmediatePropagation(), this.reader.context.setUserChangedProgress(!0, "keyboard"), this.delayGotoPreviousPage(this.reader.getRenderer()));
14
- } else this.reader.context.setUserChangedProgress(!0, "keyboard");
15
- }, this.onPressNextKey = (e, t) => {
16
- if (this.pluginOptions.flipMode == "page") {
17
- if (this.heldKeys[e.keyCode] > 1) return;
18
- this.currentPauseFlipPageOnPressKey || (e.preventDefault(), e.stopImmediatePropagation(), this.reader.context.setUserChangedProgress(!0, "keyboard"), this.delayGotoNextPage(this.reader.getRenderer()));
19
- } else this.reader.context.setUserChangedProgress(!0, "keyboard");
20
- }, this.delayGotoPreviousPage = n(async (e) => {
21
- if (e?.pagingNavigator) {
22
- await e.pagingNavigator.gotoPreviousPage({
23
- trigger: "user",
24
- triggerType: "keyboard"
25
- });
26
- return;
27
- }
28
- await e?.gotoPreviousPage?.({
29
- trigger: "user",
30
- triggerType: "keyboard"
31
- });
32
- }, 64), this.delayGotoNextPage = n(async (e) => {
33
- if (e?.pagingNavigator) {
34
- await e.pagingNavigator.gotoNextPage({
35
- trigger: "user",
36
- triggerType: "keyboard"
37
- });
38
- return;
39
- }
40
- await e?.gotoNextPage?.({
41
- trigger: "user",
42
- triggerType: "keyboard"
43
- });
44
- }, 64), this.pluginOptions = {
45
- flipMode: t?.flipMode ?? "page",
46
- flipPagePreviousKeys: t?.flipPagePreviousKeys ?? i,
47
- flipPageNextKeys: t?.flipPageNextKeys ?? a
48
- };
49
- }
50
- get name() {
51
- return "keyboard-page-turning";
52
- }
53
- get title() {
54
- return "Keyboard Page Turning";
55
- }
56
- get description() {
57
- return "Keyboard page flip navigation";
58
- }
59
- get version() {
60
- return "1.0.0";
61
- }
62
- get supportedVersion() {
63
- return ">=1.0.0";
64
- }
65
- get supportedExtensions() {
66
- return [
67
- ".xml",
68
- ".xhtml",
69
- ".html",
70
- ".epub",
71
- ".mobi",
72
- ".azw3",
73
- ".fb2",
74
- ".txt",
75
- ".md"
76
- ];
77
- }
78
- get supportedLanguages() {
79
- return ["*"];
80
- }
81
- get isUIPlugin() {
82
- return !1;
83
- }
84
- getContainer() {}
85
- set pauseFlipPageOnPressKey(e) {
86
- this.currentPauseFlipPageOnPressKey = e;
87
- }
88
- get pauseFlipPageOnPressKey() {
89
- return this.currentPauseFlipPageOnPressKey;
90
- }
91
- async load() {
92
- let t = this.reader.getReaderContainer();
93
- t && (await this.bindFlipPageKeys(t.ownerDocument.documentElement), t.ownerDocument !== document && await this.bindFlipPageKeys(document.documentElement));
94
- let n = this.reader.getRenderer()?.getLoadedDocuments?.() ?? this.reader.getRenderer()?.getDocuments?.() ?? [];
95
- for (let e of n) await this.bindDocument(e);
96
- this.reader.events.on(e.DocumentLoad, this.onDocumentLoad);
97
- }
98
- async dispose() {
99
- this.reader.events.off(e.DocumentLoad, this.onDocumentLoad);
100
- let t = this.pluginOptions.flipPagePreviousKeys, n = this.pluginOptions.flipPageNextKeys;
101
- this.bindedFlipPageElements.length > 0 && (t && r.unbind(t, "all", this.onPressPreviousKey), n && r.unbind(n, "all", this.onPressNextKey));
102
- for (let e of this.bindedDocuments) {
103
- let t = this.documentKeydownHandlers.get(e), n = this.documentKeyupHandlers.get(e);
104
- t && e.removeEventListener("keydown", t, !0), n && e.removeEventListener("keyup", n, !0);
105
- }
106
- this.documentKeydownHandlers.clear(), this.documentKeyupHandlers.clear(), this.bindedFlipPageElements = [], this.bindedDocuments = [], this.heldKeys = {}, this.currentPauseFlipPageOnPressKey = !1;
107
- }
108
- async bindDocument(e) {
109
- let t = e.getContentContainer()?.ownerDocument?.documentElement;
110
- t && await this.bindFlipPageKeys(t);
111
- }
112
- async bindFlipPageKeys(e) {
113
- if (this.bindedFlipPageElements.includes(e)) return;
114
- let t = this.pluginOptions.flipPagePreviousKeys, n = this.pluginOptions.flipPageNextKeys;
115
- t && r(t, {
116
- element: e,
117
- scope: "all"
118
- }, this.onPressPreviousKey), n && r(n, {
119
- element: e,
120
- scope: "all"
121
- }, this.onPressNextKey);
122
- let i = e.ownerDocument;
123
- if (!this.bindedDocuments.includes(i)) {
124
- this.bindedDocuments.push(i);
125
- let e = (e) => {
126
- this.heldKeys[e.keyCode] = (this.heldKeys[e.keyCode] ?? 0) + 1;
127
- }, t = (e) => {
128
- this.heldKeys[e.keyCode] = 0;
129
- };
130
- this.documentKeydownHandlers.set(i, e), this.documentKeyupHandlers.set(i, t), i.addEventListener("keydown", e, !0), i.addEventListener("keyup", t, !0);
131
- }
132
- this.bindedFlipPageElements.push(e);
133
- }
134
- };
135
- //#endregion
136
- export { o as KeyboardPageTurning };
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../../kernal/html/finder.cjs"),t=require("../../../../kernal/html/injector.cjs"),n=require("../../../../kernal/Theme.cjs"),r=require("../../../../kernal/html/image.cjs"),i=require("./ContentLayoutCssVariableNames.cjs");var a=`no-text-intent`,o=class{constructor(r){this.documentsProvider=r,this.languagesHighlightCssId=`languages-highlight-css`,this.highlightedDocuments=new Map,this.injectCss=async(n,r)=>{if(!e.getDocumentBody(r))return;let i=await this.getHighlightCss(n);t.injectCssContent(r,i,!0,this.languagesHighlightCssId)},this.getHighlightJs=async()=>{if(this.loadedHljs)return this.loadedHljs;let{default:e}=await import(`highlight.js`);return this.loadedHljs=e,this.loadedHljs},this.getHighlightCss=async e=>{if(e.colorMode===`dark`){let{default:e}=await Promise.resolve().then(()=>require("../../../../node_modules/highlight.js/styles/github-dark.cjs"));return e.toString()}let{default:t}=await Promise.resolve().then(()=>require("../../../../node_modules/highlight.js/styles/github.cjs"));return t.toString()},this.resolveCurrentTheme=async()=>(await this.documentsProvider.owner.services.get(`themeProvider`))?.getCurrentTheme()??new n.Theme}async dispose(){this.highlightedDocuments.clear(),this.loadedHljs=void 0}async applyTheme(e){let n=this.documentsProvider.getLoadedDocuments();for(let r of n){let n=r.getContentContainer()?.ownerDocument;n&&(e.colorMode===`dark`||this.highlightedDocuments.get(r)?await this.injectCss(e,n):t.removeElement(n,this.languagesHighlightCssId))}}async highlight(e){let t=(await e.getVirtualContentContainer())?.ownerDocument;if(!t)return;let n=t.getElementsByTagName(`pre`);for(let e=0;e<n.length;e++){let t=n[e];t.classList.add(a),t.style.setProperty(`max-height`,`var(${i.ContentLayoutCssVariableNames.ColumnMaxHeight})`,`important`),t.firstElementChild&&t.firstElementChild.classList.add(a)}let o=r.getRequireHighlightCodeElements(t),s=o.length>0;if(this.highlightedDocuments.set(e,s),!s)return;let c=await this.getHighlightJs(),l=await this.resolveCurrentTheme();await this.injectCss(l,t);for(let e of o)c.highlightElement(e)}};exports.LanguageHighlighter=o;
@@ -1,18 +0,0 @@
1
- import { IDocument, IDocumentsProvider, Theme } from '../../../../kernal';
2
- import { IHtmlDocument } from '../IHtmlDocument';
3
- import { ILanguageHighlighter } from './ILanguageHighlighter';
4
-
5
- export declare class LanguageHighlighter implements ILanguageHighlighter {
6
- private readonly documentsProvider;
7
- private readonly languagesHighlightCssId;
8
- private readonly highlightedDocuments;
9
- private loadedHljs?;
10
- constructor(documentsProvider: IDocumentsProvider<IHtmlDocument>);
11
- dispose(): Promise<void>;
12
- applyTheme(theme: Theme): Promise<void>;
13
- highlight(doc: IDocument): Promise<void>;
14
- private injectCss;
15
- private getHighlightJs;
16
- private getHighlightCss;
17
- private resolveCurrentTheme;
18
- }
@@ -1,52 +0,0 @@
1
- import { getDocumentBody as e } from "../../../../kernal/html/finder.mjs";
2
- import { injectCssContent as t, removeElement as n } from "../../../../kernal/html/injector.mjs";
3
- import { Theme as r } from "../../../../kernal/Theme.mjs";
4
- import { getRequireHighlightCodeElements as i } from "../../../../kernal/html/image.mjs";
5
- import { ContentLayoutCssVariableNames as a } from "./ContentLayoutCssVariableNames.mjs";
6
- //#region mediaTypes/html/renderer/style/LanguageHighlighter.ts
7
- var o = "no-text-intent", s = class {
8
- constructor(n) {
9
- this.documentsProvider = n, this.languagesHighlightCssId = "languages-highlight-css", this.highlightedDocuments = /* @__PURE__ */ new Map(), this.injectCss = async (n, r) => {
10
- if (!e(r)) return;
11
- let i = await this.getHighlightCss(n);
12
- t(r, i, !0, this.languagesHighlightCssId);
13
- }, this.getHighlightJs = async () => {
14
- if (this.loadedHljs) return this.loadedHljs;
15
- let { default: e } = await import("highlight.js");
16
- return this.loadedHljs = e, this.loadedHljs;
17
- }, this.getHighlightCss = async (e) => {
18
- if (e.colorMode === "dark") {
19
- let { default: e } = await import("../../../../node_modules/highlight.js/styles/github-dark.mjs");
20
- return e.toString();
21
- }
22
- let { default: t } = await import("../../../../node_modules/highlight.js/styles/github.mjs");
23
- return t.toString();
24
- }, this.resolveCurrentTheme = async () => (await this.documentsProvider.owner.services.get("themeProvider"))?.getCurrentTheme() ?? new r();
25
- }
26
- async dispose() {
27
- this.highlightedDocuments.clear(), this.loadedHljs = void 0;
28
- }
29
- async applyTheme(e) {
30
- let t = this.documentsProvider.getLoadedDocuments();
31
- for (let r of t) {
32
- let t = r.getContentContainer()?.ownerDocument;
33
- t && (e.colorMode === "dark" || this.highlightedDocuments.get(r) ? await this.injectCss(e, t) : n(t, this.languagesHighlightCssId));
34
- }
35
- }
36
- async highlight(e) {
37
- let t = (await e.getVirtualContentContainer())?.ownerDocument;
38
- if (!t) return;
39
- let n = t.getElementsByTagName("pre");
40
- for (let e = 0; e < n.length; e++) {
41
- let t = n[e];
42
- t.classList.add(o), t.style.setProperty("max-height", `var(${a.ColumnMaxHeight})`, "important"), t.firstElementChild && t.firstElementChild.classList.add(o);
43
- }
44
- let r = i(t), s = r.length > 0;
45
- if (this.highlightedDocuments.set(e, s), !s) return;
46
- let c = await this.getHighlightJs(), l = await this.resolveCurrentTheme();
47
- await this.injectCss(l, t);
48
- for (let e of r) c.highlightElement(e);
49
- }
50
- };
51
- //#endregion
52
- export { s as LanguageHighlighter };
@@ -1,118 +0,0 @@
1
- var e=`pre code.hljs {
2
- display: block;
3
- overflow-x: auto;
4
- padding: 1em
5
- }
6
- code.hljs {
7
- padding: 3px 5px
8
- }
9
- /*!
10
- Theme: GitHub Dark
11
- Description: Dark theme as seen on github.com
12
- Author: github.com
13
- Maintainer: @Hirse
14
- Updated: 2021-05-15
15
-
16
- Outdated base version: https://github.com/primer/github-syntax-dark
17
- Current colors taken from GitHub's CSS
18
- */
19
- .hljs {
20
- color: #c9d1d9;
21
- background: #0d1117
22
- }
23
- .hljs-doctag,
24
- .hljs-keyword,
25
- .hljs-meta .hljs-keyword,
26
- .hljs-template-tag,
27
- .hljs-template-variable,
28
- .hljs-type,
29
- .hljs-variable.language_ {
30
- /* prettylights-syntax-keyword */
31
- color: #ff7b72
32
- }
33
- .hljs-title,
34
- .hljs-title.class_,
35
- .hljs-title.class_.inherited__,
36
- .hljs-title.function_ {
37
- /* prettylights-syntax-entity */
38
- color: #d2a8ff
39
- }
40
- .hljs-attr,
41
- .hljs-attribute,
42
- .hljs-literal,
43
- .hljs-meta,
44
- .hljs-number,
45
- .hljs-operator,
46
- .hljs-variable,
47
- .hljs-selector-attr,
48
- .hljs-selector-class,
49
- .hljs-selector-id {
50
- /* prettylights-syntax-constant */
51
- color: #79c0ff
52
- }
53
- .hljs-regexp,
54
- .hljs-string,
55
- .hljs-meta .hljs-string {
56
- /* prettylights-syntax-string */
57
- color: #a5d6ff
58
- }
59
- .hljs-built_in,
60
- .hljs-symbol {
61
- /* prettylights-syntax-variable */
62
- color: #ffa657
63
- }
64
- .hljs-comment,
65
- .hljs-code,
66
- .hljs-formula {
67
- /* prettylights-syntax-comment */
68
- color: #8b949e
69
- }
70
- .hljs-name,
71
- .hljs-quote,
72
- .hljs-selector-tag,
73
- .hljs-selector-pseudo {
74
- /* prettylights-syntax-entity-tag */
75
- color: #7ee787
76
- }
77
- .hljs-subst {
78
- /* prettylights-syntax-storage-modifier-import */
79
- color: #c9d1d9
80
- }
81
- .hljs-section {
82
- /* prettylights-syntax-markup-heading */
83
- color: #1f6feb;
84
- font-weight: bold
85
- }
86
- .hljs-bullet {
87
- /* prettylights-syntax-markup-list */
88
- color: #f2cc60
89
- }
90
- .hljs-emphasis {
91
- /* prettylights-syntax-markup-italic */
92
- color: #c9d1d9;
93
- font-style: italic
94
- }
95
- .hljs-strong {
96
- /* prettylights-syntax-markup-bold */
97
- color: #c9d1d9;
98
- font-weight: bold
99
- }
100
- .hljs-addition {
101
- /* prettylights-syntax-markup-inserted */
102
- color: #aff5b4;
103
- background-color: #033a16
104
- }
105
- .hljs-deletion {
106
- /* prettylights-syntax-markup-deleted */
107
- color: #ffdcd7;
108
- background-color: #67060c
109
- }
110
- .hljs-char.escape_,
111
- .hljs-link,
112
- .hljs-params,
113
- .hljs-property,
114
- .hljs-punctuation,
115
- .hljs-tag {
116
- /* purposely ignored */
117
-
118
- }`;exports.default=e;
@@ -1,4 +0,0 @@
1
- //#region node_modules/highlight.js/styles/github-dark.css?raw
2
- var e = "pre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em\n}\ncode.hljs {\n padding: 3px 5px\n}\n/*!\n Theme: GitHub Dark\n Description: Dark theme as seen on github.com\n Author: github.com\n Maintainer: @Hirse\n Updated: 2021-05-15\n\n Outdated base version: https://github.com/primer/github-syntax-dark\n Current colors taken from GitHub's CSS\n*/\n.hljs {\n color: #c9d1d9;\n background: #0d1117\n}\n.hljs-doctag,\n.hljs-keyword,\n.hljs-meta .hljs-keyword,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-type,\n.hljs-variable.language_ {\n /* prettylights-syntax-keyword */\n color: #ff7b72\n}\n.hljs-title,\n.hljs-title.class_,\n.hljs-title.class_.inherited__,\n.hljs-title.function_ {\n /* prettylights-syntax-entity */\n color: #d2a8ff\n}\n.hljs-attr,\n.hljs-attribute,\n.hljs-literal,\n.hljs-meta,\n.hljs-number,\n.hljs-operator,\n.hljs-variable,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-selector-id {\n /* prettylights-syntax-constant */\n color: #79c0ff\n}\n.hljs-regexp,\n.hljs-string,\n.hljs-meta .hljs-string {\n /* prettylights-syntax-string */\n color: #a5d6ff\n}\n.hljs-built_in,\n.hljs-symbol {\n /* prettylights-syntax-variable */\n color: #ffa657\n}\n.hljs-comment,\n.hljs-code,\n.hljs-formula {\n /* prettylights-syntax-comment */\n color: #8b949e\n}\n.hljs-name,\n.hljs-quote,\n.hljs-selector-tag,\n.hljs-selector-pseudo {\n /* prettylights-syntax-entity-tag */\n color: #7ee787\n}\n.hljs-subst {\n /* prettylights-syntax-storage-modifier-import */\n color: #c9d1d9\n}\n.hljs-section {\n /* prettylights-syntax-markup-heading */\n color: #1f6feb;\n font-weight: bold\n}\n.hljs-bullet {\n /* prettylights-syntax-markup-list */\n color: #f2cc60\n}\n.hljs-emphasis {\n /* prettylights-syntax-markup-italic */\n color: #c9d1d9;\n font-style: italic\n}\n.hljs-strong {\n /* prettylights-syntax-markup-bold */\n color: #c9d1d9;\n font-weight: bold\n}\n.hljs-addition {\n /* prettylights-syntax-markup-inserted */\n color: #aff5b4;\n background-color: #033a16\n}\n.hljs-deletion {\n /* prettylights-syntax-markup-deleted */\n color: #ffdcd7;\n background-color: #67060c\n}\n.hljs-char.escape_,\n.hljs-link,\n.hljs-params,\n.hljs-property,\n.hljs-punctuation,\n.hljs-tag {\n /* purposely ignored */\n \n}";
3
- //#endregion
4
- export { e as default };
@@ -1,118 +0,0 @@
1
- var e=`pre code.hljs {
2
- display: block;
3
- overflow-x: auto;
4
- padding: 1em
5
- }
6
- code.hljs {
7
- padding: 3px 5px
8
- }
9
- /*!
10
- Theme: GitHub
11
- Description: Light theme as seen on github.com
12
- Author: github.com
13
- Maintainer: @Hirse
14
- Updated: 2021-05-15
15
-
16
- Outdated base version: https://github.com/primer/github-syntax-light
17
- Current colors taken from GitHub's CSS
18
- */
19
- .hljs {
20
- color: #24292e;
21
- background: #ffffff
22
- }
23
- .hljs-doctag,
24
- .hljs-keyword,
25
- .hljs-meta .hljs-keyword,
26
- .hljs-template-tag,
27
- .hljs-template-variable,
28
- .hljs-type,
29
- .hljs-variable.language_ {
30
- /* prettylights-syntax-keyword */
31
- color: #d73a49
32
- }
33
- .hljs-title,
34
- .hljs-title.class_,
35
- .hljs-title.class_.inherited__,
36
- .hljs-title.function_ {
37
- /* prettylights-syntax-entity */
38
- color: #6f42c1
39
- }
40
- .hljs-attr,
41
- .hljs-attribute,
42
- .hljs-literal,
43
- .hljs-meta,
44
- .hljs-number,
45
- .hljs-operator,
46
- .hljs-variable,
47
- .hljs-selector-attr,
48
- .hljs-selector-class,
49
- .hljs-selector-id {
50
- /* prettylights-syntax-constant */
51
- color: #005cc5
52
- }
53
- .hljs-regexp,
54
- .hljs-string,
55
- .hljs-meta .hljs-string {
56
- /* prettylights-syntax-string */
57
- color: #032f62
58
- }
59
- .hljs-built_in,
60
- .hljs-symbol {
61
- /* prettylights-syntax-variable */
62
- color: #e36209
63
- }
64
- .hljs-comment,
65
- .hljs-code,
66
- .hljs-formula {
67
- /* prettylights-syntax-comment */
68
- color: #6a737d
69
- }
70
- .hljs-name,
71
- .hljs-quote,
72
- .hljs-selector-tag,
73
- .hljs-selector-pseudo {
74
- /* prettylights-syntax-entity-tag */
75
- color: #22863a
76
- }
77
- .hljs-subst {
78
- /* prettylights-syntax-storage-modifier-import */
79
- color: #24292e
80
- }
81
- .hljs-section {
82
- /* prettylights-syntax-markup-heading */
83
- color: #005cc5;
84
- font-weight: bold
85
- }
86
- .hljs-bullet {
87
- /* prettylights-syntax-markup-list */
88
- color: #735c0f
89
- }
90
- .hljs-emphasis {
91
- /* prettylights-syntax-markup-italic */
92
- color: #24292e;
93
- font-style: italic
94
- }
95
- .hljs-strong {
96
- /* prettylights-syntax-markup-bold */
97
- color: #24292e;
98
- font-weight: bold
99
- }
100
- .hljs-addition {
101
- /* prettylights-syntax-markup-inserted */
102
- color: #22863a;
103
- background-color: #f0fff4
104
- }
105
- .hljs-deletion {
106
- /* prettylights-syntax-markup-deleted */
107
- color: #b31d28;
108
- background-color: #ffeef0
109
- }
110
- .hljs-char.escape_,
111
- .hljs-link,
112
- .hljs-params,
113
- .hljs-property,
114
- .hljs-punctuation,
115
- .hljs-tag {
116
- /* purposely ignored */
117
-
118
- }`;exports.default=e;
@@ -1,4 +0,0 @@
1
- //#region node_modules/highlight.js/styles/github.css?raw
2
- var e = "pre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em\n}\ncode.hljs {\n padding: 3px 5px\n}\n/*!\n Theme: GitHub\n Description: Light theme as seen on github.com\n Author: github.com\n Maintainer: @Hirse\n Updated: 2021-05-15\n\n Outdated base version: https://github.com/primer/github-syntax-light\n Current colors taken from GitHub's CSS\n*/\n.hljs {\n color: #24292e;\n background: #ffffff\n}\n.hljs-doctag,\n.hljs-keyword,\n.hljs-meta .hljs-keyword,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-type,\n.hljs-variable.language_ {\n /* prettylights-syntax-keyword */\n color: #d73a49\n}\n.hljs-title,\n.hljs-title.class_,\n.hljs-title.class_.inherited__,\n.hljs-title.function_ {\n /* prettylights-syntax-entity */\n color: #6f42c1\n}\n.hljs-attr,\n.hljs-attribute,\n.hljs-literal,\n.hljs-meta,\n.hljs-number,\n.hljs-operator,\n.hljs-variable,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-selector-id {\n /* prettylights-syntax-constant */\n color: #005cc5\n}\n.hljs-regexp,\n.hljs-string,\n.hljs-meta .hljs-string {\n /* prettylights-syntax-string */\n color: #032f62\n}\n.hljs-built_in,\n.hljs-symbol {\n /* prettylights-syntax-variable */\n color: #e36209\n}\n.hljs-comment,\n.hljs-code,\n.hljs-formula {\n /* prettylights-syntax-comment */\n color: #6a737d\n}\n.hljs-name,\n.hljs-quote,\n.hljs-selector-tag,\n.hljs-selector-pseudo {\n /* prettylights-syntax-entity-tag */\n color: #22863a\n}\n.hljs-subst {\n /* prettylights-syntax-storage-modifier-import */\n color: #24292e\n}\n.hljs-section {\n /* prettylights-syntax-markup-heading */\n color: #005cc5;\n font-weight: bold\n}\n.hljs-bullet {\n /* prettylights-syntax-markup-list */\n color: #735c0f\n}\n.hljs-emphasis {\n /* prettylights-syntax-markup-italic */\n color: #24292e;\n font-style: italic\n}\n.hljs-strong {\n /* prettylights-syntax-markup-bold */\n color: #24292e;\n font-weight: bold\n}\n.hljs-addition {\n /* prettylights-syntax-markup-inserted */\n color: #22863a;\n background-color: #f0fff4\n}\n.hljs-deletion {\n /* prettylights-syntax-markup-deleted */\n color: #b31d28;\n background-color: #ffeef0\n}\n.hljs-char.escape_,\n.hljs-link,\n.hljs-params,\n.hljs-property,\n.hljs-punctuation,\n.hljs-tag {\n /* purposely ignored */\n \n}";
3
- //#endregion
4
- export { e as default };