2012-02-17 2 views
1

최근에 Nook Simple Touch를 구입했습니다. Calibre를 사용하여 전자 책을 관리하고 Nook로 전송합니다.스크립트를 사용하여 epub 파일의 일부 텍스트를 변경하려면 어떻게해야합니까?

B & N 부분의 epub 사양을 비표준으로 구현했기 때문에 Nook ST는 많은 소스에서 가져온 표지 이미지를 표시하지 않습니다. 문제는 여기에 설명되어 있습니다 :

<meta content="id5" name="cover" /> 

그리고 :

<meta name="cover" content="id5" /> 

그러나 많은 EPUB 제작자가 이런 식으로 주위를 가지고 : 덮개 형식이어야하는 http://john.nachtimwald.com/2011/08/21/nook-covers-not-showing-up/ 기본적으로 구석 ST는 XML 속성을 필요로 Nook ST는 표지 이미지를 완전히 무시합니다.

내 epub 파일에서 content.opf 파일을 수동으로 편집했습니다. 지금까지 그들은 모두 이미지 메타를 가졌지 만, 항상 "잘못된"방법 (잘못된, 눅에 따르면) 주위에있었습니다.

최근에 저는 주로 REGEX로 놀았습니다. 주로 PDF 파일에서 Calibre로 변환 한 epub의 정리를 자동화하려고했습니다. 저는 여전히 REGEX의 초심자입니다.

궁금한 점은 '이름'과 '콘텐츠'속성의 교체를 자동화하는 방법에 대한 것입니다. 나는 그것이 REGEX와 스크립팅의 조합으로 이루어질 수 있다고 생각한다. 파이썬에있는 다른 epub 관련 스크립트 중 일부를 알고 있습니다. 나는 Mac (OS X)을 사용하고 있으며 정상적으로 작동하는 것 같습니다. AppleScript는 좋은 옵션이 될 수 있습니다. 사람들이 다른 플랫폼에서 실행할 수있는 것이 있다면 좋겠지 만, 다른 사람들도 유용 할 것입니다. 여기

내가 예견 단계는 다음과 같습니다

~ 추출 EPUB 파일

~ 사용 REGEX을 확인합니다 :

:

발견 ~ 경우
<meta content="???" name="cover"> 

이 사용 정규식에 주위를 변경하려면

<meta name="cover" content="???"> 

~ 올바른 압축 풀기 프로세스를 사용하여 추출 된 파일을 다시 epub에 압축 해제합니다.

여기에서 정보를 찾았습니다 : http://www.mobileread.com/forums/showthread.php?t=55681 올바르게 epub 파일을 압축하는 방법을 설명합니다. 기본적으로이 두 명령을 필요

zip -X0 "full path to new epub file" mimetype 
zip -rDX9 "full path to new epub file" * -x "*.DS_Store" -x mimetype 

나는 그것을 발견하고 사용 할 수있는 적 (B & 때까지 N 자신의 가난한 EPUB/XML 구현을 해결) 여기서 온라인 결과 스크립트를 게시하고 싶습니다. Calibre 포럼과 mobileread forums에 게시하는 것은 마음에 듭니다. (이 두 가지가 익숙하기 때문에 사람들이이 문제에 대한 수동 수정을 보았습니다.)

그런 스크립트 작성 방법을 안내 할 수있는 사람이 있습니까? 이상적으로, 저는 실제로 스크립트를 만드는 방법을 알고 싶습니다. 시간이 지남에 따라 이러한 종류의 것들을 직접 알아낼 수 있습니다 (특히 REGEX 부분은 점점 더 유용 해짐).

감사합니다.

조나단

@Haldean : 나는 반복적으로 모든 하위 폴더에있는 모든 content.opf 파일을 통해 자신의 스크립트 작업을 만들기에 관한 Haldean하는 코멘트에 무슨 뜻인지 설명하기 위해 추가되었습니다.

> My_expanded_epubs 
- -> epub_one_expanded 
- - - -> content.opf 
- -> epub_two_expanded 
- - - -> content.opf 
- -> epub_three_expanded 
- - - -> content.opf 
etc. 
+0

