mirror of
				https://github.com/janeczku/calibre-web
				synced 2025-10-30 23:03:02 +00:00 
			
		
		
		
	wrote a class to handle epub parsing, implemented bytesize of all previous files, total bytesize. still needs implementation of bytesize of current file until CFI point.
This commit is contained in:
		
							
								
								
									
										80
									
								
								cps/static/js/reading/epub-progress.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								cps/static/js/reading/epub-progress.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | |||||||
|  | class EpubParser { | ||||||
|  |     constructor(filesList) { | ||||||
|  |         this.files = filesList; | ||||||
|  |         this.parser = new DOMParser(); | ||||||
|  |         this.opfXml = this.getOPFXml(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     getTextByteLength() { | ||||||
|  |         let size = 0; | ||||||
|  |         for (let key in y = Object.keys(this.files)) { | ||||||
|  |             let file = this.files[y[key]]; | ||||||
|  |             if (file.name.endsWith("html")) { | ||||||
|  |                 size += file._data.uncompressedSize; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return size; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * @param {string} filename name of the file in filelist | ||||||
|  |      * @return {string} string representation of decompressed bytes | ||||||
|  |      */ | ||||||
|  |     decompress(filename) { | ||||||
|  |         return pako.inflate(this.files[filename]._data.compressedContent, {raw: true, to: "string"}); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     getOPFXml() { | ||||||
|  |         let content = this.decompress("META-INF/container.xml"); | ||||||
|  |         let xml = this.parser.parseFromString(content, "text/xml"); | ||||||
|  |         let path = xml.getElementsByTagName("rootfile")[0].getAttribute("full-path"); | ||||||
|  |         this.opfDir = path.split("/").slice(0, -1).join("/"); | ||||||
|  |         return this.parser.parseFromString(this.decompress(path), "text/xml"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     getSpine() { | ||||||
|  |         return Array.from(this.opfXml.getElementsByTagName("spine")[0].children).map(node => node.getAttribute("idref")); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      resolves an idref in content.opf to its file | ||||||
|  |      */ | ||||||
|  |     resolveIDref(idref) { | ||||||
|  |         return this.opfXml.getElementById(idref).getAttribute("href"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * returns absolute path from path relative to content.opf | ||||||
|  |      * @param path | ||||||
|  |      */ | ||||||
|  |     absPath(path) { | ||||||
|  |         if (this.opfDir) { | ||||||
|  |             return [this.opfDir, path].join("/"); | ||||||
|  |         } else { | ||||||
|  |             return path; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      returns the sum of the bytesize of all html files that are located before it in the spine | ||||||
|  |      @param {string} currentFile idref of the current file, also part of the CFI, e.g. here: #epubcfi(/6/2[titlepage]!/4/1:0) it would be "titlepage" | ||||||
|  |      */ | ||||||
|  |     getPreviousFilesSize(currentFile) { | ||||||
|  |         let bytesize = 0; | ||||||
|  |         for (let file of this.getSpine()) { | ||||||
|  |             if (file !== currentFile) { | ||||||
|  |                 let filepath = this.absPath(this.resolveIDref(currentFile)); | ||||||
|  |                 //ignore non text files | ||||||
|  |                 if (filepath.endsWith("html")) { | ||||||
|  |                     bytesize += this.files[filepath]._data.uncompressedSize; | ||||||
|  |                 } | ||||||
|  |             } else { | ||||||
|  |                 break | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return bytesize; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -153,6 +153,7 @@ | |||||||
| <script src="{{ url_for('static', filename='js/libs/screenfull.min.js') }}"></script> | <script src="{{ url_for('static', filename='js/libs/screenfull.min.js') }}"></script> | ||||||
| <script src="{{ url_for('static', filename='js/libs/reader.min.js') }}"></script> | <script src="{{ url_for('static', filename='js/libs/reader.min.js') }}"></script> | ||||||
| <script src="{{ url_for('static', filename='js/reading/epub.js') }}"></script> | <script src="{{ url_for('static', filename='js/reading/epub.js') }}"></script> | ||||||
|  | <script src="{{ url_for('static', filename='js/libs/pako.min.js') }}"</script> | ||||||
| <script> | <script> | ||||||
|     function getTextByteLength() { |     function getTextByteLength() { | ||||||
|         let size = 0; |         let size = 0; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 quarz12
					quarz12