omni-viewer-core 0.19.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +76 -2
  2. package/dist/i18n/catalog.en.js +197 -0
  3. package/dist/i18n/catalog.ja.js +197 -0
  4. package/dist/i18n/catalog.ko.js +197 -0
  5. package/dist/i18n/catalog.zh-cn.js +197 -0
  6. package/dist/parsers/epub/index.d.ts +102 -0
  7. package/dist/parsers/epub/index.js +951 -0
  8. package/dist/parsers/epub/model.d.ts +107 -0
  9. package/dist/parsers/epub/model.js +5 -0
  10. package/dist/parsers/epub/xml.d.ts +37 -0
  11. package/dist/parsers/epub/xml.js +292 -0
  12. package/dist/parsers/epub/zip.d.ts +43 -0
  13. package/dist/parsers/epub/zip.js +203 -0
  14. package/dist/parsers/xml/index.d.ts +13 -0
  15. package/dist/parsers/xml/index.js +60 -0
  16. package/dist/parsers/xml/model.d.ts +86 -0
  17. package/dist/parsers/xml/model.js +19 -0
  18. package/dist/parsers/xml/parse.d.ts +18 -0
  19. package/dist/parsers/xml/parse.js +649 -0
  20. package/dist/registry/index.d.ts +3 -1
  21. package/dist/registry/index.js +24 -2
  22. package/dist/registry/probe.js +3 -0
  23. package/dist/registry/sniff.d.ts +10 -1
  24. package/dist/registry/sniff.js +58 -0
  25. package/dist/styles/epub.css +61 -0
  26. package/dist/styles/xml.css +76 -0
  27. package/dist/viewers/epub/content.d.ts +129 -0
  28. package/dist/viewers/epub/content.js +1585 -0
  29. package/dist/viewers/epub/controller.d.ts +54 -0
  30. package/dist/viewers/epub/controller.js +81 -0
  31. package/dist/viewers/epub/index.d.ts +47 -0
  32. package/dist/viewers/epub/index.js +1006 -0
  33. package/dist/viewers/epub/self-loading.d.ts +3 -0
  34. package/dist/viewers/epub/self-loading.js +6 -0
  35. package/dist/viewers/epub/styles.d.ts +1 -0
  36. package/dist/viewers/epub/styles.js +66 -0
  37. package/dist/viewers/xml/controller.d.ts +83 -0
  38. package/dist/viewers/xml/controller.js +459 -0
  39. package/dist/viewers/xml/index.d.ts +62 -0
  40. package/dist/viewers/xml/index.js +836 -0
  41. package/dist/viewers/xml/styles.d.ts +1 -0
  42. package/dist/viewers/xml/styles.js +81 -0
  43. package/package.json +25 -1
package/README.md CHANGED
@@ -13,9 +13,9 @@ models, viewers mount into a DOM element, and everything host-specific
13
13
  ## Supported formats
14
14
 
15
15
  - **Documents** — PDF, Word (DOCX and legacy DOC), HWP, PowerPoint (PPTX and
16
- legacy PPT), Markdown, Jupyter Notebook (.ipynb),
16
+ legacy PPT), Markdown, Jupyter Notebook (.ipynb), EPUB e-books (2 and 3),
17
17
  LaTeX (structure and math preview, not typesetting)
18
- - **Data & spreadsheets** — Excel, CSV/TSV, JSON, JSONL/NDJSON, YAML, TOML,
18
+ - **Data & spreadsheets** — Excel, CSV/TSV, JSON, JSONL/NDJSON, YAML, TOML, XML,
19
19
  Parquet, Avro, HDF5, MATLAB MAT, NumPy (NPY/NPZ), Safetensors, GGUF, ONNX, TFLite/LiteRT,
20
20
  Keras (.keras and legacy .h5), Core ML (.mlmodel and .mlpackage),
21
21
  OpenVINO IR (.xml + .bin), PyTorch Export (.pt2), ExecuTorch (.pte), Protocol
@@ -439,6 +439,80 @@ metadata get their own tabs. Routing is by the `.har` extension; an
439
439
  extensionless archive is recognized by content — a `log` object holding an
440
440
  `entries` array — and claimed before the generic JSON viewer.
441
441
 
