manifest

package
v0.11.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 30, 2025 License: BSD-3-Clause Imports: 16 Imported by: 3

Documentation

Index

Constants

View Source
const InferredAccessibilityMetadataKey = "https://readium.org/webpub-manifest#inferredAccessibility"
View Source
const ProfileAudiobook = Profile("https://readium.org/webpub-manifest/profiles/audiobook")

Profile for audiobooks

View Source
const ProfileDivina = Profile("https://readium.org/webpub-manifest/profiles/divina")

Profile for visual narratives (comics, manga, webtoons and bandes dessinées)

View Source
const ProfileEPUB = Profile("https://readium.org/webpub-manifest/profiles/epub")

Profile for EPUB publications

View Source
const ProfilePDF = Profile("https://readium.org/webpub-manifest/profiles/pdf")

Profile for PDF documents

View Source
const UndefinedLanguage = "und"
View Source
const WebpubManifestContext = "https://readium.org/webpub-manifest/context.jsonld"

Variables

View Source
var ToolkitVersionKey = "https://github.com/readium/go-toolkit/releases"

If you really don't want the version info in your manifest, you can blank this value.

Functions

This section is empty.

Types

type A11y

type A11y struct {
	ConformsTo            A11yProfileList           `json:"conformsTo,omitempty"`           // An established standard to which the described resource conforms.
	Certification         *A11yCertification        `json:"certification,omitempty"`        // Certification of accessible publications.
	Summary               string                    `json:"summary,omitempty"`              // A human-readable summary of specific accessibility features or deficiencies, consistent with the other accessibility metadata but expressing subtleties such as "short descriptions are present but long descriptions will be needed for non-visual users" or "short descriptions are present and no long descriptions are needed."
	AccessModes           []A11yAccessMode          `json:"accessMode,omitempty"`           // The human sensory perceptual system or cognitive faculty through which a person may process or perceive information.
	AccessModesSufficient [][]A11yPrimaryAccessMode `json:"accessModeSufficient,omitempty"` //  A list of single or combined accessModes that are sufficient to understand all the intellectual content of a resource.
	Features              []A11yFeature             `json:"feature,omitempty"`              // Content features of the resource, such as accessible media, alternatives and supported enhancements for accessibility.
	Hazards               []A11yHazard              `json:"hazard,omitempty"`               // A characteristic of the described resource that is physiologically dangerous to some users.
	Exemptions            []A11yExemption           `json:"exemption,omitempty"`            // Justifications for non-conformance based on exemptions in a given jurisdiction.
}

A11y holds the accessibility metadata of a Publication.

https://www.w3.org/2021/a11y-discov-vocab/latest/ https://readium.org/webpub-manifest/schema/a11y.schema.json

func A11yFromJSON

func A11yFromJSON(rawJSON map[string]interface{}) (*A11y, error)

func NewA11y

func NewA11y() A11y

NewA11y creates a new empty A11y.

func (A11y) IsEmpty

func (a A11y) IsEmpty() bool

func (*A11y) Merge

func (a *A11y) Merge(other *A11y)

Merge extends or overwrites the current A11y with the given one.

func (*A11y) UnmarshalJSON

func (e *A11y) UnmarshalJSON(data []byte) error

type A11yAccessMode

type A11yAccessMode string

A11yAccessMode is a human sensory perceptual system or cognitive faculty through which a person may process or perceive information.

const (
	// Indicates that the resource contains information encoded in auditory form.
	A11yAccessModeAuditory A11yAccessMode = "auditory"

	// Indicates that the resource contains charts encoded in visual form.
	A11yAccessModeChartOnVisual A11yAccessMode = "chartOnVisual"

	// Indicates that the resource contains chemical equations encoded in visual form.
	A11yAccessModeChemOnVisual A11yAccessMode = "chemOnVisual"

	// Indicates that the resource contains information encoded such that color perception is necessary.
	A11yAccessModeColorDependent A11yAccessMode = "colorDependent"

	// Indicates that the resource contains diagrams encoded in visual form.
	A11yAccessModeDiagramOnVisual A11yAccessMode = "diagramOnVisual"

	// Indicates that the resource contains mathematical notations encoded in visual form.
	A11yAccessModeMathOnVisual A11yAccessMode = "mathOnVisual"

	// Indicates that the resource contains musical notation encoded in visual form.
	A11yAccessModeMusicOnVisual A11yAccessMode = "musicOnVisual"

	// Indicates that the resource contains information encoded in tactile form.
	//
	// Note that although an indication of a tactile mode often indicates the content is encoded
	// using a braille system, this is not always the case. Tactile perception may also indicate,
	// for example, the use of tactile graphics to convey information.
	A11yAccessModeTactile A11yAccessMode = "tactile"

	// Indicates that the resource contains text encoded in visual form.
	A11yAccessModeTextOnVisual A11yAccessMode = "textOnVisual"

	// Indicates that the resource contains information encoded in textual form.
	A11yAccessModeTextual A11yAccessMode = "textual"

	// Indicates that the resource contains information encoded in visual form.
	A11yAccessModeVisual A11yAccessMode = "visual"
)

func A11yAccessModesFromStrings

func A11yAccessModesFromStrings(strings []string) []A11yAccessMode

type A11yCertification

type A11yCertification struct {
	CertifiedBy string `json:"certifiedBy,omitempty"` // Identifies a party responsible for the testing and certification of the accessibility of a Publication.
	Credential  string `json:"credential,omitempty"`  // Identifies a credential or badge that establishes the authority of the party identified in the associated `certifiedBy` property to certify content accessible.
	Report      string `json:"report,omitempty"`      // Provides a link to an accessibility report created by the party identified in the associated `certifiedBy` property.
}

A11yCertification represents a certification for an accessible publication.

func (A11yCertification) IsEmpty

func (c A11yCertification) IsEmpty() bool

type A11yExemption added in v0.7.0

type A11yExemption string

A11yExemption is a justification for non-conformance based on an exemption in a given jurisdiction.

const (
	A11yExemptionEAADisproportionateBurden A11yExemption = "eaa-disproportionate-burden"
	A11yExemptionEAAFundamentalAlteration  A11yExemption = "eaa-fundamental-alteration"
	A11yExemptionEAAMicroenterprise        A11yExemption = "eaa-microenterprise"
)

func A11yExemptionsFromStrings added in v0.7.0

func A11yExemptionsFromStrings(strings []string) []A11yExemption

