메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

EPUB 정리하기

EPUB 파일의 문제점을 찾아서 정정하기

Colin Beckingham , 작가겸 연구원, 프리랜서
Colin Beckingham은 캐나다 온타리오에 거주하는 프리랜서 연구원이자 작가이며 프로그래머이다. 킹스턴의 Queen's University와 University of Windsor에서 학위를 받았고 은행 업무, 원예, 경마, 교육, 공무원 행정 업무, 소매 및 여행과 관광 업종을 포함한 다양한 분야에 종사해왔다. 데이터베이스 애플리케이션과 다양한 신문, 잡지 및 온라인 기사의 저자이며, 관심 연구 분야는 오픈 소스 프로그래밍, VoIP 및 Linux용 음성 제어 애플리케이션이다. Colin의 이메일 주소는 colbec@start.ca이다.

요약:  보통의 유효성 검증 방법으로는 EPUB 문서에서 몇 가지 문제점을 발견할 수 없습니다. 이 문서가 잘 구성된 XML처럼 유효성이 검증되고 EPUB 표준을 따르기만 하면 올바른 것처럼 보일 수 있지만, e-Reader에서는 이 문서를 올바르게 읽을 수 없습니다. 예제에는 OCR 스캐닝으로 인한 맞춤법 오류와 끊어진 단락 및 잘못된 페이지 번호가 포함되어 있습니다. 그러나 두 가지 방법(EPUB 편집기인 Sigil을 사용하는 방법과 PHP를 SimpleXML 및 Enchant 라이브러리와 조합으로 사용하는 방법)을 사용하여 이러한 오류를 확인하고 정정할 수 있습니다. 정규식은 이 문서를 효과적으로 처리하는 데 중요한 역할을 합니다.

기사 게재일:  2011 년 8 월 30 일
난이도: 중급 원문:  보기 PDF:  A4 and Letter (49KB | 12 pages)Get Adobe® Reader®
페이지뷰:  1168 회
의견:  


EPUB 형식은 문서를 표시하는 데 효과적인 방법이다. EPUB은 XML 구조를 기반으로 하기 때문에 매우 다양한 디바이스에서 문서 컴포넌트가 적절하게 배치되고 매우 잘 표시된다. EPUB에 대한 소개는 참고자료에 있는 Liza Daly의 기사를 참조한다.

자주 사용하는 약어

  • GUI: Graphical user interface
  • OCR: Optical character recognition
  • HTML: Hypertext Markup Language
  • WYSIWYG: What you see is what you get
  • XML: Extensible Markup Language

이러한 문서는 다음과 같은 두 가지 레벨에서 부족한 점이 있다.

  • 기본적인 레벨에서는 XML 마크업이나 컨텐츠가 깨진다.
  • XML 검사로 발견할 수 없는 레벨에서는 더욱 미묘한 문제점이 있다.

EPUB이 내부에서 깨지는 전자의 경우에는 EpubCheck 프로젝트를 사용할 수 있다(링크는 참고자료 참조). 이 기사의 나머지 부분에서는 리더에 문제를 일으키는 두 번째 문제점을 조사하게 된다.

XML에서 시행되는 엄격한 제어는 어느 정도만 작동한다. 다행히도 XML에서는 소프트웨어에 결함을 일으킬 수 있을 정도는 아니지만, 오류가 많이 허용된다. 그렇지만 이러한 오류는 문서를 원활하게 읽는 데 방해가 된다. 이러한 오류가 발생하는 이유를 확인하기는 쉽다. 발행자가 인쇄된 페이지를 OCR로 읽어서 그 데이터를 텍스트 형식으로 전송하는 경우에는 글꼴의 비호환성으로 인해 야기되는 오류를 포함하여 인쇄된 페이지에 있는 모든 것들이 같이 전달된다. 상업적인 상황에서는 편집자가 직접 결과를 검토하여 완성판을 만들어 내지만, 여기에서는 제품이 무료 오픈 소스 배포판용으로 계획되기 때문에 발행자가 이러한 비용을 손쉽게 부담하기는 어렵다. 그래서 결국 e-Reader에서 마무리되는 것이 좋지만 생각하는 것만큼 좋게 마무리되지는 않는다. 예제에는 깨진 단락과, 공백 페이지, 잘못된 페이지 번호 및 맞춤법 오류가 포함되어 있다.

