@mieweb/wikigdrive
Version:
Google Drive to MarkDown synchronization
445 lines (394 loc) • 13.2 kB
text/typescript
import {XmlAttribute, XmlElement, XmlElementChild, XmlRootElement, XmlText} from './UnMarshaller.ts';
// https://en.wikipedia.org/wiki/OpenDocument_technical_specification
// TODO https://git.libreoffice.org/core/+/refs/heads/master/schema/libreoffice/OpenDocument-v1.4+libreoffice-schema.rng
// TODO https://git.libreoffice.org/core/+/refs/heads/master/schema/odf1.4/OpenDocument-v1.4-schema.rng
// https://docs.libreoffice.org/schema.html
// https://wiki.documentfoundation.org/Development/ODF_Implementer_Notes/List_of_LibreOffice_ODF_Extensions
interface TextSection {
type: string;
}
interface ParagraphSection {
type: string;
}
@XmlElement()
@XmlElementChild('text:p', 'list', 'TextParagraph', {isArray: true})
@XmlElementChild('table:table', 'list', 'TableTable', {isArray: true})
@XmlElementChild('text:list', 'list', 'TextList', {isArray: true})
export class TableCell {
list: Array<TextParagraph | TableTable | TextList> = [];
}
@XmlElement()
@XmlAttribute('table:number-columns-repeated', 'numberColumns')
export class TableColumn {
numberColumns: number;
}
@XmlElement()
@XmlElementChild('table:table-cell', 'cells', 'TableCell', {isArray: true})
export class TableRow {
cells: TableCell[] = [];
}
@XmlElement()
@XmlElementChild('table:table-column', 'columns', 'TableColumn', {isArray: true})
@XmlElementChild('table:table-row', 'rows', 'TableRow', {isArray: true})
export class TableTable implements TextSection {
type = 'table';
columns: TableColumn[] = [];
rows: TableRow[] = [];
}
@XmlElement()
export class FontFaceDecl {
}
@XmlElement()
@XmlAttribute('text:c', 'chars')
export class TextSpace {
type = 'space';
chars: number;
}
@XmlElement()
@XmlAttribute('text:style-name', 'styleName')
@XmlText('list', {isArray: true})
@XmlElementChild('text:s', 'list', 'TextSpace', {isArray: true})
@XmlElementChild('text:tab', 'list', 'TextTab', {isArray: true})
@XmlElementChild('text:line-break', 'list', 'TextLineBreak', {isArray: true})
@XmlElementChild('office:annotation', 'annotations', 'OfficeAnnotation', {isArray: true})
export class TextSpan implements ParagraphSection {
type = 'span';
annotations: OfficeAnnotation[] = [];
list: Array<string | TextSpace | TextTab | TextLineBreak> = [];
styleName: string;
}
@XmlElement()
@XmlAttribute('xlink:href', 'href')
@XmlAttribute('text:style-name', 'styleName')
@XmlElementChild('text:span', 'list', 'TextSpan', {isArray: true})
export class TextLink implements ParagraphSection {
type = 'link';
href = '';
styleName: string;
list: Array<string | TextSpan> = [];
}
@XmlElement()
@XmlAttribute('text:name', 'name')
export class TextBookmark implements ParagraphSection {
type = 'bookmark';
name: string;
}
/* Sample HR:
text:anchor-type="as-char"
style:rel-width="100%"
draw:z-index="0"
draw:style-name="gr1"
draw:text-style-name="P26"
svg:width="0.0012in"
svg:height="0.0213in"
*/
@XmlElement()
@XmlAttribute('style:rel-width', 'width')
export class DrawRect implements ParagraphSection {
type = 'rect';
width: string;
}
@XmlElement()
@XmlAttribute('xlink:href', 'href')
export class DrawObject {
href: string;
}
@XmlElement()
@XmlAttribute('xlink:href', 'href')
export class DrawImage {
href: string;
}
@XmlElement()
@XmlText('value')
export class SvgDesc {
value: string;
}
@XmlElement()
@XmlElementChild('draw:object', 'object', 'DrawObject')
@XmlElementChild('draw:image', 'image', 'DrawImage')
@XmlElementChild('svg:desc', 'description', 'SvgDesc')
export class DrawFrame implements ParagraphSection {
type = 'draw_frame';
object?: DrawObject;
image?: DrawImage;
description?: SvgDesc;
}
@XmlElement()
@XmlAttribute('draw:name', 'name')
@XmlAttribute('draw:formula', 'formula')
export class DrawEquation {
name: string;
formula: string;
}
@XmlElement()
@XmlElementChild('draw:equation', 'equations', 'DrawEquation', {isArray: true})
@XmlAttribute('draw:enhanced-path', 'path')
@XmlAttribute('drawooo:enhanced-path', 'path2')
@XmlAttribute('drawooo:sub-view-size', 'subViewSize')
export class DrawEnhancedGeometry {
type = 'draw_enhanced_geometry';
equations?: DrawEquation[];
path: string;
path2?: string;
subViewSize = '';
}
@XmlElement()
@XmlElementChild('draw:enhanced-geometry', 'list', 'DrawEnhancedGeometry', {isArray: true})
@XmlElementChild('text:p', 'list', 'TextParagraph', {isArray: true})
@XmlAttribute('svg:width', 'width')
@XmlAttribute('svg:height', 'height')
@XmlAttribute('svg:x', 'x')
@XmlAttribute('svg:y', 'y')
@XmlAttribute('draw:style-name', 'styleName')
export class DrawCustomShape {
type = 'draw_custom_shape';
x = '';
y = '';
width = '';
height = '';
styleName: string;
list: Array<DrawEnhancedGeometry | TextParagraph> = [];
}
@XmlElement()
@XmlElementChild('draw:custom-shape', 'list', 'DrawCustomShape', {isArray: true})
@XmlAttribute('draw:style-name', 'styleName')
export class DrawG {
type = 'draw_g';
list: DrawCustomShape[] = [];
styleName: string;
}
@XmlElement()
export class TextTab implements ParagraphSection {
type = 'tab';
}
@XmlElement()
export class TextLineBreak implements ParagraphSection {
type = 'line_break';
}
@XmlElement()
@XmlAttribute('text:change-id', 'changeId')
export class TextChangeStart {
type = 'change_start';
changeId: string;
}
@XmlElement()
@XmlAttribute('text:change-id', 'changeId')
export class TextChangeEnd {
type = 'change_end';
changeId: string;
}
@XmlElement()
@XmlText('list', {isArray: true})
@XmlAttribute('text:style-name', 'styleName')
@XmlElementChild('text:bookmark', 'list', 'TextBookmark', {isArray: true})
@XmlElementChild('text:a', 'list', 'TextLink', {isArray: true})
@XmlElementChild('text:span', 'list', 'TextSpan', {isArray: true})
@XmlElementChild('draw:rect', 'list', 'DrawRect', {isArray: true})
@XmlElementChild('draw:frame', 'list', 'DrawFrame', {isArray: true})
@XmlElementChild('draw:g', 'list', 'DrawG', {isArray: true})
@XmlElementChild('draw:custom-shape', 'list', 'DrawCustomShape', {isArray: true})
@XmlElementChild('text:tab', 'list', 'TextTab', {isArray: true})
@XmlElementChild('text:line-break', 'list', 'TextLineBreak', {isArray: true})
@XmlElementChild('text:s', 'list', 'TextSpace', {isArray: true})
@XmlElementChild('office:annotation', 'annotations', 'OfficeAnnotation', {isArray: true})
@XmlElementChild('text:change-start', 'list', 'TextChangeStart', {isArray: true})
@XmlElementChild('text:change-end', 'list', 'TextChangeEnd', {isArray: true})
export class TextParagraph implements TextSection {
type = 'paragraph';
list: Array<string | TextLink | TextSpan | DrawRect | DrawFrame | TextTab | TextLineBreak | TextSpace | DrawG | TextChangeStart | TextChangeEnd | DrawCustomShape | TextBookmark> = [];
annotations: OfficeAnnotation[] = [];
styleName: string;
}
@XmlElement()
@XmlElementChild('text:p', 'list', 'TextParagraph', {isArray: true})
export class TextIndexBody {
list: Array<TextParagraph> = [];
}
@XmlElement()
@XmlElementChild('text:index-body', 'indexBody', 'TextIndexBody')
export class TableOfContent {
type = 'toc';
indexBody: TextIndexBody;
}
@XmlElement()
export class OfficeAnnotation {
}
@XmlElement()
@XmlElementChild('text:p', 'list', 'TextParagraph', {isArray: true})
@XmlElementChild('text:list', 'list', 'TextList', {isArray: true})
export class TextListItem {
list: Array<TextParagraph | TextList> = [];
}
@XmlElement()
@XmlAttribute('text:style-name', 'styleName')
@XmlAttribute('text:continue-numbering', 'continueNumbering')
@XmlAttribute('text:continue-list', 'continueList')
@XmlAttribute('xml:id', 'id')
@XmlElementChild('text:list-item', 'list', 'TextListItem', {isArray: true})
export class TextList implements TextSection {
type = 'list';
id?: string;
continueNumbering?: string;
continueList?: string;
list: Array<TextListItem> = [];
styleName: string;
}
@XmlElement()
@XmlElementChild('text:p', 'list', 'TextParagraph', {isArray: true})
@XmlElementChild('text:list', 'list', 'TextList', {isArray: true})
@XmlElementChild('table:table', 'list', 'TableTable', {isArray: true})
@XmlElementChild('text:table-of-content', 'list', 'TableOfContent', {isArray: true})
export class OfficeText {
list: Array<TextParagraph | TableTable | TextList | TableOfContent> = [];
}
@XmlElement()
@XmlElementChild('office:text', 'text', 'OfficeText')
export class OfficeBody {
text: OfficeText;
}
@XmlElement()
@XmlAttribute('style:font-name', 'fontName')
@XmlAttribute('fo:font-weight', 'fontWeight')
@XmlAttribute('fo:font-style', 'fontStyle')
@XmlAttribute('fo:font-size', 'fontSize')
@XmlAttribute('fo:color', 'fontColor')
@XmlAttribute('style:text-underline-style', 'underlineStyle')
export class TextProperty {
fontName?: 'Courier New' | 'Arial';
fontWeight?: 'bold';
fontStyle?: 'italic';
underlineStyle?: 'solid';
fontSize?: string;
fontColor?: string;
}
@XmlElement()
@XmlAttribute('svg:stroke-color', 'strokeColor')
@XmlAttribute('svg:stroke-width', 'strokeWidth')
@XmlAttribute('draw:stroke-linejoin', 'strokeLinejoin')
@XmlAttribute('draw:stroke', 'stroke')
@XmlAttribute('draw:fill', 'fill')
@XmlAttribute('draw:fill-color', 'fillColor')
export class GraphicProperty {
strokeColor: string;
strokeWidth: string;
strokeLinejoin: string;
stroke: string;
fill: string;
fillColor: string;
}
@XmlElement()
@XmlAttribute('fo:break-before', 'breakBefore')
@XmlAttribute('fo:break-after', 'breakAfter')
@XmlAttribute('fo:margin-left', 'marginLeft')
export class ParagraphProperty {
breakBefore?: 'auto';
breakAfter?: 'auto';
marginLeft?: string;
}
@XmlElement()
@XmlAttribute('style:name', 'name')
@XmlAttribute('style:list-style-name', 'listStyleName')
@XmlAttribute('style:parent-style-name', 'parentStyleName')
@XmlElementChild('style:text-properties', 'textProperties', 'TextProperty')
@XmlElementChild('style:paragraph-properties', 'paragraphProperties', 'ParagraphProperty')
@XmlElementChild('style:graphic-properties', 'graphicProperties', 'GraphicProperty')
export class Style {
name: string;
listStyleName: string;
parentStyleName: string;
textProperties: TextProperty;
paragraphProperties: ParagraphProperty;
graphicProperties: GraphicProperty;
}
@XmlElement()
@XmlElementChild('style:style', 'styles', 'Style', {isArray: true})
export class AutomaticStyle {
styles: Style[] = [];
}
@XmlRootElement('office:document-content')
@XmlElementChild('office:font-face-decls', 'fontFaceDecl', 'FontFaceDecl')
@XmlElementChild('office:body', 'body', 'OfficeBody')
@XmlElementChild('office:automatic-styles', 'automaticStyles', 'AutomaticStyle')
export class DocumentContent {
body: OfficeBody;
fontFaceDecl: FontFaceDecl[] = [];
automaticStyles: AutomaticStyle;
}
@XmlElement()
@XmlAttribute('text:level', 'level')
export class ListLevelStyleBullet {
level = 0;
}
@XmlElement()
@XmlAttribute('text:level', 'level')
@XmlAttribute('text:start-value', 'startValue')
@XmlAttribute('style:num-format', 'numFormat')
export class ListLevelStyleNumber {
level = 0;
startValue = 0;
numFormat = '1';
}
@XmlElement()
@XmlAttribute('style:name', 'name')
@XmlElementChild('text:list-level-style-bullet', 'listLevelStyleBullet', 'ListLevelStyleBullet', {isArray: true})
@XmlElementChild('text:list-level-style-number', 'listLevelStyleNumber', 'ListLevelStyleNumber', {isArray: true})
export class ListStyle {
name: string;
listLevelStyleBullet: ListLevelStyleBullet[] = [];
listLevelStyleNumber: ListLevelStyleNumber[] = [];
}
@XmlElement()
@XmlElementChild('text:list-style', 'listStyles', 'ListStyle', {isArray: true})
@XmlElementChild('style:style', 'styles', 'Style', {isArray: true})
export class OfficeStyles {
listStyles: ListStyle[] = [];
styles: Style[] = [];
}
@XmlRootElement('office:document-styles')
@XmlElementChild('office:styles', 'styles', 'OfficeStyles')
export class DocumentStyles {
styles: OfficeStyles;
}
export const LIBREOFFICE_CLASSES = {
'DocumentContent': DocumentContent,
'OfficeBody': OfficeBody,
'OfficeText': OfficeText,
'OfficeAnnotation': OfficeAnnotation,
'FontFaceDecl': FontFaceDecl,
'AutomaticStyle': AutomaticStyle,
'Style': Style,
'GraphicProperty': GraphicProperty,
'ParagraphProperty': ParagraphProperty,
'TextProperty': TextProperty,
'TextParagraph': TextParagraph,
'TextLink': TextLink,
'TextSpan': TextSpan,
'TextSpace': TextSpace,
'TableOfContent': TableOfContent,
'TextIndexBody': TextIndexBody,
'TextList': TextList,
'TextListItem': TextListItem,
'TextBookmark': TextBookmark,
'TextTab': TextTab,
'TextLineBreak': TextLineBreak,
'DrawRect': DrawRect,
'DrawFrame': DrawFrame,
'DrawObject': DrawObject,
'DrawImage': DrawImage,
'DrawG': DrawG,
'DrawCustomShape': DrawCustomShape,
'DrawEnhancedGeometry': DrawEnhancedGeometry,
'DrawEquation': DrawEquation,
'SvgDesc': SvgDesc,
'TableCell': TableCell,
'TableColumn': TableColumn,
'TableRow': TableRow,
'TableTable': TableTable,
'DocumentStyles': DocumentStyles,
'OfficeStyles': OfficeStyles,
'ListStyle': ListStyle,
'ListLevelStyleNumber': ListLevelStyleNumber,
'ListLevelStyleBullet': ListLevelStyleBullet,
'TextChangeStart': TextChangeStart,
'TextChangeEnd': TextChangeEnd
};