type A11yFeature

type A11yFeature string

A11yFeature is a content feature of the described resource, such as accessible media, alternatives and supported enhancements for accessibility.

const (
	// The work includes annotations from the author, instructor and/or others.
	A11yFeatureAnnotations A11yFeature = "annotations"

	// Indicates the resource includes ARIA roles to organize and improve the structure and navigation.
	//
	// The use of this value corresponds to the inclusion of Document Structure, Landmark,
	// Live Region, and Window roles [WAI-ARIA].
	A11yFeatureAria A11yFeature = "ARIA"

	// The work includes bookmarks to facilitate navigation to key points.
	A11yFeatureBookmarks A11yFeature = "bookmark"

	// The work includes an index to the content.
	A11yFeatureIndex A11yFeature = "index"

	// The resource includes static page markers, such as those identified by the doc-pagebreak role.
	// This value is most commonly used with ebooks for which there is a statically paginated
	// equivalent, such as a print edition, but it is not required that the page markers correspond
	// to another work. The markers may exist solely to facilitate navigation in purely digital works.
	A11yFeaturePageBreakMarkers A11yFeature = "pageBreakMarkers"

	// The resource includes a means of navigating to static page break locations.
	// The most common way of providing page navigation in digital publications is through a page list.
	A11yFeaturePageNavigation A11yFeature = "pageNavigation"

	// The reading order of the content is clearly defined in the markup
	// (e.g., figures, sidebars and other secondary content has been marked up to allow it
	// to be skipped automatically and/or manually escaped from).
	A11yFeatureReadingOrder A11yFeature = "readingOrder"

	// The use of headings in the work fully and accurately reflects the document hierarchy,
	// allowing navigation by assistive technologies.
	A11yFeatureStructuralNavigation A11yFeature = "structuralNavigation"

	// The work includes a table of contents that provides links to the major sections of the content.
	A11yFeatureTableOfContents A11yFeature = "tableOfContents"

	// The contents of the PDF have been tagged to permit access by assistive technologies.
	A11yFeatureTaggedPDF A11yFeature = "taggedPDF"

	// Alternative text is provided for visual content (e.g., via the HTML `alt` attribute).
	A11yFeatureAlternativeText A11yFeature = "alternativeText"

	// Audio descriptions are available (e.g., via an HTML `track` element with its `kind`
	// attribute set to "descriptions".
	A11yFeatureAudioDescription A11yFeature = "audioDescription"

	// Indicates that synchronized captions are available for audio and video content.
	A11yFeatureCaptions A11yFeature = "captions"

	// Textual descriptions of math equations are included, whether in the alt attribute
	// for image-based equations,
	A11yFeatureDescribedMath A11yFeature = "describeMath"

	// Descriptions are provided for image-based visual content and/or complex structures
	// such as tables, mathematics, diagrams, and charts.
	A11yFeatureLongDescription A11yFeature = "longDescription"

	// Indicates that `ruby` annotations HTML are provided in the content. Ruby annotations
	// are used as pronunciation guides for the logographic characters for languages like
	// Chinese or Japanese. It makes difficult Kanji or CJK ideographic characters more accessible.
	//
	// The absence of rubyAnnotations implies that no CJK ideographic characters have ruby.
	A11yFeatureRubyAnnotations A11yFeature = "rubyAnnotations"

	// Sign language interpretation is available for audio and video content.
	A11yFeatureSignLanguage A11yFeature = "signLanguage"

	// Indicates that a transcript of the audio content is available.
	A11yFeatureTranscript A11yFeature = "transcript"

	// Display properties are controllable by the user. This property can be set, for example,
	// if custom CSS style sheets can be applied to the content to control the appearance.
	// It can also be used to indicate that styling in document formats like Word and PDF
	// can be modified.
	A11yFeatureDisplayTransformability A11yFeature = "displayTransformability"

	// Describes a resource that offers both audio and text, with information that allows them
	// to be rendered simultaneously. The granularity of the synchronization is not specified.
	// This term is not recommended when the only material that is synchronized is
	// the document headings.
	A11yFeatureSynchronizedAudioText A11yFeature = "synchronizedAudioText"

	// For content with timed interaction, this value indicates that the user can control
	// the timing to meet their needs (e.g., pause and reset)
	A11yFeatureTimingControl A11yFeature = "timingControl"

	// No digital rights management or other content restriction protocols have been applied
	// to the resource.
	A11yFeatureUnlocked A11yFeature = "unlocked"

	// Identifies that chemical information is encoded using the ChemML markup language.
	A11yFeatureChemML A11yFeature = "ChemML"

	// Identifies that mathematical equations and formulas are encoded in the LaTeX
	// typesetting system.
	A11yFeatureLatex A11yFeature = "latex"

	// Identifies that mathematical equations and formulas are encoded in MathML.
	A11yFeatureMathML A11yFeature = "MathML"

	// One or more of SSML, Pronunciation-Lexicon, and CSS3-Speech properties has been used
	// to enhance text-to-speech playback quality.
	A11yFeatureTTSMarkup A11yFeature = "ttsMarkup"

	// Audio content with speech in the foreground meets the contrast thresholds set out
	// in WCAG Success Criteria 1.4.7.
	A11yFeatureHighContrastAudio A11yFeature = "highContrastAudio"

	// Content meets the visual contrast threshold set out in WCAG Success Criteria 1.4.6.
	A11yFeatureHighContrastDisplay A11yFeature = "highContrastDisplay"

	// The content has been formatted to meet large print guidelines.
	//
	// The property is not set if the font size can be increased. See DisplayTransformability.
	A11yFeatureLargePrint A11yFeature = "largePrint"

	// The content is in braille format, or alternatives are available in braille.
	A11yFeatureBraille A11yFeature = "braille"

	// When used with creative works such as books, indicates that the resource includes
	// tactile graphics. When used to describe an image resource or physical object,
	// indicates that the resource is a tactile graphic.
	A11yFeatureTactileGraphic A11yFeature = "tactileGraphic"

	// When used with creative works such as books, indicates that the resource includes models
	// to generate tactile 3D objects. When used to describe a physical object,
	// indicates that the resource is a tactile 3D object.
	A11yFeatureTactileObject A11yFeature = "tactileObject"

	// Indicates that the resource does not contain any accessibility features.
	A11yFeatureNone A11yFeature = "none"
)

func A11yFeaturesFromStrings