개발자 관점에서는 EPUB의 구조를 이용하여 이러한 문제점을 어떻게 처리할 수 있을 것인지가 과제이다. 이 기사에서는 Sigil EPUB 편집기를 사용하여 이러한 문제점 중 일부를 처리하고 PHP를 SimpleXML 및 맞춤법 라이브러리와 조합하여 기타 다양한 문제점을 해결하는 방법을 살펴본다.

깨어진 단락과 공백 페이지

깨어진 단락을 2차적인 문제점의 예로 취급한다. HTML 마크업에서는 이 문제점이 다음과 같이 나타난다.

<p>This is where my paragraph begins, hits the end of a physical page here</p>
<div class="newpage" id="page-12"></div>
<p>and then continues from the top of the next physical page, 
     finally coming to an end here.</p>

스캐너가 페이지의 끝을 읽으면 페이지가 구문적으로 완료되었는지 여부와 관계없이 스캐너는 단락 태그를 삽입한 후, 페이지가 적절한지 여부와 관계없이 페이지가 새 단락으로 시작되도록 다음 페이지의 맨 위에서 시작한다. 이렇게 하는 것이 코드를 완료하는 데 도움이 되지만, 고아 섹션(다음 페이지로 넘어간 섹션)으로 인해 불완전한 단락이 발생하게 된다. e-Reader에서는 사용자가 페이지 마커가 표시되어 있지 않지만 마치 독립된 단락처럼 단락 섹션이 분리되어 있는 동일한 디바이스 페이지에서 양 섹션을 볼 수 있다.

이와 마찬가지로 공백 페이지를 생각해보자.

<div class="newpage" id="page-128"></div>
<p></p>
<div class="newpage" id="page-129"></div>

위에 있는 스니펫에서 129 페이지는 실제로 존재하는 것일까? 페이지를 공백으로 유지해야 할 수도 있지만, 그렇지 않은 경우에는 한 페이지만 넘겨야 할 때 두 페이지를 넘기는 것은 불편하다.

맞춤법 오류는 문제점의 형태가 다양하며 여기에서는 복잡한 패턴을 살펴보는 대신 서로 다른 두 가지 단어 목록을 비교한다. 스크립팅 방법을 사용하여 이 문제점을 개별적으로 처리한다.


Sigil

Sigil(웹 사이트와 지원 페이지는 참고자료 참조)은 프로그래머가 패턴 일치 오류를 찾아서 오류를 정정할 수 있는 WYSIWYG EPUB 편집기이다. 정규식에 대한 간단한 소개는 정규식 사이드바를 참조하고 자세한 정보는 참고자료를 참조한다.

정규식

정규식은 패턴 일치 기술을 사용하여 텍스트를 검색하고 대체할 수 있는 강력한 방식이다. 구문이 간결하므로 원하지 않는 결과가 발생하지 않게 하려면 주의해서 사용해야 한다.

정규식의 예는 [^.]</p>이며, 이 정규식은 앞에 마침표가 없는 단락 태그의 끝을 검색한다. 이 정규식은 문제가 될 수도 있고 그렇지 않을 수도 있다.

이 정규식에서 대괄호([])는 단 하나에만 적용할 수 있는 문자 그룹을 둘러싸며, 캐럿 기호(^)는 다음 문자가 임의의 문자가 아니라는 것을 의미하며, 그룹 안에 있는 쉼표(.)는 대괄호 밖에 있는 나머지 기호와 마찬가지로 쉼표 자체를 의미한다.

이 유용한 도구에 대한 더 자세한 내용은 참고자료를 참조한다.

Sigil은 Linux® 저장소에서는 사용할 수 없지만, 사전 컴파일된 2진 파일이나 소스 파일로 사용 가능하다. 일단 GUI에서 File > Open을 클릭하여 EPUB을 직접 연다. 이렇게 하면 EPUB이 추출되고 왼쪽에 컴포넌트 파일의 디렉토리가 표시되고, 오른쪽에는 개별 파일의 컨텐츠기 표시되며 e-Reader로 이 컨텐츠를 보거나 마크업 코드로 볼 수 있는 브라우저 분할창이 표시된다. 문제점을 찾아서 정정하는 데 있어서는 마지막 기능이 필수적이다.