찾고있는 메타 태그를 올바르게 식별 할 수있는 정규식이 있습니까? – Marcin

+2

또한 B & N에 불평해야합니다. 속성이 특정 순서로 있어야하는 XML 프로세서를 사용하는 것에 대한 변명의 여지가 없습니다. – Marcin

+0

감사합니다. Marcin. 이 문제와 관련하여 지금 B & N에 메시지를 보냅니다. – inspirednz

답변

0

개인적으로 나는 정규식 (its the wrong tool)이 작업을 수행하지 않을 것입니다. XSLT를 사용할 수 있습니까?


편집 : 여기

는 데모입니다. http://www.xsltcake.com/slices/nvLRJ6

숫자가 XSLT librarys for python입니다.


는 편집 :

당신이 정규식과 함께 그 일을 주장하는 경우,이 같은 패튼 할 것입니다 :
<meta content="([^"]+)" name="([^"]+)" \/>

나는 disclaimer that this is the wrong tool으로이 말을하고 가장자리 경우가 있습니다 이것이 신뢰할 수 없게 만들고 추천하지 않습니다.

http://regexr.com?301uq

+0

오케이. 제안 해 주셔서 감사합니다. 내가 제공 한 링크를 살펴 보았습니다. 현재 작업을 자동화하는 과정에서 XSLT를 사용하는 방법이 분명하지 않습니다. 어떤 제안? 링크 된 페이지로 연결된 페이지를 통해 읽었습니다. 나는 앞으로 나아갈 방법을 알아낼 수있는 것을 찾지 못했습니다. – inspirednz

+0

그래서 regex가 문제의 XML 속성을 찾는 방법이 아닌 이유에 대해 더 많이 배우고 있습니다. 비록 내가 아직 확신하지는 않지만 매우 간단한 것을 찾기 위해 정규 표현식을 사용하는 것은 불가능합니다. 그것은 정규 표현식의 한계에 대한 나의 무지 때문에 발생할 수 있습니다. – inspirednz

+0

@ indepiredlife : 정규식은 올바른 XML 파서가 원하는 순서대로 속성을 출력하도록 할 수 없기 때문에 정규식이 적합하다고 말할 수 있습니다. 전체 문서를 구문 분석하는 모든 솔루션은 영향을받은 구현. 대조적으로,'sed '와 같은 도구는 변경하고자하는 문서의 부분만을 편집 할 수있게합니다. – Marcin

2

당신이 (내가 더 나은 옵션이라고 생각) 쉘 스크립트로 갈 의향이 있다면 당신은 나오지도 한 줄 사용할 수 있습니다

sed 's/<meta content="\(.*\)" name="cover" \/>/<meta name="cover" content="\1" \/>/' [your-file] 

것은 모두 교체해야합니다 메타 행은 content 속성이 먼저오고 올바른 순서로 표시됩니다.

import re 
import sys 
with open(sys.argv[1]) as f: 
    for line in f: 
    # Match this line to the wrong-way-around meta tag, put the content in group 1 
    m = re.match(r'<meta content="(.*)" name="cover" />', line) 
    if not m: 
     print line 
    else: 
     print '<meta name="cover" content="%s" />' % m.group(1) 
+0

정규식은 공백의 변형에 강건하지 않습니다. – Marcin

+0

고맙습니다. 파이썬은 내 머리를 잡기 위해 비교적 간단한 언어처럼 보입니다. 나는 아마도 25 년 전에 함께 놀았던 베이직을 생각 나게한다. Marcin이 제공 한 정규식을 사용하여이 문제를 해결해 보겠습니다. – inspirednz

+0

@Haldean : epub 파일의 압축을 풀고 다시 포장하는 방법을 알고 싶습니까? 나는 그 정보를 어느 곳에서도 찾아 볼 수 없다. 그것은 내 원래 게시물에 지정된 방식으로해야합니다. – inspirednz

-1

내가 zapthedingbat's answer 동의가 : 이것이 XML 문제입니다, 그래서 특별히 XML, 즉 XSLT를 위해 설계 도구를 사용하자 그 등가 파이썬 번역 될 것이다.

XSLT를 처음 사용 했으므로이 솔루션을 사용해 보려면 XSLT 프로세서가 필요합니다. * nix를 사용하는 경우 xsltproc은 명령 행 처리기이며 기본적으로 거의 확실하게 설치되며이 솔루션을 액면 그대로 사용할 수 있습니다. 그렇지 않은 경우 선택한 언어에서 XSL 변환을 수행하기위한 API가 있는지 확인해야합니다.여기

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="@*|node()"> 
    <!-- copy everything as is --> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="meta"> 
    <!-- except for the <meta/> element, reverse the attribute order --> 
    <meta name="{@name}" content="{@content}"/> 
    </xsl:template> 
</xsl:stylesheet> 

당신의 예제 : 다음 XSLT를 실행

<root> 
    <meta content="id5" name="cover" /> 
</root> 

xsltproc과 :

$ xsltproc so.xsl so.xml 

그 결과

다음 속성을 재정렬에 대한 매우 간단한 일반적인 솔루션입니다 :

<root> 
    <meta name="cover" content="id5"/> 
</root> 
+0

왜 downvote? 이 대답은 질문을 완전히 만족시킵니다 * 스크립트를 사용하여 epub 파일의 일부 텍스트를 변경하려면 어떻게합니까? * –

+0

어떤 종류의 XML 처리를 사용하면 구석에있는 다른 버그를 일으키는 유효한 마크 업을 알 수 없기 때문에 매우 매력적이지 않습니다. . 대상 텍스트 편집은 여기에 필요한 것입니다. – Marcin

+0

@Marcin "매력없는 사람"이 될 자격이 있습니까? –

1

난 당신이 압축 해제 파일로 작업하기 위해 sed를 사용하는 것이 좋습니다과 같은 것을 할 것 :이 버전의 추가 또는 누락 된 공간, 또는 슬래시 대처할 것

sed -e 's/<[ ]*meta[ ]*content[ ]*=[ ]*"\(.*\)"[ ]*name[ ]*=[ ]*"cover"[ ]*\/*[ ]*>/<meta name="cover" content="\1" \/>/g' 

참고.

xml 프로세서 (나는 lxml을 사용하는 python 스크립트를 제안합니다)를 사용하여 수정 사항에 잘못된 유효하지 않은 마크 업이 없는지 확인할 수 있습니다.

완벽하게 호환되는 XML 프로세서가 완전히 합법적 인 다른 변경 사항을 만들 수 있기 때문에 모든 종류의 XML 도구를 사용하여 조작을 수행하는 것이 매력적이지 않으며 구석에있는 다른 버그를 유발할 수 있습니다. sed을 사용하면 원하는 문서 부분 만 편집 할 수 있습니다.

+0

이것을 완전히 생각해 줘서 고마워. 잠시 후 귀하의 제안을 시도하겠습니다 (오후 내내 오프라인 상태가되어 응답이 지연됩니다). 태그 조작이 모두 좋으면 다른 단계는 내가 어떻게 다른 단계를 돌보는지를 해결하는 것입니다. 예를 들어, epub의 압축을 풀고 정규식 검사를 실행 한 다음 epub을 다시 포장하십시오. 누군가 Nook ST에 편승하기를 원하는 많은 epub 파일을 가지고 있다면, 대부분의 시간은 단지 풀고 재 포장하는 데에만 소비됩니다. 스크립트에서 파일을 실행하고 거기에있는 모든 epub 파일을 반복적으로 처리하는 것이 좋을 것입니다. – inspirednz

+0

나는 (내가 기억하는 것에서) Calibre를 사용하여 epubs를 아주 쉽게 대량으로 검증 할 수 있습니다. 좋은 생각 일텐데. 감사. – inspirednz

+0

@ indepiredlife : 포장 풀기와 관련하여 문제가있는 경우 별도의 질문을 게시하는 것이 좋습니다. – Marcin