func A11yFeaturesFromStrings(strings []string) []A11yFeature

type A11yHazard

type A11yHazard string

A11yHazard is a characteristic of the described resource that is physiologically dangerous to some users.

const (
	// Indicates that the resource presents a flashing hazard for photosensitive persons.
	A11yHazardFlashing A11yHazard = "flashing"

	// Indicates that the resource does not present a flashing hazard.
	A11yHazardNoFlashingHazard A11yHazard = "noFlashingHazard"

	// Indicates that the resource contains instances of motion simulation that
	// may affect some individuals.
	//
	// Some examples of motion simulation include video games with a first-person perspective
	// and CSS-controlled backgrounds that move when a user scrolls a page.
	A11yHazardMotionSimulation A11yHazard = "motionSimulation"

	// Indicates that the resource does not contain instances of motion simulation.
	A11yHazardNoMotionSimulationHazard A11yHazard = "noMotionSimulationHazard"

	// Indicates that the resource contains auditory sounds that may affect some individuals.
	A11yHazardSound A11yHazard = "sound"

	// Indicates that the resource does not contain auditory hazards.
	A11yHazardNoSoundHazard A11yHazard = "noSoundHazard"

	// Indicates that the author is not able to determine if the resource presents any hazards.
	A11yHazardUnknown A11yHazard = "unknown"

	// Indicates that the resource does not contain any hazards.
	A11yHazardNone A11yHazard = "none"
)

func A11yHazardsFromStrings

func A11yHazardsFromStrings(strings []string) []A11yHazard

type A11yPrimaryAccessMode

type A11yPrimaryAccessMode string

A11yPrimaryAccessMode is a human primary sensory perceptual system or cognitive faculty through which a person may process or perceive information.

const (
	// Indicates that auditory perception is necessary to consume the information.
	A11yPrimaryAccessModeAuditory A11yPrimaryAccessMode = "auditory"

	// Indicates that tactile perception is necessary to consume the information.
	A11yPrimaryAccessModeTactile A11yPrimaryAccessMode = "tactile"

	// Indicates that the ability to read textual content is necessary to consume the information.
	//
	// Note that reading textual content does not require visual perception, as textual content
	// can be rendered as audio using a text-to-speech capable device or assistive technology.
	A11yPrimaryAccessModeTextual A11yPrimaryAccessMode = "textual"

	// Indicates that visual perception is necessary to consume the information.
	A11yPrimaryAccessModeVisual A11yPrimaryAccessMode = "visual"
)

func A11yPrimaryAccessModesFromStrings

func A11yPrimaryAccessModesFromStrings(strings []string) []A11yPrimaryAccessMode

type A11yProfile

type A11yProfile string

A11yProfile represents an established accessibility standard a publication can conform to.

const (
	// EPUB Accessibility 1.0 - WCAG 2.0 Level A
	EPUBA11y10WCAG20A A11yProfile = "http://www.idpf.org/epub/a11y/accessibility-20170105.html#wcag-a"
	// EPUB Accessibility 1.0 - WCAG 2.0 Level AA
	EPUBA11y10WCAG20AA A11yProfile = "http://www.idpf.org/epub/a11y/accessibility-20170105.html#wcag-aa"
	// EPUB Accessibility 1.0 - WCAG 2.0 Level AAA
	EPUBA11y10WCAG20AAA A11yProfile = "http://www.idpf.org/epub/a11y/accessibility-20170105.html#wcag-aaa"
	// EPUB Accessibility 1.1 - WCAG 2.0 Level A
	EPUBA11y11WCAG20A A11yProfile = "https://www.w3.org/TR/epub-a11y-11#wcag-2.0-a"
	// EPUB Accessibility 1.1 - WCAG 2.0 Level AA
	EPUBA11y11WCAG20AA A11yProfile = "https://www.w3.org/TR/epub-a11y-11#wcag-2.0-aa"
	// EPUB Accessibility 1.1 - WCAG 2.0 Level AAA
	EPUBA11y11WCAG20AAA A11yProfile = "https://www.w3.org/TR/epub-a11y-11#wcag-2.0-aaa"
	// EPUB Accessibility 1.1 - WCAG 2.1 Level A
	EPUBA11y11WCAG21A A11yProfile = "https://www.w3.org/TR/epub-a11y-11#wcag-2.1-a"
	// EPUB Accessibility 1.1 - WCAG 2.1 Level AA
	EPUBA11y11WCAG21AA A11yProfile = "https://www.w3.org/TR/epub-a11y-11#wcag-2.1-aa"
	// EPUB Accessibility 1.1 - WCAG 2.1 Level AAA
	EPUBA11y11WCAG21AAA A11yProfile = "https://www.w3.org/TR/epub-a11y-11#wcag-2.1-aaa"
	// EPUB Accessibility 1.1 - WCAG 2.2 Level A
	EPUBA11y11WCAG22A A11yProfile = "https://www.w3.org/TR/epub-a11y-11#wcag-2.2-a"
	// EPUB Accessibility 1.1 - WCAG 2.2 Level AA
	EPUBA11y11WCAG22AA A11yProfile = "https://www.w3.org/TR/epub-a11y-11#wcag-2.2-aa"
	// EPUB Accessibility 1.1 - WCAG 2.2 Level AAA
	EPUBA11y11WCAG22AAA A11yProfile = "https://www.w3.org/TR/epub-a11y-11#wcag-2.2-aaa"
)

func A11yProfilesFromStrings

func A11yProfilesFromStrings(strings []string) []A11yProfile

func (A11yProfile) Compare added in v0.8.0

func (p A11yProfile) Compare(other A11yProfile) int

type A11yProfileList added in v0.8.0

type A11yProfileList []A11yProfile

func (A11yProfileList) Sort added in v0.8.0

func (l A11yProfileList) Sort()

type AltIdentifier added in v0.11.0

type AltIdentifier struct {
	Value  string `json:"value"`
	Scheme string `json:"scheme,omitempty"`
}

AltIdentifier https://github.com/readium/webpub-manifest/tree/master/contexts/default#identifier https://github.com/readium/webpub-manifest/blob/master/schema/altIdentifier.schema.json

func AltIdentifierFromJSON added in v0.11.0

func AltIdentifierFromJSON(rawJson any) (*AltIdentifier, error)

Parses an AltIdentifier from its RWPM JSON representation. A altIdentifier can be parsed from a single string, or an object.