EPUB에 포함되어 있는 HTML 파일 중 하나를 선택하고 두 번 클릭하여 브라우저 창에서 이 파일을 연다. 그런 다음, View > Code View를 클릭하여 이 파일에 숨겨져 있는 코드를 표시한다. 그러면 모든 태그를 볼 수 있다.

고아가 된 단락 청크를 찾고자 한다고 가정한다. 찾고 있는 기준은 일반적인 문장 끝 문자가 선행되지 않는 단락 끝 태그(</p>)이다. 이러한 문자 중 가장 일반적인 것은 쉼표이다. Sigil은 검색 기능(Edit > Find)을 제공하며 보통의 검색 모드를 이용하면 .</p>와 같은 문자열을 찾을 수 있지만, 이렇게 해서는 단락 끝 태그 앞에 쉼표가 없는 단락 끝을 찾을 수가 없다. 이러한 작업을 수행하기 위해서는 More를 클릭할 때 표시되는 정규식 검색 모드를 사용해야 한다. 브라우저 창에서 코드의 맨 위로 이동하여 다음과 같은 단계를 수행한다.

  1. Direction에는 Down을 선택한다.
  2. Search mode에는 Regular expression을 선택한다.
  3. Find what 문자열로 [^.]</p>를 입력한다.
  4. Find Next를 클릭한다.

이 프로세스를 이용하면 찾고자 하는 문자열을 찾을 수 있다(해당하는 문자열이 존재하는 경우). 아무 것도 검색되지 않는 경우에는 임시로 해당 문자열을 작성하여 검색 기능이 작동하는지 확인할 수도 있다.

한동안 이 기술을 사용하고 나면 논리적으로 단락이 쉼표 이외의 문자로 끝날 수 있다는 사실을 바로 알게 된다. 큰따옴표("), 느낌표(!), 물음표(?) 및 기타 일부 문자가 완전한 문장의 요구사항에 부합한다는 것을 알 수 있다. 이점은 정규식의 문제점이 아니다. 대괄호는 그룹을 나타내기 때문에 Find what[^.?!"]</p>로 변경하면 검색 기능은 단락의 끝에 쉼표, 물음표, 느낌표 또는 큰따옴표가 있는 것을 정상으로 받아들이고 그밖의 것은 오류로 플래그를 지정한다.

깨어진 단락을 나타내는 또 다른 신호는 <p>다음에 알파벳 소문자로 시작하는 문장이다. 이것을 정규식으로 표현하면 <p>[a-z].이다. 또 다른 유용한 정규식은 <p>[0-9].이며, 이 정규식은 숫자로 시작하는 단락을 찾는다. 이 부호는 e-Reader에서는 더 이상 컨텍스트가 관련이 없을 수도 있는 페이지 번호를 스캐너가 발견한 위치에서 효과적이다.

이러한 오류 중 하나를 수정할 결심을 어떻게 하는가는 별개의 문제이다. 페이지 마커로 인해 단락이 두 부분으로 분리되는 경우에는 완전한 단락의 앞이나 뒤로 마커를 이동하여 이 두 부분이 하나의 단락이 되도록 재결합한다. 이렇게 해도 페이지 번호가 대체로 정확하지만 완전히 정확한 것은 아니다.

페이지 마커를 검색하는 프로세스도 비슷하다. 다시 정규식 옵션을 사용하며 Find whatpage-[0-9]+인 경우에는 리터럴 문자 p, a, g, e대시로 시작하고 다음에 하나 이상의 숫자(0 ~ 9까지의 여러 가지 숫자 문자)가 있는 모든 문자열을 검색한다.

손쉽게 발견할 수 있는 중요한 오류는 단어, 단락 및 페이지가 모두 동시에 깨지는 경우이다. 인쇄 버전에서는 하이픈이나 대시가 깨져서 나타나며 이러한 오류는 코드를 보면 쉽게 확인하고 검색할 수 있다.

<p>This is where my paragraph begins, hits the end of a phys-</p>
<div class="newpage" id="page-12"></div>
<p>ical page and then continues from the top of the next physical page, 
     finally coming to an end here.</p>

