전자책 편집 도구용 API 문서¶
전자책 편집 도구는 책을 HTML + 리소스 파일 모음으로 나타내는 calibre.ebooks.oeb.polish.container.Container 객체와, 그 컨테이너에서 여러 작업을 수행하는 데 사용할 수 있는 다양한 도구로 이루어져 있습니다. 모든 도구는 여러 calibre.ebooks.oeb.polish.* 모듈에 있는 모듈 수준 함수 형태로 제공됩니다.
다음과 같이 경로에 있는 책의 컨테이너 객체를 얻을 수 있습니다:
from calibre.ebooks.oeb.polish.container import get_container
container = get_container('Path to book file', tweak_mode=True)
전자책 편집기용 플러그인을 작성하는 경우, 현재 편집 중인 책의 컨테이너는 다음과 같이 얻습니다:
from calibre.gui2.tweak_book import current_container
container = current_container()
if container is None:
report_error # No book has been opened yet
Container 객체¶
- class calibre.ebooks.oeb.polish.container.Container(rootpath=None, opfpath=None, log=<calibre.utils.logging.Log object>, clone_data=None)[소스]¶
컨테이너는 파일이 가득한 폴더와 OPF 파일로 구성된 열린 전자책을 나타냅니다. 여기에는 두 가지 중요한 개념이 있습니다:
루트 폴더. 전자책의 기준 위치입니다. 전자책의 모든 파일은 이 폴더 또는 그 하위 폴더 안에 있습니다.
이름(Name): 루트 폴더를 기준으로 한 책 파일의 경로입니다. 항상 POSIX 구분자를 사용하며 따옴표로 이스케이프되지 않습니다. 책 안의 파일을 식별하는 정규 식별자로 생각하면 됩니다. 컨테이너 객체의 대부분 메서드는 이름을 사용합니다. 이름은 항상 NFC 유니코드 정규화 형식입니다.
복제(Clone): 컨테이너 객체는 디스크 상에서 효율적인 복제를 지원하며, 전자책 편집기의 체크포인트 구현에 사용됩니다. 이를 제대로 동작하게 하려면 파일 시스템의 파일에 직접 접근하면 안 됩니다. 대신
raw_data()또는 :meth:`open`을 사용해 책 안의 구성 파일을 읽고 쓰십시오.
href와 이름 사이를 변환할 때는 이 클래스에서 제공하는 메서드를 사용하십시오. 이 메서드들은 모든 href가 따옴표로 이스케이프된 것으로 가정합니다.
- abspath_to_name(fullpath, root=None)[소스]¶
:attr:`root`를 기준으로 한 정규 이름으로 절대 경로를 변환합니다.
- 매개변수:
root – 기준 폴더입니다. 기본값으로 이 컨테이너 객체의 루트가 사용됩니다.
- add_file(name, data=b'', media_type=None, spine_index=None, modify_name_if_needed=False, process_manifest_item=None, suggested_id='')[소스]¶
이 컨테이너에 파일을 추가합니다. 파일에 대한 항목이 OPF manifest와 spine에 자동으로 생성됩니다(파일이 텍스트 문서인 경우).
- add_name_to_manifest(name, process_manifest_item=None, suggested_id='')[소스]¶
지정한 이름의 파일에 대해 manifest 항목을 추가합니다. manifest id를 반환합니다.
- apply_unique_properties(name, *properties)[소스]¶
지정한 속성이 이름으로 식별된 manifest 항목에만 설정되도록 합니다. 이름에 None을 전달하면 모든 항목에서 해당 속성을 제거합니다.
- book_type = 'oeb'¶
책의 형식입니다(EPUB 파일은 epub, AZW3 파일은 azw3).
- commit(outpath=None, keep_parsed=False)[소스]¶
변경된 모든 파싱 객체를 파일 시스템에 기록하고, outpath에 전자책 파일을 출력합니다.
- 매개변수:
output – 저장된 전자책 파일을 기록할 경로입니다. None이면 원본 책 파일의 경로를 사용합니다.
keep_parsed – True이면 커밋된 항목의 파싱된 표현이 캐시에 유지됩니다.
- commit_item(name, keep_parsed=False)[소스]¶
파싱된 객체를 디스크에 커밋합니다(직렬화되어 실제 파일에 기록됩니다). ``keep_parsed``가 True이면 파싱된 표현이 캐시에 유지됩니다. 참고:
parsed()
- exists(name)[소스]¶
정규 이름에 해당하는 파일/폴더가 존재할 때만 True를 반환합니다. 이 함수는 기반 OS 파일 시스템의 한계, 특히 대소문자 구분 여부의 영향을 받습니다. 따라서 대소문자를 구분하지 않는 파일 시스템에서는 name의 대소문자가 실제 파일과 달라도 True를 반환할 수 있습니다. 참고:
has_name()
- generate_item(name, id_prefix=None, media_type=None, unique_href=True)[소스]¶
지정한 이름으로부터 href를 파생하여 manifest에 항목을 추가합니다. href와 id의 고유성이 자동으로 보장됩니다. 생성된 항목을 반환합니다.
- get_file_path_for_processing(name, allow_modification=True)[소스]¶
open()과 비슷하지만, 열린 파일 객체 대신 파일 경로를 반환합니다.
- property guide_type_map¶
guide 유형에서 정규 이름으로의 매핑
- has_name(name)[소스]¶
지정한 것과 동일한 정규 이름을 가진 파일이 존재할 때만 True를 반환합니다. :meth:`exists`와 달리 이 메서드는 항상 대소문자를 구분합니다.
- href_to_name(href, base=None)[소스]¶
href(기준은 base)를 이름으로 변환합니다. base는 이름이어야 하며, None이면 self.root를 사용합니다.
- insert_into_xml(parent, item, index=None)[소스]¶
항목을 parent에 삽입합니다(index가 None이면 끝에 추가). 들여쓰기는 자동으로 맞춥니다. 자기 닫힘 항목에서만 동작합니다.
- is_dir = False¶
이 컨테이너가 압축 해제된 책(디렉터리)을 나타내는 경우
- iterlinks(name, get_line_numbers=True)[소스]¶
name 안의 모든 링크를 반복합니다. get_line_numbers가 True이면 (link, line_number, offset) 형태의 결과를 반환합니다. 여기서 line_number는 링크가 나타나는 줄 번호이고, offset은 해당 줄 시작부터의 문자 수입니다. offset이 0이 아니면 실제로는 여러 줄에 걸칠 수도 있습니다.
- property manifest_id_map¶
manifest id에서 정규 이름으로의 매핑
- manifest_items_of_type(predicate)[소스]¶
media-type이 predicate와 일치하는 모든 manifest 항목의 이름입니다. `predicate`는 집합, 리스트, 문자열 또는 단일 인수를 받는 함수가 될 수 있으며, 함수인 경우 media-type을 인수로 호출됩니다.
- property manifest_type_map¶
manifest media-type에서 해당 media-type의 정규 이름 목록으로의 매핑
- property mi¶
이 책의 메타데이터를 담은 Metadata 객체입니다. 이 객체는 이 속성을 요청할 때마다 즉시 생성되므로 꼭 필요할 때만 사용하십시오.
- name_to_href(name, base=None)[소스]¶
이름을 base 기준 href로 변환합니다. base는 이름이어야 하며, None이면 self.root가 기준으로 사용됩니다.
- property names_that_must_not_be_changed¶
절대 이름을 바꿔서는 안 되는 이름 집합입니다. 전자책 파일 형식에 따라 달라집니다.
- property names_that_must_not_be_removed¶
컨테이너에서 절대 삭제하면 안 되는 이름 집합입니다. 전자책 파일 형식에 따라 달라집니다.
- property names_that_need_not_be_manifested¶
manifest에서 누락되어도 허용되는 이름 집합입니다. 전자책 파일 형식에 따라 달라집니다.
- open(name, mode='rb')[소스]¶
name이 가리키는 파일을 직접 읽기/쓰기로 엽니다. 파일이 dirty 상태이면 커밋되고 파스 캐시에서 제거된다는 점에 유의하십시오. 다시 파싱된 버전에 접근하기 전에 반드시 이 파일 처리를 끝내야 합니다. 그렇지 않으면 문제가 생길 수 있습니다.
- property opf¶
파싱된 OPF 파일
- opf_get_or_create(name)[소스]¶
지정한 이름의 첫 번째 XML 요소를 반환하거나, 없으면 opf:package 요소 아래에 생성한 뒤 반환하는 편의 메서드입니다.
- property opf_version¶
OPF의 <package> 요소에 설정된 버전
- property opf_version_parsed¶
OPF의 <package> 요소에 설정된 버전을 정수 튜플로 나타낸 값
- parsed(name)[소스]¶
name으로 지정한 파일의 파싱된 표현을 반환합니다. HTML/XML 파일은 lxml 트리를, CSS 파일은 css_parser 스타일시트를 반환합니다. 성능을 위해 파싱 객체는 캐시된다는 점에 유의하십시오. 파싱 객체를 변경한 경우 컨테이너가 캐시를 갱신할 수 있도록 반드시
dirty`를 호출해야 합니다. 참고: :meth:`replace()
- raw_data(name, decode=True, normalize_to_nfc=True)[소스]¶
지정한 이름의 파일에 해당하는 원시 데이터를 반환합니다.
- 매개변수:
decode – True이고 파일의 MIME 유형이 텍스트 기반이면, 원시 바이트 대신 디코딩된 유니코드 객체를 반환합니다.
normalize_to_nfc – True이면 반환된 유니코드 객체가 EPUB 및 AZW3 파일 형식에서 요구되는 NFC 정규화 형식으로 정규화됩니다.
- relpath(path, base=None)[소스]¶
절대 경로(os 구분자 사용)를 base 기준 상대 경로로 변환합니다(base 기본값은 self.root). 이 상대 경로는 *이름*이 아닙니다. 이름으로 변환하려면 :meth:`abspath_to_name`을 사용하십시오.
- remove_from_spine(spine_items, remove_if_no_longer_in_spine=True)[소스]¶
지정한 항목(정규 이름 기준)을 spine에서 제거합니다. ``remove_if_no_longer_in_spine``가 True이면 항목을 spine에서만 빼는 것이 아니라 책에서도 삭제합니다.
- remove_item(name, remove_from_guide=True)[소스]¶
이름으로 식별된 항목을 이 컨테이너에서 제거합니다. 이 작업은 OPF manifest, guide, spine에 있는 모든 참조와 내부 캐시의 항목도 함께 제거합니다.
- rename(current_name, new_name)[소스]¶
파일 이름을 current_name에서 new_name으로 바꿉니다. 파일이 들어 있는 폴더가 바뀌면 파일 내부의 모든 링크 기준을 자동으로 다시 맞춥니다. 단, 이 파일을 참조할 수 있는 다른 파일 안의 링크는 갱신되지 않습니다. 성능 때문이며, 이런 갱신은 한 번에 일괄 처리해야 합니다.
- replace(name, obj)[소스]¶
name에 해당하는 파싱 객체를 obj로 교체합니다. obj는 동일한 종류의 객체여야 합니다. 즉, HTML/XML이면 lxml 트리, CSS 파일이면 css_parser 스타일시트여야 합니다.
- replace_links(name, replace_func)[소스]¶
replace_func를 사용해 name 안의 모든 링크를 교체합니다. replace_func는 URL을 받아 치환된 URL을 반환하는 호출 가능 객체여야 합니다. 또한 실제 치환이 일어나면 True로 설정되는 ‘replaced’ 속성을 가져야 합니다. 이런 호출 객체는
LinkReplacer`와 :class:`LinkRebaser클래스를 사용하면 편리하게 만들 수 있습니다.
- set_spine(spine_items)[소스]¶
spine을 spine_items로 설정합니다. spine_items는 (name, linear) 형태의 반복 가능 객체여야 합니다. 이름 중 하나라도 manifest에 없으면 오류가 발생합니다.
- property spine_items¶
책의 spine에 있는 각 항목의 경로를 반환하는 반복자입니다. 참고:
spine_iter,spine_items
- property spine_iter¶
책의 spine에 있는 각 항목에 대해 item, name, is_linear를 반환하는 반복자입니다. item은 lxml 요소, name은 정규 파일 이름이며, 항목이 linear이면 is_linear는 True입니다. 참고:
spine_names,spine_items
- property spine_names¶
책의 spine에 있는 각 항목에 대해 name과 is_linear를 반환하는 반복자입니다. 참고:
spine_iter,spine_items
컨테이너 안의 구성 파일 관리¶
- calibre.ebooks.oeb.polish.replace.replace_links(container, link_map, frag_map=<function <lambda>>, replace_in_opf=False)[소스]¶
컨테이너 안의 파일을 가리키는 링크를 교체합니다. 컨테이너의 모든 파일을 순회하면서 지정한 링크를 변경합니다.
- 매개변수:
link_map – 이전 정규 이름에서 새 정규 이름으로의 매핑입니다. 예:
{'images/old.png': 'images/new.png'}frag_map –
(name, anchor)두 인수를 받아 새 anchor를 반환하는 호출 가능 객체입니다. HTML 파일의 anchor를 바꿔야 할 때 유용합니다. 기본값은 아무 작업도 하지 않습니다.replace_in_opf – False이면 OPF 파일의 링크는 교체하지 않습니다.
예쁘게 정리하기 및 파싱 오류 자동 수정¶
- calibre.ebooks.oeb.polish.pretty.fix_html(container, raw)[소스]¶
raw 문자열로 표현된 HTML의 파싱 오류를 수정합니다. 수정은 HTML5 파싱 알고리즘을 사용해 수행됩니다.
- calibre.ebooks.oeb.polish.pretty.fix_all_html(container)[소스]¶
컨테이너 안의 모든 HTML 파일의 파싱 오류를 수정합니다. 수정은 HTML5 파싱 알고리즘을 사용해 수행됩니다.
- calibre.ebooks.oeb.polish.pretty.pretty_html(container, name, raw)[소스]¶
raw 문자열로 표현된 HTML을 보기 좋게 정리합니다.
- calibre.ebooks.oeb.polish.pretty.pretty_css(container, name, raw)[소스]¶
raw 문자열로 표현된 CSS를 보기 좋게 정리합니다.
책 재킷 관리¶
파일 분할 및 병합¶
- calibre.ebooks.oeb.polish.split.split(container, name, loc_or_xpath, before=True, totals=None)[소스]¶
name으로 지정한 파일을 loc_or_xpath로 지정한 위치에서 분할합니다. 분할 시 영향받는 파일에 대한 모든 링크와 참조가 자동으로 옮겨집니다.
- 매개변수:
loc_or_xpath – //h:div[@id=”split_here”] 같은 XPath 식이어야 합니다. 미리보기 패널에서 분할 기능을 구현하기 위해 내부적으로 사용하는 loc 값도 사용할 수 있습니다.
before – True이면 식별된 요소 앞에서 분할하고, 그렇지 않으면 뒤에서 분할합니다.
totals – 내부적으로 사용됩니다.
- calibre.ebooks.oeb.polish.split.multisplit(container, name, xpath, before=True)[소스]¶
지정한 파일을 여러 위치(지정한 XPath 식과 일치하는 모든 태그)에서 분할합니다. 참고:
split(). 분할 시 영향받는 파일에 대한 모든 링크와 참조가 자동으로 옮겨집니다.- 매개변수:
before – True이면 식별된 요소 앞에서 분할이 일어나고, 그렇지 않으면 뒤에서 분할됩니다.
- calibre.ebooks.oeb.polish.split.merge(container, category, names, master)[소스]¶
지정한 파일들을 하나의 파일로 병합하고, 영향받는 파일에 대한 모든 링크와 참조를 자동으로 옮깁니다. 파일은 모두 HTML 파일이거나 모두 CSS 파일이어야 합니다.
- 매개변수:
category – HTML 파일이면
'text', CSS 파일이면'styles'이어야 합니다.names – 병합할 파일 목록
master – 병합된 파일 가운데 마스터 파일이 될 파일입니다. 즉, 병합 후에도 남아 있을 파일입니다.
표지 관리¶
- calibre.ebooks.oeb.polish.cover.set_cover(container, cover_path, report=None, options=None)[소스]¶
책의 표지를 cover_path가 가리키는 이미지로 설정합니다.
- 매개변수:
cover_path – 이미지 파일의 절대 경로이거나 책 안에 있는 이미지의 정규 이름입니다. 책 안의 이미지를 사용할 때는 아래 설명처럼 options도 설정해야 합니다.
report – 단일 인수를 받는 선택적 호출 가능 객체입니다. 처리 중인 작업에 대한 정보가 이 객체로 전달됩니다.
options – 표지 설정 방식을 제어하는 None 또는 사전입니다. 사전에는 다음 항목이 들어갈 수 있습니다. keep_aspect: True 또는 False (EPUB에서 표지의 종횡비 유지) no_svg: True 또는 False (EPUB 제목 페이지에서 SVG 표지 래퍼 사용) existing: True 또는 False (``cover_path``가 책 안의 기존 이미지를 가리킴)
CSS 다루기¶
- calibre.ebooks.oeb.polish.fonts.change_font(container, old_name, new_name=None)[소스]¶
글꼴 패밀리를 old_name에서 new_name으로 바꿉니다. 스타일시트, style 태그, style 속성에 있는 해당 글꼴 패밀리의 모든 항목이 변경됩니다. old_name이 내장 글꼴을 가리키면 그 글꼴은 제거됩니다. 글꼴 패밀리를 변경하는 대신 제거하려면 new_name에 None을 지정하면 됩니다.
- calibre.ebooks.oeb.polish.css.remove_unused_css(container, report=None, remove_unused_classes=False, merge_rules=False, merge_rules_with_identical_properties=False, remove_unreferenced_sheets=False)[소스]¶
책에서 사용되지 않는 CSS 규칙을 모두 제거합니다. 사용되지 않는 CSS 규칙은 실제 콘텐츠와 일치하지 않는 규칙입니다.
- 매개변수:
report – 단일 인수를 받는 선택적 호출 가능 객체입니다. 수행 중인 작업에 관한 정보가 이 객체로 전달됩니다.
remove_unused_classes – True이면 어떤 CSS 규칙과도 일치하지 않는 HTML의 class 속성도 제거합니다.
merge_rules – True이면 동일한 선택자를 가진 규칙을 병합합니다.
merge_rules_with_identical_properties – True이면 동일한 속성을 가진 규칙을 병합합니다.
remove_unreferenced_sheets – True이면 어떤 콘텐츠에서도 참조되지 않는 스타일시트를 제거합니다.
목차 다루기¶
책 편집 도구¶
- class calibre.gui2.tweak_book.plugin.Tool[소스]¶
기반 클래스:
objectEdit Book 플러그인에서 개별 도구의 기본 클래스입니다. 유용한 멤버는 다음과 같습니다:
self.plugin: 이 도구가 속한calibre.customize.Plugin객체에 대한 참조입니다.self.
bossself.
gui
하위 클래스에서 반드시 재정의해야 하는 메서드:
- name = None¶
고유한 이름으로 설정하십시오. 키로 사용됩니다.
- allowed_in_toolbar = True¶
True이면 사용자가 이 도구를 플러그인 도구 모음에 배치할 수 있습니다.
True이면 사용자가 이 도구를 플러그인 메뉴에 배치할 수 있습니다.
- toolbar_button_popup_mode = 'delayed'¶
도구 모음 버튼 메뉴(있는 경우)의 팝업 모드입니다. 가능한 값은 ‘delayed’, ‘instant’, ‘button’입니다.
- property boss¶
사용자 인터페이스를 제어하는
calibre.gui2.tweak_book.boss.Boss객체입니다.
- property gui¶
사용자 인터페이스의 메인 창
- property current_container¶
현재 편집 중인 책을 나타내는
calibre.ebooks.oeb.polish.container.Container객체를 반환합니다.
- register_shortcut(qaction, unique_name, default_keys=(), short_text=None, description=None, **extra_data)[소스]¶
지정한 ``qaction``을 실행할 키보드 단축키를 등록합니다. 이 단축키는 편집기 환경설정의 키보드 단축키 섹션에서 사용자가 자동으로 사용자 지정할 수 있게 됩니다.
- 매개변수:
qaction – QAction 객체입니다. 사용자가 설정된 키 조합을 누르면 이 객체가 실행됩니다.
unique_name – 이 단축키/동작의 고유 이름입니다. 내부적으로 사용되며, 이 플러그인의 다른 어떤 동작과도 중복되면 안 됩니다.
default_keys – 기본 키보드 단축키 목록입니다. 지정하지 않으면 기본 단축키는 설정되지 않습니다. 여기 지정한 단축키가 내장 단축키 또는 사용자 설정/다른 플러그인의 단축키와 충돌하면 무시됩니다. 그런 경우 사용자는 환경설정에서 직접 단축키를 설정해야 합니다. 예:
default_keys=('Ctrl+J', 'F9').short_text – 이 동작의 선택적 짧은 설명입니다. 지정하지 않으면 QAction의 텍스트가 사용됩니다.
description – 이 동작의 선택적 긴 설명입니다. 이 단축키의 환경설정 항목에 사용됩니다.
- create_action(for_toolbar=True)[소스]¶
for_toolbar값에 따라 플러그인 도구 모음 또는 플러그인 메뉴에 추가될 QAction을 생성합니다. 예:def create_action(self, for_toolbar=True): ac = QAction(get_icons('myicon.png'), 'Do something') if for_toolbar: # We want the toolbar button to have a popup menu menu = QMenu() ac.setMenu(menu) menu.addAction('Do something else') subaction = menu.addAction('And another') # Register a keyboard shortcut for this toolbar action be # careful to do this for only one of the toolbar action or # the menu action, not both. self.register_shortcut(ac, 'some-unique-name', default_keys=('Ctrl+K',)) return ac
더 보기
메서드
register_shortcut().
편집기 사용자 인터페이스 제어¶
전자책 편집기의 사용자 인터페이스는 전역 Boss 객체 하나로 제어됩니다. 이 객체에는 플러그인 코드에서 일반 작업을 수행할 때 사용할 수 있는 유용한 메서드가 많이 있습니다.
- class calibre.gui2.tweak_book.boss.Boss(parent, notify=None)[소스]¶
-
- apply_container_update_to_gui(mark_as_modified=True)[소스]¶
현재 책 컨테이너의 최신 데이터가 반영되도록 사용자 인터페이스의 모든 구성 요소를 갱신합니다.
- 매개변수:
mark_as_modified – True이면 책이 수정된 것으로 표시되어, 종료할 때 사용자에게 저장할지 묻습니다.
- commit_all_editors_to_container()[소스]¶
편집기에서 열려 있는 파일에 사용자가 가한 변경 사항을 컨테이너에 커밋합니다. 현재 컨테이너에 대해 작업을 수행하기 전에 이 메서드를 호출해야 합니다.
- property currently_editing¶
현재 편집 중인 파일의 이름을 반환합니다. 편집 중인 파일이 없으면 None을 반환합니다.
- edit_file(name, syntax=None, use_template=None)[소스]¶
name으로 지정한 파일을 편집기에서 엽니다.
- 매개변수:
syntax – 파일의 미디어 형식입니다. 예:
'text/html'. 지정하지 않으면 파일 확장자로 추정합니다.use_template – 열린 편집기를 초기화하는 데 사용할 템플릿입니다.
- open_book(path=None, edit_file=None, clear_notify_data=True, open_folder=False, search_text=None)[소스]¶
``path``에 있는 전자책을 편집용으로 엽니다. 전자책 형식이 지원되지 않거나 현재 책에 저장되지 않은 변경 사항이 있으면 오류를 표시합니다.
- 매개변수:
edit_file – 새로 연 책 안에서 처음 편집을 시작할 파일 이름입니다. 이름 목록을 지정할 수도 있습니다.
