diff --git a/config.py b/config.py index 019a159..3b8d2a7 100644 --- a/config.py +++ b/config.py @@ -16,6 +16,7 @@ class Config: with open(cfg_path, 'r', encoding='UTF-8') as f: self._data = json.load(f) else: + self._data['add_images_to_single_page'] = False self._data['db'] = 'cwm.db' self._data['save_to_config'] = True self._data['type'] = 'epub,txt' @@ -43,6 +44,10 @@ class Config: self._data[key] = default return default + @cached_property + def add_images_to_single_page(self): + return self.get_arg('add_images_to_single_page', False) + @cached_property def book_id(self): return getattr(self._args, 'bid', None) @@ -130,7 +135,7 @@ class Config: @cached_property def save_to_config(self): - return getattr(self._args, 'save_to_config', True) + return getattr(self._data, 'save_to_config', True) def save(self): with open(self._path, 'w', encoding='UTF-8') as f: diff --git a/epub.py b/epub.py index 05a0dd0..4f3ca4e 100644 --- a/epub.py +++ b/epub.py @@ -139,7 +139,7 @@ def perform_convert(image_path: str) -> Optional[str]: class HTMLImage: - def __init__(self, attrs, cfg: Config): + def __init__(self, attrs, cfg: Config, chapter_id): self.src = None self.alt = None self.path = None @@ -151,6 +151,7 @@ class HTMLImage: self.alt = value self.cfg = cfg self.footnote = '' + self.chapter_id = chapter_id def is_valid(self): return self.src is not None and self.src != '' @@ -185,22 +186,23 @@ class HTMLImage: if self.cfg.image_type == 'inline': return ET.tostring(img, 'unicode') else: - link = ET.Element('a', {'href': f'#img{index}', + target = '' + if self.cfg.add_images_to_single_page: + target = f'{self.chapter_id}_img.xhtml' + link = ET.Element('a', {'href': f'{target}#img{index}', 'epub:type': 'noteref'}) if self.alt: link.text = self.alt aside = ET.Element('aside', {'epub:type': 'footnote', 'id': f'img{index}'}) - p = ET.Element('p') - p.append(img) - aside.append(p) + aside.append(img) self.footnote = ET.tostring(aside, 'unicode') + '\n' return ET.tostring(link, 'unicode') # Used to parse content class ContentParser(HTMLParser): - def __init__(self, cfg: Config): + def __init__(self, cfg: Config, chapter_id): super().__init__() self._in_paragraph = False self.data = [] @@ -210,6 +212,7 @@ class ContentParser(HTMLParser): self.cfg = cfg self.footnote = '' self.img_index = 0 + self.chapter_id = chapter_id def handle_data(self, data: str): if self._in_paragraph: @@ -225,7 +228,8 @@ class ContentParser(HTMLParser): self._paragraph_data = [self._paragraph_data] else: self._paragraph_data = [] - self._paragraph_data.append(HTMLImage(attrs, self.cfg)) + self._paragraph_data.append(HTMLImage(attrs, self.cfg, + self.chapter_id)) else: self.data.append(HTMLImage(attrs, self.cfg)) elif tag == 'p': @@ -289,7 +293,8 @@ class ContentParser(HTMLParser): if self._paragraph_data: data += f'

{self._paragraph_data}

\n' if default_data_list: - data += self.footnote + if not self.cfg.add_images_to_single_page: + data += self.footnote return data @@ -355,7 +360,7 @@ class EpubFile: uid=f'ch{chapter_id}', ) ch.is_linear = is_linear - parser = ContentParser(self.cfg) + parser = ContentParser(self.cfg, chapter_id) contents = content.splitlines() try: parser.feed('

' + '

\n

'.join(contents) + '

') @@ -391,6 +396,17 @@ class EpubFile: else: self.EpubList.append(ch) self.epub.spine.append(ch) + if self.cfg.add_images_to_single_page and parser.footnote: + ch_img = epub.EpubHtml( + title=f"{chapter_title} (图片)", + file_name=f'{chapter_id}_img.xhtml', + lang='zh-CN', + uid=f'ch{chapter_id}_img', + ) + ch_img.is_linear = False + ch_img.content = parser.footnote + self.epub.add_item(ch_img) + self.epub.spine.append(ch_img) def add_nodownload_chapter(self, chapter, division_name: str, is_linear: bool): diff --git a/main.py b/main.py index cb8d6be..29422ad 100644 --- a/main.py +++ b/main.py @@ -25,6 +25,7 @@ parser.add_argument('-i', '--image-type', help='How to handle images in EPUB. Av parser.add_argument('-f', '--force', help='Force import keys.', action='store_true') # noqa: E501 parser.add_argument('-D', '--division-id', help='The division id.', type=int, metavar='ID') # noqa: E501 parser.add_argument('-l', '--linear', help='Mark as linear.', type=parse_bool, metavar='BOOL', default=False) # noqa: E501 +parser.add_argument('-A', '--add-images-to-single-page', help='Add images to single page.', type=parse_bool, metavar='BOOL') # noqa: E501 parser.add_argument('action', help='The action to do.', choices=['importkey', 'exportchapter', 'exportbook', 'export', 'exportall', 'markaslinear', 'ik', 'ec', 'eb', 'e', 'ea', 'mal'], nargs='?', default='export') # noqa: E501