이 경우에는 Find what 문자열이 -</p>인 글로벌 정상 검색으로 이러한 오류를 매우 신속하게 가려낼 수 있다.


페이지 번호 검토

Sigil을 사용하여 페이지 브레이크와 페이지 번호를 찾아서 검토할 수 있다고 해도 페이지 수가 100을 초과하는 문서에서는 그렇게 하는 것이 지루할 수 있다. 가장 손쉬운 방법은 PHP를 사용하여 문서 전체를 반복하여 페이지 번호를 검토하는 것이다.

목록 1에 있는 스크립트는 HTML 페이지를 찾아서 검토하고 페이지 브레이크를 확인한다. 또한, 첫 번째 페이지(1페이지가 아닐 수도 있음)의 번호를 찾아서 각 후속 페이지가 첫 번째 페이지로부터 증가된 것인지 확인한다. 페이지 번호 테스트는 매우 단순하지만, OPF 파일을 사용하여 컴포넌트 HTML을 찾고 시험하는 하나의 방법이라고 할 수 있다.


목록 1. PHP와 SimpleXML을 사용하여 EPUB을 확인하는 페이지

<?php
/* epub is a zipped package containing many files
  the file "content.opf" contains the pointers to the constituent files
  inside content.opf you have 

  package (root)
    -> manifest
      -> item
          which we need to filter for media-type="application/xhtml+xml"
          and to check these are real text pages, not just full page images

  these are the text chapters which need to be checked one by one
*/
$firstpage = 0;
$oldpage = 0;
// look for the text to be checked
$opf_file = "./OEBPS/content.opf";
if (!file_exists($opf_file)) {
  //cleanup();
  die("Cannot find the OPF file\n");
} else {
  echo "Found it!\n";
  $xml = simplexml_load_file($opf_file);
  // get the manifest items
  foreach ($xml->manifest->item as $mi) {
    if ($mi['media-type']=='application/xhtml+xml') {
      echo "Found ".$mi['href']."\n";
      if (substr($mi['href'],0,4) == 'part') {
          echo "Page number check in document ".$mi['href']."\n";
          echo scan_chap("./OEBPS/".$mi['href']);
      }
    }
  }
}
function scan_chap($chap) {
global $firstpage, $oldpage;
  echo "Trying to page num check section $chap \n";
  if (!file_exists($chap)) {
    echo "Cannot find the chapter $chap\n";
  } else {
    echo "Found it!\n";
    $xml = simplexml_load_file($chap);
    //$i = 0;
    foreach ($xml->body->div->div as $pagnumdiv) {
      if ($pagnumdiv["class"]=='newpage') {
          echo $pagnumdiv["id"]."\n";
          $page = (int) substr($pagnumdiv["id"],5);
          if ($firstpage == 0) {
          $firstpage = $oldpage = $page;
          } else {
          if ($page != $oldpage+1) echo "Problem at page after $oldpage\n";
          $oldpage++;
          }
      }
    }
  }
  return "Done...\n";
}
?>

이 코드에서는 먼저 발견된 첫 번째 논리 페이지의 번호(루프의 시작 부분에서 한 번 설정)와 확인된 이전 페이지의 번호(반복될 때마다 변경되는)에 해당하는 글로벌 변수를 설정한다. 그런 다음에는 OPF 파일의 이름을 선언하고 이 파일을 찾으며 이 파일을 찾을 수 없는 경우에는 오류를 표시하고 종료한다. 파일이 발견되면, 이 스크립트는 이 파일을 XML 오브젝트로 열고, media-type 속성을 사용하여 HTML이 되도록 표시하는 속성 정의 파일에 기재되어 있는 파일의 이름을 찾는다. 이 특별한 EPUB 문서의 어떤 HTML 파일에는 전체 페이지 이미지만 포함되어 있으며 따라서 이러한 파일은 무시된다. 이러한 페이지의 파일 이름에는 문자열 leaf가 포함되어 있으며 확장된 텍스트가 있는 기타 파일에는 part 레이블이 있다. 이 코드에서는 서브스트링을 사용하여 이러한 것을 필터링한다.