func AltIdentifierFromJSONArray added in v0.11.0

func AltIdentifierFromJSONArray(rawJsonArray any) ([]AltIdentifier, error)

Creates a list of AltIdentifier from its RWPM JSON representation.

func (AltIdentifier) MarshalJSON added in v0.11.0

func (s AltIdentifier) MarshalJSON() ([]byte, error)

func (*AltIdentifier) UnmarshalJSON added in v0.11.0

func (s *AltIdentifier) UnmarshalJSON(data []byte) error

type Collection

type Collection = Contributor

type Collections

type Collections = Contributors

type Contributor

type Contributor struct {
	LocalizedName   LocalizedString  `json:"name"`                    // The name of the contributor.
	LocalizedSortAs *LocalizedString `json:"sortAs,omitempty"`        // The string used to sort the name of the contributor.
	Identifier      string           `json:"identifier,omitempty"`    // An unambiguous reference to this contributor.
	AltIdentifier   []AltIdentifier  `json:"altIdentifier,omitempty"` // Alternate identifiers
	Roles           Strings          `json:"role,omitempty"`          // The roles of the contributor in the making of the publication.
	Position        *float64         `json:"position,omitempty"`      // The position of the publication in this collection/series, when the contributor represents a collection. TODO validator
	Links           LinkList         `json:"links,omitempty"`         // Used to retrieve similar publications for the given contributor.
}

Contributor https://github.com/readium/webpub-manifest/tree/master/contexts/default#contributors https://github.com/readium/webpub-manifest/blob/master/schema/contributor-object.schema.json

func ContributorFromJSON

func ContributorFromJSON(rawJson interface{}) (*Contributor, error)

Parses a Contributor from its RWPM JSON representation. A contributor can be parsed from a single string, or a full-fledged object. The [links]' href and their children's will be normalized recursively using the provided [normalizeHref] closure.

func ContributorFromJSONArray

func ContributorFromJSONArray(rawJsonArray interface{}) ([]Contributor, error)

func (Contributor) Copy added in v0.6.0

func (c Contributor) Copy(transformer ManifestTransformer) Contributor

func (Contributor) MarshalJSON

func (c Contributor) MarshalJSON() ([]byte, error)

func (Contributor) Name

func (c Contributor) Name() string

func (Contributor) SortAs

func (c Contributor) SortAs() string

func (*Contributor) UnmarshalJSON

func (c *Contributor) UnmarshalJSON(data []byte) error

type Contributors

type Contributors []Contributor

TODO replace with generic

func (Contributors) Copy added in v0.6.0

func (c Contributors) Copy(transformer ManifestTransformer) Contributors

func (Contributors) MarshalJSON

func (c Contributors) MarshalJSON() ([]byte, error)

type Encryption

type Encryption struct {
	Scheme         string `json:"scheme,omitempty"`
	Profile        string `json:"profile,omitempty"`
	Algorithm      string `json:"algorithm,omitempty"`
	Compression    string `json:"compression,omitempty"`
	OriginalLength int64  `json:"originalLength,omitempty"`
}

Encryption contains metadata from encryption xml

func EncryptionFromJSON

func EncryptionFromJSON(rawJson map[string]interface{}) (*Encryption, error)

func (Encryption) ToMap

func (m Encryption) ToMap() map[string]interface{}

func (*Encryption) UnmarshalJSON

func (e *Encryption) UnmarshalJSON(data []byte) error

type GuidedNavigationDocument added in v0.5.0

type GuidedNavigationDocument struct {
	Links  LinkList                 `json:"links,omitempty"` // References to other resources that are related to the current Guided Navigation Document.
	Guided []GuidedNavigationObject `json:"guided"`          // A sequence of resources and/or media fragments into these resources, meant to be presented sequentially to the user.
}

Readium Guided Navigation Document https://readium.org/guided-navigation/schema/document.schema.json

type GuidedNavigationObject added in v0.5.0

type GuidedNavigationObject struct {
	AudioRef string                   `json:"audioref,omitempty"` // References an audio resource or a fragment of it.
	ImgRef   string                   `json:"imgref,omitempty"`   // References an image or a fragment of it.
	TextRef  string                   `json:"textref,omitempty"`  // References a textual resource or a fragment of it.
	Text     string                   `json:"text,omitempty"`     // Textual equivalent of the resources or fragment of the resources referenced by the current Guided Navigation Object.
	Role     []string                 `json:"role,omitempty"`     // Convey the structural semantics of a publication
	Children []GuidedNavigationObject `json:"children,omitempty"` // Items that are children of the containing Guided Navigation Object.
}

Readium Guided Navigation Object https://readium.org/guided-navigation/schema/object.schema.json TODO: Role should be typed TODO: all refs should be url.URL

type HREF added in v0.6.0

type HREF struct {
	// contains filtered or unexported fields
}

An hypertext reference points to a resource in a [Publication]. It is potentially templated, use [Resolve] to get the actual URL.

func MustNewHREFFromString added in v0.6.0

func MustNewHREFFromString(href string, templated bool) HREF

Proxy for NewHREFFromString which panics if the URL is invalid.

func NewHREF added in v0.6.0

func NewHREF(href url.URL) HREF

Creates an HREF from a valid URL.

func NewHREFFromString added in v0.6.0

func NewHREFFromString(href string, templated bool) (HREF, error)

Creates an HREF from a valid URL or URL template (RFC 6570). `templated` Indicates whether [href] is a URL template.

func (HREF) Copy added in v0.6.0

func (h HREF) Copy(transformer ManifestTransformer) HREF

func (HREF) IsTemplated added in v0.6.0

func (h HREF) IsTemplated() bool

Indicates whether this HREF is templated.

func (HREF) Parameters added in v0.6.0

func (h HREF) Parameters() []string

List of URI template parameter keys, if the HREF is templated.

func (HREF) Resolve added in v0.6.0

func (h HREF) Resolve(base url.URL, parameters map[string]string) url.URL

Returns the URL represented by this HREF, resolved to the given [base] URL. If the HREF is a template, the [parameters] are used to expand it according to RFC 6570.

func (HREF) ResolveTo added in v0.6.0

func (h HREF) ResolveTo(baseURL url.URL) HREF

Resolves the receiver HREF to the given [baseUrl].

func (HREF) String added in v0.6.0

func (h HREF) String() string

type HREFNormalizer added in v0.6.0