442
+ ### EPUB e-books (.epub)
443
+
444
+ EPUB 2.0.1 and EPUB 3.x books open in a reflowable reading pane with the
445
+ book's table of contents, chapter navigation, text scaling, and a book-info
446
+ panel (metadata, cover, diagnostics). Sanitizing chapter markup is mandatory,
447
+ so the viewer takes a DOMPurify factory — `loadEpubViewerDeps` imports the
448
+ optional `dompurify` peer for you:
449
+
450
+ ```ts
451
+ import { mountEpubViewer } from 'omni-viewer-core/viewers/epub';
452
+ import { loadEpubViewerDeps } from 'omni-viewer-core/viewers/epub/self-loading';
453
+
454
+ await mountEpubViewer({ fileName: file.name, data: bytes }, container,
455
+ { ...ctx, navigation }, await loadEpubViewerDeps());
456
+ ```
457
+
458
+ `parseEpub` is a contract parser (`ParseOutcome<EpubDocument>`) that reads
459
+ only the package files — `container.xml`, the OPF package document, the EPUB 3
460
+ navigation document or the EPUB 2 NCX, and `encryption.xml` — so opening a
461
+ large illustrated book costs its package files, not its images. EPUB 2
462
+ `opf:` attributes and EPUB 3 `refines` metadata map onto one model (title and
463
+ subtitles, creators with roles and sort names, identifiers with schemes,
464
+ publication date, series, subjects, plain-text description). Chapters and
465
+ images are inflated on demand through `openEpubArchive`, each read capped per
466
+ member and against a cumulative budget, and a member that inflates past the
467
+ size its directory record declares is rejected as corrupt. Inflation uses the
468
+ platform's `DecompressionStream('deflate-raw')`; pass `inflate` to supply one
469
+ on hosts without it.
470
+
471
+ Chapter markup is parsed and sanitized in an inert document before it reaches
472
+ the page: scripts, forms, frames, media, and **publisher CSS** (`<link>`,
473
+ `<style>`, `style=""`) are dropped and the viewer's own reading typography
474
+ applies; container images become blob URLs revoked on chapter change; remote
475
+ images are blocked and counted. Internal links move through the spine,
476
+ fragments scroll within the chapter, and external links go only through the
477
+ host `navigation` service (allow-listed schemes). Next/previous walk the linear
478
+ spine (`linear="no"` covers and notes stay reachable by link), arrow keys turn
479
+ pages in the book's progression direction, and `Ctrl/Cmd` `+`/`-`/`0` scale
480
+ text. A book whose every chapter is DRM-encrypted fails with
481
+ `password-required` (font obfuscation is ignored); partly encrypted, missing,
482
+ or fixed-layout content is reported as diagnostics. Routing is by the `.epub`
483
+ extension; an extensionless book is recognized by `probeContainer` from its
484
+ stored `mimetype` member.
485
+
486
+ ### XML (.xml and XML dialects)
487
+
488
+ Configuration and integration documents (`pom.xml`, Android manifests,
489
+ MSBuild projects, SOAP/WSDL, RSS/Atom, XLIFF, KML/GPX…) open as an
490
+ element/attribute tree with a node inspector and the original source side by
491
+ side:
492
+
493
+ ```ts
494
+ import { mountXmlViewer } from 'omni-viewer-core/viewers/xml';
495
+
496
+ const handle = await mountXmlViewer({ fileName: file.name, data: bytes }, container, { ...ctx, clipboard });
497
+ ```
498
+
499
+ `parseXml` is a contract parser (`ParseOutcome<XmlDocument>`) with no DOM
500
+ dependency. Every node keeps its source range, and namespaces are resolved.
501
+ Well-formedness errors (mismatched or unclosed tags, duplicate attributes,
502
+ undeclared prefixes…) are reported with line and column, then recovered, so a
503
+ broken file still opens as a `partial` tree. External entities are never
504
+ loaded. Internal DTD entities expand one level only, under a budget, which
505
+ rules out XXE and billion-laughs expansion.
506
+
507
+ Selecting a node highlights its range in the source. Clicking a tag or
508
+ attribute in the source selects that node. Search covers names, values, or
509
+ comments and PIs, with next/previous and a matches-only filter. Copy gives the
510
+ XPath (positions appear only where names repeat), the value, or the node's XML.
511
+ Both panes are virtualized, and long single-line sources are split into
512
+ display segments. Defaults are 64 MiB input, 500,000 nodes, and depth 1,000.
513
+ ARXML and ReqIF keep their dedicated viewers by extension. An `.xml` whose root
514
+ is an OpenVINO IR goes to the OpenVINO viewer when a text sample is provided.
515
+
442
516
  ### Archive host integration
443
517
 
444
518
  Archive decompression remains adapter-owned: pass an `ArchiveDecoder` to