파일의 이름을 확인했으므로 이 파일을 자체 simpleXML 오브젝트로 읽어 들일 수 있다. <div> 태그 전체를 반복하여 클래스 속성 newpage가 있는 페이지를 대상으로 필터링하면 페이지 번호를 포함하고 있는 id 속성 값을 찾을 수 있다. 첫 번째 페이지가 1 페이지가 아닐 수도 있으므로 어떤 번호가 첫 번째 페이지인지 책에서 알려 주도록 해야 하며, 이 값이 글로벌 첫 번째 페이지 변수에 저장되고 나면 다음 페이지의 번호가 무엇인지 예측할 수 있다. 페이지의 번호가 예상되는 번호가 아닌 경우에도 이 스크립트는 오류를 생성하고 계속 확인 작업을 수행한다.

이 스크립트는 텍스트를 변경하려고 하지는 않는다. 이 스크립트는 단지 주의를 기울일 필요가 있다고 여겨지는 것에 플래그를 지정할 뿐이다.


PHP, XML 및 Enchant를 사용하여 맞춤법 확인

맞춤법에는 다양한 문제점이 있다. 사실상 이 경우에는 OCR이 TJpon이나 IJpon로 읽는 Upon과 같은 이벤트가 완료되었는 데도 오류가 정정되지 않는 것을 추적하는 것이다. 맞춤법에서 여러 가지 대안을 제시하면 맞춤법 루틴은 이 맞춤법이 너무 이상하여 이 맞춤법에서 제공하는 제안이 만족할 만하거나 유용하지 않다라고 여긴다.

맞춤법 루틴은 단어를 하나씩 시험하고 알려진 표준 목록과 비교하여 일치하지 않는 단어를 찾아내고 제안을 하여 사용자가 변경할 수 있도록 한다. Sigil을 이용하면 EPUB 패키지에 있는 여러 가지 문서에서 특정 문자열을 대체할 수 있지만, 세밀한 제어를 하려면 전문 라이브러리와 더불어 PHP, Perl, Python 등과 같은 스크립팅 엔진의 기능이 필요하다.

현재 PHP 새 버전에는 SimpleXML을 사용하여 XML과 HTML 파일을 조사하고 Enchant 맞춤법 관리자 라이브러리를 사용하는 데 필요한 도구가 포함되어 있다. Enchant에는 다양한 기본 맞춤법 목록을 관리할 수 있는 기능이 있다. 또한, UK English와 US English를 구별하는 데 도움이 된다.

목록 2에 있는 스크립트는 목록 1과 동일한 방법을 사용하여 각 속성 정의 파일을 별도로 시험하며, 이번에는 각 단락과 단어를 하나씩 알려진 각 맞춤법 목록과 대조한다. 이 스크립트는 목록 1과 동일한 방법으로 HTML 컴포넌트 파일 전체를 반복하고 해당 사전을 액세스하는 데 필요한 명령을 추가한다.


목록 2. PHP, SimpleXML 및 Enchant를 사용하여 EPUB의 맞춤법 확인

<?php
  // spell check an epub