type HREFNormalizer struct {
	// contains filtered or unexported fields
}

func NewHREFNormalizer added in v0.6.0

func NewHREFNormalizer(baseURL url.URL) HREFNormalizer

func (HREFNormalizer) TransformHREF added in v0.6.0

func (n HREFNormalizer) TransformHREF(href HREF) HREF

TransformHREF implements ManifestTransformer

func (n HREFNormalizer) TransformLink(link Link) Link

TransformLink implements ManifestTransformer

func (HREFNormalizer) TransformManifest added in v0.6.0

func (n HREFNormalizer) TransformManifest(manifest Manifest) Manifest

TransformManifest implements ManifestTransformer

func (HREFNormalizer) TransformMetadata added in v0.6.0

func (n HREFNormalizer) TransformMetadata(metadata Metadata) Metadata

TransformMetadata implements ManifestTransformer

type HashAlgorithm added in v0.9.0

type HashAlgorithm string
const (
	HashAlgorithmBlake2b  HashAlgorithm = "blake2b"
	HashAlgorithmBlake2s  HashAlgorithm = "blake2s"
	HashAlgorithmBlake3   HashAlgorithm = "blake3"
	HashAlgorithmSHA512   HashAlgorithm = "sha512"
	HashAlgorithmSHA256   HashAlgorithm = "sha256"
	HashAlgorithmSHA1     HashAlgorithm = "sha1"
	HashAlgorithmMD5      HashAlgorithm = "md5"
	HashAlgorithmXXH3     HashAlgorithm = "xxh3"
	HashAlgorithmCRC32    HashAlgorithm = "crc32"
	HashAlgorithmPhashDCT HashAlgorithm = "phash-dct"
)

The following hashes keys are reserved for future use, but not necessarily supported by the toolkit. If you are using a hash algorithm not listed here, it's better to use a URI, such as `https://blurha.sh`. If there's an algorithm you think should be recognized, let us know.

type HashList added in v0.9.0

type HashList []HashValue

func HashListFromJSONArray added in v0.9.0

func HashListFromJSONArray(rawJsonArray []interface{}) (HashList, error)

func (*HashList) Deduplicate added in v0.9.0

func (h *HashList) Deduplicate()

func (HashList) Find added in v0.10.0

func (h HashList) Find(algorithm HashAlgorithm) (HashValue, bool)

func (HashList) ToJSONArray added in v0.10.0

func (h HashList) ToJSONArray() []interface{}

func (HashList) Value added in v0.9.0

func (h HashList) Value(algorithm HashAlgorithm) (string, bool)

type HashValue added in v0.9.0

type HashValue struct {
	Algorithm HashAlgorithm `json:"algorithm"`
	Value     string        `json:"value"`
}

func (HashValue) Equal added in v0.10.0

func (h HashValue) Equal(other HashValue) bool

func (HashValue) String added in v0.10.0

func (h HashValue) String() string

type Layout added in v0.11.0

type Layout string
const (
	LayoutNone       Layout = ""           // No layout specified, reading systems should use their default layout.
	LayoutReflowable Layout = "reflowable" // Reading systems are free to adapt text and layout entirely based on user preferences.
	LayoutFixed      Layout = "fixed"      // Each resource is a "page" where both dimensions are usually contained in the device's viewport. Based on user preferences, the reading system may also display two resources side by side in a spread.
	LayoutScrolled   Layout = "scrolled"   // Resources are displayed in a continuous scroll, usually by filling the width of the viewport, without any visible gap between between spine items.
)

func (Layout) EffectiveValue added in v0.11.0

func (l Layout) EffectiveValue(profiles Profiles) Layout

Determines the actual layout value based on the provided profiles.

type Link struct {
	Href       HREF                 `json:"href"`                 // URI or URI template of the linked resource.
	MediaType  *mediatype.MediaType `json:"type,omitempty"`       // MIME type of the linked resource.
	Title      string               `json:"title,omitempty"`      // Title of the linked resource.
	Rels       Strings              `json:"rel,omitempty"`        // Relation between the linked resource and its containing collection.
	Properties Properties           `json:"properties,omitempty"` // Properties associated to the linked resource.
	Height     uint                 `json:"height,omitempty"`     // Height of the linked resource in pixels.
	Width      uint                 `json:"width,omitempty"`      // Width of the linked resource in pixels.
	Size       uint                 `json:"size,omitempty"`       // Original size of the resource in bytes.
	Bitrate    float64              `json:"bitrate,omitempty"`    // Bitrate of the linked resource in kbps.
	Duration   float64              `json:"duration,omitempty"`   // Length of the linked resource in seconds.
	Languages  Strings              `json:"language,omitempty"`   // Expected language of the linked resource (BCP 47 tag).
	Alternates LinkList             `json:"alternate,omitempty"`  // Alternate resources for the linked resource.
	Children   LinkList             `json:"children,omitempty"`   // Resources that are children of the linked resource, in the context of a given collection role.
}

Link https://github.com/readium/webpub-manifest/blob/master/README.md#24-the-link-object https://github.com/readium/webpub-manifest/blob/master/schema/link.schema.json

func LinkFromJSON

func LinkFromJSON(rawJson map[string]interface{}) (*Link, error)

Creates an Link from its RWPM JSON representation.

func (Link) Copy added in v0.6.0

func (l Link) Copy(transformer ManifestTransformer) Link

func (Link) MarshalJSON

func (l Link) MarshalJSON() ([]byte, error)

func (Link) NormalizeHREFsToBase added in v0.6.0

func (l Link) NormalizeHREFsToBase(baseURL url.URL) Link

Returns a copy of the receiver after normalizing its HREFs to the given [baseUrl].

func (Link) URL added in v0.6.0

func (l Link) URL(base url.URL, parameters map[string]string) url.URL

Returns the URL represented by this link's HREF, resolved to the given [base] URL. If the HREF is a template, the [parameters] are used to expand it according to RFC 6570.

func (*Link) UnmarshalJSON

func (l *Link) UnmarshalJSON(b []byte) error
type LinkList []Link

Slice of links

func LinksFromJSONArray

func LinksFromJSONArray(rawJsonArray []interface{}) (LinkList, error)

func (LinkList) AllAreAudio

func (ll LinkList) AllAreAudio() bool

Returns whether all the resources in the collection are audio clips.

func (LinkList) AllAreBitmap

func (ll LinkList) AllAreBitmap() bool

