@foxycape/core 1.2.2 → 1.2.4
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.
- package/dist/kernal/FileLoader.cjs +1 -1
- package/dist/kernal/FileLoader.mjs +1 -1
- package/dist/kernal/Reader.cjs +1 -1
- package/dist/kernal/Reader.mjs +1 -1
- package/dist/kernal/html/geometry.cjs +1 -1
- package/dist/kernal/html/geometry.d.ts +3 -3
- package/dist/kernal/html/geometry.mjs +22 -22
- package/dist/mediaTypes/html/DefaultHtmlSymbolMeasure.cjs +1 -1
- package/dist/mediaTypes/html/DefaultHtmlSymbolMeasure.mjs +9 -9
- package/dist/mediaTypes/html/renderer/HtmlRenderer.cjs +1 -1
- package/dist/mediaTypes/html/renderer/HtmlRenderer.mjs +7 -7
- package/dist/mediaTypes/html/renderer/document/HtmlDocument.cjs +1 -1
- package/dist/mediaTypes/html/renderer/document/HtmlDocument.mjs +9 -9
- package/dist/mediaTypes/html/renderer/document/HtmlPageCalculator.cjs +1 -1
- package/dist/mediaTypes/html/renderer/document/HtmlPageCalculator.mjs +13 -13
- package/dist/mediaTypes/html/renderer/documents/HtmlDocumentsProvider.cjs +1 -1
- package/dist/mediaTypes/html/renderer/documents/HtmlDocumentsProvider.mjs +39 -39
- package/dist/mediaTypes/html/renderer/html/HtmlContentProcessor.cjs +1 -1
- package/dist/mediaTypes/html/renderer/html/HtmlContentProcessor.mjs +8 -8
- package/dist/mediaTypes/html/renderer/image/HtmlImageLoader.cjs +1 -1
- package/dist/mediaTypes/html/renderer/image/HtmlImageLoader.mjs +8 -8
- package/dist/mediaTypes/html/renderer/layout/HtmlRendererViewport.cjs +1 -1
- package/dist/mediaTypes/html/renderer/layout/HtmlRendererViewport.mjs +20 -20
- package/dist/mediaTypes/html/renderer/layout/pageStripRouteChange.cjs +1 -1
- package/dist/mediaTypes/html/renderer/layout/pageStripRouteChange.mjs +10 -10
- package/dist/mediaTypes/html/renderer/location/HtmlLayoutStatePreserver.cjs +1 -1
- package/dist/mediaTypes/html/renderer/location/HtmlLayoutStatePreserver.mjs +14 -14
- package/dist/mediaTypes/html/renderer/style/HtmlStyleProvider.cjs +1 -1
- package/dist/mediaTypes/html/renderer/style/HtmlStyleProvider.d.ts +0 -1
- package/dist/mediaTypes/html/renderer/style/HtmlStyleProvider.mjs +6 -7
- package/dist/mediaTypes/html/renderer/style/html-content.cjs +4 -0
- package/dist/mediaTypes/html/renderer/style/html-content.mjs +1 -1
- package/dist/mediaTypes/pdf/renderer/PdfDocument.cjs +1 -1
- package/dist/mediaTypes/pdf/renderer/PdfDocument.mjs +6 -6
- package/dist/mediaTypes/pdf/renderer/documents/PdfDocumentsProvider.cjs +1 -1
- package/dist/mediaTypes/pdf/renderer/documents/PdfDocumentsProvider.mjs +7 -7
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../../kernal/web/BrowserCapabilities.cjs"),t=require("../../../../kernal/common/text.cjs"),n=require("../../../../kernal/progress/Progress.cjs");require("../../../../kernal/Constants.cjs");const r=require("../../../../kernal/common/number.cjs"),i=require("../../../../kernal/html/finder.cjs"),a=require("../../../../kernal/html/dom.cjs"),o=require("../../../../kernal/web/scheduler.cjs"),s=require("../../../../kernal/html/style.cjs"),c=require("../../../../kernal/html/selection.cjs"),l=require("../../../../kernal/html/geometry.cjs"),u=require("../../HtmlSettings.cjs"),d=require("../../../base/renderer/BaseDocumentsProvider.cjs"),f=require("../layout/resolveLayoutRoute.cjs"),p=require("../location/scrollActivity.cjs"),m=require("../location/remapStoredPageNumber.cjs"),h=require("../document/HtmlDocument.cjs"),g=require("./HtmlDocumentsPreloader.cjs"),_=require("./HtmlDocumentsIntersectionObserver.cjs"),v=require("../location/HtmlElementLocator.cjs"),y=require("../layout/HtmlRendererViewport.cjs"),b=require("../layout/geometry/getLayoutOffsetLeft.cjs");let x=require("perfect-debounce");var S=class extends d.BaseDocumentsProvider{constructor(e,n,r,i){super(e,n),this.readerContainer=r,this.htmlOptions=i,this.isInit=!1,this.isFirstLoad=!0,this.hangTasks=[],this.resetTransformContainer=()=>{let e=this.getTransformContainer();e&&(e.style.removeProperty(`transition`),e.style.transform=`translate3d(0px,0,0)`,e.setAttribute(`data-target-transform`,`0`),e.offsetWidth)},this.removeElementTransitionEvent=async e=>{let t=e.target;for(t.style.removeProperty(`transition`),t.style.removeProperty(`will-change`),t.removeAttribute(u.HtmlSettings.PageMovingAttributeName),t.removeEventListener(`transitionend`,this.removeElementTransitionEvent);this.hangTasks.length>0;)await this.hangTasks.shift()()},this.scrollWrapperIntoView=(e,t)=>{let n=e.getWrapperContainer(),r=f.getLayoutGeometry(this.htmlOptions);if(r.flipMode==`page`){let t=this.rendererViewport.getLayoutMetrics(),i=this.getTransformContainer();if(r.pageAxis==`y`){let e=Math.max(0,n.offsetTop);i.style.transform=r.getPageTranslateCss(e),i.setAttribute(`data-target-transform`,`${e}`)}else{let n=this.getDocumentPageBox(e),a=r.getPageTransformOffset(n,1,t.pageMoveLength);i.style.transform=r.getPageTranslateCss(a),i.setAttribute(`data-target-transform`,`${a}`)}}else(!n.isVisible||t)&&r.alignWrapperToViewport({wrapper:n,scrollElement:this.getScrollElement(),rootDocument:this.owner.getRootContainer()?.ownerDocument});this.setCurrentVisibleDocument(e)},this.setDocumentVisible=(e,t)=>{e.isVisible=t},this.reload=async()=>{let e=this.owner.context.currentLocation;t.isNullOrWhiteSpace(e?.url)||await this.load(e,!0)},this.restoreReadingPosition=async()=>{let e=this.owner.context.currentLocation;if(t.isNullOrWhiteSpace(e?.url))return;let n=this.getDocument(e.url)??this.getFirstVisibleDocument();n&&await this.gotoDoc(n,e,!0)},this.delayRestoreReadingPosition=(0,x.debounce)(this.restoreReadingPosition,100),this.delayReloadTime=300,this.delayReload=(0,x.debounce)(this.reload,this.delayReloadTime),i.documentLanguage=e.context?.metadata?.language,this.logger=this.owner.loggerFactory.getLogger(this.constructor.name),this.elementLocator=new v.HtmlElementLocator(this),this.rendererViewport=new y.HtmlRendererViewport(e,this.readerContainer,this.owner.optionsProvider,i),this.documentsIntersectionObserver=new _.HtmlDocumentsIntersectionObserver(this),this.documentPreloader=new g.HtmlDocumentsPreloader(this.owner.events,this,()=>this.loadingDoc,i)}getTransformContainer(){return this.getRendererContainer().querySelector(`.`+u.HtmlSettings.TransformContainerCssName)}getRendererContainer(){return this.rendererViewport.getRendererContainer()}getScrollElement(){return this.rendererViewport.getScrollElement()}getLoadingDocument(){return this.loadingDoc}getLoadedDocuments(){return this.getDocuments().filter(e=>e.getLoadStatus()==`success`)}getVisibleDocuments(){return this.getDocuments().filter(e=>e.getWrapperContainer()?.isVisible)}getFirstVisibleDocument(e){let t=this.getVisibleDocuments();if(e){let e=t.find(e=>e.getVisibleElements(!0).length>0);if(e)return e}if(t[0])return t[0];let n=this.owner.context.currentLocation?.url;return n&&this.getDocument(n)||this.getDocuments()[0]||null}getLastVisibleDocument(e){let t=this.getVisibleDocuments();if(e){let e=[...t].reverse().find(e=>e.getVisibleElements().length>0);if(e)return e}if(t.length>0)return t[t.length-1];let n=this.owner.context.currentLocation?.url,r=this.getDocuments();return n&&this.getDocument(n)||r[r.length-1]||null}async createDocument(e,t,n){return new h.HtmlDocument(this.owner,this.rendererViewport,this.fileParser,e,t,this.htmlOptions)}async initialize(e){this.rendererViewport.applyCssVariables(),await super.initialize(e);let t=this.getDocuments();for(let e of t)e.getWrapperContainer().classList.add(u.HtmlSettings.FileContentContainerClassName,u.HtmlSettings.FileContentContainerHeightClassName)}async load(e,t){this.htmlOptions.documentLanguage=this.owner.context?.metadata?.language,this.isInit||=(await this.initialize(this.getTransformContainer()),this.documentsIntersectionObserver.register(),!0),e?.storeCurrent&&await this.owner.onBeforeRedirect?.(this),t??=!1;let r=e?.url,i=this.getDocument(r);if(!i){let t=this.getDocuments();i=t[0],(t.length>1||!e)&&(e=new n.FileLocation(i.url,1,`ratio`),e.current=0)}f.getLayoutGeometry(this.htmlOptions).flipMode==`page`?this.appendPageStyles():this.removePageStyles(),this.loadingDoc=i,this.owner.context.redirectingDocUrl=i.url,p.shouldBeginAbsoluteLocate(e?.direction,f.getLayoutGeometry(this.htmlOptions).holdsAbsoluteLocate)&&p.beginAbsoluteLocate();try{this.owner.context.setUserChangedProgress(!t,e?.from),!t&&e?.url&&(this.owner.context.currentLocation=e),await this.gotoDoc(i,e,t),this.isFirstLoad&&!t&&(await this.owner.loading?.hide(),this.isFirstLoad=!1),await this.documentPreloader.preloadDocuments(),this.shouldRealignAfterPreload(e,t)&&await this.gotoDoc(i,e,!0)}finally{setTimeout(()=>{this.loadingDoc=null,this.owner.context.redirectingDocUrl=void 0},166)}}async gotoDoc(e,t,n){if(!t)return;n??=!1;let r=f.getLayoutGeometry(this.htmlOptions).flipMode,i=e instanceof h.HtmlDocument?e:null,a=!!i&&r==`scroll`&&!n&&!t.suppressScroll&&e.getLoadStatus()!=`success`;a&&i&&(i.prepareCoveredLoad(),this.scrollWrapperIntoView(e,!0),await o.yieldToMain());try{if(await e.load(),!e.getContentContainer())return;let i=await this.findTarget(e,t),a=i?.target,o=i?.pageNumber,s=i?.isDocumentStart;if(!a&&!o)return;let c=this.resolveRedirectTarget(a,t);r==`scroll`?t.suppressScroll?this.setDocumentVisible(e.getWrapperContainer(),!0):c&&await this.gotoScroll(e,t,c,s):(o=await this.resolvePageNumber(e,t,c,o),await this.transformPage(e,o,n?void 0:t.direction))}finally{a&&i&&await i.revealCoveredLoad()}}async resolvePageNumber(e,t,n,r){let i=await e.getNumberOfPages(),a=t.unit===`page`&&t.current!=null&&t.current>0;return a&&t.total===i?m.remapStoredPageNumber(t,i):l.isDomRange(n)?e.getPageNumber(n):a?m.remapStoredPageNumber(t,i):n?e.getPageNumber(n):r}resolveRedirectTarget(e,t){if(!e||!(t?.textOffset>=0))return e;let n=e.textContent??``;if(t.textOffset>=n.length)return e;let r=t.textOffset,a=e.firstElementChild;return a&&i.compareTagName(a.tagName,`ST`)&&a.getBoundingClientRect().width==0&&(r=a.textContent?.length??0),r>=n.length?e:c.createRange(e,e,r,Math.min(r+1,n.length))??e}async gotoScroll(t,n,r,i){if(f.getLayoutGeometry(this.htmlOptions).blockAxis==`x`){await this.gotoScrollX(t,n,r,i);return}let a=l.getLocateElement(r),o=l.getLocateClientRect(r),c=0;n?.ignoreOverlayHeader||(c=this.owner.options.redirectPositionOffset,o.height==0&&(!a||a.clientHeight==0)&&(c+=50)),n.offsetTop&&(c+=n.offsetTop);let u=this.getScrollElement(),d=o.y,p=t.getContentContainer().ownerDocument.defaultView?.frameElement,m=p?.getBoundingClientRect()?.y??0,h=d+m,g=u.scrollTop;if(n.useAbsoluteScrollTop){let e=g+h-c;u.scrollTo(0,e)}else if(i)this.scrollWrapperIntoView(t,!0);else{if(e.BrowserCapabilities.isSafari()){s.scrollElementIntoView(t.getWrapperContainer(),void 0,void 0,this.owner.getRootContainer()?.ownerDocument),g=u.scrollTop;let e=p?.offsetTop??0;if(Math.abs(e+d-g)>5){let e=g+t.getWrapperContainer().getBoundingClientRect().y+d;u.scrollTo(0,e)}let n=l.getLocateClientRect(r).y;m=p?.getBoundingClientRect()?.y??0,h=n+m}c=h-c-u.getBoundingClientRect().top,c>0?u.scrollHeight-u.scrollTop-u.clientHeight>0?u.scrollBy(0,c):a&&s.scrollElementIntoView(a,void 0,n?.scrollIntoViewIfNeeded,this.owner.getRootContainer()?.ownerDocument):u.scrollBy(0,c),this.setDocumentVisible(t.getWrapperContainer(),!0)}}async gotoScrollX(e,t,n,r){let i=this.getScrollElement();if(r){this.scrollWrapperIntoView(e,!0);return}let a=l.getLocateClientRect(n),o=(e.getContentContainer().ownerDocument.defaultView?.frameElement)?.getBoundingClientRect()?.x??0,s=i.getBoundingClientRect(),c=t.offsetLeft??0,u=a.x+o-c,d=a.right+o-c,p=f.getLayoutGeometry(this.htmlOptions).getScrollLocateDelta({targetStart:u,viewportStart:s.left,targetEnd:d,viewportEnd:s.right});if(t.useAbsoluteScrollTop){i.scrollTo(i.scrollLeft+p,i.scrollTop),this.setDocumentVisible(e.getWrapperContainer(),!0);return}i.scrollBy(p,0),this.setDocumentVisible(e.getWrapperContainer(),!0)}async findTarget(e,t){return this.elementLocator.locateElement(e,t,this.htmlOptions)}async transformPage(e,t,n){if(this.setCurrentVisibleDocument(e),f.getLayoutGeometry(this.htmlOptions).pageAxis==`y`){this.transformVerticalPage(e,t,n);return}this.transformHorizontalPage(e,t,n)}transformHorizontalPage(e,t,n){let r=this.resolveRelativePageTransform(e,t,n,`x`);if(!r){this.syncPageNumberWhenTransformBlocked(e,n);return}this.applyPageTransform(r.transformContainer,r.newTransformLength,n,`x`),this.setCurrentPageNumber(e,t)}transformVerticalPage(e,t,n){let r=this.resolveRelativePageTransform(e,t,n,`y`);if(!r){this.syncPageNumberWhenTransformBlocked(e,n);return}this.applyPageTransform(r.transformContainer,r.newTransformLength,n,`y`),this.setCurrentPageNumber(e,t)}resolveRelativePageTransform(e,t,n,i){let a=this.getTransformContainer();if(!a)return null;let o=s.getTransformLength(a,i),c=a.getAttribute(`data-target-transform`),l=0;l=c?r.parseNumber(c,0,`parseFloat`):o;let u=this.rendererViewport.getLayoutMetrics(),d=Math.max(1,u.pageMoveLength);if(n==`previous`)return{transformContainer:a,newTransformLength:Math.max(0,l-d)};if(n==`next`){let e=l+d;return this.wouldExceedLastContent(e,i,a)?null:{transformContainer:a,newTransformLength:e}}let f=this.getDocumentPageStartOffset(e,i),p=f+(t-1)*u.pageMoveLength,m=i==`y`?e.getWrapperContainer()?.scrollHeight??0:this.getDocumentPageBox(e).contentWidth,h=i==`y`?u.pageHeight:u.pageWidth,g=Number.isFinite(h)&&h>0?h:u.pageMoveLength,_=Math.max(0,f+m-g);return p>_&&(p=_),p<0&&(p=0),{transformContainer:a,newTransformLength:p}}canAdvancePageTransform(e){let t=f.getLayoutGeometry(this.htmlOptions),n=this.getCurrentPageNumber(e)+1;return this.resolveRelativePageTransform(e,n,`next`,t.pageAxis)!=null}wouldExceedLastContent(e,t,n){return this.getLastContentExtent(t,n)-e<=0}getLastContentExtent(e,t){let n=this.getDocuments(),r=n[n.length-1]?.getWrapperContainer();return r?f.getLayoutGeometry(this.htmlOptions).getLastContentExtent(r,t):0}syncPageNumberWhenTransformBlocked(e,t){if(t!=`next`)return;let n=e.getContentContainer()?.ownerDocument?.documentElement,i=r.parseNumber(n?.getAttribute(u.HtmlSettings.HtmlDocumentNumperOfPagesPropertyName),this.getCurrentPageNumber(e),`parseInt`);this.setCurrentPageNumber(e,i)}getDocumentPageStartOffset(e,t){let n=e.getWrapperContainer(),r=this.getDocumentPageBox(e);return f.getLayoutGeometry(this.htmlOptions).getDocumentPageStartOffset(n,r)}getDocumentPageBox(e){let t=e.getWrapperContainer(),n=(e.getContentContainer()?.ownerDocument?.documentElement)?.ownerDocument?.defaultView?.frameElement,r=n?.offsetWidth||(t?.clientWidth??0),i=this.getTransformContainer(),a=n&&i?b.getLayoutOffsetLeft(n,i):t?.offsetLeft??0,o=i?.offsetWidth??0;return{offsetLeft:a,contentWidth:r,startOffset:f.getLayoutGeometry(this.htmlOptions).getPageStartOffset({offsetLeft:a,contentWidth:r,containerWidth:o}),containerWidth:o}}applyPageTransform(e,t,n,r=`x`){let i=f.getLayoutGeometry(this.htmlOptions),a=parseFloat(t.toFixed(10)),o=i.getPageTranslateCss(a),c=i.getSignedTranslateLength(a),l=s.getTransformLength(e,r,!0);e.setAttribute(`data-target-transform`,`${a}`),!(n&&Math.abs(c-l)<=.5)&&(!e.style.transition&&this.htmlOptions.flipPageStyle==`slide`&&(n==`next`||n==`previous`)&&(e.style.transition=`transform 0.2s ease`),e.style.transition&&e.addEventListener(`transitionend`,this.removeElementTransitionEvent),e.style.transform=o)}setCurrentPageNumber(e,t){let n=e.getContentContainer()?.ownerDocument?.documentElement;n&&n.setAttribute(u.HtmlSettings.HtmlDocumentCurrentPagePropertyName,t.toFixed(0))}getCurrentPageNumber(e){let t=e.getContentContainer()?.ownerDocument?.documentElement;if(!t)return 1;let n=t.getAttribute(u.HtmlSettings.HtmlDocumentCurrentPagePropertyName);return r.parseNumber(n,1,`parseInt`)}async syncPageState(e){(e.getContentContainer()?.ownerDocument?.documentElement)?.removeAttribute(u.HtmlSettings.HtmlDocumentNumperOfPagesPropertyName);let t=Math.max(1,await e.getNumberOfPages()),n=f.getLayoutGeometry(this.htmlOptions),i=this.rendererViewport.getLayoutMetrics(),a=Math.max(1,i.pageMoveLength),o=this.getTransformContainer(),s=r.parseNumber(o?.getAttribute(`data-target-transform`),0,`parseFloat`),c=this.getDocumentPageStartOffset(e,n.pageAxis),l=Math.min(t,Math.max(1,Math.round(Math.abs(s-c)/a)+1));return this.setCurrentPageNumber(e,l),{current:l,total:t}}setCurrentVisibleDocument(e){for(let t of this.getDocuments())this.setDocumentVisible(t.getWrapperContainer(),t===e)}shouldRealignAfterPreload(e,t){return t||e?.direction==`next`||e?.direction==`previous`?!1:f.getLayoutGeometry(this.htmlOptions).flipMode==`page`}appendPageStyles(){}clearPageTransform(){let e=this.getTransformContainer();e&&(e.style.removeProperty(`transition`),e.style.removeProperty(`transform`),e.removeAttribute(`data-target-transform`),e.offsetWidth)}removePageStyles(){this.getRendererContainer().classList.remove(u.HtmlSettings.TransformPagesClassName),this.clearPageTransform()}async dispose(){await this.documentsIntersectionObserver.dispose(),await this.documentPreloader.dispose(),await super.dispose(),this.readerContainer&&a.emptyElement(this.readerContainer),this.isInit=!1}};exports.HtmlDocumentsProvider=S;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../../kernal/web/BrowserCapabilities.cjs"),t=require("../../../../kernal/common/text.cjs"),n=require("../../../../kernal/progress/Progress.cjs");require("../../../../kernal/Constants.cjs");const r=require("../../../../kernal/common/number.cjs"),i=require("../../../../kernal/html/finder.cjs"),a=require("../../../../kernal/html/dom.cjs"),o=require("../../../../kernal/web/scheduler.cjs"),s=require("../../HtmlSettings.cjs"),c=require("../../../base/renderer/BaseDocumentsProvider.cjs"),l=require("../../../../kernal/html/style.cjs"),u=require("../../../../kernal/html/selection.cjs"),d=require("../../../../kernal/html/geometry.cjs"),f=require("../layout/resolveLayoutRoute.cjs"),p=require("../location/scrollActivity.cjs"),m=require("../location/remapStoredPageNumber.cjs"),h=require("../document/HtmlDocument.cjs"),g=require("./HtmlDocumentsPreloader.cjs"),_=require("./HtmlDocumentsIntersectionObserver.cjs"),v=require("../location/HtmlElementLocator.cjs"),y=require("../layout/HtmlRendererViewport.cjs"),b=require("../layout/geometry/getLayoutOffsetLeft.cjs");let x=require("perfect-debounce");var S=class extends c.BaseDocumentsProvider{constructor(e,n,r,i){super(e,n),this.readerContainer=r,this.htmlOptions=i,this.isInit=!1,this.isFirstLoad=!0,this.hangTasks=[],this.resetTransformContainer=()=>{let e=this.getTransformContainer();e&&(e.style.removeProperty(`transition`),e.style.transform=`translate3d(0px,0,0)`,e.setAttribute(`data-target-transform`,`0`),e.offsetWidth)},this.removeElementTransitionEvent=async e=>{let t=e.target;for(t.style.removeProperty(`transition`),t.style.removeProperty(`will-change`),t.removeAttribute(s.HtmlSettings.PageMovingAttributeName),t.removeEventListener(`transitionend`,this.removeElementTransitionEvent);this.hangTasks.length>0;)await this.hangTasks.shift()()},this.scrollWrapperIntoView=(e,t)=>{let n=e.getWrapperContainer(),r=f.getLayoutGeometry(this.htmlOptions);if(r.flipMode==`page`){let t=this.rendererViewport.getLayoutMetrics(),i=this.getTransformContainer();if(r.pageAxis==`y`){let e=Math.max(0,n.offsetTop);i.style.transform=r.getPageTranslateCss(e),i.setAttribute(`data-target-transform`,`${e}`)}else{let n=this.getDocumentPageBox(e),a=r.getPageTransformOffset(n,1,t.pageMoveLength);i.style.transform=r.getPageTranslateCss(a),i.setAttribute(`data-target-transform`,`${a}`)}}else(!n.isVisible||t)&&r.alignWrapperToViewport({wrapper:n,scrollElement:this.getScrollElement(),rootDocument:this.owner.getRootContainer()?.ownerDocument});this.setCurrentVisibleDocument(e)},this.setDocumentVisible=(e,t)=>{e.isVisible=t},this.reload=async()=>{let e=this.owner.context.currentLocation;t.isNullOrWhiteSpace(e?.url)||await this.load(e,!0)},this.restoreReadingPosition=async()=>{let e=this.owner.context.currentLocation;if(t.isNullOrWhiteSpace(e?.url))return;let n=this.getDocument(e.url)??this.getFirstVisibleDocument();n&&await this.gotoDoc(n,e,!0)},this.delayRestoreReadingPosition=(0,x.debounce)(this.restoreReadingPosition,100),this.delayReloadTime=300,this.delayReload=(0,x.debounce)(this.reload,this.delayReloadTime),i.documentLanguage=e.context?.metadata?.language,this.logger=this.owner.loggerFactory.getLogger(this.constructor.name),this.elementLocator=new v.HtmlElementLocator(this),this.rendererViewport=new y.HtmlRendererViewport(e,this.readerContainer,this.owner.optionsProvider,i),this.documentsIntersectionObserver=new _.HtmlDocumentsIntersectionObserver(this),this.documentPreloader=new g.HtmlDocumentsPreloader(this.owner.events,this,()=>this.loadingDoc,i)}getTransformContainer(){return this.getRendererContainer().querySelector(`.`+s.HtmlSettings.TransformContainerCssName)}getRendererContainer(){return this.rendererViewport.getRendererContainer()}getScrollElement(){return this.rendererViewport.getScrollElement()}getLoadingDocument(){return this.loadingDoc}getLoadedDocuments(){return this.getDocuments().filter(e=>e.getLoadStatus()==`success`)}getVisibleDocuments(){return this.getDocuments().filter(e=>e.getWrapperContainer()?.isVisible)}getFirstVisibleDocument(e){let t=this.getVisibleDocuments();if(e){let e=t.find(e=>e.getVisibleElements(!0).length>0);if(e)return e}if(t[0])return t[0];let n=this.owner.context.currentLocation?.url;return n&&this.getDocument(n)||this.getDocuments()[0]||null}getLastVisibleDocument(e){let t=this.getVisibleDocuments();if(e){let e=[...t].reverse().find(e=>e.getVisibleElements().length>0);if(e)return e}if(t.length>0)return t[t.length-1];let n=this.owner.context.currentLocation?.url,r=this.getDocuments();return n&&this.getDocument(n)||r[r.length-1]||null}async createDocument(e,t,n){return new h.HtmlDocument(this.owner,this.rendererViewport,this.fileParser,e,t,this.htmlOptions)}async initialize(e){this.rendererViewport.applyCssVariables(),await super.initialize(e);let t=this.getDocuments();for(let e of t)e.getWrapperContainer().classList.add(s.HtmlSettings.FileContentContainerClassName,s.HtmlSettings.FileContentContainerHeightClassName)}async load(e,t){this.htmlOptions.documentLanguage=this.owner.context?.metadata?.language,this.isInit||=(await this.initialize(this.getTransformContainer()),this.documentsIntersectionObserver.register(),!0),e?.storeCurrent&&await this.owner.onBeforeRedirect?.(this),t??=!1;let r=e?.url,i=this.getDocument(r);if(!i){let t=this.getDocuments();i=t[0],(t.length>1||!e)&&(e=new n.FileLocation(i.url,1,`ratio`),e.current=0)}f.getLayoutGeometry(this.htmlOptions).flipMode==`page`?this.appendPageStyles():this.removePageStyles(),this.loadingDoc=i,this.owner.context.redirectingDocUrl=i.url,p.shouldBeginAbsoluteLocate(e?.direction,f.getLayoutGeometry(this.htmlOptions).holdsAbsoluteLocate)&&p.beginAbsoluteLocate();try{this.owner.context.setUserChangedProgress(!t,e?.from),!t&&e?.url&&(this.owner.context.currentLocation=e),await this.gotoDoc(i,e,t),this.isFirstLoad&&!t&&(await this.owner.loading?.hide(),this.isFirstLoad=!1),await this.documentPreloader.preloadDocuments(),this.shouldRealignAfterPreload(e,t)&&await this.gotoDoc(i,e,!0)}finally{setTimeout(()=>{this.loadingDoc=null,this.owner.context.redirectingDocUrl=void 0},166)}}async gotoDoc(e,t,n){if(!t)return;n??=!1;let r=f.getLayoutGeometry(this.htmlOptions).flipMode,i=e instanceof h.HtmlDocument?e:null,a=!!i&&r==`scroll`&&!n&&!t.suppressScroll&&e.getLoadStatus()!=`success`;a&&i&&(i.prepareCoveredLoad(),this.scrollWrapperIntoView(e,!0),await o.yieldToMain());try{if(await e.load(),!e.getContentContainer())return;let i=await this.findTarget(e,t),a=i?.target,o=i?.pageNumber,s=i?.isDocumentStart;if(!a&&!o)return;let c=this.resolveRedirectTarget(a,t);r==`scroll`?t.suppressScroll?this.setDocumentVisible(e.getWrapperContainer(),!0):c&&await this.gotoScroll(e,t,c,s):(o=await this.resolvePageNumber(e,t,c,o),await this.transformPage(e,o,n?void 0:t.direction))}finally{a&&i&&await i.revealCoveredLoad()}}async resolvePageNumber(e,t,n,r){let i=await e.getNumberOfPages(),a=t.unit===`page`&&t.current!=null&&t.current>0;return a&&t.total===i?m.remapStoredPageNumber(t,i):d.isDomRange(n)?e.getPageNumber(n):a?m.remapStoredPageNumber(t,i):n?e.getPageNumber(n):r}resolveRedirectTarget(e,t){if(!e||!(t?.textOffset>=0))return e;let n=e.textContent??``;if(t.textOffset>=n.length)return e;let r=t.textOffset,a=e.firstElementChild;return a&&i.compareTagName(a.tagName,`ST`)&&a.getBoundingClientRect().width==0&&(r=a.textContent?.length??0),r>=n.length?e:u.createRange(e,e,r,Math.min(r+1,n.length))??e}async gotoScroll(t,n,r,i){if(f.getLayoutGeometry(this.htmlOptions).blockAxis==`x`){await this.gotoScrollX(t,n,r,i);return}let a=d.getLocateElement(r),o=d.getLocateClientRect(r),s=0;n?.ignoreOverlayHeader||(s=this.owner.options.redirectPositionOffset,o.height==0&&(!a||a.clientHeight==0)&&(s+=50)),n.offsetTop&&(s+=n.offsetTop);let c=this.getScrollElement(),u=o.y,p=t.getContentContainer().ownerDocument.defaultView?.frameElement,m=p?.getBoundingClientRect()?.y??0,h=u+m,g=c.scrollTop;if(n.useAbsoluteScrollTop){let e=g+h-s;c.scrollTo(0,e)}else if(i)this.scrollWrapperIntoView(t,!0);else{if(e.BrowserCapabilities.isSafari()){l.scrollElementIntoView(t.getWrapperContainer(),void 0,void 0,this.owner.getRootContainer()?.ownerDocument),g=c.scrollTop;let e=p?.offsetTop??0;if(Math.abs(e+u-g)>5){let e=g+t.getWrapperContainer().getBoundingClientRect().y+u;c.scrollTo(0,e)}let n=d.getLocateClientRect(r).y;m=p?.getBoundingClientRect()?.y??0,h=n+m}s=h-s-c.getBoundingClientRect().top,s>0?c.scrollHeight-c.scrollTop-c.clientHeight>0?c.scrollBy(0,s):a&&l.scrollElementIntoView(a,void 0,n?.scrollIntoViewIfNeeded,this.owner.getRootContainer()?.ownerDocument):c.scrollBy(0,s),this.setDocumentVisible(t.getWrapperContainer(),!0)}}async gotoScrollX(e,t,n,r){let i=this.getScrollElement();if(r){this.scrollWrapperIntoView(e,!0);return}let a=d.getLocateClientRect(n),o=(e.getContentContainer().ownerDocument.defaultView?.frameElement)?.getBoundingClientRect()?.x??0,s=i.getBoundingClientRect(),c=t.offsetLeft??0,l=a.x+o-c,u=a.right+o-c,p=f.getLayoutGeometry(this.htmlOptions).getScrollLocateDelta({targetStart:l,viewportStart:s.left,targetEnd:u,viewportEnd:s.right});if(t.useAbsoluteScrollTop){i.scrollTo(i.scrollLeft+p,i.scrollTop),this.setDocumentVisible(e.getWrapperContainer(),!0);return}i.scrollBy(p,0),this.setDocumentVisible(e.getWrapperContainer(),!0)}async findTarget(e,t){return this.elementLocator.locateElement(e,t,this.htmlOptions)}async transformPage(e,t,n){if(this.setCurrentVisibleDocument(e),f.getLayoutGeometry(this.htmlOptions).pageAxis==`y`){this.transformVerticalPage(e,t,n);return}this.transformHorizontalPage(e,t,n)}transformHorizontalPage(e,t,n){let r=this.resolveRelativePageTransform(e,t,n,`x`);if(!r){this.syncPageNumberWhenTransformBlocked(e,n);return}this.applyPageTransform(r.transformContainer,r.newTransformLength,n,`x`),this.setCurrentPageNumber(e,t)}transformVerticalPage(e,t,n){let r=this.resolveRelativePageTransform(e,t,n,`y`);if(!r){this.syncPageNumberWhenTransformBlocked(e,n);return}this.applyPageTransform(r.transformContainer,r.newTransformLength,n,`y`),this.setCurrentPageNumber(e,t)}resolveRelativePageTransform(e,t,n,i){let a=this.getTransformContainer();if(!a)return null;let o=l.getTransformLength(a,i),s=a.getAttribute(`data-target-transform`),c=0;c=s?r.parseNumber(s,0,`parseFloat`):o;let u=this.rendererViewport.getLayoutMetrics(),d=Math.max(1,u.pageMoveLength);if(n==`previous`)return{transformContainer:a,newTransformLength:Math.max(0,c-d)};if(n==`next`){let e=c+d;return this.wouldExceedLastContent(e,i,a)?null:{transformContainer:a,newTransformLength:e}}let f=this.getDocumentPageStartOffset(e,i),p=f+(t-1)*u.pageMoveLength,m=i==`y`?e.getWrapperContainer()?.scrollHeight??0:this.getDocumentPageBox(e).contentWidth,h=i==`y`?u.pageHeight:u.pageWidth,g=Number.isFinite(h)&&h>0?h:u.pageMoveLength,_=Math.max(0,f+m-g);return p>_&&(p=_),p<0&&(p=0),{transformContainer:a,newTransformLength:p}}canAdvancePageTransform(e){let t=f.getLayoutGeometry(this.htmlOptions),n=this.getCurrentPageNumber(e)+1;return this.resolveRelativePageTransform(e,n,`next`,t.pageAxis)!=null}wouldExceedLastContent(e,t,n){return this.getLastContentExtent(t,n)-e<=0}getLastContentExtent(e,t){let n=this.getDocuments(),r=n[n.length-1]?.getWrapperContainer();return r?f.getLayoutGeometry(this.htmlOptions).getLastContentExtent(r,t):0}syncPageNumberWhenTransformBlocked(e,t){if(t!=`next`)return;let n=e.getContentContainer()?.ownerDocument?.documentElement,i=r.parseNumber(n?.getAttribute(s.HtmlSettings.HtmlDocumentNumperOfPagesPropertyName),this.getCurrentPageNumber(e),`parseInt`);this.setCurrentPageNumber(e,i)}getDocumentPageStartOffset(e,t){let n=e.getWrapperContainer(),r=this.getDocumentPageBox(e);return f.getLayoutGeometry(this.htmlOptions).getDocumentPageStartOffset(n,r)}getDocumentPageBox(e){let t=e.getWrapperContainer(),n=(e.getContentContainer()?.ownerDocument?.documentElement)?.ownerDocument?.defaultView?.frameElement,r=n?.offsetWidth||(t?.clientWidth??0),i=this.getTransformContainer(),a=n&&i?b.getLayoutOffsetLeft(n,i):t?.offsetLeft??0,o=i?.offsetWidth??0;return{offsetLeft:a,contentWidth:r,startOffset:f.getLayoutGeometry(this.htmlOptions).getPageStartOffset({offsetLeft:a,contentWidth:r,containerWidth:o}),containerWidth:o}}applyPageTransform(e,t,n,r=`x`){let i=f.getLayoutGeometry(this.htmlOptions),a=parseFloat(t.toFixed(10)),o=i.getPageTranslateCss(a),s=i.getSignedTranslateLength(a),c=l.getTransformLength(e,r,!0);e.setAttribute(`data-target-transform`,`${a}`),!(n&&Math.abs(s-c)<=.5)&&(!e.style.transition&&this.htmlOptions.flipPageStyle==`slide`&&(n==`next`||n==`previous`)&&(e.style.transition=`transform 0.2s ease`),e.style.transition&&e.addEventListener(`transitionend`,this.removeElementTransitionEvent),e.style.transform=o)}setCurrentPageNumber(e,t){let n=e.getContentContainer()?.ownerDocument?.documentElement;n&&n.setAttribute(s.HtmlSettings.HtmlDocumentCurrentPagePropertyName,t.toFixed(0))}getCurrentPageNumber(e){let t=e.getContentContainer()?.ownerDocument?.documentElement;if(!t)return 1;let n=t.getAttribute(s.HtmlSettings.HtmlDocumentCurrentPagePropertyName);return r.parseNumber(n,1,`parseInt`)}async syncPageState(e){(e.getContentContainer()?.ownerDocument?.documentElement)?.removeAttribute(s.HtmlSettings.HtmlDocumentNumperOfPagesPropertyName);let t=Math.max(1,await e.getNumberOfPages()),n=f.getLayoutGeometry(this.htmlOptions),i=this.rendererViewport.getLayoutMetrics(),a=Math.max(1,i.pageMoveLength),o=this.getTransformContainer(),c=r.parseNumber(o?.getAttribute(`data-target-transform`),0,`parseFloat`),l=this.getDocumentPageStartOffset(e,n.pageAxis),u=Math.min(t,Math.max(1,Math.round(Math.abs(c-l)/a)+1));return this.setCurrentPageNumber(e,u),{current:u,total:t}}setCurrentVisibleDocument(e){for(let t of this.getDocuments())this.setDocumentVisible(t.getWrapperContainer(),t===e)}shouldRealignAfterPreload(e,t){return t||e?.direction==`next`||e?.direction==`previous`?!1:f.getLayoutGeometry(this.htmlOptions).flipMode==`page`}appendPageStyles(){}clearPageTransform(){let e=this.getTransformContainer();e&&(e.style.removeProperty(`transition`),e.style.removeProperty(`transform`),e.removeAttribute(`data-target-transform`),e.offsetWidth)}removePageStyles(){this.getRendererContainer().classList.remove(s.HtmlSettings.TransformPagesClassName),this.clearPageTransform()}async dispose(){await this.documentsIntersectionObserver.dispose(),await this.documentPreloader.dispose(),await super.dispose(),this.readerContainer&&a.emptyElement(this.readerContainer),this.isInit=!1}};exports.HtmlDocumentsProvider=S;
|
|
@@ -7,11 +7,11 @@ import { compareTagName as i } from "../../../../kernal/html/finder.mjs";
|
|
|
7
7
|
import { emptyElement as a } from "../../../../kernal/html/dom.mjs";
|
|
8
8
|
import { yieldToMain as o } from "../../../../kernal/web/scheduler.mjs";
|
|
9
9
|
import { asyncDebounce as s } from "../../../../kernal/web/debounce.mjs";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
10
|
+
import { HtmlSettings as c } from "../../HtmlSettings.mjs";
|
|
11
|
+
import { BaseDocumentsProvider as l } from "../../../base/renderer/BaseDocumentsProvider.mjs";
|
|
12
|
+
import { getTransformLength as u, scrollElementIntoView as d } from "../../../../kernal/html/style.mjs";
|
|
13
|
+
import { createRange as f } from "../../../../kernal/html/selection.mjs";
|
|
14
|
+
import { getLocateClientRect as p, getLocateElement as m, isDomRange as h } from "../../../../kernal/html/geometry.mjs";
|
|
15
15
|
import { getLayoutGeometry as g } from "../layout/resolveLayoutRoute.mjs";
|
|
16
16
|
import { beginAbsoluteLocate as _, shouldBeginAbsoluteLocate as v } from "../location/scrollActivity.mjs";
|
|
17
17
|
import { remapStoredPageNumber as y } from "../location/remapStoredPageNumber.mjs";
|
|
@@ -22,14 +22,14 @@ import { HtmlElementLocator as C } from "../location/HtmlElementLocator.mjs";
|
|
|
22
22
|
import { HtmlRendererViewport as w } from "../layout/HtmlRendererViewport.mjs";
|
|
23
23
|
import { getLayoutOffsetLeft as T } from "../layout/geometry/getLayoutOffsetLeft.mjs";
|
|
24
24
|
//#region mediaTypes/html/renderer/documents/HtmlDocumentsProvider.ts
|
|
25
|
-
var E = class extends
|
|
25
|
+
var E = class extends l {
|
|
26
26
|
constructor(e, n, r, i) {
|
|
27
27
|
super(e, n), this.readerContainer = r, this.htmlOptions = i, this.isInit = !1, this.isFirstLoad = !0, this.hangTasks = [], this.resetTransformContainer = () => {
|
|
28
28
|
let e = this.getTransformContainer();
|
|
29
29
|
e && (e.style.removeProperty("transition"), e.style.transform = "translate3d(0px,0,0)", e.setAttribute("data-target-transform", "0"), e.offsetWidth);
|
|
30
30
|
}, this.removeElementTransitionEvent = async (e) => {
|
|
31
31
|
let t = e.target;
|
|
32
|
-
for (t.style.removeProperty("transition"), t.style.removeProperty("will-change"), t.removeAttribute(
|
|
32
|
+
for (t.style.removeProperty("transition"), t.style.removeProperty("will-change"), t.removeAttribute(c.PageMovingAttributeName), t.removeEventListener("transitionend", this.removeElementTransitionEvent); this.hangTasks.length > 0;) await this.hangTasks.shift()();
|
|
33
33
|
}, this.scrollWrapperIntoView = (e, t) => {
|
|
34
34
|
let n = e.getWrapperContainer(), r = g(this.htmlOptions);
|
|
35
35
|
if (r.flipMode == "page") {
|
|
@@ -60,7 +60,7 @@ var E = class extends h {
|
|
|
60
60
|
}, this.delayRestoreReadingPosition = s(this.restoreReadingPosition, 100), this.delayReloadTime = 300, this.delayReload = s(this.reload, this.delayReloadTime), i.documentLanguage = e.context?.metadata?.language, this.logger = this.owner.loggerFactory.getLogger(this.constructor.name), this.elementLocator = new C(this), this.rendererViewport = new w(e, this.readerContainer, this.owner.optionsProvider, i), this.documentsIntersectionObserver = new S(this), this.documentPreloader = new x(this.owner.events, this, () => this.loadingDoc, i);
|
|
61
61
|
}
|
|
62
62
|
getTransformContainer() {
|
|
63
|
-
return this.getRendererContainer().querySelector("." +
|
|
63
|
+
return this.getRendererContainer().querySelector("." + c.TransformContainerCssName);
|
|
64
64
|
}
|
|
65
65
|
getRendererContainer() {
|
|
66
66
|
return this.rendererViewport.getRendererContainer();
|
|
@@ -103,7 +103,7 @@ var E = class extends h {
|
|
|
103
103
|
async initialize(e) {
|
|
104
104
|
this.rendererViewport.applyCssVariables(), await super.initialize(e);
|
|
105
105
|
let t = this.getDocuments();
|
|
106
|
-
for (let e of t) e.getWrapperContainer().classList.add(
|
|
106
|
+
for (let e of t) e.getWrapperContainer().classList.add(c.FileContentContainerClassName, c.FileContentContainerHeightClassName);
|
|
107
107
|
}
|
|
108
108
|
async load(e, t) {
|
|
109
109
|
this.htmlOptions.documentLanguage = this.owner.context?.metadata?.language, this.isInit ||= (await this.initialize(this.getTransformContainer()), this.documentsIntersectionObserver.register(), !0), e?.storeCurrent && await this.owner.onBeforeRedirect?.(this), t ??= !1;
|
|
@@ -138,39 +138,39 @@ var E = class extends h {
|
|
|
138
138
|
}
|
|
139
139
|
async resolvePageNumber(e, t, n, r) {
|
|
140
140
|
let i = await e.getNumberOfPages(), a = t.unit === "page" && t.current != null && t.current > 0;
|
|
141
|
-
return a && t.total === i ? y(t, i) :
|
|
141
|
+
return a && t.total === i ? y(t, i) : h(n) ? e.getPageNumber(n) : a ? y(t, i) : n ? e.getPageNumber(n) : r;
|
|
142
142
|
}
|
|
143
143
|
resolveRedirectTarget(e, t) {
|
|
144
144
|
if (!e || !(t?.textOffset >= 0)) return e;
|
|
145
145
|
let n = e.textContent ?? "";
|
|
146
146
|
if (t.textOffset >= n.length) return e;
|
|
147
147
|
let r = t.textOffset, a = e.firstElementChild;
|
|
148
|
-
return a && i(a.tagName, "ST") && a.getBoundingClientRect().width == 0 && (r = a.textContent?.length ?? 0), r >= n.length ? e :
|
|
148
|
+
return a && i(a.tagName, "ST") && a.getBoundingClientRect().width == 0 && (r = a.textContent?.length ?? 0), r >= n.length ? e : f(e, e, r, Math.min(r + 1, n.length)) ?? e;
|
|
149
149
|
}
|
|
150
150
|
async gotoScroll(t, n, r, i) {
|
|
151
151
|
if (g(this.htmlOptions).blockAxis == "x") {
|
|
152
152
|
await this.gotoScrollX(t, n, r, i);
|
|
153
153
|
return;
|
|
154
154
|
}
|
|
155
|
-
let a =
|
|
155
|
+
let a = m(r), o = p(r), s = 0;
|
|
156
156
|
n?.ignoreOverlayHeader || (s = this.owner.options.redirectPositionOffset, o.height == 0 && (!a || a.clientHeight == 0) && (s += 50)), n.offsetTop && (s += n.offsetTop);
|
|
157
|
-
let c = this.getScrollElement(),
|
|
157
|
+
let c = this.getScrollElement(), l = o.y, u = t.getContentContainer().ownerDocument.defaultView?.frameElement, f = u?.getBoundingClientRect()?.y ?? 0, h = l + f, _ = c.scrollTop;
|
|
158
158
|
if (n.useAbsoluteScrollTop) {
|
|
159
159
|
let e = _ + h - s;
|
|
160
160
|
c.scrollTo(0, e);
|
|
161
161
|
} else if (i) this.scrollWrapperIntoView(t, !0);
|
|
162
162
|
else {
|
|
163
163
|
if (e.isSafari()) {
|
|
164
|
-
|
|
165
|
-
let e =
|
|
166
|
-
if (Math.abs(e +
|
|
167
|
-
let e = _ + t.getWrapperContainer().getBoundingClientRect().y +
|
|
164
|
+
d(t.getWrapperContainer(), void 0, void 0, this.owner.getRootContainer()?.ownerDocument), _ = c.scrollTop;
|
|
165
|
+
let e = u?.offsetTop ?? 0;
|
|
166
|
+
if (Math.abs(e + l - _) > 5) {
|
|
167
|
+
let e = _ + t.getWrapperContainer().getBoundingClientRect().y + l;
|
|
168
168
|
c.scrollTo(0, e);
|
|
169
169
|
}
|
|
170
|
-
let n =
|
|
171
|
-
|
|
170
|
+
let n = p(r).y;
|
|
171
|
+
f = u?.getBoundingClientRect()?.y ?? 0, h = n + f;
|
|
172
172
|
}
|
|
173
|
-
s = h - s - c.getBoundingClientRect().top, s > 0 ? c.scrollHeight - c.scrollTop - c.clientHeight > 0 ? c.scrollBy(0, s) : a &&
|
|
173
|
+
s = h - s - c.getBoundingClientRect().top, s > 0 ? c.scrollHeight - c.scrollTop - c.clientHeight > 0 ? c.scrollBy(0, s) : a && d(a, void 0, n?.scrollIntoViewIfNeeded, this.owner.getRootContainer()?.ownerDocument) : c.scrollBy(0, s), this.setDocumentVisible(t.getWrapperContainer(), !0);
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
176
|
async gotoScrollX(e, t, n, r) {
|
|
@@ -179,17 +179,17 @@ var E = class extends h {
|
|
|
179
179
|
this.scrollWrapperIntoView(e, !0);
|
|
180
180
|
return;
|
|
181
181
|
}
|
|
182
|
-
let a =
|
|
182
|
+
let a = p(n), o = (e.getContentContainer().ownerDocument.defaultView?.frameElement)?.getBoundingClientRect()?.x ?? 0, s = i.getBoundingClientRect(), c = t.offsetLeft ?? 0, l = a.x + o - c, u = a.right + o - c, d = g(this.htmlOptions).getScrollLocateDelta({
|
|
183
183
|
targetStart: l,
|
|
184
184
|
viewportStart: s.left,
|
|
185
185
|
targetEnd: u,
|
|
186
186
|
viewportEnd: s.right
|
|
187
187
|
});
|
|
188
188
|
if (t.useAbsoluteScrollTop) {
|
|
189
|
-
i.scrollTo(i.scrollLeft +
|
|
189
|
+
i.scrollTo(i.scrollLeft + d, i.scrollTop), this.setDocumentVisible(e.getWrapperContainer(), !0);
|
|
190
190
|
return;
|
|
191
191
|
}
|
|
192
|
-
i.scrollBy(
|
|
192
|
+
i.scrollBy(d, 0), this.setDocumentVisible(e.getWrapperContainer(), !0);
|
|
193
193
|
}
|
|
194
194
|
async findTarget(e, t) {
|
|
195
195
|
return this.elementLocator.locateElement(e, t, this.htmlOptions);
|
|
@@ -220,21 +220,21 @@ var E = class extends h {
|
|
|
220
220
|
resolveRelativePageTransform(e, t, n, i) {
|
|
221
221
|
let a = this.getTransformContainer();
|
|
222
222
|
if (!a) return null;
|
|
223
|
-
let o =
|
|
224
|
-
|
|
225
|
-
let
|
|
223
|
+
let o = u(a, i), s = a.getAttribute("data-target-transform"), c = 0;
|
|
224
|
+
c = s ? r(s, 0, "parseFloat") : o;
|
|
225
|
+
let l = this.rendererViewport.getLayoutMetrics(), d = Math.max(1, l.pageMoveLength);
|
|
226
226
|
if (n == "previous") return {
|
|
227
227
|
transformContainer: a,
|
|
228
|
-
newTransformLength: Math.max(0,
|
|
228
|
+
newTransformLength: Math.max(0, c - d)
|
|
229
229
|
};
|
|
230
230
|
if (n == "next") {
|
|
231
|
-
let e =
|
|
231
|
+
let e = c + d;
|
|
232
232
|
return this.wouldExceedLastContent(e, i, a) ? null : {
|
|
233
233
|
transformContainer: a,
|
|
234
234
|
newTransformLength: e
|
|
235
235
|
};
|
|
236
236
|
}
|
|
237
|
-
let f = this.getDocumentPageStartOffset(e, i), p = f + (t - 1) *
|
|
237
|
+
let f = this.getDocumentPageStartOffset(e, i), p = f + (t - 1) * l.pageMoveLength, m = i == "y" ? e.getWrapperContainer()?.scrollHeight ?? 0 : this.getDocumentPageBox(e).contentWidth, h = i == "y" ? l.pageHeight : l.pageWidth, g = Number.isFinite(h) && h > 0 ? h : l.pageMoveLength, _ = Math.max(0, f + m - g);
|
|
238
238
|
return p > _ && (p = _), p < 0 && (p = 0), {
|
|
239
239
|
transformContainer: a,
|
|
240
240
|
newTransformLength: p
|
|
@@ -253,7 +253,7 @@ var E = class extends h {
|
|
|
253
253
|
}
|
|
254
254
|
syncPageNumberWhenTransformBlocked(e, t) {
|
|
255
255
|
if (t != "next") return;
|
|
256
|
-
let n = e.getContentContainer()?.ownerDocument?.documentElement, i = r(n?.getAttribute(
|
|
256
|
+
let n = e.getContentContainer()?.ownerDocument?.documentElement, i = r(n?.getAttribute(c.HtmlDocumentNumperOfPagesPropertyName), this.getCurrentPageNumber(e), "parseInt");
|
|
257
257
|
this.setCurrentPageNumber(e, i);
|
|
258
258
|
}
|
|
259
259
|
getDocumentPageStartOffset(e, t) {
|
|
@@ -274,24 +274,24 @@ var E = class extends h {
|
|
|
274
274
|
};
|
|
275
275
|
}
|
|
276
276
|
applyPageTransform(e, t, n, r = "x") {
|
|
277
|
-
let i = g(this.htmlOptions), a = parseFloat(t.toFixed(10)), o = i.getPageTranslateCss(a), s = i.getSignedTranslateLength(a),
|
|
278
|
-
e.setAttribute("data-target-transform", `${a}`), !(n && Math.abs(s -
|
|
277
|
+
let i = g(this.htmlOptions), a = parseFloat(t.toFixed(10)), o = i.getPageTranslateCss(a), s = i.getSignedTranslateLength(a), c = u(e, r, !0);
|
|
278
|
+
e.setAttribute("data-target-transform", `${a}`), !(n && Math.abs(s - c) <= .5) && (!e.style.transition && this.htmlOptions.flipPageStyle == "slide" && (n == "next" || n == "previous") && (e.style.transition = "transform 0.2s ease"), e.style.transition && e.addEventListener("transitionend", this.removeElementTransitionEvent), e.style.transform = o);
|
|
279
279
|
}
|
|
280
280
|
setCurrentPageNumber(e, t) {
|
|
281
281
|
let n = e.getContentContainer()?.ownerDocument?.documentElement;
|
|
282
|
-
n && n.setAttribute(
|
|
282
|
+
n && n.setAttribute(c.HtmlDocumentCurrentPagePropertyName, t.toFixed(0));
|
|
283
283
|
}
|
|
284
284
|
getCurrentPageNumber(e) {
|
|
285
285
|
let t = e.getContentContainer()?.ownerDocument?.documentElement;
|
|
286
286
|
if (!t) return 1;
|
|
287
|
-
let n = t.getAttribute(
|
|
287
|
+
let n = t.getAttribute(c.HtmlDocumentCurrentPagePropertyName);
|
|
288
288
|
return r(n, 1, "parseInt");
|
|
289
289
|
}
|
|
290
290
|
async syncPageState(e) {
|
|
291
|
-
(e.getContentContainer()?.ownerDocument?.documentElement)?.removeAttribute(
|
|
292
|
-
let t = Math.max(1, await e.getNumberOfPages()), n = g(this.htmlOptions), i = this.rendererViewport.getLayoutMetrics(), a = Math.max(1, i.pageMoveLength), o = this.getTransformContainer(), s = r(o?.getAttribute("data-target-transform"), 0, "parseFloat"),
|
|
293
|
-
return this.setCurrentPageNumber(e,
|
|
294
|
-
current:
|
|
291
|
+
(e.getContentContainer()?.ownerDocument?.documentElement)?.removeAttribute(c.HtmlDocumentNumperOfPagesPropertyName);
|
|
292
|
+
let t = Math.max(1, await e.getNumberOfPages()), n = g(this.htmlOptions), i = this.rendererViewport.getLayoutMetrics(), a = Math.max(1, i.pageMoveLength), o = this.getTransformContainer(), s = r(o?.getAttribute("data-target-transform"), 0, "parseFloat"), l = this.getDocumentPageStartOffset(e, n.pageAxis), u = Math.min(t, Math.max(1, Math.round(Math.abs(s - l) / a) + 1));
|
|
293
|
+
return this.setCurrentPageNumber(e, u), {
|
|
294
|
+
current: u,
|
|
295
295
|
total: t
|
|
296
296
|
};
|
|
297
297
|
}
|
|
@@ -307,7 +307,7 @@ var E = class extends h {
|
|
|
307
307
|
e && (e.style.removeProperty("transition"), e.style.removeProperty("transform"), e.removeAttribute("data-target-transform"), e.offsetWidth);
|
|
308
308
|
}
|
|
309
309
|
removePageStyles() {
|
|
310
|
-
this.getRendererContainer().classList.remove(
|
|
310
|
+
this.getRendererContainer().classList.remove(c.TransformPagesClassName), this.clearPageTransform();
|
|
311
311
|
}
|
|
312
312
|
async dispose() {
|
|
313
313
|
await this.documentsIntersectionObserver.dispose(), await this.documentPreloader.dispose(), await super.dispose(), this.readerContainer && a(this.readerContainer), this.isInit = !1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../../kernal/common/encoding.cjs"),t=require("../../../../kernal/common/uuid.cjs"),n=require("../../../../kernal/common/text.cjs"),r=require("../../../../kernal/common/url.cjs"),i=require("../../../../kernal/common/path.cjs"),a=require("../../../../kernal/Constants.cjs"),o=require("../../../../kernal/html/finder.cjs"),s=require("../../../../kernal/html/injector.cjs"),c=require("
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../../kernal/common/encoding.cjs"),t=require("../../../../kernal/common/uuid.cjs"),n=require("../../../../kernal/common/text.cjs"),r=require("../../../../kernal/common/url.cjs"),i=require("../../../../kernal/common/path.cjs"),a=require("../../../../kernal/Constants.cjs"),o=require("../../../../kernal/html/finder.cjs"),s=require("../../../../kernal/html/injector.cjs"),c=require("../../HtmlSettings.cjs"),l=require("../../../../kernal/common/buffer.cjs"),u=require("../../../../kernal/html/style.cjs");var d=class{constructor(e){this.fileParser=e,this.childrenUrls=new Map,this.errorLinks=[],this.docBlobUrls=new Map,this.opaqueDocumentBaseUrls=[]}async preprocess(e){let t=(await e.getVirtualContentContainer())?.ownerDocument;t&&(this.format(t),this.injectBaseUrl(t,e.url),await this.resetCssHref(t,e),await this.resetScriptSrc(t,e))}format(e){let t=e.getElementsByTagName(`*`),n=!1;for(let e=t.length-1;e>=0;e--){let r=t[e];if(r.textContent.trim()||r.classList.add(`lhx-text-empty`),r.style&&(r.style.fontSize||r.style.textIndent)){let e=r.getAttribute(`style`);r.style.fontSize&&(e=u.replaceFontSize(e)),r.style.textIndent&&(e=u.removeTextIndent(e)),r.setAttribute(`style`,e)}o.compareTagName(r.tagName,`TABLE`)&&(r.style.width=`100%`,r.style.height=`auto`),n||(o.compareTagName(r.tagName,`SVG`)||r.children.length==0&&!o.compareTagName(r.parentElement.tagName,`SVG`))&&(n=!0,r.setAttribute(a.LastElementAttributeName,`true`)),r.getAttribute(`epub:type`)==`footnote`&&r.style.setProperty(`display`,`none`)}}async resetCssHref(e,r){let i=e.getElementsByTagName(`link`);for(let a=i.length-1;a>=0;a--){let o=i[a].getAttribute(`href`);if(!i[a].rel||i[a].rel.toLowerCase()!=`stylesheet`||n.isNullOrWhiteSpace(o))continue;let{href:l,cssContent:u,isHref:d}=await this.getActualCssLink(o,r);if(d&&o)i[a].href=l,i[a].setAttribute(c.HtmlSettings.LinkOriginHrefPropertyName,o);else if(u){let n=t.getRandomId(!0);s.injectCssContent(e,u,!1,n),i[a].parentElement?.removeChild(i[a])}}}async getActualCssLink(t,a){if(n.isNullOrWhiteSpace(t)||r.checkIsAbsoluteUrl(t))return{href:t,cssContent:``,isHref:!0};try{let o=await this.fileParser.getFile(t,a.url,`blob`),s=e.convertArrayBufferToString(await o.arrayBuffer()),c=s.matchAll(/url\(["']?(.*?)["']?\)/gi);for(let e of c){let o=e[1];if(this.childrenUrls.get(o))continue;let s=i.getExtension(o);if(s&&s.toLowerCase()==`.css`){if(n.isNullOrWhiteSpace(o)||r.checkIsAbsoluteUrl(o))continue;let{href:e}=await this.getActualCssLink(o,a);this.childrenUrls.set(o,e)}else{let e=r.getFullUrl(o,t);if(!n.startsWithAny(e.toString(),!0,`http://`,`https://`))continue;let i=(e.pathname+e.search).substring(1);if(this.errorLinks.indexOf(i)>=0)continue;try{let e=await this.fileParser.getFile(i,``,`blob`),t=URL.createObjectURL(e);this.childrenUrls.set(o,t)}catch(t){this.errorLinks.indexOf(i)<0&&this.errorLinks.push(i),this.logger.error(t),this.childrenUrls.set(o,e.toString())}}}let d=s.replace(/url\(["']?(.*?)["']?\)/gi,(e,t)=>r.checkIsAbsoluteUrl(t)?e:``);d=u.replaceFontSize(d),d=u.removeTextIndent(d),d=u.appendZeroTextIndentForCenterRightAlign(d);let f=e.convertStringToUint8Array(d),p=l.toBlob(f,{type:`text/css`}),m=URL.createObjectURL(p);return this.childrenUrls.set(t,m),{href:m,cssContent:d,isHref:!1}}catch(e){return this.logger.error(e),{href:t,cssContent:``,isHref:!0}}}async dispose(){this.childrenUrls.clear(),this.errorLinks&&this.errorLinks.splice(0),this.docBlobUrls.clear();for(let e of this.opaqueDocumentBaseUrls)try{URL.revokeObjectURL(e)}catch{}this.opaqueDocumentBaseUrls=[]}async resetScriptSrc(e,t){let n=t.getRoot();n||=``;let i=e.getElementsByTagName(`script`);for(let e=0;e<i.length;e++){let a=i[e].getAttribute(`src`);if(!(!a||a.startsWith(`/`))){if(!r.checkIsAbsoluteUrl(a)){let e=r.getFullUrl(a,n);r.checkIsAbsoluteUrl(n)?a=e.toString():(a=e.pathname+e.search,a=a.substring(1))}if(!r.checkIsAbsoluteUrl(a)){let o=r.getFullUrl(a,n),s=o.pathname+o.search;s=s.substring(1);let l=await this.fileParser.getFile(a,t.url,`blob`),u=URL.createObjectURL(l);i[e].src=u,i[e].setAttribute(c.HtmlSettings.LinkOriginHrefPropertyName,a)}}}}injectBaseUrl(e,t){let i=e.getElementsByTagName(`base`);for(let e=0;e<i.length;e++)if(!n.isNullOrWhiteSpace(i[e].href))return;let a=t;!n.isNullOrWhiteSpace(a)&&r.checkIsAbsoluteUrl(a)||(a=this.createOpaqueDocumentBaseUrl());let c=s.createElement(e,`base`,null,{href:a}),l=o.getDocumentHead(e);l.insertBefore(c,l.firstChild)}createOpaqueDocumentBaseUrl(){let e=URL.createObjectURL(new Blob([`<!doctype html><title></title>`],{type:`text/html`}));return this.opaqueDocumentBaseUrls.push(e),e}};exports.HtmlContentProcessor=d;
|
|
@@ -6,9 +6,9 @@ import { getExtension as s } from "../../../../kernal/common/path.mjs";
|
|
|
6
6
|
import { LastElementAttributeName as c } from "../../../../kernal/Constants.mjs";
|
|
7
7
|
import { compareTagName as l, getDocumentHead as u } from "../../../../kernal/html/finder.mjs";
|
|
8
8
|
import { createElement as d, injectCssContent as f } from "../../../../kernal/html/injector.mjs";
|
|
9
|
-
import {
|
|
10
|
-
import { toBlob as
|
|
11
|
-
import {
|
|
9
|
+
import { HtmlSettings as p } from "../../HtmlSettings.mjs";
|
|
10
|
+
import { toBlob as m } from "../../../../kernal/common/buffer.mjs";
|
|
11
|
+
import { appendZeroTextIndentForCenterRightAlign as h, removeTextIndent as g, replaceFontSize as _ } from "../../../../kernal/html/style.mjs";
|
|
12
12
|
//#region mediaTypes/html/renderer/html/HtmlContentProcessor.ts
|
|
13
13
|
var v = class {
|
|
14
14
|
constructor(e) {
|
|
@@ -24,7 +24,7 @@ var v = class {
|
|
|
24
24
|
let r = t[e];
|
|
25
25
|
if (r.textContent.trim() || r.classList.add("lhx-text-empty"), r.style && (r.style.fontSize || r.style.textIndent)) {
|
|
26
26
|
let e = r.getAttribute("style");
|
|
27
|
-
r.style.fontSize && (e =
|
|
27
|
+
r.style.fontSize && (e = _(e)), r.style.textIndent && (e = g(e)), r.setAttribute("style", e);
|
|
28
28
|
}
|
|
29
29
|
l(r.tagName, "TABLE") && (r.style.width = "100%", r.style.height = "auto"), n || (l(r.tagName, "SVG") || r.children.length == 0 && !l(r.parentElement.tagName, "SVG")) && (n = !0, r.setAttribute(c, "true")), r.getAttribute("epub:type") == "footnote" && r.style.setProperty("display", "none");
|
|
30
30
|
}
|
|
@@ -35,7 +35,7 @@ var v = class {
|
|
|
35
35
|
let o = i[a].getAttribute("href");
|
|
36
36
|
if (!i[a].rel || i[a].rel.toLowerCase() != "stylesheet" || r(o)) continue;
|
|
37
37
|
let { href: s, cssContent: c, isHref: l } = await this.getActualCssLink(o, t);
|
|
38
|
-
if (l && o) i[a].href = s, i[a].setAttribute(
|
|
38
|
+
if (l && o) i[a].href = s, i[a].setAttribute(p.LinkOriginHrefPropertyName, o);
|
|
39
39
|
else if (c) {
|
|
40
40
|
let t = n(!0);
|
|
41
41
|
f(e, c, !1, t), i[a].parentElement?.removeChild(i[a]);
|
|
@@ -72,8 +72,8 @@ var v = class {
|
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
let f = u.replace(/url\(["']?(.*?)["']?\)/gi, (e, t) => a(t) ? e : "");
|
|
75
|
-
f =
|
|
76
|
-
let
|
|
75
|
+
f = _(f), f = g(f), f = h(f);
|
|
76
|
+
let p = t(f), v = m(p, { type: "text/css" }), y = URL.createObjectURL(v);
|
|
77
77
|
return this.childrenUrls.set(n, y), {
|
|
78
78
|
href: y,
|
|
79
79
|
cssContent: f,
|
|
@@ -109,7 +109,7 @@ var v = class {
|
|
|
109
109
|
let a = o(i, n), s = a.pathname + a.search;
|
|
110
110
|
s = s.substring(1);
|
|
111
111
|
let c = await this.fileParser.getFile(i, t.url, "blob"), l = URL.createObjectURL(c);
|
|
112
|
-
r[e].src = l, r[e].setAttribute(
|
|
112
|
+
r[e].src = l, r[e].setAttribute(p.LinkOriginHrefPropertyName, i);
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../../kernal/EventNames.cjs"),t=require("../../../../kernal/common/encoding.cjs"),n=require("../../../../kernal/web/BrowserCapabilities.cjs"),r=require("../../../../kernal/common/text.cjs"),i=require("../../../../kernal/common/url.cjs"),a=require("../../../../kernal/Constants.cjs"),o=require("../../../../kernal/common/number.cjs"),s=require("../../../../kernal/html/finder.cjs"),c=require("../../../../kernal/html/injector.cjs"),l=require("../../../../kernal/web/scheduler.cjs"),u=require("../../../../kernal/html/parser.cjs"),d=require("../../../../kernal/html/image.cjs"),f=require("../../HtmlSettings.cjs"),p=require("../style/ContentLayoutCssVariableNames.cjs"),m=require("./error-image.cjs"),h=require("./htmlImagePlaceholderUrl.cjs"),g=require("./htmlImageFitStyles.cjs");let _=require("perfect-debounce");var v=`lhx-svg`,y=5,b=`.${v} {max-width: var(${p.ContentLayoutCssVariableNames.ColumnBoxWidth}) !important; width: auto !important; height: auto !important; }`,x=`*,p,div{text-align:center;margin-block:0 !important;margin-inline:auto !important;text-indent:0 !important;padding:0 !important;line-height:0 !important}`,S=e=>r.isNullOrWhiteSpace(e)?!0:h.isHtmlPlaceholderImageUrl(e),C=e=>{let t=e.querySelectorAll(`img, image`);return t.length>0?[...t]:[...e.getElementsByTagName(`img`),...e.getElementsByTagName(`image`)]},w=e=>s.compareTagName(e.tagName,`IMAGE`),T=(e,t,n=!1)=>{let r=e.style;if(!r){let r=Object.entries(t).map(([e,t])=>n?`${e}:${t} !important`:`${e}:${t}`).join(`;`);e.setAttribute(`style`,r);return}for(let[e,i]of Object.entries(t))r.setProperty(e,i,n?`important`:``)},E=class{constructor(e,t,n){this.documentsProvider=e,this.rendererViewport=t,this.htmlOptions=n,this.documentImageSizeMaps=new Map,this.blobUrls=new Map,this.isDisposed=!1,this.onDocumentDisposing=e=>{this.revokeDocumentBlobUrls(e),this.documentImageSizeMaps.delete(e)},this.onImageElementsVisible=async e=>{if(!this.isDisposed)for(let[t,n]of e.entries()){if(this.isDisposed)return;await this.loadImages(t,n)}},this.delayLoadOnImageElementsVisible=(0,_.debounce)(this.onImageElementsVisible,100),this.onLayoutChange=async()=>{await this.delayResetAllImageSize()},this.onDocumentLoad=async e=>{this.isDisposed||await this.resetImageSize(e)},this.resetAllImageSize=async()=>{if(!this.isDisposed)for(let e of this.documentsProvider.getLoadedDocuments()){if(this.isDisposed)return;await this.resetImageSize(e)}},this.delayResetAllImageSize=(0,_.debounce)(this.resetAllImageSize,100),this.events=this.documentsProvider.owner.events,this.logger=this.documentsProvider.owner.loggerFactory.getLogger(this.constructor.name),this.bindEvents()}bindEvents(){this.events.on(e.EventNames.LayoutChange,this.onLayoutChange),this.events.on(e.EventNames.DocumentLoad,this.onDocumentLoad),this.events.on(e.EventNames.DocumentDisposing,this.onDocumentDisposing),this.events.on(e.EventNames.ImageElementsVisible,this.delayLoadOnImageElementsVisible)}unbindEvents(){this.events.off(e.EventNames.LayoutChange,this.onLayoutChange),this.events.off(e.EventNames.DocumentLoad,this.onDocumentLoad),this.events.off(e.EventNames.DocumentDisposing,this.onDocumentDisposing),this.events.off(e.EventNames.ImageElementsVisible,this.delayLoadOnImageElementsVisible)}addBlobUrl(e,t){if(!i.checkIsBlobUrl(t))return;let n=this.blobUrls.get(e);if(!n){this.blobUrls.set(e,[t]);return}n.indexOf(t)<0&&n.push(t)}revokeDocumentBlobUrls(e){let t=this.blobUrls.get(e);if(t){for(let e of t)this.revokeObjectURL(e);this.blobUrls.delete(e)}}removeTrackedBlobUrl(e,t){let n=this.blobUrls.get(e);if(!n)return;let r=n.filter(e=>e!=t);if(r.length==0){this.blobUrls.delete(e);return}this.blobUrls.set(e,r)}async preprocessImages(e){let t=e,n=(await t.getVirtualContentContainer())?.ownerDocument;n&&(await this.prepareImageSize(t,n),this.setImagePreviewUrl(n),this.applyOnlyOneImageStyles(n))}setImagePreviewUrl(e){let t=C(e);for(let e of t)this.applyPreviewUrl(e,this.getImageUrl(e))}applyPreviewUrl(e,t){let n=o.parseNumber(e.getAttribute(`data-width`),0),i=o.parseNumber(e.getAttribute(`data-height`),0),a=h.createHtmlPlaceholderImageUrl(n,i),s=e.getAttribute(`data-preview-src`);if(S(s)&&(s=a,e.setAttribute(`data-preview-src`,a)),!r.isNullOrWhiteSpace(t)&&!S(t)){let n=e.getAttribute(`data-src`);(r.isNullOrWhiteSpace(n)||!S(n))&&e.setAttribute(`data-src`,t)}this.setImageSource(e,s),e.setAttribute(`data-preset-preview-url`,`true`),this.setImageStyle(e)}setImageSource(e,t){if(s.compareTagName(e.tagName,`IMG`)){e.src=t;return}if(n.BrowserCapabilities.isSafari()){e.href.baseVal=t;return}e.setAttribute(`xlink:href`,t)}setImageStyle(e){let t=e.parentElement;t&&t.children.length==1&&r.isNullOrWhiteSpace(t.innerText)&&(n.BrowserCapabilities.supportCssHas()||t.classList.add(f.HtmlSettings.BreakInsideAvoid),t.style.removeProperty(`width`),t.style.removeProperty(`height`))}async prepareImageSize(t,n){c.injectCssContent(n,b,!1,`lhx-svg-style`),this.checkIsOnlyOneImageInDocument(n)&&c.injectCssContent(n,x,!1,`only-one-image`);let i=C(n),a=this.getImageSizeMap(t),o=await this.loadImageSizes(t);if(o)for(let e of o)!r.isNullOrWhiteSpace(e.url)&&e.width>0&&a.set(e.url,e);let u=i.length>100;for(let n=0;n<i.length;n++){if(this.isDisposed)return;try{let r=i[n];r.parentElement&&s.compareTagName(r.parentElement.tagName,`SVG`)&&r.parentElement.classList.add(v);let o=this.getImageUrl(r),c=o?a.get(o):void 0;c||=await this.prefetchImageSize(t,r),c&&(this.resetImageStyles(r,c.width,c.height),this.resetInlineImageSize(r)),u&&(n%10==0||n===i.length-1)&&(this.events.emit(e.EventNames.ProcessedImageCount,{doc:t,totalImageCount:i.length,processedImageCount:n===i.length-1?i.length:n}),await l.yieldToMain())}catch(e){this.logger.error(e)}}let d=Array.from(a.values()).filter(e=>e.width>0&&!r.isNullOrWhiteSpace(e.url));if(d.length>0){if(o&&o.length>0){let e=new Set(o.map(e=>e.url)),n=d.filter(t=>!e.has(t.url));n.length>0&&await this.persistImageSizes(t,n);return}await this.persistImageSizes(t,d)}}async loadImageSizes(e){return[]}async persistImageSizes(e,t){}getImageSizeMap(e){let t=this.documentImageSizeMaps.get(e);return t||(t=new Map,this.documentImageSizeMaps.set(e,t)),t}getImageUrl(e){let t=e.getAttribute(`data-preset-preview-url`)==`true`;return w(e)?t?e.getAttribute(`data-src`)??e.getAttribute(`xlink:href`)??e.getAttribute(`href`)??``:e.getAttribute(`xlink:href`)??e.getAttribute(`href`)??``:t?e.getAttribute(`data-src`)??``:e.getAttribute(`src`)??``}async prefetchImageSize(e,t){let n=this.getImageUrl(t);if(r.isNullOrWhiteSpace(n))return;let a=t.getAttribute(`data-width`);if(a!=null){let r=o.parseNumber(a,0),i=o.parseNumber(t.getAttribute(`data-height`),0);return this.addImageDescriptor(e,n,r,i)}let s=this.getImageSizeMap(e).get(n);if(s)return s;let c=0,l=0;try{if(i.checkIsAbsoluteUrl(n)){let e=await d.getImageSize(n);c=e.width,l=e.height}else{let t=await e.fileParser.getFile(n,e.url,`blob`),r=t&&t.size>0?t:m.default;try{let e=await d.getImageSize(r);c=e.width,l=e.height}catch{}}}catch(e){this.logger.error(e)}return this.addImageDescriptor(e,n,c,l)}revokeObjectURL(e,t){if(i.checkIsBlobUrl(e)){try{URL.revokeObjectURL(e)}catch{}t&&this.removeTrackedBlobUrl(t,e)}}addImageDescriptor(e,t,n,r){let i=this.getImageSizeMap(e),a=i.get(t)??{url:t,width:n,height:r};return a.url=t,a.width=n,a.height=r,i.set(t,a),a}setWidthAndHeight(e,t,n){t>0&&n>0&&o.parseNumber(e.getAttribute(`data-width`),0,`parseInt`)<=0&&(e.setAttribute(`data-width`,`${t}`),e.setAttribute(`data-height`,`${n}`))}getColumnMetrics(){let e=this.rendererViewport.getLayoutMetrics();return{columnWidth:e.columnWidth,columnHeight:e.columnHeight}}resetImageStyles(e,t,r){if(t<=0||r<=0||!n.BrowserCapabilities.supportCssAspectRatio())return;this.setWidthAndHeight(e,t,r);let i=w(e)?e.parentElement:e;i&&(i.setAttribute(`width`,`${t}`),i.setAttribute(`height`,`${r}`),T(i,g.getImageFitStyles(t,r)))}resetImageWidthHeight(e,t,n){T(e,{width:`auto`,"max-width":`var(${p.ContentLayoutCssVariableNames.ColumnBoxWidth})`,"max-height":`var(${p.ContentLayoutCssVariableNames.ColumnBoxHeight})`},!0),this.resetImageHeight(e,t,n,this.htmlOptions.maxImageHeightRatio)}async resetImageSize(e){let t=e.getContentContainer()?.ownerDocument;if(!t||!s.getDocumentBody(t))return;let{columnWidth:r,columnHeight:i}=this.getColumnMetrics(),a=this.getOnlyImageInDocument(t);if(a){this.handleOnlyOneImageInDocument(r,i,a),await this.loadSingleImage(e,a);return}let o=C(t);if(!n.BrowserCapabilities.supportCssAspectRatio())for(let e of o){if(this.isDisposed)return;this.resetImageWidthHeight(e,r,i),await l.yieldToMain()}for(let t=0;t<Math.min(y,o.length);t++){if(this.isDisposed)return;await this.loadSingleImage(e,o[t])}}resetInlineImageSize(e){let t=o.parseNumber(e.getAttribute(`data-width`),0),n=o.parseNumber(e.getAttribute(`data-height`),0);if(t<=0||n<=0||n>200&&!(e.previousSibling?.nodeType==Node.TEXT_NODE&&(e.previousSibling.textContent?.trim()?.length??0)>0||e.nextSibling?.nodeType==Node.TEXT_NODE&&(e.nextSibling.textContent?.trim()?.length??0)>0)||!this.isInlineImage(e))return;let r=s.compareTagName(e.tagName,`IMG`)?e:e.parentElement;r&&(T(e,{width:`auto`,"max-width":`100%`,height:`1em`,"margin-block-start":`0`,"margin-block-end":`0`},!0),r.style.setProperty(`vertical-align`,`-0.2em`,`important`),r.setAttribute(`data-inline-image`,`true`))}applyOnlyOneImageStyles(e){let t=this.getOnlyImageInDocument(e);if(!t)return;let{columnWidth:n,columnHeight:r}=this.getColumnMetrics();this.handleOnlyOneImageInDocument(n,r,t)}handleOnlyOneImageInDocument(e,t,n){let r=n.ownerDocument,i=s.getDocumentBody(r);if(!i)return;c.injectCssContent(r,x,!1,`only-one-image`),i.setAttribute(`data-handled-one-image`,`true`),T(i,{display:`flex`,height:`100%`,"justify-content":`center`,"align-items":`center`},!0),this.clearPercentageSizeAttributes(n);let a=n;s.compareTagName(n.parentElement?.tagName,`SVG`)&&(a=n.parentElement,this.clearPercentageSizeAttributes(a),T(n,{width:`auto`,"max-width":`var(${p.ContentLayoutCssVariableNames.ColumnBoxWidth})`,"max-height":t+`px`,display:`block`},!0)),T(a,{width:`auto`,"max-width":`var(${p.ContentLayoutCssVariableNames.ColumnBoxWidth})`,display:`block`},!0),a.parentElement&&(a.parentElement.style.textAlign=`center`),this.resetImageHeight(n,e,t,.95,!0)}clearPercentageSizeAttributes(e){for(let t of[`width`,`height`]){let n=e.getAttribute(t);n&&n.includes(`%`)&&e.removeAttribute(t)}}resetImageHeight(e,t,n,r,i){let a=w(e)?e.parentElement:e;if(!a)return;let{width:o,height:s}=this.getImageIntrinsicSize(e);o<=0||s<=0||(this.setWidthAndHeight(e,o,s),this.forceSetImageHeight(a,t,n,o,s,r,i))}forceSetImageHeight(e,t,r,i,a,o,s){if(n.BrowserCapabilities.supportCssMinMaxFunction()){let t=g.getImageHeightRatioExpr(o,s);e.style.setProperty(`height`,g.getImageForcedHeightCss(i,a,t),`important`);return}let c=this.calcImageHeight(t,r,i,a)*o;e.style.setProperty(`height`,c+`px`,`important`)}calcImageHeight(e,t,n,r){return t>=r&&e>=n?r:e/t<=n/r?e/n*r:t}getImageIntrinsicSize(e){let t=o.parseNumber(e.getAttribute(`data-width`),0),n=o.parseNumber(e.getAttribute(`data-height`),0);if(t>0&&n>0)return{width:t,height:n};if(!w(e)){let t=e;if(t.naturalWidth>0&&t.naturalHeight>0)return{width:t.naturalWidth,height:t.naturalHeight}}return{width:0,height:0}}hasNonImageText(e){let t=e.ownerDocument;if(!t)return!!e.textContent?.trim();let n=t.createTreeWalker(e,NodeFilter.SHOW_TEXT),r=n.nextNode();for(;r;){if(r.textContent?.trim())return!0;r=n.nextNode()}return!1}getOnlyImageInDocument(e){let t=s.getDocumentBody(e);if(!t)return;let n=C(t);if(n.length==1&&!(!t.classList.contains(`lhx-text-empty`)&&this.hasNonImageText(t)))return n[0]}checkIsOnlyOneImageInDocument(e){return!!this.getOnlyImageInDocument(e)}checkIsInlineTag(e){let t=e.nodeName;if(r.isNullOrWhiteSpace(t))return!1;let n=t.toLowerCase();return n==`img`||n==`image`||this.htmlOptions.htmlInlineTags.indexOf(n)>=0}isInlineImage(e){if(this.hasInlineSiblings(e))return!0;let t=e.parentElement,n=e;for(;t&&!s.compareTagName(t.tagName,`BODY`);){if(t.children.length>1||t.children.length==1&&t.textContent.trim().length>0)return this.hasInlineSiblings(n);n=t,t=t.parentElement}return!1}findSiblingNodes(e){let t=e.previousSibling,n=e.nextSibling;for(;t!=null&&!(!r.isNullOrWhiteSpace(t.textContent)||t.nodeType==Node.ELEMENT_NODE);)t=t.previousSibling;for(;n!=null&&!(!r.isNullOrWhiteSpace(n.textContent)||n.nodeType==Node.ELEMENT_NODE);)n=n.nextSibling;return{previousSiblingNode:t,nextSiblingNode:n}}hasInlineSiblings(e){let{previousSiblingNode:t,nextSiblingNode:n}=this.findSiblingNodes(e);return!t&&!n?!1:t?.nodeType==Node.TEXT_NODE&&!r.isNullOrWhiteSpace(t.nodeValue)||n?.nodeType==Node.TEXT_NODE&&!r.isNullOrWhiteSpace(n.nodeValue)||t&&this.checkIsInlineTag(t)||n&&this.checkIsInlineTag(n)}async loadImages(e,t){let n=e;if(!(!n||!t?.length))for(let r of t){if(this.isDisposed||!r)return;let t=r.ownerDocument.defaultView;if(!t)continue;if(r instanceof t.window.HTMLImageElement||r instanceof t.window.SVGImageElement){let e=this.queryOriginElement(r.ownerDocument,r);e&&await this.loadSingleImage(n,e);continue}let i=r.getElementsByTagName(`img`);for(let e=0;e<i.length;e++)await this.loadSingleImage(n,i[e]);let a=this.queryOriginElement(e.getContentContainer(),r)??r,o=a==r?r.getElementsByTagName(`image`):a.getElementsByTagName(`image`);for(let e=0;e<o.length;e++)await this.loadSingleImage(n,o[e])}}queryOriginElement(e,t){let n=t.getAttribute(a.ElementInitialNumberName);return!e||r.isNullOrWhiteSpace(n)?t:e.querySelector(`[data-initial-index='${n}']`)??t}async loadSingleImage(e,t){if(!t||!e||this.isDisposed)return;let n=t.getAttribute(`data-load-state`);if(n==`loaded`||n==`loading`||n==`fail`)return;let i=this.getImageUrl(t);if(r.isNullOrWhiteSpace(i)){t.setAttribute(`data-load-state`,`fail`);return}t.setAttribute(`data-load-state`,`loading`),t.onload=()=>{t.setAttribute(`data-load-state`,`loaded`),this.applyOnlyOneImageStyles(t.ownerDocument)},t.onerror=()=>{t.setAttribute(`data-load-state`,`fail`)};let a=await this.resolveLoadUrl(e,i,t);if(this.isDisposed){this.revokeObjectURL(a,e);return}if(s.compareTagName(t.tagName,`IMG`)){let n=t;if(n.src=a,!await this.waitForImageReady(n)){this.revokeObjectURL(a,e),this.retryLoadAfterDecodeFailure(e,n,i);return}this.applyOnlyOneImageStyles(t.ownerDocument);return}this.setImageSource(t,a),this.applyOnlyOneImageStyles(t.ownerDocument)}waitForImageReady(e){return e.complete?Promise.resolve(this.isImageUsable(e)):new Promise(t=>{let n=!1,r=r=>{n||(n=!0,e.removeEventListener(`load`,i),e.removeEventListener(`error`,a),t(r))},i=()=>r(!0),a=()=>r(this.isImageUsable(e));e.addEventListener(`load`,i),e.addEventListener(`error`,a),typeof e.decode==`function`&&e.decode().then(()=>r(!0)).catch(()=>{this.isImageUsable(e)&&r(!0)})})}isImageUsable(e){return e.complete&&e.naturalWidth>0}retryLoadAfterDecodeFailure(e,t,n){setTimeout(async()=>{if(!this.isDisposed)try{let r=await e.fileParser.getFile(n,e.url,`blob`);if(this.isDisposed)return;if(r&&r.size>0){let n=URL.createObjectURL(r);this.addBlobUrl(e,n),t.src=n}else t.src=m.default}catch(e){this.logger.error(e),this.isDisposed||(t.src=m.default)}},500)}async resolveLoadUrl(e,t,n){if(i.checkIsAbsoluteUrl(t))return t;let r=await e.fileParser.getFile(t,e.url,`blob`);if(!r||r.size<=0)return m.default;if(r.type?.toLowerCase()==`image/svg+xml`)return await this.resolveSvgBlobUrl(e,r,n);let a=URL.createObjectURL(r);return this.addBlobUrl(e,a),a}async resolveSvgBlobUrl(e,n,a){let o=t.convertArrayBufferToString(await n.arrayBuffer()),s=u.getFormatDocument(o).querySelector(`image`);if(!s)return`data:image/svg+xml,`+encodeURIComponent(o);let c=s.getAttribute(`xlink:href`)??s.getAttribute(`href`)??``;if(r.isNullOrWhiteSpace(c))return`data:image/svg+xml,`+encodeURIComponent(o);let l=c,f=c;if(!i.checkIsAbsoluteUrl(c)){let t=await e.fileParser.getFile(c,e.url,`blob`);if(!t||t.size<=0)return m.default;f=URL.createObjectURL(t),this.addBlobUrl(e,f),l=t}try{let e=await d.getImageSize(l);a.setAttribute(`data-width`,e.width.toString()),a.setAttribute(`data-height`,e.height.toString());let{columnWidth:t,columnHeight:n}=this.getColumnMetrics();this.forceSetImageHeight(a,t,n,e.width,e.height,this.htmlOptions.maxImageHeightRatio)}catch(e){this.logger.error(e)}return f}async dispose(){this.isDisposed=!0,this.delayLoadOnImageElementsVisible.cancel(),this.delayResetAllImageSize.cancel(),this.unbindEvents(),this.documentImageSizeMaps.clear();for(let e of[...this.blobUrls.keys()])this.revokeDocumentBlobUrls(e);this.blobUrls.clear()}};exports.HtmlImageLoader=E;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../../kernal/EventNames.cjs"),t=require("../../../../kernal/common/encoding.cjs"),n=require("../../../../kernal/web/BrowserCapabilities.cjs"),r=require("../../../../kernal/common/text.cjs"),i=require("../../../../kernal/common/url.cjs"),a=require("../../../../kernal/Constants.cjs"),o=require("../../../../kernal/common/number.cjs"),s=require("../../../../kernal/html/finder.cjs"),c=require("../../../../kernal/html/injector.cjs"),l=require("../../../../kernal/web/scheduler.cjs"),u=require("../../HtmlSettings.cjs"),d=require("../../../../kernal/html/parser.cjs"),f=require("../../../../kernal/html/image.cjs"),p=require("../style/ContentLayoutCssVariableNames.cjs"),m=require("./error-image.cjs"),h=require("./htmlImagePlaceholderUrl.cjs"),g=require("./htmlImageFitStyles.cjs");let _=require("perfect-debounce");var v=`lhx-svg`,y=5,b=`.${v} {max-width: var(${p.ContentLayoutCssVariableNames.ColumnBoxWidth}) !important; width: auto !important; height: auto !important; }`,x=`*,p,div{text-align:center;margin-block:0 !important;margin-inline:auto !important;text-indent:0 !important;padding:0 !important;line-height:0 !important}`,S=e=>r.isNullOrWhiteSpace(e)?!0:h.isHtmlPlaceholderImageUrl(e),C=e=>{let t=e.querySelectorAll(`img, image`);return t.length>0?[...t]:[...e.getElementsByTagName(`img`),...e.getElementsByTagName(`image`)]},w=e=>s.compareTagName(e.tagName,`IMAGE`),T=(e,t,n=!1)=>{let r=e.style;if(!r){let r=Object.entries(t).map(([e,t])=>n?`${e}:${t} !important`:`${e}:${t}`).join(`;`);e.setAttribute(`style`,r);return}for(let[e,i]of Object.entries(t))r.setProperty(e,i,n?`important`:``)},E=class{constructor(e,t,n){this.documentsProvider=e,this.rendererViewport=t,this.htmlOptions=n,this.documentImageSizeMaps=new Map,this.blobUrls=new Map,this.isDisposed=!1,this.onDocumentDisposing=e=>{this.revokeDocumentBlobUrls(e),this.documentImageSizeMaps.delete(e)},this.onImageElementsVisible=async e=>{if(!this.isDisposed)for(let[t,n]of e.entries()){if(this.isDisposed)return;await this.loadImages(t,n)}},this.delayLoadOnImageElementsVisible=(0,_.debounce)(this.onImageElementsVisible,100),this.onLayoutChange=async()=>{await this.delayResetAllImageSize()},this.onDocumentLoad=async e=>{this.isDisposed||await this.resetImageSize(e)},this.resetAllImageSize=async()=>{if(!this.isDisposed)for(let e of this.documentsProvider.getLoadedDocuments()){if(this.isDisposed)return;await this.resetImageSize(e)}},this.delayResetAllImageSize=(0,_.debounce)(this.resetAllImageSize,100),this.events=this.documentsProvider.owner.events,this.logger=this.documentsProvider.owner.loggerFactory.getLogger(this.constructor.name),this.bindEvents()}bindEvents(){this.events.on(e.EventNames.LayoutChange,this.onLayoutChange),this.events.on(e.EventNames.DocumentLoad,this.onDocumentLoad),this.events.on(e.EventNames.DocumentDisposing,this.onDocumentDisposing),this.events.on(e.EventNames.ImageElementsVisible,this.delayLoadOnImageElementsVisible)}unbindEvents(){this.events.off(e.EventNames.LayoutChange,this.onLayoutChange),this.events.off(e.EventNames.DocumentLoad,this.onDocumentLoad),this.events.off(e.EventNames.DocumentDisposing,this.onDocumentDisposing),this.events.off(e.EventNames.ImageElementsVisible,this.delayLoadOnImageElementsVisible)}addBlobUrl(e,t){if(!i.checkIsBlobUrl(t))return;let n=this.blobUrls.get(e);if(!n){this.blobUrls.set(e,[t]);return}n.indexOf(t)<0&&n.push(t)}revokeDocumentBlobUrls(e){let t=this.blobUrls.get(e);if(t){for(let e of t)this.revokeObjectURL(e);this.blobUrls.delete(e)}}removeTrackedBlobUrl(e,t){let n=this.blobUrls.get(e);if(!n)return;let r=n.filter(e=>e!=t);if(r.length==0){this.blobUrls.delete(e);return}this.blobUrls.set(e,r)}async preprocessImages(e){let t=e,n=(await t.getVirtualContentContainer())?.ownerDocument;n&&(await this.prepareImageSize(t,n),this.setImagePreviewUrl(n),this.applyOnlyOneImageStyles(n))}setImagePreviewUrl(e){let t=C(e);for(let e of t)this.applyPreviewUrl(e,this.getImageUrl(e))}applyPreviewUrl(e,t){let n=o.parseNumber(e.getAttribute(`data-width`),0),i=o.parseNumber(e.getAttribute(`data-height`),0),a=h.createHtmlPlaceholderImageUrl(n,i),s=e.getAttribute(`data-preview-src`);if(S(s)&&(s=a,e.setAttribute(`data-preview-src`,a)),!r.isNullOrWhiteSpace(t)&&!S(t)){let n=e.getAttribute(`data-src`);(r.isNullOrWhiteSpace(n)||!S(n))&&e.setAttribute(`data-src`,t)}this.setImageSource(e,s),e.setAttribute(`data-preset-preview-url`,`true`),this.setImageStyle(e)}setImageSource(e,t){if(s.compareTagName(e.tagName,`IMG`)){e.src=t;return}if(n.BrowserCapabilities.isSafari()){e.href.baseVal=t;return}e.setAttribute(`xlink:href`,t)}setImageStyle(e){let t=e.parentElement;t&&t.children.length==1&&r.isNullOrWhiteSpace(t.innerText)&&(n.BrowserCapabilities.supportCssHas()||t.classList.add(u.HtmlSettings.BreakInsideAvoid),t.style.removeProperty(`width`),t.style.removeProperty(`height`))}async prepareImageSize(t,n){c.injectCssContent(n,b,!1,`lhx-svg-style`),this.checkIsOnlyOneImageInDocument(n)&&c.injectCssContent(n,x,!1,`only-one-image`);let i=C(n),a=this.getImageSizeMap(t),o=await this.loadImageSizes(t);if(o)for(let e of o)!r.isNullOrWhiteSpace(e.url)&&e.width>0&&a.set(e.url,e);let u=i.length>100;for(let n=0;n<i.length;n++){if(this.isDisposed)return;try{let r=i[n];r.parentElement&&s.compareTagName(r.parentElement.tagName,`SVG`)&&r.parentElement.classList.add(v);let o=this.getImageUrl(r),c=o?a.get(o):void 0;c||=await this.prefetchImageSize(t,r),c&&(this.resetImageStyles(r,c.width,c.height),this.resetInlineImageSize(r)),u&&(n%10==0||n===i.length-1)&&(this.events.emit(e.EventNames.ProcessedImageCount,{doc:t,totalImageCount:i.length,processedImageCount:n===i.length-1?i.length:n}),await l.yieldToMain())}catch(e){this.logger.error(e)}}let d=Array.from(a.values()).filter(e=>e.width>0&&!r.isNullOrWhiteSpace(e.url));if(d.length>0){if(o&&o.length>0){let e=new Set(o.map(e=>e.url)),n=d.filter(t=>!e.has(t.url));n.length>0&&await this.persistImageSizes(t,n);return}await this.persistImageSizes(t,d)}}async loadImageSizes(e){return[]}async persistImageSizes(e,t){}getImageSizeMap(e){let t=this.documentImageSizeMaps.get(e);return t||(t=new Map,this.documentImageSizeMaps.set(e,t)),t}getImageUrl(e){let t=e.getAttribute(`data-preset-preview-url`)==`true`;return w(e)?t?e.getAttribute(`data-src`)??e.getAttribute(`xlink:href`)??e.getAttribute(`href`)??``:e.getAttribute(`xlink:href`)??e.getAttribute(`href`)??``:t?e.getAttribute(`data-src`)??``:e.getAttribute(`src`)??``}async prefetchImageSize(e,t){let n=this.getImageUrl(t);if(r.isNullOrWhiteSpace(n))return;let a=t.getAttribute(`data-width`);if(a!=null){let r=o.parseNumber(a,0),i=o.parseNumber(t.getAttribute(`data-height`),0);return this.addImageDescriptor(e,n,r,i)}let s=this.getImageSizeMap(e).get(n);if(s)return s;let c=0,l=0;try{if(i.checkIsAbsoluteUrl(n)){let e=await f.getImageSize(n);c=e.width,l=e.height}else{let t=await e.fileParser.getFile(n,e.url,`blob`),r=t&&t.size>0?t:m.default;try{let e=await f.getImageSize(r);c=e.width,l=e.height}catch{}}}catch(e){this.logger.error(e)}return this.addImageDescriptor(e,n,c,l)}revokeObjectURL(e,t){if(i.checkIsBlobUrl(e)){try{URL.revokeObjectURL(e)}catch{}t&&this.removeTrackedBlobUrl(t,e)}}addImageDescriptor(e,t,n,r){let i=this.getImageSizeMap(e),a=i.get(t)??{url:t,width:n,height:r};return a.url=t,a.width=n,a.height=r,i.set(t,a),a}setWidthAndHeight(e,t,n){t>0&&n>0&&o.parseNumber(e.getAttribute(`data-width`),0,`parseInt`)<=0&&(e.setAttribute(`data-width`,`${t}`),e.setAttribute(`data-height`,`${n}`))}getColumnMetrics(){let e=this.rendererViewport.getLayoutMetrics();return{columnWidth:e.columnWidth,columnHeight:e.columnHeight}}resetImageStyles(e,t,r){if(t<=0||r<=0||!n.BrowserCapabilities.supportCssAspectRatio())return;this.setWidthAndHeight(e,t,r);let i=w(e)?e.parentElement:e;i&&(i.setAttribute(`width`,`${t}`),i.setAttribute(`height`,`${r}`),T(i,g.getImageFitStyles(t,r)))}resetImageWidthHeight(e,t,n){T(e,{width:`auto`,"max-width":`var(${p.ContentLayoutCssVariableNames.ColumnBoxWidth})`,"max-height":`var(${p.ContentLayoutCssVariableNames.ColumnBoxHeight})`},!0),this.resetImageHeight(e,t,n,this.htmlOptions.maxImageHeightRatio)}async resetImageSize(e){let t=e.getContentContainer()?.ownerDocument;if(!t||!s.getDocumentBody(t))return;let{columnWidth:r,columnHeight:i}=this.getColumnMetrics(),a=this.getOnlyImageInDocument(t);if(a){this.handleOnlyOneImageInDocument(r,i,a),await this.loadSingleImage(e,a);return}let o=C(t);if(!n.BrowserCapabilities.supportCssAspectRatio())for(let e of o){if(this.isDisposed)return;this.resetImageWidthHeight(e,r,i),await l.yieldToMain()}for(let t=0;t<Math.min(y,o.length);t++){if(this.isDisposed)return;await this.loadSingleImage(e,o[t])}}resetInlineImageSize(e){let t=o.parseNumber(e.getAttribute(`data-width`),0),n=o.parseNumber(e.getAttribute(`data-height`),0);if(t<=0||n<=0||n>200&&!(e.previousSibling?.nodeType==Node.TEXT_NODE&&(e.previousSibling.textContent?.trim()?.length??0)>0||e.nextSibling?.nodeType==Node.TEXT_NODE&&(e.nextSibling.textContent?.trim()?.length??0)>0)||!this.isInlineImage(e))return;let r=s.compareTagName(e.tagName,`IMG`)?e:e.parentElement;r&&(T(e,{width:`auto`,"max-width":`100%`,height:`1em`,"margin-block-start":`0`,"margin-block-end":`0`},!0),r.style.setProperty(`vertical-align`,`-0.2em`,`important`),r.setAttribute(`data-inline-image`,`true`))}applyOnlyOneImageStyles(e){let t=this.getOnlyImageInDocument(e);if(!t)return;let{columnWidth:n,columnHeight:r}=this.getColumnMetrics();this.handleOnlyOneImageInDocument(n,r,t)}handleOnlyOneImageInDocument(e,t,n){let r=n.ownerDocument,i=s.getDocumentBody(r);if(!i)return;c.injectCssContent(r,x,!1,`only-one-image`),i.setAttribute(`data-handled-one-image`,`true`),T(i,{display:`flex`,height:`100%`,"justify-content":`center`,"align-items":`center`},!0),this.clearPercentageSizeAttributes(n);let a=n;s.compareTagName(n.parentElement?.tagName,`SVG`)&&(a=n.parentElement,this.clearPercentageSizeAttributes(a),T(n,{width:`auto`,"max-width":`var(${p.ContentLayoutCssVariableNames.ColumnBoxWidth})`,"max-height":t+`px`,display:`block`},!0)),T(a,{width:`auto`,"max-width":`var(${p.ContentLayoutCssVariableNames.ColumnBoxWidth})`,display:`block`},!0),a.parentElement&&(a.parentElement.style.textAlign=`center`),this.resetImageHeight(n,e,t,.95,!0)}clearPercentageSizeAttributes(e){for(let t of[`width`,`height`]){let n=e.getAttribute(t);n&&n.includes(`%`)&&e.removeAttribute(t)}}resetImageHeight(e,t,n,r,i){let a=w(e)?e.parentElement:e;if(!a)return;let{width:o,height:s}=this.getImageIntrinsicSize(e);o<=0||s<=0||(this.setWidthAndHeight(e,o,s),this.forceSetImageHeight(a,t,n,o,s,r,i))}forceSetImageHeight(e,t,r,i,a,o,s){if(n.BrowserCapabilities.supportCssMinMaxFunction()){let t=g.getImageHeightRatioExpr(o,s);e.style.setProperty(`height`,g.getImageForcedHeightCss(i,a,t),`important`);return}let c=this.calcImageHeight(t,r,i,a)*o;e.style.setProperty(`height`,c+`px`,`important`)}calcImageHeight(e,t,n,r){return t>=r&&e>=n?r:e/t<=n/r?e/n*r:t}getImageIntrinsicSize(e){let t=o.parseNumber(e.getAttribute(`data-width`),0),n=o.parseNumber(e.getAttribute(`data-height`),0);if(t>0&&n>0)return{width:t,height:n};if(!w(e)){let t=e;if(t.naturalWidth>0&&t.naturalHeight>0)return{width:t.naturalWidth,height:t.naturalHeight}}return{width:0,height:0}}hasNonImageText(e){let t=e.ownerDocument;if(!t)return!!e.textContent?.trim();let n=t.createTreeWalker(e,NodeFilter.SHOW_TEXT),r=n.nextNode();for(;r;){if(r.textContent?.trim())return!0;r=n.nextNode()}return!1}getOnlyImageInDocument(e){let t=s.getDocumentBody(e);if(!t)return;let n=C(t);if(n.length==1&&!(!t.classList.contains(`lhx-text-empty`)&&this.hasNonImageText(t)))return n[0]}checkIsOnlyOneImageInDocument(e){return!!this.getOnlyImageInDocument(e)}checkIsInlineTag(e){let t=e.nodeName;if(r.isNullOrWhiteSpace(t))return!1;let n=t.toLowerCase();return n==`img`||n==`image`||this.htmlOptions.htmlInlineTags.indexOf(n)>=0}isInlineImage(e){if(this.hasInlineSiblings(e))return!0;let t=e.parentElement,n=e;for(;t&&!s.compareTagName(t.tagName,`BODY`);){if(t.children.length>1||t.children.length==1&&t.textContent.trim().length>0)return this.hasInlineSiblings(n);n=t,t=t.parentElement}return!1}findSiblingNodes(e){let t=e.previousSibling,n=e.nextSibling;for(;t!=null&&!(!r.isNullOrWhiteSpace(t.textContent)||t.nodeType==Node.ELEMENT_NODE);)t=t.previousSibling;for(;n!=null&&!(!r.isNullOrWhiteSpace(n.textContent)||n.nodeType==Node.ELEMENT_NODE);)n=n.nextSibling;return{previousSiblingNode:t,nextSiblingNode:n}}hasInlineSiblings(e){let{previousSiblingNode:t,nextSiblingNode:n}=this.findSiblingNodes(e);return!t&&!n?!1:t?.nodeType==Node.TEXT_NODE&&!r.isNullOrWhiteSpace(t.nodeValue)||n?.nodeType==Node.TEXT_NODE&&!r.isNullOrWhiteSpace(n.nodeValue)||t&&this.checkIsInlineTag(t)||n&&this.checkIsInlineTag(n)}async loadImages(e,t){let n=e;if(!(!n||!t?.length))for(let r of t){if(this.isDisposed||!r)return;let t=r.ownerDocument.defaultView;if(!t)continue;if(r instanceof t.window.HTMLImageElement||r instanceof t.window.SVGImageElement){let e=this.queryOriginElement(r.ownerDocument,r);e&&await this.loadSingleImage(n,e);continue}let i=r.getElementsByTagName(`img`);for(let e=0;e<i.length;e++)await this.loadSingleImage(n,i[e]);let a=this.queryOriginElement(e.getContentContainer(),r)??r,o=a==r?r.getElementsByTagName(`image`):a.getElementsByTagName(`image`);for(let e=0;e<o.length;e++)await this.loadSingleImage(n,o[e])}}queryOriginElement(e,t){let n=t.getAttribute(a.ElementInitialNumberName);return!e||r.isNullOrWhiteSpace(n)?t:e.querySelector(`[data-initial-index='${n}']`)??t}async loadSingleImage(e,t){if(!t||!e||this.isDisposed)return;let n=t.getAttribute(`data-load-state`);if(n==`loaded`||n==`loading`||n==`fail`)return;let i=this.getImageUrl(t);if(r.isNullOrWhiteSpace(i)){t.setAttribute(`data-load-state`,`fail`);return}t.setAttribute(`data-load-state`,`loading`),t.onload=()=>{t.setAttribute(`data-load-state`,`loaded`),this.applyOnlyOneImageStyles(t.ownerDocument)},t.onerror=()=>{t.setAttribute(`data-load-state`,`fail`)};let a=await this.resolveLoadUrl(e,i,t);if(this.isDisposed){this.revokeObjectURL(a,e);return}if(s.compareTagName(t.tagName,`IMG`)){let n=t;if(n.src=a,!await this.waitForImageReady(n)){this.revokeObjectURL(a,e),this.retryLoadAfterDecodeFailure(e,n,i);return}this.applyOnlyOneImageStyles(t.ownerDocument);return}this.setImageSource(t,a),this.applyOnlyOneImageStyles(t.ownerDocument)}waitForImageReady(e){return e.complete?Promise.resolve(this.isImageUsable(e)):new Promise(t=>{let n=!1,r=r=>{n||(n=!0,e.removeEventListener(`load`,i),e.removeEventListener(`error`,a),t(r))},i=()=>r(!0),a=()=>r(this.isImageUsable(e));e.addEventListener(`load`,i),e.addEventListener(`error`,a),typeof e.decode==`function`&&e.decode().then(()=>r(!0)).catch(()=>{this.isImageUsable(e)&&r(!0)})})}isImageUsable(e){return e.complete&&e.naturalWidth>0}retryLoadAfterDecodeFailure(e,t,n){setTimeout(async()=>{if(!this.isDisposed)try{let r=await e.fileParser.getFile(n,e.url,`blob`);if(this.isDisposed)return;if(r&&r.size>0){let n=URL.createObjectURL(r);this.addBlobUrl(e,n),t.src=n}else t.src=m.default}catch(e){this.logger.error(e),this.isDisposed||(t.src=m.default)}},500)}async resolveLoadUrl(e,t,n){if(i.checkIsAbsoluteUrl(t))return t;let r=await e.fileParser.getFile(t,e.url,`blob`);if(!r||r.size<=0)return m.default;if(r.type?.toLowerCase()==`image/svg+xml`)return await this.resolveSvgBlobUrl(e,r,n);let a=URL.createObjectURL(r);return this.addBlobUrl(e,a),a}async resolveSvgBlobUrl(e,n,a){let o=t.convertArrayBufferToString(await n.arrayBuffer()),s=d.getFormatDocument(o).querySelector(`image`);if(!s)return`data:image/svg+xml,`+encodeURIComponent(o);let c=s.getAttribute(`xlink:href`)??s.getAttribute(`href`)??``;if(r.isNullOrWhiteSpace(c))return`data:image/svg+xml,`+encodeURIComponent(o);let l=c,u=c;if(!i.checkIsAbsoluteUrl(c)){let t=await e.fileParser.getFile(c,e.url,`blob`);if(!t||t.size<=0)return m.default;u=URL.createObjectURL(t),this.addBlobUrl(e,u),l=t}try{let e=await f.getImageSize(l);a.setAttribute(`data-width`,e.width.toString()),a.setAttribute(`data-height`,e.height.toString());let{columnWidth:t,columnHeight:n}=this.getColumnMetrics();this.forceSetImageHeight(a,t,n,e.width,e.height,this.htmlOptions.maxImageHeightRatio)}catch(e){this.logger.error(e)}return u}async dispose(){this.isDisposed=!0,this.delayLoadOnImageElementsVisible.cancel(),this.delayResetAllImageSize.cancel(),this.unbindEvents(),this.documentImageSizeMaps.clear();for(let e of[...this.blobUrls.keys()])this.revokeDocumentBlobUrls(e);this.blobUrls.clear()}};exports.HtmlImageLoader=E;
|
|
@@ -9,9 +9,9 @@ import { compareTagName as c, getDocumentBody as l } from "../../../../kernal/ht
|
|
|
9
9
|
import { injectCssContent as u } from "../../../../kernal/html/injector.mjs";
|
|
10
10
|
import { yieldToMain as d } from "../../../../kernal/web/scheduler.mjs";
|
|
11
11
|
import { asyncDebounce as f } from "../../../../kernal/web/debounce.mjs";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
12
|
+
import { HtmlSettings as p } from "../../HtmlSettings.mjs";
|
|
13
|
+
import { getFormatDocument as m } from "../../../../kernal/html/parser.mjs";
|
|
14
|
+
import { getImageSize as h } from "../../../../kernal/html/image.mjs";
|
|
15
15
|
import { ContentLayoutCssVariableNames as g } from "../style/ContentLayoutCssVariableNames.mjs";
|
|
16
16
|
import _ from "./error-image.mjs";
|
|
17
17
|
import { createHtmlPlaceholderImageUrl as v, isHtmlPlaceholderImageUrl as y } from "./htmlImagePlaceholderUrl.mjs";
|
|
@@ -109,7 +109,7 @@ var C = "lhx-svg", w = 5, T = `.${C} {max-width: var(${g.ColumnBoxWidth}) !impor
|
|
|
109
109
|
}
|
|
110
110
|
setImageStyle(e) {
|
|
111
111
|
let t = e.parentElement;
|
|
112
|
-
t && t.children.length == 1 && r(t.innerText) && (n.supportCssHas() || t.classList.add(
|
|
112
|
+
t && t.children.length == 1 && r(t.innerText) && (n.supportCssHas() || t.classList.add(p.BreakInsideAvoid), t.style.removeProperty("width"), t.style.removeProperty("height"));
|
|
113
113
|
}
|
|
114
114
|
async prepareImageSize(t, n) {
|
|
115
115
|
u(n, T, !1, "lhx-svg-style"), this.checkIsOnlyOneImageInDocument(n) && u(n, E, !1, "only-one-image");
|
|
@@ -166,12 +166,12 @@ var C = "lhx-svg", w = 5, T = `.${C} {max-width: var(${g.ColumnBoxWidth}) !impor
|
|
|
166
166
|
let c = 0, l = 0;
|
|
167
167
|
try {
|
|
168
168
|
if (i(n)) {
|
|
169
|
-
let e = await
|
|
169
|
+
let e = await h(n);
|
|
170
170
|
c = e.width, l = e.height;
|
|
171
171
|
} else {
|
|
172
172
|
let t = await e.fileParser.getFile(n, e.url, "blob"), r = t && t.size > 0 ? t : _;
|
|
173
173
|
try {
|
|
174
|
-
let e = await
|
|
174
|
+
let e = await h(r);
|
|
175
175
|
c = e.width, l = e.height;
|
|
176
176
|
} catch {}
|
|
177
177
|
}
|
|
@@ -452,7 +452,7 @@ var C = "lhx-svg", w = 5, T = `.${C} {max-width: var(${g.ColumnBoxWidth}) !impor
|
|
|
452
452
|
return this.addBlobUrl(e, a), a;
|
|
453
453
|
}
|
|
454
454
|
async resolveSvgBlobUrl(e, n, a) {
|
|
455
|
-
let o = t(await n.arrayBuffer()), s =
|
|
455
|
+
let o = t(await n.arrayBuffer()), s = m(o).querySelector("image");
|
|
456
456
|
if (!s) return "data:image/svg+xml," + encodeURIComponent(o);
|
|
457
457
|
let c = s.getAttribute("xlink:href") ?? s.getAttribute("href") ?? "";
|
|
458
458
|
if (r(c)) return "data:image/svg+xml," + encodeURIComponent(o);
|
|
@@ -463,7 +463,7 @@ var C = "lhx-svg", w = 5, T = `.${C} {max-width: var(${g.ColumnBoxWidth}) !impor
|
|
|
463
463
|
u = URL.createObjectURL(t), this.addBlobUrl(e, u), l = t;
|
|
464
464
|
}
|
|
465
465
|
try {
|
|
466
|
-
let e = await
|
|
466
|
+
let e = await h(l);
|
|
467
467
|
a.setAttribute("data-width", e.width.toString()), a.setAttribute("data-height", e.height.toString());
|
|
468
468
|
let { columnWidth: t, columnHeight: n } = this.getColumnMetrics();
|
|
469
469
|
this.forceSetImageHeight(a, t, n, e.width, e.height, this.htmlOptions.maxImageHeightRatio);
|
|
@@ -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("../../HtmlSettings.cjs"),n=require("../../../../kernal/html/realm.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(n,r,i,a){this.owner=n,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(`.`+t.HtmlSettings.ContentsShadowContainerCssName),this.rendererContainer.setAttribute(t.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(`.`+t.HtmlSettings.TransformContainerCssName);if(!n.isHtmlElement(r))return;if(e.flipMode!=`page`){r.style.removeProperty(`transition`),r.style.removeProperty(`transform`),r.removeAttribute(`data-target-transform`);return}if(r.hasAttribute(t.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),n=e.flipMode;this.rendererContainer.setAttribute(t.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&&n==`scroll`?this.htmlOptions.contentWrapperBorderRadius??0:0;a.set(r.ViewportCssVariableNames.ContentWrapperBorderRadius,l+`px`);let u=this.owner.getHostViewport().mode==`window`&&n==`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;
|