/* epub is a zipped package containing many files
  the file "content.opf" contains the pointers to the constituent files
  inside content.opf we have 

  package (root)
    -> manifest
      -> item
          which we need to filter for media-type="application/xhtml+xml"
          and to check these are real text pages, not just full page images

  these are the text chapters that need to be checked one by one

  Acknowledgment: Some of the dictionary-related code
  was copied from the PHP Enchant manual page

*/
// set up console for input
$console = fopen("php://stdin","r");
// set up enchant (from PHP manual)
$tag = 'en_CA';
$r = enchant_broker_init();
$bprovides = enchant_broker_describe($r);
echo "Current broker provides the following backend(s):\n";
print_r($bprovides);
$dicts = enchant_broker_list_dicts($r);
print_r($dicts);
if (enchant_broker_dict_exists($r,$tag)) {
    $d = enchant_broker_request_dict($r, $tag);
    $dprovides = enchant_dict_describe($d);
    echo "dictionary $tag provides:\n";
} else {
  cleanup();
  die ("Cannot set up the spell checker\n");
}
// look for the text to be checked
$opf_file = "./OEBPS/content.opf";
if (!file_exists($opf_file)) {
  cleanup();
  die("Cannot find the OPF file\n");
} else {
  echo "Found it!\n";
  $xml = simplexml_load_file($opf_file);
  foreach ($xml->manifest->item as $mi) {
    if ($mi['media-type']=='application/xhtml+xml') {
      echo "Found ".$mi['href']."\n";
      if (substr($mi['href'],0,4) == 'part') {
          echo "Need to spell check ".$mi['href']."\n";
          echo scan_chap("./OEBPS/".$mi['href']);
      }
    }
  }
}
function cleanup() {
global $d, $r;
  enchant_broker_free_dict($d);
  enchant_broker_free($r);
}
function scan_chap($chap) {
  echo "Trying to spell check section $chap \n";
  if (!file_exists($chap)) {
    echo "Cannot find the chapter $chap\n";
  } else {
    echo "Found it!\n";
    $xml = simplexml_load_file($chap);
    $i = 0;
    foreach ($xml->body->div->p as $para) {
      echo $para."\n";
      // need to spell check the contents of $para
      spell_check(trim($para));
      $i++;
      if ($i > 5) break;
    }
  }
  return "Done...\n";
}
function spell_check($para) {
global $console, $d;
  $para = str_replace("  "," ",$para);
  $para = str_replace(".","",$para);
  $para = $para." ";
  echo "Checking text : $para\n";
  $start = 0;
  while ($pos !== false) {
    $pos = strpos($para," ",$start);
    echo "Found $pos\n";
    if (!$pos) break;
    $len = $pos-$start;
    $theword = substr($para,$start,$len);
    // tidy up theword which may contain punctuation
    $punc = array(':',';',',','"','?','!');
    $theword = str_replace($punc,"",$theword);
    //
    if ((strlen($theword) > 0) and (!is_numeric($theword))) {
      if ($wordcorrect = enchant_dict_check($d, $theword)) {
          echo "$theword is OK!\n";
      } else {
          $suggs = enchant_dict_suggest($d, $theword);
          echo "Suggestions for <$theword>:\n";
          //print_r($suggs);
          $max = 5;
          foreach ($suggs as $k=>$sugg) {
            echo "$k => $sugg\n";
            if ($k > $max) break;
          }
          $inp = fgets($console,1024);
      }
    }
    $start += $len+1;
  }
}
?>

이 코드에서는 먼저, 표준 입력을 가리키는 파일 포인터를 선언하여 맞춤법 검사 프로세스가 진행되는 동안 키보드를 통해 대화식으로 정보를 받을 수 있도록 한다. 다음 섹션에서는 해당 사전에 연결을 설정한다. tag 변수가 en-CA를 가리키고 있어서 이 경우에는 Canadian English로 설정되는 점에 주목한다. 그 결과 맞춤법 검사기는 color보다는 colour를, acknowledgment보다는 acknowledgement를 선택하게 된다. 이 태그에 대한 표준 설정은 en-US이다. 이 스크립트는 사전이 연결된 후에 목록 1에 있는 HTML 텍스트 파일을 동일하게 검색하지만, 이번에는 페이지 번호 <div> 태그를 검색하는 대신에 실제 텍스트가 있는 단락을 검색한다.

목적은 실제 맞춤법 검사를 수행하기 전에 단어를 하나씩 시험하는 데 있으므로 긴 공백과 마침표 및 쉼표를 제거하여 관리가 용이하도록 하기 위해 이 스크립트는 단락 텍스트를 정리한다. 그 후에는 단락에서 단어 간을 이동하고 숫자로 된 단어는 무시하고 단어를 사전과 비교하여 맞춤법 검사를 시작한다. 해당 단어가 사전에 없는 경우에는 대신할 수 있는 단어를 스크립트가 제시한다. 이 경우에는 스크립트가 첫 번째 다섯 가지 대안을 제시한다. 문제점이 있는 단어를 찾을 때마다 스크립트는 정지하여 사용자가 키보드를 통해 입력할 때까지 대기한다. 이 시점에서는 변경 코드 추가, 일단 무시, 해당 세션 자체 무시 등의 작업을 수행할 수 있다.


결론