Returns whether all the resources in the collection are bitmaps.

func (LinkList) AllAreHTML

func (ll LinkList) AllAreHTML() bool

Returns whether all the resources in the collection are HTML documents.

func (LinkList) AllAreVideo

func (ll LinkList) AllAreVideo() bool

Returns whether all the resources in the collection are video clips.

func (LinkList) AllAreVisual

func (ll LinkList) AllAreVisual() bool

Returns whether all the resources in the collection are bitmaps or video clips.

func (LinkList) AllMatchMediaType

func (ll LinkList) AllMatchMediaType(mt ...*mediatype.MediaType) bool

Returns whether all the resources in the collection are matching the given media type.

func (LinkList) Copy added in v0.6.0

func (ll LinkList) Copy(transformer ManifestTransformer) LinkList

func (LinkList) FilterByMediaType

func (ll LinkList) FilterByMediaType(mt ...*mediatype.MediaType) LinkList

Finds all the links matching any of the given media types.

func (LinkList) FilterByRel

func (ll LinkList) FilterByRel(rel string) LinkList

Finds all the links with the given relation.

func (LinkList) FirstWithHref

func (ll LinkList) FirstWithHref(href url.URL) *Link

Finds the first link matching the given HREF.

func (LinkList) FirstWithMediaType

func (ll LinkList) FirstWithMediaType(mt *mediatype.MediaType) *Link

Finds the first link matching the given media type.

func (LinkList) FirstWithRel

func (ll LinkList) FirstWithRel(rel string) *Link

Finds the first link with the given relation.

func (LinkList) Flatten added in v0.6.0

func (ll LinkList) Flatten() LinkList

Returns a list of `Link` after flattening the `children` and `alternates` links of the receiver.

func (LinkList) IndexOfFirstWithHref

func (ll LinkList) IndexOfFirstWithHref(href url.URL) int

Returns the first Link with the given [href], or null if not found.

type LocalizedString

type LocalizedString struct {
	Translations map[string]string
}

func LocalizedStringFromJSON

func LocalizedStringFromJSON(d interface{}) (*LocalizedString, error)

func NewLocalizedStringFromString

func NewLocalizedStringFromString(value string) LocalizedString

func NewLocalizedStringFromStrings

func NewLocalizedStringFromStrings(strings map[string]string) LocalizedString

Shortcut to create a LocalizedString using a map of translations indexed by the BCP 47 language tag.

func (*LocalizedString) DefaultTranslation

func (l *LocalizedString) DefaultTranslation() string

func (*LocalizedString) GetOrFallback

func (l *LocalizedString) GetOrFallback(language string) string

GetOrFallback Returns the first translation for the given [language] BCP–47 tag.

func (*LocalizedString) Length

func (l *LocalizedString) Length() int

func (LocalizedString) MarshalJSON

func (l LocalizedString) MarshalJSON() ([]byte, error)

func (*LocalizedString) SetDefaultTranslation

func (l *LocalizedString) SetDefaultTranslation(value string)

func (*LocalizedString) SetTranslation

func (l *LocalizedString) SetTranslation(language string, value string)

func (*LocalizedString) String

func (l *LocalizedString) String() string

func (*LocalizedString) UnmarshalJSON

func (l *LocalizedString) UnmarshalJSON(data []byte) error

type Locations

type Locations struct {
	Fragments        []string               `json:"fragments,omitempty"`        // Contains one or more fragment in the resource referenced by the [Locator].
	Progression      *float64               `json:"progression,omitempty"`      // Progression in the resource expressed as a percentage (between 0 and 1).
	Position         *uint                  `json:"position,omitempty"`         // An index in the publication (>= 1).
	TotalProgression *float64               `json:"totalProgression,omitempty"` // Progression in the publication expressed as a percentage (between 0 and 1).
	OtherLocations   map[string]interface{} // Additional locations for extensions.
}

One or more alternative expressions of the location. https://github.com/readium/architecture/tree/master/models/locators#the-location-object

func LocationsFromJSON

func LocationsFromJSON(rawJson map[string]interface{}) (l Locations, err error)

func (Locations) CSSSelector

func (l Locations) CSSSelector() string

func (Locations) MarshalJSON

func (l Locations) MarshalJSON() ([]byte, error)

func (*Locations) UnmarshalJSON

func (l *Locations) UnmarshalJSON(b []byte) error

type Locator

type Locator struct {
	Href      url.URL             `json:"href"`
	MediaType mediatype.MediaType `json:"type"`
	Title     string              `json:"title,omitempty"`
	Locations Locations           `json:"locations,omitempty"`
	Text      Text                `json:"text,omitempty"`
}

Locator provides a precise location in a publication in a format that can be stored and shared.

There are many different use cases for locators:

  • getting back to the last position in a publication
  • bookmarks
  • highlights & annotations
  • search results
  • human-readable (and shareable) reference in a publication

https://github.com/readium/architecture/tree/master/locators

func LocatorFromJSON

func LocatorFromJSON(rawJson map[string]interface{}) (Locator, error)

func (Locator) MarshalJSON

func (l Locator) MarshalJSON() ([]byte, error)

func (*Locator) UnmarshalJSON

func (l *Locator) UnmarshalJSON(b []byte) error

type Manifest

type Manifest struct {
	Context         Strings                  `json:"@context,omitempty"`
	Metadata        Metadata                 `json:"metadata"`
	Links           LinkList                 `json:"links"`
	ReadingOrder    LinkList                 `json:"readingOrder,omitempty"`
	Resources       LinkList                 `json:"resources,omitempty"` //Replaces the manifest but less redundant
	TableOfContents LinkList                 `json:"toc,omitempty"`
	Subcollections  PublicationCollectionMap `json:"-"` //Extension point for collections that shouldn't show up in the manifest
}

Manifest Main structure for a publication

func ManifestFromJSON

func ManifestFromJSON(rawJson map[string]interface{}, packaged bool) (*Manifest, error)

Parses a Manifest from its RWPM JSON representation.

TODO log [warnings] ? https://readium.org/webpub-manifest/ https://readium.org/webpub-manifest/schema/publication.schema.json

func (Manifest) ConformsTo

func (m Manifest) ConformsTo(profile Profile) bool

Returns whether this manifest conforms to the given Readium Web Publication Profile.

func (Manifest) Copy added in v0.6.0

func (m Manifest) Copy(transformer ManifestTransformer) Manifest

