Переводить Markdown то Document Object Model ()DOM)
Чтобы программно читать, манипулировать и изменять содержание и форматирование документа, вам нужно перевести его на веб-сайт. Aspose.Words Document Object Model ()DOM).
В отличие от текстов, Markdown не соответствует требованиям DOM описанный в Aspose.Words Document Object Model (DOM) Статья. Однако, Aspose.Words Создает собственный механизм перевода Markdown документы для DOM и обратно, чтобы мы могли успешно работать с их элементами, такими как форматирование текста, таблицы, заголовки и другие.
В этой статье объясняется, как различные markdown Функции могут быть переведены в Aspose.Words DOM и обратно в Markdown Формат.
Сложность перевода Markdown - DOM - Markdown
Основная сложность этого механизма заключается не только в переводе. Markdown то DOM, но и сделать обратную трансформацию – сохранить документ обратно в исходное состояние. Markdown Формат с минимальными потерями. Есть элементы, такие как многоуровневые котировки, для которых обратное преобразование не тривиально.
Наш движок перевода позволяет пользователям не только работать со сложными элементами в существующем Markdown документ, а также для создания собственного документа в Markdown Формат с оригинальной структурой с нуля. Для создания различных элементов необходимо использовать стили с конкретными названиями по определенным правилам, описанным ниже в этой статье. Такие стили можно создавать программно.
Общий перевод Принципы
Мы используем Font Форматирование для встроенных блоков. Если нет прямой корреспонденции для Markdown свойство Aspose.Words DOM, Мы используем стиль персонажа с именем, которое начинается с некоторых специальных слов.
Для контейнерных блоков мы используем наследование стиля для обозначения вложенных Markdown особенности. В этом случае, даже когда нет вложенных функций, мы также используем стили абзацев с именем, которое начинается с некоторых специальных слов.
Бюллетени и упорядоченные списки представляют собой контейнерные блоки. Markdown И тоже. Их гнездование представлено в DOM Так же, как и для всех остальных контейнерных блоков, использующих стиль наследования. Кроме того, списки в DOM соответствовали форматированию номеров в стиле списка или в формате абзаца.
Встроенные блоки
Мы используем Font Форматирование при переводе Bold, Italic или Strikethroughinline markdown особенности.
Markdown особенность |
Aspose.Words |
Bold
{1} |
Font.bold = True |
# Use a document builder to add content to the document.
builder = aw.DocumentBuilder()
# Make the text Bold.
builder.font.bold = True
builder.writeln("This text will be Bold")
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.bold_text_example.md")
|
|
Italic
*italic text* |
Font.italic = True |
# Use a document builder to add content to the document.
builder = aw.DocumentBuilder()
# Make the text Italic.
builder.font.italic = True
builder.writeln("This text will be Italic")
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.italic_text_example.md")
|
|
Strikethrough
~Strikethrough text~ |
Font.strike_through = True |
# Use a document builder to add content to the document.
builder = aw.DocumentBuilder()
# Make the text Strikethrough.
builder.font.strike_through = True
builder.writeln("This text will be Strikethrough")
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.strikethrough_text_example.md")
|
|
Мы используем стиль персонажа с именем, начинающимся от слова. <p notrans="<p notrans=" InlineCode
"="">
"> с последующей факультативной точкой
(.)
и несколько задних ходов
(`)
для
InlineCode
особенность. Если пропущено несколько бэктиков, то по умолчанию будет использоваться один бэктик.
Markdown особенность |
Aspose.Words |
InlineCode
{1} |
Font.style_name = "InlineCode[.][N]" |
# Use a document builder to add content to the document.
builder = aw.DocumentBuilder()
# Number of backticks is missed, one backtick will be used by default.
inlineCode1BackTicks = builder.document.styles.add(aw.StyleType.CHARACTER, "InlineCode")
builder.font.style = inlineCode1BackTicks
builder.writeln("Text with InlineCode style with 1 backtick")
# There will be 3 backticks.
inlineCode3BackTicks = builder.document.styles.add(aw.StyleType.CHARACTER, "InlineCode.3")
builder.font.style = inlineCode3BackTicks
builder.writeln("Text with InlineCode style with 3 backtick")
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.inline_code_example.md")
|
|
Autolink
<scheme://domain.com>
<email@domain.com> |
The FieldHyperlink класс |
# Use a document builder to add content to the document.
builder = aw.DocumentBuilder()
# Insert hyperlink.
builder.insert_hyperlink("https://www.aspose.com", "https://www.aspose.com", False);
builder.insert_hyperlink("email@aspose.com", "mailto:email@aspose.com", False);
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.autolink_example.md")
|
|
Link
{1}
{2}
{3}
{4}) |
The FieldHyperlink |
# Use a document builder to add content to the document.
builder = aw.DocumentBuilder()
# Insert hyperlink.
builder.insert_hyperlink("Aspose", "https://www.aspose.com", False)
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.link_example.md")
|
|
Image
{1}
{2}
{3}
{4}) |
The Shape класс |
# Use a document builder to add content to the document.
builder = aw.DocumentBuilder()
# Insert image.
shape = aw.drawing.Shape(builder.document, aw.drawing.ShapeType.IMAGE)
shape.wrap_type = aw.drawing.WrapType.INLINE
shape.image_data.source_full_name = "/attachment/1456/pic001.png"
shape.image_data.title = "title"
builder.insert_node(shape)
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.image_example.md")
|
|
Контейнерные блоки
Документ представляет собой последовательность контейнерных блоков, таких как заголовки, абзацы, списки, цитаты и другие. Блоки контейнеров можно разделить на 2 класса: Блоки листьев и сложные контейнеры. Блоки листьев могут содержать только встроенный контент. Сложные контейнеры, в свою очередь, могут содержать другие контейнерные блоки, в том числе блоки Leaf.
Блоки листьев
В приведенной ниже таблице приведены примеры использования Markdown Листья блокируют Aspose.Words:
Markdown особенность |
Aspose.Words |
HorizontalRule
----- |
Это простой абзац с соответствующей формой горизонтального правила: DocumentBuilder.insert_horizontal_rule() |
|
|
ATX Heading
# H1, ## H2, ### H3… |
ParagraphFormat.style_name = "Heading N" , где (1<= N <= 9). Это переводится во встроенный стиль и должно быть именно указанного шаблона (никаких суффиксов или префиксов не допускается). В противном случае это будет обычный абзац с соответствующим стилем |
|
|
Setext Heading
=== (если уровень 1),
--- (если уровень 2) |
ParagraphFormat.style_name = "SetextHeading[some suffix]" , основанный на "Heading N" стиль. Если (N > 2), то "Heading 2" будет использоваться, в противном случае "Heading 1" . Допускается любой суффикс, но Aspose.Words Импортер использует цифры “1” и “2” соответственно |
# Use a document builder to add content to the document.
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.paragraph_format.style_name = "Heading 1"
builder.writeln("This is an H1 tag")
# Reset styles from the previous paragraph to not combine styles between paragraphs.
builder.font.bold = False
builder.font.italic = False
setexHeading1 = doc.styles.add(aw.StyleType.PARAGRAPH, "SetexHeading1")
builder.paragraph_format.style = setexHeading1
doc.styles.get_by_name("SetexHeading1").base_style_name = "Heading 1"
builder.writeln("Setex Heading level 1")
builder.paragraph_format.style = doc.styles.get_by_name("Heading 3")
builder.writeln("This is an H3 tag")
# Reset styles from the previous paragraph to not combine styles between paragraphs.
builder.font.bold = False
builder.font.italic = False
setexHeading2 = doc.styles.add(aw.StyleType.PARAGRAPH, "SetexHeading2")
builder.paragraph_format.style = setexHeading2
doc.styles.get_by_name("SetexHeading2").base_style_name = "Heading 3"
# Setex heading level will be reset to 2 if the base paragraph has a Heading level greater than 2.
builder.writeln("Setex Heading level 2")
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.setext_heading_example.md")
|
|
Indented Code |
ParagraphFormat.style_name = "IndentedCode[some suffix]" |
# Use a document builder to add content to the document.
builder = aw.DocumentBuilder()
indentedCode = builder.document.styles.add(aw.StyleType.PARAGRAPH, "IndentedCode")
builder.paragraph_format.style = indentedCode
builder.writeln("This is an indented code")
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.indented_code_example.md")
|
|
Fenced Code
``` c#
if ()
then
else
```
|
ParagraphFormat.style_name = "FencedCode[.][info string]" The [.] и [info string] необязательно |
# Use a document builder to add content to the document.
builder = aw.DocumentBuilder()
fencedCode = builder.document.styles.add(aw.StyleType.PARAGRAPH, "FencedCode")
builder.paragraph_format.style = fencedCode
builder.writeln("This is an fenced code")
fencedCodeWithInfo = builder.document.styles.add(aw.StyleType.PARAGRAPH, "FencedCode.C#")
builder.paragraph_format.style = fencedCodeWithInfo
builder.writeln("This is a fenced code with info string")
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.fenced_code_example.md")
|
|
Комплексные контейнеры
В приведенной ниже таблице приведены примеры использования Markdown Сложные контейнеры в Aspose.Words:
Markdown особенность |
Aspose.Words |
Quote
> quote,
>> nested quote |
ParagraphFormat.style_name = "Quote[some suffix]" Суффикс в названии стиля необязателен, но Aspose.Words Импортер использует упорядоченные номера 1, 2, 3, …. в случае вложенных котировок. Гнездо определяется через унаследованные стили |
# Use a document builder to add content to the document.
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
# By default a document stores blockquote style for the first level.
builder.paragraph_format.style_name = "Quote"
builder.writeln("Blockquote")
# Create styles for nested levels through style inheritance.
quoteLevel2 = doc.styles.add(aw.StyleType.PARAGRAPH, "Quote1")
builder.paragraph_format.style = quoteLevel2
doc.styles.get_by_name("Quote1").base_style_name = "Quote"
builder.writeln("1. Nested blockquote")
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.quote_example.md")
|
|
BulletedList
- Item 1
- Item 2 - Item 2a - Item 2b |
Бюллетени представлены с использованием нумерации пунктов: ListFormat.apply_bullet_default() Могут быть 3 типа списков. Они диффундируют только в нумерационном формате самого первого уровня. Это: '-' , '+' или '*' соответственно |
# Use a document builder to add content to the document.
builder = aw.DocumentBuilder()
builder.list_format.apply_bullet_default()
builder.list_format.list.list_levels[0].number_format = "-"
builder.writeln("Item 1")
builder.writeln("Item 2")
builder.list_format.list_indent()
builder.writeln("Item 2a")
builder.writeln("Item 2b")
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.bulleted_list_example.md")
|
|
OrderedList
1. Item 1
2. Item 2 1) Item 2a 2) Item 2b |
Упорядоченные списки представлены с использованием нумерации пунктов: ListFormat.apply_number_default() Может быть 2 символа формата: '.' и ')' . Маркер по умолчанию является '.' |
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.list_format.apply_number_default()
builder.writeln("Item 1")
builder.writeln("Item 2")
builder.list_format.list_indent()
builder.writeln("Item 2a")
builder.write("Item 2b")
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.ordered_list_example.md")
|
|
Таблицы
Aspose.Words позволяет переводить таблицы в DOM, Как показано ниже:
Markdown особенность |
Aspose.Words |
Table “а” |
b<br /> - |
# Use a document builder to add content to the document.
builder = aw.DocumentBuilder()
# Add the first row.
builder.insert_cell()
builder.writeln("a")
builder.insert_cell()
builder.writeln("b")
builder.end_row()
# Add the second row.
builder.insert_cell()
builder.writeln("c")
builder.insert_cell()
builder.writeln("d")
builder.end_table()
builder.document.save(docs_base.artifacts_dir + "WorkingWithMarkdown.ordered_list_table.md")
|
|
Смотрите также