XML과 맞춤법 라이브러리를 이용한 PHP 스크립팅과 Sigil은 보통의 EPUB 확인 루틴을 사용하여 발견할 수 없는 오류를 찾아서 수정하는 데 유용한 도구이다. 이러한 2차적 오류가 진정한 오류인지 아니면 단지 중요하지 않은 표면적인 불편함에 불과한지는 해당 문서를 사용 중인 컨텍스트와 이러한 문제점을 즉시 해결하는 데 필요한 하드웨어 리더 및 자체 소프트웨어의 기능에 따라 다르다.


참고자료

교육

  • EPUB을 사용하여 디지털 서적 만들기(Liza Daly, developerWorks, 2011년 1월 업데이트, 2008년 11월 발행): EPUB에 대한 소개와 EPUB 참고자료 목록을 읽어보자.

  • Know your regular expressions(Michael Stutz, developerWorks, 2007년 6월): UNIX® 시스템의 정규식에 대한 이 소개 기사를 확인하자. 다양한 프로그램과 언어에 맞게 정규식을 구성하는 방법을 배우는 데 도움이 되는 사용 가능한 도구와 기술을 확인하자.

  • More articles by this author (Colin Beckingham, developerWorks, 2009년 3월 현재): XML, 음성 인식, XHTML, PHP, SMIL 및 기타 기술에 관한 기사를 읽어보자.

  • XML 입문 XML을 배우는 데 필요한 참고자료를 얻자.

  • XML: DTD, 스키마 및 XSLT를 포함한 XML 분야의 스킬을 발전시키는 데 필요한 참고자료를 찾을 수 있다. XML 기술 자료에서 다양한 기술 관련 기사와 팁, 튜토리얼, 표준 및 IBM Redbook을 볼 수 있다.

  • IBM XML 인증: XML 및 관련 기술에 대한 IBM 인증 개발자가 되는 방법을 찾아볼 수 있다.

  • developerWorks 기술 행사 및 웹 캐스트: 이러한 세션에 참가하여 최신 기술에 대한 정보를 얻을 수 있다.

  • Twitter의 developerWorks 페이지: 오늘 가입하여 developerWorks 트윗을 팔로우하자.

  • developerWorks podcasts: 소프트웨어 개발자의 흥미로운 인터뷰와 토론을 확인할 수 있다.

  • developerWorks on-demand demos: 입문자를 위한 제품 설치 및 설정 과정에서 숙련된 개발자를 위한 고급 기능의 활용에 이르기까지 다양한 데모를 제공한다.

제품 및 기술

  • Sigil: EPUB 형식으로 책을 편집할 수 있게 설계된, 이 다중 플랫폼 WYSIWYG 전자책 편집기를 탐구하자.

  • Enchant: 여러 가지 라이브러리를 바탕으로 균일성과 적합성을 제공하는 이 랩퍼를 사용하여 맞춤법을 검사하는 방법을 배우자.

  • EpubCheck project: IDPF EPUB 파일의 유효성을 검증하는 데 유용한 이 도구를 확인하자. 이 도구를 이용하면 EPUB에서 여러 가지 유형의 오류를 발견할 수 있다.

  • IBM 제품 평가판: IBM SQA Sandbox의 온라인 시험판을 다운로드하거나 살펴보고 DB2®, Lotus®, Rational®, Tivoli® 및 WebSphere®의 애플리케이션 개발 도구 및 미들웨어 제품을 사용해 볼 수 있다.

토론

  • XML 영역 토론 포럼: 여러 XML 관련 토론에 참여해 볼 수 있다.

  • developerWorks 커뮤니티: 개발자가 운영하고 있는 블로그, 포럼, 그룹 및 위키를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.

필자소개

Colin Beckingham은 캐나다 온타리오에 거주하는 프리랜서 연구원이자 작가이며 프로그래머이다. 킹스턴의 Queen's University와 University of Windsor에서 학위를 받았고 은행 업무, 원예, 경마, 교육, 공무원 행정 업무, 소매 및 여행과 관광 업종을 포함한 다양한 분야에 종사해왔다. 데이터베이스 애플리케이션과 다양한 신문, 잡지 및 온라인 기사의 저자이며, 관심 연구 분야는 오픈 소스 프로그래밍, VoIP 및 Linux용 음성 제어 애플리케이션이다. Colin의 이메일 주소는 colbec@start.ca이다.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=XML, 오픈 소스
ArticleID=787563
ArticleTitle=EPUB 정리하기
publish-date=08302011

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.