Creates a copy of the receiver Manifest, applying the given [transformer] to each component.

func (Manifest) LinkWithHref

func (m Manifest) LinkWithHref(href url.URL) *Link

Finds the first Link with the given href in the manifest's links. Searches through (in order) the reading order, resources and links recursively following alternate and children links. If there's no match, tries again after removing any query parameter and anchor from the given href.

func (Manifest) LinkWithRel

func (m Manifest) LinkWithRel(rel string) *Link

Finds the first Link with the given relation in the manifest's links.

func (Manifest) LinksWithRel

func (m Manifest) LinksWithRel(rel string) []Link

Finds all [Link]s having the given [rel] in the manifest's links.

func (m Manifest) LocatorFromLink(link Link) *Locator

Creates a new Locator object from a Link to a resource of this manifest. Returns nil if the resource is not found in this manifest.

func (Manifest) MarshalJSON

func (m Manifest) MarshalJSON() ([]byte, error)

func (Manifest) NormalizeHREFsToBase added in v0.6.0

func (m Manifest) NormalizeHREFsToBase(baseURL url.URL) Manifest

Returns a copy of the receiver after normalizing its HREFs to the given [baseUrl].

func (Manifest) NormalizeHREFsToSelf added in v0.6.0

func (m Manifest) NormalizeHREFsToSelf() Manifest

Returns a copy of the receiver after normalizing its HREFs to the link with `rel="self"`.

func (Manifest) ToMap

func (m Manifest) ToMap(selfLink *Link) map[string]interface{}

func (*Manifest) UnmarshalJSON

func (m *Manifest) UnmarshalJSON(b []byte) error

type ManifestTransformer added in v0.6.0

type ManifestTransformer interface {
	TransformManifest(manifest Manifest) Manifest
	TransformMetadata(metadata Metadata) Metadata
	TransformLink(link Link) Link
	TransformHREF(href HREF) HREF
}

Transforms a manifest's components.

type MediaOverlay added in v0.5.0

type MediaOverlay struct {
	ActiveClass         string `json:"activeClass,omitempty"`         // Author-defined CSS class name to apply to the currently-playing EPUB Content Document element.
	PlaybackActiveClass string `json:"playbackActiveClass,omitempty"` // Author-defined CSS class name to apply to the EPUB Content Document's document element when playback is active.
}

EPUB profile extension for WebPub Manifest for media overlay features.

type Metadata

type Metadata struct {
	Identifier         string                 `json:"identifier,omitempty"`
	AltIdentifiers     []AltIdentifier        `json:"altIdentifier,omitempty"`
	Type               string                 `json:"@type,omitempty"`
	ConformsTo         Profiles               `json:"conformsTo,omitempty"`
	LocalizedTitle     LocalizedString        `json:"title"`
	LocalizedSubtitle  *LocalizedString       `json:"subtitle,omitempty"`
	LocalizedSortAs    *LocalizedString       `json:"sortAs,omitempty"`
	Accessibility      *A11y                  `json:"accessibility,omitempty"`
	TDM                *TDM                   `json:"tdm,omitempty"`
	Modified           *time.Time             `json:"modified,omitempty"`
	Published          *time.Time             `json:"published,omitempty"`
	Languages          Strings                `json:"language,omitempty"`
	Subjects           []Subject              `json:"subject,omitempty"`
	Authors            Contributors           `json:"author,omitempty"`
	Translators        Contributors           `json:"translator,omitempty"`
	Editors            Contributors           `json:"editor,omitempty"`
	Artists            Contributors           `json:"artist,omitempty"`
	Illustrators       Contributors           `json:"illustrator,omitempty"`
	Letterers          Contributors           `json:"letterer,omitempty"`
	Pencilers          Contributors           `json:"penciler,omitempty"`
	Colorists          Contributors           `json:"colorist,omitempty"`
	Inkers             Contributors           `json:"inker,omitempty"`
	Narrators          Contributors           `json:"narrator,omitempty"`
	Contributors       Contributors           `json:"contributor,omitempty"`
	Publishers         Contributors           `json:"publisher,omitempty"`
	Imprints           Contributors           `json:"imprint,omitempty"`
	ReadingProgression ReadingProgression     `json:"readingProgression,omitempty"`
	Layout             Layout                 `json:"layout,omitempty"`
	Description        string                 `json:"description,omitempty"`
	Duration           *float64               `json:"duration,omitempty"`
	NumberOfPages      *uint                  `json:"numberOfPages,omitempty"`
	BelongsTo          map[string]Collections `json:"belongsTo,omitempty"`
	MediaOverlay       *MediaOverlay          `json:"mediaOverlay,omitempty"`

	OtherMetadata map[string]interface{} `json:"-"` // Extension point for other metadata.
}

Metadata for the default context in WebPub

func MetadataFromJSON

func MetadataFromJSON(rawJson map[string]interface{}) (*Metadata, error)

func (Metadata) BelongsToCollections

func (m Metadata) BelongsToCollections() []Collection

func (Metadata) BelongsToSeries

func (m Metadata) BelongsToSeries() []Collection

func (Metadata) Copy added in v0.6.0

func (m Metadata) Copy(transformer ManifestTransformer) Metadata

func (Metadata) EffectiveLayout added in v0.11.0

func (m Metadata) EffectiveLayout() Layout

func (Metadata) EffectiveReadingProgression

func (m Metadata) EffectiveReadingProgression() ReadingProgression

func (Metadata) InferredAccessibility

func (m Metadata) InferredAccessibility() *A11y

InferredAccessibility returns the accessibility metadata inferred from the manifest and stored in OtherMetadata.

func (Metadata) MarshalJSON

func (m Metadata) MarshalJSON() ([]byte, error)

func (Metadata) SetOtherMetadata

func (m Metadata) SetOtherMetadata(key string, value interface{}) error

SetOtherMetadata marshalls the value to a JSON map before storing it in OtherMetadata under the given key.

func (Metadata) SortAs

func (m Metadata) SortAs() string

func (Metadata) Subtitle

func (m Metadata) Subtitle() string

func (Metadata) Title

func (m Metadata) Title() string

func (*Metadata) UnmarshalJSON

func (m *Metadata) UnmarshalJSON(b []byte) error

type Page

type Page string // Indicates how the linked resource should be displayed in a reading environment that displays synthetic spreads.
const (
	PageNone   Page = ""
	PageLeft   Page = "left"
	PageRight  Page = "right"
	PageCenter Page = "center"
)