@@ -307,6 +307,203 @@ export const CATALOG_EN = {
307
307
  'pte.inspector.inputs': 'Inputs', 'pte.inspector.outputs': 'Outputs', 'pte.inspector.arguments': 'Arguments',
308
308
  'pte.inspector.delegate': 'Delegate', 'pte.inspector.destination': 'Destination', 'pte.inspector.stackTrace': 'Stack trace',
309
309
  'pte.inspector.value': 'Value', 'pte.inspector.items': 'Items',
310
+ 'xml.title': 'XML document',
311
+ 'xml.eyebrow': 'XML {version}',
312
+ 'xml.unreadable': 'This file could not be read as XML.',
313
+ 'xml.search': 'Search names, values, comments…',
314
+ 'xml.searchLabel': 'Search the document',
315
+ 'xml.scopeLabel': 'Search in',
316
+ 'xml.scope.all': 'Everything',
317
+ 'xml.scope.name': 'Names',
318
+ 'xml.scope.value': 'Values',
319
+ 'xml.scope.comment': 'Comments & PIs',
320
+ 'xml.previousMatch': 'Previous match',
321
+ 'xml.nextMatch': 'Next match',
322
+ 'xml.matchPosition': '{current} / {total}',
323
+ 'xml.noMatches': 'No matches',
324
+ 'xml.matchesOnly': 'Matches only',
325
+ 'xml.showAttributes': 'Attribute rows',
326
+ 'xml.expandAll': 'Expand all',
327
+ 'xml.collapseAll': 'Collapse all',
328
+ 'xml.problems': '{count} notes',
329
+ 'xml.problemsPartial': '{count} problems — the tree shows what could be recovered',
330
+ 'xml.tree': 'Structure',
331
+ 'xml.treeLabel': 'XML structure',
332
+ 'xml.rowCount': '{count} rows',
333
+ 'xml.inspector': 'Details',
334
+ 'xml.source': 'Source',
335
+ 'xml.lineCount': '{count} lines',
336
+ 'xml.summary.elements': 'Elements',
337
+ 'xml.summary.attributes': 'Attributes',
338
+ 'xml.summary.depth': 'Max depth',
339
+ 'xml.summary.namespaces': 'Namespaces',
340
+ 'xml.summary.lines': 'Lines',
341
+ 'xml.moreAttributes': '+{count} more',
342
+ 'xml.childCount': '({count} children)',
343
+ 'xml.kind.element': 'Element',
344
+ 'xml.kind.attribute': 'Attribute',
345
+ 'xml.kind.text': 'Text',
346
+ 'xml.kind.cdata': 'CDATA',
347
+ 'xml.kind.comment': 'Comment',
348
+ 'xml.kind.pi': 'Processing instruction',
349
+ 'xml.kind.doctype': 'Document type',
350
+ 'xml.copyXpath': 'Copy XPath',
351
+ 'xml.copyValue': 'Copy value',
352
+ 'xml.copyXml': 'Copy XML',
353
+ 'xml.showInSource': 'Show in source',
354
+ 'xml.copied': 'Copied to the clipboard',
355
+ 'xml.copyFailed': 'Copy failed',
356
+ 'xml.document': 'Document',
357
+ 'xml.namespaces': 'Namespace declarations',
358
+ 'xml.noNamespaces': 'This document declares no namespaces.',
359
+ 'xml.defaultNamespace': '(default)',
360
+ 'xml.statistics': 'Statistics',
361
+ 'xml.attributes': 'Attributes',
362
+ 'xml.stat.text': 'Text nodes',
363
+ 'xml.stat.cdata': 'CDATA sections',
364
+ 'xml.stat.comments': 'Comments',
365
+ 'xml.stat.pis': 'Processing instructions',
366
+ 'xml.field.version': 'XML version',
367
+ 'xml.field.encoding': 'Encoding',
368
+ 'xml.field.encodingValue': '{used} (declared {declared})',
369
+ 'xml.field.standalone': 'Standalone',
370
+ 'xml.field.doctype': 'DOCTYPE',
371
+ 'xml.field.publicId': 'Public ID',
372
+ 'xml.field.systemId': 'System ID',
373
+ 'xml.field.root': 'Root element',
374
+ 'xml.field.namespace': 'Namespace',
375
+ 'xml.field.prefix': 'Prefix',
376
+ 'xml.field.uri': 'URI',
377
+ 'xml.field.count': 'Declarations',
378
+ 'xml.field.xpath': 'XPath',
379
+ 'xml.field.position': 'Position',
380
+ 'xml.field.positionValue': 'Line {line}, column {column}',
381
+ 'xml.field.children': 'Children',
382
+ 'xml.field.childrenValue': '{elements} elements · {attributes} attributes',
383
+ 'xml.field.status': 'Status',
384
+ 'xml.field.name': 'Name',
385
+ 'xml.field.value': 'Value',
386
+ 'xml.field.text': 'Text content',
387
+ 'xml.unclosed': 'Not closed — its end tag is missing',
388
+ 'xml.emptyText': 'No text content.',
389
+ 'xml.truncated': 'Showing the first {count} characters.',
390
+ 'diag.xml.noRoot': 'The file contains no XML element.',
391
+ 'diag.xml.notText': 'The file is binary, not XML text.',
392
+ 'diag.xml.unsupportedEncoding': 'The declared encoding {encoding} is not supported; the file was read as UTF-8.',
393
+ 'diag.xml.mismatchedTag': 'End tag </{found}> does not match the open element <{expected}>.',
394
+ 'diag.xml.unclosedElement': 'Element <{name}> is not closed.',
395
+ 'diag.xml.endTagSyntax': 'End tag </{name}> may contain only its name.',
396
+ 'diag.xml.missingAttributeSpace': 'Attribute {name} must be separated from the previous one by whitespace.',
397
+ 'diag.xml.entityMarkup': 'Entity &{name}; contains markup, which is shown as text, not parsed into elements.',
398
+ 'diag.xml.entityLtInAttribute': 'Entity &{name}; puts a \'<\' into an attribute value.',
399
+ 'diag.xml.tagSyntax': 'Unexpected character {char} in tag <{name}>.',
400
+ 'diag.xml.unexpectedEndTag': 'End tag </{name}> has no matching start tag.',
401
+ 'diag.xml.duplicateAttribute': 'Attribute {name} appears more than once.',
402
+ 'diag.xml.attributeSyntax': 'Attribute {name} needs a quoted value.',
403
+ 'diag.xml.ltInAttribute': 'Attribute {name} contains a \'<\'.',
404
+ 'diag.xml.undeclaredPrefix': 'Namespace prefix {prefix} is not declared.',
405
+ 'diag.xml.multipleRoots': 'The document has more than one root element.',
406
+ 'diag.xml.textOutsideRoot': 'Text appears outside the root element.',
407
+ 'diag.xml.misplacedDeclaration': 'The XML declaration must be at the very start of the file.',
408
+ 'diag.xml.misplacedDoctype': 'The DOCTYPE must come once, before the root element.',
409
+ 'diag.xml.invalidMarkup': 'Unrecognized markup.',
410
+ 'diag.xml.unescapedLt': 'A \'<\' that does not start markup must be written as &lt;.',
411
+ 'diag.xml.bareAmpersand': 'An \'&\' that does not start a reference must be written as &amp;.',
412
+ 'diag.xml.invalidCharRef': 'Invalid character reference {reference}.',
413
+ 'diag.xml.undefinedEntity': 'Entity &{name}; is not declared and was left as written.',
414
+ 'diag.xml.externalEntity': 'External entity &{name}; is not loaded and was left as written.',
415
+ 'diag.xml.entityExpansionLimit': 'Entity expansion stopped at {max} characters; later references were left as written.',
416
+ 'diag.xml.unterminatedTag': 'A tag is not closed with \'>\'.',
417
+ 'diag.xml.unterminatedAttribute': 'An attribute value is missing its closing quote.',
418
+ 'diag.xml.unterminatedComment': 'A comment is not closed with \'-->\'.',
419
+ 'diag.xml.unterminatedCdata': 'A CDATA section is not closed with \']]>\'.',
420
+ 'diag.xml.unterminatedPi': 'A processing instruction is not closed with \'?>\'.',
421
+ 'diag.xml.unterminatedDoctype': 'The DOCTYPE declaration is not closed.',
422
+ 'diag.xml.nodeLimit': 'Only the first {max} nodes were read.',
423
+ 'diag.xml.depthLimit': 'Reading stopped at an element nested deeper than {max} levels; the rest of the document was not read.',
424
+ 'diag.xml.moreDiagnostics': '{count} more problems are not listed.',
425
+ 'epub.title': 'EPUB e-book',
426
+ 'epub.eyebrow': 'EPUB {version}',
427
+ 'epub.contents': 'Contents',
428
+ 'epub.info': 'Book info',
429
+ 'epub.previous': 'Previous',
430
+ 'epub.next': 'Next',
431
+ 'epub.chapter': 'Chapter',
432
+ 'epub.position': '{position} / {total}',
433
+ 'epub.textSmaller': 'Smaller text',
434
+ 'epub.textLarger': 'Larger text',
435
+ 'epub.textReset': 'Reset text size',
436
+ 'epub.textScale': 'Text size {scale}% (reset)',
437
+ 'epub.toolbar': 'Reading controls',
438
+ 'epub.reader': 'Book text',
439
+ 'epub.partial': 'Some parts of this book could not be read ({count} issues). See Book info.',
440
+ 'epub.section': 'Section {number}',
441
+ 'epub.untitled': 'Untitled',
442
+ 'epub.cover': 'Cover',
443
+ 'epub.moreDiagnostics': '{count} more issues not listed.',
444
+ 'epub.diagnostics': 'Diagnostics',
445
+ 'epub.blocked': '{count} external resources were blocked.',
446
+ 'epub.meta.title': 'Title',
447
+ 'epub.meta.otherTitles': 'Other titles',
448
+ 'epub.meta.creators': 'Authors',
449
+ 'epub.meta.contributors': 'Contributors',
450
+ 'epub.meta.publisher': 'Publisher',
451
+ 'epub.meta.date': 'Published',
452
+ 'epub.meta.modified': 'Modified',
453
+ 'epub.meta.language': 'Language',
454
+ 'epub.meta.identifiers': 'Identifiers',
455
+ 'epub.meta.series': 'Series',
456
+ 'epub.meta.subjects': 'Subjects',
457
+ 'epub.meta.description': 'Description',
458
+ 'epub.meta.rights': 'Rights',
459
+ 'epub.meta.source': 'Source',
460
+ 'epub.meta.version': 'EPUB version',
461
+ 'epub.meta.layout': 'Layout',
462
+ 'epub.meta.direction': 'Page direction',
463
+ 'epub.meta.chapters': 'Chapters',
464
+ 'epub.meta.files': 'Files',
465
+ 'epub.meta.package': 'Package document',
466
+ 'epub.direction.rtl': 'Right to left',
467
+ 'epub.direction.ltr': 'Left to right',
468
+ 'epub.layout.reflowable': 'Reflowable',
469
+ 'epub.layout.fixed': 'Fixed layout (shown reflowed)',
470
+ 'epub.chapter.encrypted': 'This chapter is DRM-protected and cannot be shown.',
471
+ 'epub.chapter.unsupported': 'This chapter is a {mediaType} document, which cannot be shown.',
472
+ 'epub.chapter.missing': 'This chapter is listed in the book but missing from the file ({path}).',
473
+ 'epub.chapter.renderFailed': 'This chapter could not be displayed ({path}).',
474
+ 'epub.read.missing': 'This chapter is missing from the file ({path}).',
475
+ 'epub.read.too-large': 'This chapter is larger than the configured read limit ({path}).',
476
+ 'epub.read.unsupported-method': 'This chapter uses an unsupported ZIP compression method ({path}).',
477
+ 'epub.read.encrypted': 'This chapter is encrypted ({path}).',
478
+ 'epub.read.corrupted': 'This chapter is damaged and could not be decompressed ({path}).',
479
+ 'epub.read.inflate-unavailable': 'This platform cannot decompress EPUB content.',
480
+ 'epub.read.budget-exceeded': 'The decompression budget for this book has been used up.',
481
+ 'diag.epub.not-zip': 'This file is not a readable EPUB (ZIP) container.',
482
+ 'diag.epub.no-package': 'No package document (.opf) was found in this EPUB.',
483
+ 'diag.epub.package-unreadable': 'The package document could not be read.',
484
+ 'diag.epub.package-invalid': 'The package document is not a valid EPUB package.',
485
+ 'diag.epub.no-spine': 'This EPUB has no readable reading order (spine).',
486
+ 'diag.epub.drm': 'This EPUB is DRM-protected; its content cannot be shown.',
487
+ 'diag.epub.inflate-unavailable': 'This platform cannot decompress EPUB content.',
488
+ 'diag.epub.decompressed-limit': 'This EPUB declares more uncompressed data than can be safely opened.',
489
+ 'diag.epub.zip-entry-limit': 'Only the first {limit} files in the container were read.',
490
+ 'diag.epub.xml-truncated': 'An XML document was too large or deeply nested and was read partially.',
491
+ 'diag.epub.mimetype-missing': 'The container has no mimetype file.',
492
+ 'diag.epub.mimetype-mismatch': 'The container mimetype is "{value}" instead of application/epub+zip.',
493
+ 'diag.epub.multiple-renditions': 'The book has {count} renditions; the first one is shown.',
494
+ 'diag.epub.container-missing': 'META-INF/container.xml is missing or invalid; using {path}.',
495
+ 'diag.epub.encoding': 'Unsupported text encoding "{encoding}" was read as UTF-8.',
496
+ 'diag.epub.rights-file': 'The book contains a rights file (META-INF/rights.xml), which usually indicates DRM.',
497
+ 'diag.epub.item-limit': 'Only the first {limit} items were read.',
498
+ 'diag.epub.manifest-missing': '{count} files listed in the manifest are missing from the container.',
499
+ 'diag.epub.spine-idref': 'The reading order references {count} unknown items (first: "{idref}").',
500
+ 'diag.epub.spine-unsupported': 'A reading-order item of type {mediaType} cannot be displayed.',
501
+ 'diag.epub.resource-missing': 'A content document listed in the reading order is missing.',
502
+ 'diag.epub.encrypted': '{count} chapters are encrypted and cannot be shown.',
503
+ 'diag.epub.toc-unreadable': 'The table of contents could not be read.',
504
+ 'diag.epub.toc-missing': 'The book has no table of contents; chapters are listed in reading order.',
505
+ 'diag.epub.time-limit': 'Parsing stopped at the time limit; the book may be incomplete.',
506
+ 'diag.epub.fixed-layout': 'This is a fixed-layout book; pages are shown as reflowable text.',
310
507
  'har.title': 'HAR network log',
311
508
  'har.search': 'Search URL, status, headers…', 'har.searchBodies': 'Search bodies',
312
509
  'har.version': 'HAR {version}', 'har.requestCount': '{count} requests', 'har.unknownCreator': 'Unknown writer',
@@ -303,6 +303,203 @@ export const CATALOG_JA = {
303
303
  'pte.inspector.inputs': '入力', 'pte.inspector.outputs': '出力', 'pte.inspector.arguments': '引数',
304
304
  'pte.inspector.delegate': 'デリゲート', 'pte.inspector.destination': 'ジャンプ先', 'pte.inspector.stackTrace': 'スタックトレース',
305
305
  'pte.inspector.value': '値', 'pte.inspector.items': '項目',
306
+ 'xml.title': 'XML文書',
307
+ 'xml.eyebrow': 'XML {version}',
308
+ 'xml.unreadable': 'このファイルはXMLとして読み込めませんでした。',
309
+ 'xml.search': '名前・値・コメントを検索…',
310
+ 'xml.searchLabel': '文書を検索',
311
+ 'xml.scopeLabel': '検索対象',
312
+ 'xml.scope.all': 'すべて',
313
+ 'xml.scope.name': '名前',
314
+ 'xml.scope.value': '値',
315
+ 'xml.scope.comment': 'コメント・PI',
316
+ 'xml.previousMatch': '前の一致',
317
+ 'xml.nextMatch': '次の一致',
318
+ 'xml.matchPosition': '{current} / {total}',
319
+ 'xml.noMatches': '一致なし',
320
+ 'xml.matchesOnly': '一致のみ表示',
321
+ 'xml.showAttributes': '属性行',
322
+ 'xml.expandAll': 'すべて展開',
323
+ 'xml.collapseAll': 'すべて折りたたむ',
324
+ 'xml.problems': '通知 {count} 件',
325
+ 'xml.problemsPartial': '問題 {count} 件 — 復元できた範囲をツリーに表示しています',
326
+ 'xml.tree': '構造',
327
+ 'xml.treeLabel': 'XML構造',
328
+ 'xml.rowCount': '{count} 行',
329
+ 'xml.inspector': '詳細',
330
+ 'xml.source': 'ソース',
331
+ 'xml.lineCount': '{count} 行',
332
+ 'xml.summary.elements': '要素',
333
+ 'xml.summary.attributes': '属性',
334
+ 'xml.summary.depth': '最大の深さ',
335
+ 'xml.summary.namespaces': '名前空間',
336
+ 'xml.summary.lines': '行数',
337
+ 'xml.moreAttributes': '他 {count} 件',
338
+ 'xml.childCount': '(子 {count} 個)',
339
+ 'xml.kind.element': '要素',
340
+ 'xml.kind.attribute': '属性',
341
+ 'xml.kind.text': 'テキスト',
342
+ 'xml.kind.cdata': 'CDATA',
343
+ 'xml.kind.comment': 'コメント',
344
+ 'xml.kind.pi': '処理命令',
345
+ 'xml.kind.doctype': '文書型',
346
+ 'xml.copyXpath': 'XPathをコピー',
347
+ 'xml.copyValue': '値をコピー',
348
+ 'xml.copyXml': 'XMLをコピー',
349
+ 'xml.showInSource': 'ソースで表示',
350
+ 'xml.copied': 'クリップボードにコピーしました',
351
+ 'xml.copyFailed': 'コピーできませんでした',
352
+ 'xml.document': '文書',
353
+ 'xml.namespaces': '名前空間宣言',
354
+ 'xml.noNamespaces': 'この文書は名前空間を宣言していません。',
355
+ 'xml.defaultNamespace': '(既定)',
356
+ 'xml.statistics': '統計',
357
+ 'xml.attributes': '属性',
358
+ 'xml.stat.text': 'テキストノード',
359
+ 'xml.stat.cdata': 'CDATAセクション',
360
+ 'xml.stat.comments': 'コメント',
361
+ 'xml.stat.pis': '処理命令',
362
+ 'xml.field.version': 'XMLバージョン',
363
+ 'xml.field.encoding': 'エンコーディング',
364
+ 'xml.field.encodingValue': '{used}(宣言: {declared})',
365
+ 'xml.field.standalone': 'Standalone',
366
+ 'xml.field.doctype': 'DOCTYPE',
367
+ 'xml.field.publicId': '公開識別子',
368
+ 'xml.field.systemId': 'システム識別子',
369
+ 'xml.field.root': 'ルート要素',
370
+ 'xml.field.namespace': '名前空間',
371
+ 'xml.field.prefix': '接頭辞',
372
+ 'xml.field.uri': 'URI',
373
+ 'xml.field.count': '宣言数',
374
+ 'xml.field.xpath': 'XPath',
375
+ 'xml.field.position': '位置',
376
+ 'xml.field.positionValue': '{line} 行 {column} 列',
377
+ 'xml.field.children': '子',
378
+ 'xml.field.childrenValue': '要素 {elements} 個 · 属性 {attributes} 個',
379
+ 'xml.field.status': '状態',
380
+ 'xml.field.name': '名前',
381
+ 'xml.field.value': '値',
382
+ 'xml.field.text': 'テキスト内容',
383
+ 'xml.unclosed': '閉じられていません — 終了タグがありません',
384
+ 'xml.emptyText': 'テキスト内容はありません。',
385
+ 'xml.truncated': '先頭 {count} 文字のみ表示しています。',
386
+ 'diag.xml.noRoot': 'ファイルにXML要素がありません。',
387
+ 'diag.xml.notText': 'XMLテキストではなくバイナリファイルです。',
388
+ 'diag.xml.unsupportedEncoding': '宣言されたエンコーディング {encoding} には対応していないため、UTF-8として読み込みました。',
389
+ 'diag.xml.mismatchedTag': '終了タグ </{found}> が開いている要素 <{expected}> と一致しません。',
390
+ 'diag.xml.unclosedElement': '要素 <{name}> が閉じられていません。',
391
+ 'diag.xml.endTagSyntax': '終了タグ </{name}> には名前しか書けません。',
392
+ 'diag.xml.missingAttributeSpace': '属性 {name} は前の属性と空白で区切る必要があります。',
393
+ 'diag.xml.entityMarkup': 'エンティティ &{name}; にはマークアップが含まれますが、要素として解析せずテキストとして表示します。',
394
+ 'diag.xml.entityLtInAttribute': 'エンティティ &{name}; が属性値に \'<\' を持ち込んでいます。',
395
+ 'diag.xml.tagSyntax': 'タグ <{name}> に予期しない文字 {char} があります。',
396
+ 'diag.xml.unexpectedEndTag': '終了タグ </{name}> に対応する開始タグがありません。',
397
+ 'diag.xml.duplicateAttribute': '属性 {name} が複数回出現しています。',
398
+ 'diag.xml.attributeSyntax': '属性 {name} には引用符で囲んだ値が必要です。',
399
+ 'diag.xml.ltInAttribute': '属性 {name} の値に \'<\' が含まれています。',
400
+ 'diag.xml.undeclaredPrefix': '名前空間接頭辞 {prefix} が宣言されていません。',
401
+ 'diag.xml.multipleRoots': 'ルート要素が複数あります。',
402
+ 'diag.xml.textOutsideRoot': 'ルート要素の外にテキストがあります。',
403
+ 'diag.xml.misplacedDeclaration': 'XML宣言はファイルの先頭に置く必要があります。',
404
+ 'diag.xml.misplacedDoctype': 'DOCTYPEはルート要素の前に一度だけ置けます。',
405
+ 'diag.xml.invalidMarkup': '認識できないマークアップです。',
406
+ 'diag.xml.unescapedLt': 'マークアップを開始しない \'<\' は &lt; と書く必要があります。',
407
+ 'diag.xml.bareAmpersand': '参照を開始しない \'&\' は &amp; と書く必要があります。',
408
+ 'diag.xml.invalidCharRef': '無効な文字参照 {reference} です。',
409
+ 'diag.xml.undefinedEntity': 'エンティティ &{name}; は宣言されていないため、そのまま残しました。',
410
+ 'diag.xml.externalEntity': '外部エンティティ &{name}; は読み込まず、そのまま残しました。',
411
+ 'diag.xml.entityExpansionLimit': 'エンティティ展開は {max} 文字で停止しました。以降の参照はそのまま残しました。',
412
+ 'diag.xml.unterminatedTag': 'タグが \'>\' で閉じられていません。',
413
+ 'diag.xml.unterminatedAttribute': '属性値の閉じ引用符がありません。',
414
+ 'diag.xml.unterminatedComment': 'コメントが \'-->\' で閉じられていません。',
415
+ 'diag.xml.unterminatedCdata': 'CDATAセクションが \']]>\' で閉じられていません。',
416
+ 'diag.xml.unterminatedPi': '処理命令が \'?>\' で閉じられていません。',
417
+ 'diag.xml.unterminatedDoctype': 'DOCTYPE宣言が閉じられていません。',
418
+ 'diag.xml.nodeLimit': '先頭 {max} 個のノードのみ読み込みました。',
419
+ 'diag.xml.depthLimit': '{max} 階層より深くネストされた要素で読み込みを停止しました。文書の残りは読み込んでいません。',
420
+ 'diag.xml.moreDiagnostics': '一覧にない問題が他に {count} 件あります。',
421
+ 'epub.title': 'EPUB電子書籍',
422
+ 'epub.eyebrow': 'EPUB {version}',
423
+ 'epub.contents': '目次',
424
+ 'epub.info': '書籍情報',
425
+ 'epub.previous': '前へ',
426
+ 'epub.next': '次へ',
427
+ 'epub.chapter': '章',
428
+ 'epub.position': '{position} / {total}',
429
+ 'epub.textSmaller': '文字を小さく',
430
+ 'epub.textLarger': '文字を大きく',
431
+ 'epub.textReset': '文字サイズをリセット',
432
+ 'epub.textScale': '文字サイズ {scale}%(リセット)',
433
+ 'epub.toolbar': '閲覧ツール',
434
+ 'epub.reader': '本文',
435
+ 'epub.partial': 'この書籍の一部を読み込めませんでした(問題 {count} 件)。書籍情報を確認してください。',
436
+ 'epub.section': 'セクション {number}',
437
+ 'epub.untitled': '無題',
438
+ 'epub.cover': '表紙',
439
+ 'epub.moreDiagnostics': 'ほかに {count} 件の問題があります(一覧に表示していません)。',
440
+ 'epub.diagnostics': '診断',
441
+ 'epub.blocked': '外部リソースを {count} 件ブロックしました。',
442
+ 'epub.meta.title': 'タイトル',
443
+ 'epub.meta.otherTitles': '別タイトル',
444
+ 'epub.meta.creators': '著者',
445
+ 'epub.meta.contributors': '寄与者',
446
+ 'epub.meta.publisher': '出版社',
447
+ 'epub.meta.date': '発行日',
448
+ 'epub.meta.modified': '更新日',
449
+ 'epub.meta.language': '言語',
450
+ 'epub.meta.identifiers': '識別子',
451
+ 'epub.meta.series': 'シリーズ',
452
+ 'epub.meta.subjects': '件名',
453
+ 'epub.meta.description': '説明',
454
+ 'epub.meta.rights': '権利',
455
+ 'epub.meta.source': '出典',
456
+ 'epub.meta.version': 'EPUBバージョン',
457
+ 'epub.meta.layout': 'レイアウト',
458
+ 'epub.meta.direction': 'ページ方向',
459
+ 'epub.meta.chapters': '章数',
460
+ 'epub.meta.files': 'ファイル数',
461
+ 'epub.meta.package': 'パッケージ文書',
462
+ 'epub.direction.rtl': '右から左',
463
+ 'epub.direction.ltr': '左から右',
464
+ 'epub.layout.reflowable': 'リフロー',
465
+ 'epub.layout.fixed': '固定レイアウト(リフロー表示)',
466
+ 'epub.chapter.encrypted': 'この章はDRMで保護されているため表示できません。',
467
+ 'epub.chapter.unsupported': 'この章は{mediaType}文書のため表示できません。',
468
+ 'epub.chapter.missing': 'この章は書籍に登録されていますが、ファイルにありません({path})。',
469
+ 'epub.chapter.renderFailed': 'この章を表示できませんでした({path})。',
470
+ 'epub.read.missing': 'この章がファイルにありません({path})。',
471
+ 'epub.read.too-large': 'この章は設定された読み込み上限を超えています({path})。',
472
+ 'epub.read.unsupported-method': 'この章はサポートされていないZIP圧縮方式を使用しています({path})。',
473
+ 'epub.read.encrypted': 'この章は暗号化されています({path})。',
474
+ 'epub.read.corrupted': 'この章は破損しているため展開できません({path})。',
475
+ 'epub.read.inflate-unavailable': 'この環境ではEPUBコンテンツを展開できません。',
476
+ 'epub.read.budget-exceeded': 'この書籍の展開上限に達しました。',
477
+ 'diag.epub.not-zip': '読み込み可能なEPUB(ZIP)コンテナではありません。',
478
+ 'diag.epub.no-package': 'このEPUBにパッケージ文書(.opf)が見つかりません。',
479
+ 'diag.epub.package-unreadable': 'パッケージ文書を読み込めませんでした。',
480
+ 'diag.epub.package-invalid': 'パッケージ文書が有効なEPUBパッケージではありません。',
481
+ 'diag.epub.no-spine': 'このEPUBには読み込み可能な読み順(spine)がありません。',
482
+ 'diag.epub.drm': 'このEPUBはDRMで保護されているため内容を表示できません。',
483
+ 'diag.epub.inflate-unavailable': 'この環境ではEPUBコンテンツを展開できません。',
484
+ 'diag.epub.decompressed-limit': 'このEPUBは安全に開ける量を超える展開後データを宣言しています。',
485
+ 'diag.epub.zip-entry-limit': 'コンテナ内の最初の {limit} 個のファイルのみ読み込みました。',
486
+ 'diag.epub.xml-truncated': 'XML文書が大きすぎるか入れ子が深すぎるため、一部のみ読み込みました。',
487
+ 'diag.epub.mimetype-missing': 'コンテナにmimetypeファイルがありません。',
488
+ 'diag.epub.mimetype-mismatch': 'コンテナのmimetypeがapplication/epub+zipではなく「{value}」です。',
489
+ 'diag.epub.multiple-renditions': 'この書籍には {count} 個のレンディションがあり、最初のものを表示します。',
490
+ 'diag.epub.container-missing': 'META-INF/container.xmlがないか無効なため、{path} を使用します。',
491
+ 'diag.epub.encoding': 'サポートされていない文字エンコーディング「{encoding}」をUTF-8として読み込みました。',
492
+ 'diag.epub.rights-file': 'この書籍には権利ファイル(META-INF/rights.xml)があり、通常はDRMを示します。',
493
+ 'diag.epub.item-limit': '最初の {limit} 項目のみ読み込みました。',
494
+ 'diag.epub.manifest-missing': 'マニフェストに記載された {count} 個のファイルがコンテナにありません。',
495
+ 'diag.epub.spine-idref': '読み順が不明な項目を {count} 件参照しています(最初: 「{idref}」)。',
496
+ 'diag.epub.spine-unsupported': '{mediaType} 形式の読み順項目は表示できません。',
497
+ 'diag.epub.resource-missing': '読み順に記載されたコンテンツ文書がありません。',
498
+ 'diag.epub.encrypted': '{count} 章が暗号化されているため表示できません。',
499
+ 'diag.epub.toc-unreadable': '目次を読み込めませんでした。',
500
+ 'diag.epub.toc-missing': 'この書籍には目次がないため、読み順どおりに章を一覧表示します。',
501
+ 'diag.epub.time-limit': '時間上限に達したため解析を停止しました。書籍が不完全な可能性があります。',
502
+ 'diag.epub.fixed-layout': '固定レイアウトの書籍です。ページをリフローテキストとして表示します。',
306
503
  'har.title': 'HARネットワークログ',
307
504
  'har.search': 'URL・ステータス・ヘッダーを検索…', 'har.searchBodies': '本文も検索',
308
505
  'har.version': 'HAR {version}', 'har.requestCount': 'リクエスト{count}件', 'har.unknownCreator': '作成ツール不明',