]>
git.immae.eu Git - github/wallabag/wallabag.git/blob - inc/3rdparty/libraries/PHPePub/EPub.OPF.php
3 * ePub OPF file structure
5 * @author A. Grandt <php@grandt.com>
6 * @copyright 2009-2014 A. Grandt
7 * @license GNU LGPL, Attribution required for commercial implementations, requested for everything else.
11 const _VERSION
= 3.20;
14 * These types are the only guaranteed mime types any ePub reader must understand.
15 * Any other type muse define a fall back whose fallback chain will end in one of these.
17 const TYPE_GIF
= "image/gif";
18 const TYPE_JPEG
= "image/jpeg";
19 const TYPE_PNG
= "image/png";
20 const TYPE_SVG
= "image/svg+xml";
21 const TYPE_XHTML
= "application/xhtml+xml";
22 const TYPE_DTBOOK
= "application/x-dtbook+xml";
23 const TYPE_CSS
= "text/css";
24 const TYPE_XML
= "application/xml";
25 const TYPE_OEB1_DOC
= "text/x-oeb1-document"; // Deprecated
26 const TYPE_OEB1_CSS
= "text/x-oeb1-css"; // Deprecated
27 const TYPE_NCX
= "application/x-dtbncx+xml";
29 private $bookVersion = EPub
::BOOK_VERSION_EPUB2
;
30 private $ident = "BookId";
33 public $metadata = NULL;
34 public $manifest = NULL;
43 function __construct($ident = "BookId", $bookVersion = EPub
::BOOK_VERSION_EPUB2
) {
44 $this->setIdent($ident);
45 $this->setVersion($bookVersion);
46 $this->metadata
= new Metadata();
47 $this->manifest
= new Manifest();
48 $this->spine
= new Spine();
49 $this->guide
= new Guide();
57 function __destruct() {
58 unset ($this->bookVersion
, $this->ident
, $this->date
, $this->metadata
, $this->manifest
, $this->spine
, $this->guide
);
63 * Enter description here ...
65 * @param string $ident
67 function setVersion($bookVersion) {
68 $this->bookVersion
= is_string($bookVersion) ? trim($bookVersion) : EPub
::BOOK_VERSION_EPUB2
;
71 function isEPubVersion2() {
72 return $this->bookVersion
=== EPub
::BOOK_VERSION_EPUB2
;
77 * Enter description here ...
79 * @param string $ident
81 function setIdent($ident = "BookId") {
82 $this->ident
= is_string($ident) ? trim($ident) : "BookId";
87 * Enter description here ...
92 $opf = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
93 . "<package xmlns=\"http://www.idpf.org/2007/opf\" unique-identifier=\"" . $this->ident
. "\" version=\"" . $this->bookVersion
. "\">\n";
95 $opf .= $this->metadata
->finalize($this->bookVersion
, $this->date
);
96 $opf .= $this->manifest
->finalize($this->bookVersion
);
97 $opf .= $this->spine
->finalize();
99 if ($this->guide
->length() > 0) {
100 $opf .= $this->guide
->finalize();
103 return $opf . "</package>\n";
106 // Convenience functions:
110 * Enter description here ...
112 * @param string $title
113 * @param string $language
114 * @param string $identifier
115 * @param string $identifierScheme
117 function initialize($title, $language, $identifier, $identifierScheme) {
118 $this->metadata
->addDublinCore(new DublinCore("title", $title));
119 $this->metadata
->addDublinCore(new DublinCore("language", $language));
121 $dc = new DublinCore("identifier", $identifier);
122 $dc->addAttr("id", $this->ident
);
123 $dc->addOpfAttr("scheme", $identifierScheme);
124 $this->metadata
->addDublinCore($dc);
129 * Enter description here ...
132 * @param string $href
133 * @param string $mediaType
135 function addItem($id, $href, $mediaType, $properties = NULL) {
136 $this->manifest
->addItem(new Item($id, $href, $mediaType, $properties));
141 * Enter description here ...
143 * @param string $idref
144 * @param bool $linear
146 function addItemRef($idref, $linear = TRUE) {
147 $this->spine
->addItemref(new Itemref($idref, $linear));
152 * Enter description here ...
154 * @param string $type
155 * @param string $title
156 * @param string $href
158 function addReference($type, $title, $href) {
159 $this->guide
->addReference(new Reference($type, $title, $href));
164 * Enter description here ...
166 * @param string $name
167 * @param string $value
169 function addDCMeta($name, $value) {
170 $this->metadata
->addDublinCore(new DublinCore($name, $value));
175 * Enter description here ...
177 * @param string $name
178 * @param string $content
180 function addMeta($name, $content) {
181 $this->metadata
->addMeta($name, $content);
186 * Enter description here ...
188 * @param string $name
189 * @param string $fileAs
190 * @param string $role Use the MarcCode constants
192 function addCreator($name, $fileAs = NULL, $role = NULL) {
193 $dc = new DublinCore(DublinCore
::CREATOR
, trim($name));
195 if ($fileAs !== NULL) {
196 $dc->addOpfAttr("file-as", trim($fileAs));
199 if ($role !== NULL) {
200 $dc->addOpfAttr("role", trim($role));
203 $this->metadata
->addDublinCore($dc);
208 * Enter description here ...
210 * @param string $name
211 * @param string $fileAs
212 * @param string $role Use the MarcCode constants
214 function addColaborator($name, $fileAs = NULL, $role = NULL) {
215 $dc = new DublinCore(DublinCore
::CONTRIBUTOR
, trim($name));
217 if ($fileAs !== NULL) {
218 $dc->addOpfAttr("file-as", trim($fileAs));
221 if ($role !== NULL) {
222 $dc->addOpfAttr("role", trim($role));
225 $this->metadata
->addDublinCore($dc);
230 * ePub OPF Metadata structures
233 const _VERSION
= 3.00;
235 private $dc = array();
236 private $meta = array();
243 function __construct() {
251 function __destruct() {
252 unset ($this->dc
, $this->meta
);
257 * Enter description here ...
259 * @param DublinCore $dc
261 function addDublinCore($dc) {
262 if ($dc != NULL && is_object($dc) && get_class($dc) === "DublinCore") {
269 * Enter description here ...
271 * @param string $name
272 * @param string $content
274 function addMeta($name, $content) {
275 $name = is_string($name) ? trim($name) : NULL;
277 $content = is_string($content) ? trim($content) : NULL;
279 if (isset($content)) {
280 $this->meta
[] = array ($name => $content);
286 * @param string $bookVersion
290 function finalize($bookVersion = EPub
::BOOK_VERSION_EPUB2
, $date = NULL) {
291 $metadata = "\t<metadata xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n";
292 if ($bookVersion === EPub
::BOOK_VERSION_EPUB2
) {
293 $metadata .= "\t\txmlns:opf=\"http://www.idpf.org/2007/opf\"\n\t\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n";
295 $metadata .= "\t\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n";
299 $metadata .= "\t\t<meta property=\"dcterms:modified\">" . gmdate("Y-m-d\TH:i:s\Z", $date) . "</meta>\n";
302 foreach ($this->dc
as $dc) {
303 $metadata .= $dc->finalize($bookVersion);
306 foreach ($this->meta
as $data) {
307 list($name, $content) = each($data);
308 $metadata .= "\t\t<meta name=\"" . $name . "\" content=\"" . $content . "\" />\n";
311 return $metadata . "\t</metadata>\n";
316 * ePub OPF Dublin Core (dc:) Metadata structures
319 const _VERSION
= 3.00;
321 const CONTRIBUTOR
= "contributor";
322 const COVERAGE
= "coverage";
323 const CREATOR
= "creator";
325 const DESCRIPTION
= "description";
326 const FORMAT
= "format";
327 const IDENTIFIER
= "identifier";
328 const LANGUAGE
= "language";
329 const PUBLISHER
= "publisher";
330 const RELATION
= "relation";
331 const RIGHTS
= "rights";
332 const SOURCE
= "source";
333 const SUBJECT
= "subject";
334 const TITLE
= "title";
337 private $dcName = NULL;
338 private $dcValue = NULL;
339 private $attr = array();
340 private $opfAttr = array();
347 function __construct($name, $value) {
348 $this->setDc($name, $value);
356 function __destruct() {
357 unset ($this->dcName
, $this->dcValue
, $this->attr
, $this->opfAttr
);
362 * Enter description here ...
364 * @param string $name
365 * @param string $value
367 function setDc($name, $value) {
368 $this->dcName
= is_string($name) ? trim($name) : NULL;
369 if (isset($this->dcName
)) {
370 $this->dcValue
= isset($value) ? (string)$value : NULL;
372 if (! isset($this->dcValue
)) {
373 $this->dcName
= NULL;
379 * Enter description here ...
381 * @param string $attrName
382 * @param string $attrValue
384 function addAttr($attrName, $attrValue) {
385 $attrName = is_string($attrName) ? trim($attrName) : NULL;
386 if (isset($attrName)) {
387 $attrValue = is_string($attrValue) ? trim($attrValue) : NULL;
389 if (isset($attrValue)) {
390 $this->attr
[$attrName] = $attrValue;
396 * Enter description here ...
398 * @param string $opfAttrName
399 * @param string $opfAttrValue
401 function addOpfAttr($opfAttrName, $opfAttrValue) {
402 $opfAttrName = is_string($opfAttrName) ? trim($opfAttrName) : NULL;
403 if (isset($opfAttrName)) {
404 $opfAttrValue = is_string($opfAttrValue) ? trim($opfAttrValue) : NULL;
406 if (isset($opfAttrValue)) {
407 $this->opfAttr
[$opfAttrName] = $opfAttrValue;
414 * @param string $bookVersion
417 function finalize($bookVersion = EPub
::BOOK_VERSION_EPUB2
) {
418 $dc = "\t\t<dc:" . $this->dcName
;
420 if (sizeof($this->attr
) > 0) {
421 while (list($name, $content) = each($this->attr
)) {
422 $dc .= " " . $name . "=\"" . $content . "\"";
426 if ($bookVersion === EPub
::BOOK_VERSION_EPUB2
&& sizeof($this->opfAttr
) > 0) {
427 while (list($name, $content) = each($this->opfAttr
)) {
428 $dc .= " opf:" . $name . "=\"" . $content . "\"";
432 return $dc . ">" . $this->dcValue
. "</dc:" . $this->dcName
. ">\n";
437 * ePub OPF Manifest structure
440 const _VERSION
= 3.00;
442 private $items = array();
449 function __construct() {
457 function __destruct() {
458 unset ($this->items
);
463 * Enter description here ...
467 function addItem($item) {
468 if ($item != NULL && is_object($item) && get_class($item) === "Item") {
469 $this->items
[] = $item;
475 * @param string $bookVersion
478 function finalize($bookVersion = EPub
::BOOK_VERSION_EPUB2
) {
479 $manifest = "\n\t<manifest>\n";
480 foreach ($this->items
as $item) {
481 $manifest .= $item->finalize($bookVersion);
483 return $manifest . "\t</manifest>\n";
488 * ePub OPF Item structure
491 const _VERSION
= 3.00;
494 private $href = NULL;
495 private $mediaType = NULL;
496 private $properties = NULL;
497 private $requiredNamespace = NULL;
498 private $requiredModules = NULL;
499 private $fallback = NULL;
500 private $fallbackStyle = NULL;
507 function __construct($id, $href, $mediaType, $properties = NULL) {
509 $this->setHref($href);
510 $this->setMediaType($mediaType);
511 $this->setProperties($properties);
519 function __destruct() {
520 unset ($this->id
, $this->href
, $this->mediaType
);
521 unset ($this->properties
, $this->requiredNamespace
, $this->requiredModules
, $this->fallback
, $this->fallbackStyle
);
526 * Enter description here ...
530 function setId($id) {
531 $this->id
= is_string($id) ? trim($id) : NULL;
536 * Enter description here ...
538 * @param string $href
540 function setHref($href) {
541 $this->href
= is_string($href) ? trim($href) : NULL;
546 * Enter description here ...
548 * @param string $mediaType
550 function setMediaType($mediaType) {
551 $this->mediaType
= is_string($mediaType) ? trim($mediaType) : NULL;
556 * Enter description here ...
558 * @param string $properties
560 function setProperties($properties) {
561 $this->properties
= is_string($properties) ? trim($properties) : NULL;
566 * Enter description here ...
568 * @param string $requiredNamespace
570 function setRequiredNamespace($requiredNamespace) {
571 $this->requiredNamespace
= is_string($requiredNamespace) ? trim($requiredNamespace) : NULL;
576 * Enter description here ...
578 * @param string $requiredModules
580 function setRequiredModules($requiredModules) {
581 $this->requiredModules
= is_string($requiredModules) ? trim($requiredModules) : NULL;
586 * Enter description here ...
588 * @param string $fallback
590 function setfallback($fallback) {
591 $this->fallback
= is_string($fallback) ? trim($fallback) : NULL;
596 * Enter description here ...
598 * @param string $fallbackStyle
600 function setFallbackStyle($fallbackStyle) {
601 $this->fallbackStyle
= is_string($fallbackStyle) ? trim($fallbackStyle) : NULL;
606 * @param string $bookVersion
609 function finalize($bookVersion = EPub
::BOOK_VERSION_EPUB2
) {
610 $item = "\t\t<item id=\"" . $this->id
. "\" href=\"" . $this->href
. "\" media-type=\"" . $this->mediaType
. "\" ";
611 if ($bookVersion === EPub
::BOOK_VERSION_EPUB3
&& isset($this->properties
)) {
612 $item .= "properties=\"" . $this->properties
. "\" ";
614 if (isset($this->requiredNamespace
)) {
615 $item .= "\n\t\t\trequired-namespace=\"" . $this->requiredNamespace
. "\" ";
616 if (isset($this->requiredModules
)) {
617 $item .= "required-modules=\"" . $this->requiredModules
. "\" ";
620 if (isset($this->fallback
)) {
621 $item .= "\n\t\t\tfallback=\"" . $this->fallback
. "\" ";
623 if (isset($this->fallbackStyle
)) {
624 $item .= "\n\t\t\tfallback-style=\"" . $this->fallbackStyle
. "\" ";
626 return $item . "/>\n";
631 * ePub OPF Spine structure
634 const _VERSION
= 1.00;
636 private $itemrefs = array();
644 function __construct($toc = "ncx") {
653 function __destruct() {
654 unset ($this->itemrefs
, $this->toc
);
659 * Enter description here ...
663 function setToc($toc) {
664 $this->toc
= is_string($toc) ? trim($toc) : NULL;
669 * Enter description here ...
671 * @param Itemref $itemref
673 function addItemref($itemref) {
675 && is_object($itemref)
676 && get_class($itemref) === "Itemref"
677 && !isset($this->itemrefs
[$itemref->getIdref()])) {
678 $this->itemrefs
[$itemref->getIdref()] = $itemref;
684 * Enter description here ...
688 function finalize() {
689 $spine = "\n\t<spine toc=\"" . $this->toc
. "\">\n";
690 foreach ($this->itemrefs
as $itemref) {
691 $spine .= $itemref->finalize();
693 return $spine . "\t</spine>\n";
698 * ePub OPF ItemRef structure
701 const _VERSION
= 3.00;
703 private $idref = NULL;
704 private $linear = TRUE;
711 function __construct($idref, $linear = TRUE) {
712 $this->setIdref($idref);
713 $this->setLinear($linear);
721 function __destruct() {
722 unset ($this->idref
, $this->linear
);
727 * Enter description here ...
729 * @param string $idref
731 function setIdref($idref) {
732 $this->idref
= is_string($idref) ? trim($idref) : NULL;
737 * Enter description here ...
739 * @return string $idref
741 function getIdref() {
747 * Enter description here ...
749 * @param bool $linear
751 function setLinear($linear = TRUE) {
752 $this->linear
= $linear === TRUE;
757 * Enter description here ...
761 function finalize() {
762 $itemref = "\t\t<itemref idref=\"" . $this->idref
. "\"";
763 if ($this->linear
== FALSE) {
764 return $itemref .= " linear=\"no\" />\n";
766 return $itemref . " />\n";
771 * ePub OPF Guide structure
774 const _VERSION
= 3.00;
776 private $references = array();
783 function __construct() {
791 function __destruct() {
792 unset ($this->references
);
797 * Enter description here ...
801 return sizeof($this->references
);
806 * Enter description here ...
808 * @param Reference $reference
810 function addReference($reference) {
811 if ($reference != NULL && is_object($reference) && get_class($reference) === "Reference") {
812 $this->references
[] = $reference;
818 * Enter description here ...
822 function finalize() {
824 if (sizeof($this->references
) > 0) {
825 $ref = "\n\t<guide>\n";
826 foreach ($this->references
as $reference) {
827 $ref .= $reference->finalize();
829 $ref .= "\t</guide>\n";
836 * Reference constants
839 const _VERSION
= 1.00;
841 /* REFERENCE types are derived from the "Chicago Manual of Style"
844 /** Acknowledgements page */
845 const ACKNOWLEDGEMENTS
= "acknowledgements";
847 /** Bibliography page */
848 const BIBLIOGRAPHY
= "bibliography";
851 const COLOPHON
= "colophon";
853 /** Copyright page */
854 const COPYRIGHT_PAGE
= "copyright-page";
857 const DEDICATION
= "dedication";
860 const EPIGRAPH
= "epigraph";
863 const FOREWORD
= "foreword";
866 const GLOSSARY
= "glossary";
868 /** back-of-book style index */
869 const INDEX
= "index";
871 /** List of illustrations */
872 const LIST_OF_ILLUSTRATIONS
= "loi";
874 /** List of tables */
875 const LIST_OF_TABLES
= "lot";
878 const NOTES
= "notes";
881 const PREFACE
= "preface";
883 /** Table of contents */
884 const TABLE_OF_CONTENTS
= "toc";
886 /** Page with possibly title, author, publisher, and other metadata */
887 const TITLE_PAGE
= "titlepage";
889 /** First page of the book, ie. first page of the first chapter */
892 // ******************
894 // ******************
896 // Document partitions
897 /** The publications cover(s), jacket information, etc. This is officially in ePub3, but works for ePub 2 as well */
898 const COVER
= "cover";
900 /** Preliminary material to the content body, such as tables of contents, dedications, etc. */
901 const FRONTMATTER
= "frontmatter";
903 /** The main (body) content of a document. */
904 const BODYMATTER
= "bodymatter";
906 /** Ancillary material occurring after the document body, such as indices, appendices, etc. */
907 const BACKMATTER
= "backmatter";
910 private $type = NULL;
911 private $title = NULL;
912 private $href = NULL;
917 * @param string $type
918 * @param string $title
919 * @param string $href
921 function __construct($type, $title, $href) {
922 $this->setType($type);
923 $this->setTitle($title);
924 $this->setHref($href);
932 function __destruct() {
933 unset ($this->type
, $this->title
, $this->href
);
938 * Enter description here ...
940 * @param string $type
942 function setType($type) {
943 $this->type
= is_string($type) ? trim($type) : NULL;
948 * Enter description here ...
950 * @param string $title
952 function setTitle($title) {
953 $this->title
= is_string($title) ? trim($title) : NULL;
958 * Enter description here ...
960 * @param string $href
962 function setHref($href) {
963 $this->href
= is_string($href) ? trim($href) : NULL;
968 * Enter description here ...
972 function finalize() {
973 return "\t\t<reference type=\"" . $this->type
. "\" title=\"" . $this->title
. "\" href=\"" . $this->href
. "\" />\n";
979 * Ref: http://www.loc.gov/marc/relators/
982 const _VERSION
= 3.00;
987 * Use for a person who
988 * 1) reworks a musical composition, usually for a different medium, or
989 * 2) rewrites novels or stories for motion pictures or other audiovisual medium.
991 const ADAPTER
= "adp";
996 * Use for a person who writes manuscript annotations on a printed item.
998 const ANNOTATOR
= "ann";
1003 * Use for a person who transcribes a musical composition, usually for a different
1004 * medium from that of the original; in an arrangement the musical substance remains
1005 * essentially unchanged.
1007 const ARRANGER
= "arr";
1012 * Use for a person (e.g., a painter) who conceives, and perhaps also implements,
1013 * an original graphic design or work of art, if specific codes (e.g., [egr],
1014 * [etr]) are not desired. For book illustrators, prefer Illustrator [ill].
1016 const ARTIST
= "art";
1021 * Use as a general relator for a name associated with or found in an item or
1022 * collection, or which cannot be determined to be that of a Former owner [fmo]
1023 * or other designated relator indicative of provenance.
1025 const ASSOCIATED_NAME
= "asn";
1030 * Use for a person or corporate body chiefly responsible for the intellectual
1031 * or artistic content of a work. This term may also be used when more than one
1032 * person or body bears such responsibility.
1034 const AUTHOR
= "aut";
1037 * Author in quotations or text extracts
1039 * Use for a person whose work is largely quoted or extracted in a works to which
1040 * he or she did not contribute directly. Such quotations are found particularly
1041 * in exhibition catalogs, collections of photographs, etc.
1043 const AUTHOR_IN_QUOTES
= "aqt";
1046 * Author of afterword, colophon, etc.
1048 * Use for a person or corporate body responsible for an afterword, postface,
1049 * colophon, etc. but who is not the chief author of a work.
1051 const AUTHOR_OF_AFTERWORD
= "aft";
1054 * Author of introduction, etc.
1056 * Use for a person or corporate body responsible for an introduction, preface,
1057 * foreword, or other critical matter, but who is not the chief author.
1059 const AUTHOR_OF_INTRO
= "aui";
1062 * Bibliographic antecedent
1064 * Use for the author responsible for a work upon which the work represented by
1065 * the catalog record is based. This can be appropriate for adaptations, sequels,
1066 * continuations, indexes, etc.
1068 const BIB_ANTECEDENT
= "ant";
1073 * Use for the person or firm responsible for the production of books and other
1074 * print media, if specific codes (e.g., [bkd], [egr], [tyd], [prt]) are not desired.
1076 const BOOK_PRODUCER
= "bkp";
1081 * Use for a person or corporate body that takes a limited part in the elaboration
1082 * of a work of another author or that brings complements (e.g., appendices, notes)
1083 * to the work of another author.
1085 const COLABORATOR
= "clb";
1090 * Use for a person who provides interpretation, analysis, or a discussion of the
1091 * subject matter on a recording, motion picture, or other audiovisual medium.
1092 * Compiler [com] Use for a person who produces a work or publication by selecting
1093 * and putting together material from the works of various persons or bodies.
1095 const COMMENTATOR
= "cmm";
1100 * Use for a person or organization responsible for design if specific codes (e.g.,
1101 * [bkd], [tyd]) are not desired.
1103 const DESIGNER
= "dsr";
1108 * Use for a person who prepares for publication a work not primarily his/her own,
1109 * such as by elucidating text, adding introductory or other critical matter, or
1110 * technically directing an editorial staff.
1112 const EDITORT
= "edt";
1117 * Use for the person who conceives, and perhaps also implements, a design or
1118 * illustration, usually to accompany a written text.
1120 const ILLUSTRATOR
= "ill";
1125 * Use for the writer of the text of a song.
1127 const LYRICIST
= "lyr";
1132 * Use for the person or organization primarily responsible for compiling and
1133 * maintaining the original description of a metadata set (e.g., geospatial
1136 const METADATA_CONTACT
= "mdc";
1141 * Use for the person who performs music or contributes to the musical content
1142 * of a work when it is not possible or desirable to identify the function more
1145 const MUSICIAN
= "mus";
1150 * Use for the speaker who relates the particulars of an act, occurrence, or
1153 const NARRATOR
= "nrt";
1158 * Use for relator codes from other lists which have no equivalent in the MARC
1159 * list or for terms which have not been assigned a code.
1161 const OTHER
= "oth";
1166 * Use for the person or organization responsible for taking photographs, whether
1167 * they are used in their original form or as reproductions.
1169 const PHOTOGRAPHER
= "pht";
1174 * Use for the person or organization who prints texts, whether from type or plates.
1176 const PRINTER
= "prt";
1181 * Use for a person who writes or develops the framework for an item without
1182 * being intellectually responsible for its content.
1184 const REDACTOR
= "red";
1189 * Use for a person or corporate body responsible for the review of book, motion
1190 * picture, performance, etc.
1192 const REVIEWER
= "rev";
1197 * Use for the person or agency that issued a contract, or under whose auspices
1198 * a work has been written, printed, published, etc.
1200 const SPONSOR
= "spn";
1205 * Use for the person under whose supervision a degree candidate develops and
1206 * presents a thesis, memoir, or text of a dissertation.
1208 const THESIS_ADVISOR
= "ths";
1213 * Use for a person who prepares a handwritten or typewritten copy from original
1214 * material, including from dictated or orally recorded material.
1216 const TRANSCRIBER
= "trc";
1221 * Use for a person who renders a text from one language into another, or from
1222 * an older form of a language into the modern form.
1224 const TRANSLATOR
= "trl";