type Profile

type Profile string

type Profiles

type Profiles []Profile

TODO replace with generic

func (Profiles) MarshalJSON

func (p Profiles) MarshalJSON() ([]byte, error)

type Properties

type Properties map[string]interface{}

Properties associated with a linked resource

func PropertiesFromJSON

func PropertiesFromJSON(rawJson interface{}) (Properties, error)

func (Properties) Contains

func (p Properties) Contains() []string

Identifies content contained in the linked resource, that cannot be strictly identified using a media type.

func (Properties) Encryption

func (p Properties) Encryption() *Encryption

Indicates that a resource is encrypted/obfuscated and provides relevant information for decryption.

func (*Properties) Get

func (p *Properties) Get(key string) interface{}

func (Properties) GetBool

func (p Properties) GetBool(key string) *bool

func (Properties) GetString

func (p Properties) GetString(key string) string

func (Properties) Hash added in v0.9.0

func (p Properties) Hash() HashList

func (Properties) Page

func (p Properties) Page() Page

Indicates how the linked resource should be displayed in a reading environment that displays synthetic spreads.

func (*Properties) UnmarshalJSON

func (p *Properties) UnmarshalJSON(data []byte) error

type PublicationCollection

type PublicationCollection struct {
	Metadata       map[string]interface{}   `json:"metadata,omitempty"`
	Links          LinkList                 `json:"links,omitempty"`
	Subcollections PublicationCollectionMap `json:"-"`
}

PublicationCollection can be used as extension point in the Readium Web Publication Manifest. https://readium.org/webpub-manifest/schema/subcollection.schema.json

func PublicationCollectionFromJSON

func PublicationCollectionFromJSON(rawJson interface{}) (*PublicationCollection, error)

Parses a PublicationCollection from its RWPM JSON representation.

TODO log [warnings] ?

The [links]' href and their children's will be normalized recursively using the provided [normalizeHref] closure.

func (PublicationCollection) Copy added in v0.6.0

func (PublicationCollection) MarshalJSON

func (pc PublicationCollection) MarshalJSON() ([]byte, error)

func (*PublicationCollection) UnmarshalJSON

func (pc *PublicationCollection) UnmarshalJSON(b []byte) error

type PublicationCollectionMap

type PublicationCollectionMap map[string][]PublicationCollection

func PublicationCollectionsFromJSON

func PublicationCollectionsFromJSON(rawJson map[string]interface{}) (PublicationCollectionMap, error)

Parses a map of PublicationCollection indexed by their roles from its RWPM JSON representation.

The [Links]' href and their children's will be normalized recursively using the provided [normalizeHref] closure.

func (PublicationCollectionMap) Copy added in v0.6.0

func (PublicationCollectionMap) MarshalJSON

func (pcm PublicationCollectionMap) MarshalJSON() ([]byte, error)

func (*PublicationCollectionMap) UnmarshalJSON

func (pcm *PublicationCollectionMap) UnmarshalJSON(b []byte) error

type ReadingProgression

type ReadingProgression string
const (
	None ReadingProgression = ""
	LTR  ReadingProgression = "ltr"
	RTL  ReadingProgression = "rtl"
)

type Strings

type Strings []string

TODO replace with generic

func (Strings) MarshalJSON

func (s Strings) MarshalJSON() ([]byte, error)

type Subject

type Subject struct {
	LocalizedName   LocalizedString  `json:"name"`
	LocalizedSortAs *LocalizedString `json:"sortAs,omitempty"`
	Scheme          string           `json:"scheme,omitempty"`
	Code            string           `json:"code,omitempty"`
	Links           LinkList         `json:"links,omitempty"`
}

Subject https://github.com/readium/webpub-manifest/tree/master/contexts/default#subjects https://github.com/readium/webpub-manifest/blob/master/schema/subject-object.schema.json

func SubjectFromJSON

func SubjectFromJSON(rawJson interface{}) (*Subject, error)

Parses a Subject from its RWPM JSON representation. A subject can be parsed from a single string, or a full-fledged object. The [links]' href and their children's will be normalized recursively using the provided [normalizeHref] closure.

func SubjectFromJSONArray

func SubjectFromJSONArray(rawJsonArray interface{}) ([]Subject, error)

Creates a list of Subject from its RWPM JSON representation. The [links]' href and their children's will be normalized recursively using the provided [normalizeHref] closure.

func (Subject) Copy added in v0.6.0

func (s Subject) Copy(transformer ManifestTransformer) Subject

func (Subject) MarshalJSON

func (s Subject) MarshalJSON() ([]byte, error)

func (Subject) Name

func (s Subject) Name() string

func (Subject) SortAs

func (s Subject) SortAs() string

func (*Subject) UnmarshalJSON

func (s *Subject) UnmarshalJSON(data []byte) error

type TDM added in v0.7.1

type TDM struct {
	Policy      string         `json:"policy,omitempty"`
	Reservation TDMReservation `json:"reservation,omitempty"`
}

TDMRep (Text & Data Mining Reservation Protocol)

https://www.w3.org/community/reports/tdmrep/CG-FINAL-tdmrep-20240510/

func TDMFromJSON added in v0.7.1

func TDMFromJSON(rawJSON map[string]interface{}) (*TDM, error)

func (*TDM) IsEmpty added in v0.7.1

func (t *TDM) IsEmpty() bool

func (*TDM) UnmarshalJSON added in v0.7.1

func (t *TDM) UnmarshalJSON(data []byte) error

type TDMReservation added in v0.7.1

type TDMReservation string
const (
	TDMReservationAll  TDMReservation = "all"
	TDMReservationNone TDMReservation = "none"
)

func (TDMReservation) String added in v0.7.1

func (t TDMReservation) String() string

type Text

type Text struct {
	Before    string `json:"before,omitempty"`    // The text before the locator.
	Highlight string `json:"highlight,omitempty"` // The text at the locator.
	After     string `json:"after,omitempty"`     // The text after the locator.
}

Textual context of the locator. A Locator Text Object contains multiple text fragments, useful to give a context to the Locator or for highlights. https://github.com/readium/architecture/tree/master/models/locators#the-text-object

func TextFromJSON

func TextFromJSON(rawJson map[string]interface{}) (t Text)

func (Text) Substring added in v0.6.0

func (t Text) Substring(start, end int64) Text

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL