This blog template is built with Astro. For the things that are not mentioned in this guide, you may find the answers in the Astro Docs.
Front-matter of Posts
---title: My First Blog Postpublished: 2020-08-28description: This is the first post of my new Astro blog.image: ./cover.jpgtags: [Foo, Bar]category: Front-enddraft: false---| Attribute | Description |
|---|---|
title | The title of the post. |
published | The date the post was published. |
updated | The date the post was last updated. |
description | A short description of the post. Displayed on index page. |
image | The cover image path of the post. 1. Start with http:// or https://: Use web image2. Start with /: For image in public dir3. With none of the prefixes: Relative to the markdown file |
tags | The tags of the post. |
category | The category of the post. |
draft | If this post is still a draft, which won’t be displayed. |
Where to Place the Post Files
Your post files should be placed in src/content/posts/ directory. You can also create sub-directories to better organize your posts and assets.
src/content/posts/├── post-1.md└── post-2/ ├── cover.png └── index.mdBasic Markdown Syntax
Headers
H1 Header
H2 Header
H3 Header
H4 Header
H5 Header
H6 Header
Text Formatting
- Italic text
- Bold text
- Bold and italic text
StrikethroughInline code- Link to example
(Example image path)
Lists
Unordered list:
- Item 1
- Item 2
- Subitem 1
- Subitem 2
Ordered list:
- First item
- Second item
- Subitem 1
- Subitem 2
Blockquotes
This is a blockquote.
It can span multiple lines.
Code Blocks
// This is a code block with syntax highlighting#[instrument(skip_all, name = "trace_start_server")]fn main() -> Result<(), ServerError> { let rt = match compio::runtime::Runtime::new() { Ok(rt) => rt, Err(e) => { match e.kind() { std::io::ErrorKind::OutOfMemory => print_locked_memory_limit_info(), std::io::ErrorKind::PermissionDenied => print_io_uring_permission_info(), _ => {} } panic!("Cannot create runtime: {e}"); } };}// Code block without syntax highlightingconsole.log("Hello, world!");Tables
| Column 1 | Column 2 | Column 3 |
|---|---|---|
| Cell 1 | Cell 2 | Cell 3 |
| Cell 4 | Cell 5 | Cell 6 |
Horizontal Rule
Footnotes
This is a footnote reference1.
Extended Markdown Features
GitHub Repository Cards
You can add dynamic cards that link to GitHub repositories. On page load, the repository information is pulled from the GitHub API.
Create a GitHub repository card with the code ::github{repo="<owner>/<repository>"}.
Admonitions
Following types of admonitions are supported: note tip important warning caution
NOTEHighlights information that users should take into account, even when skimming.
TIPOptional information to help a user be more successful.
IMPORTANTCrucial information necessary for users to succeed.
WARNINGCritical content demanding immediate user attention due to potential risks.
CAUTIONNegative potential consequences of an action.
Custom Titles
The title of the admonition can be customized.
MY CUSTOM TITLEThis is a note with a custom title.
Basic syntax:
:::noteHighlights information that users should take into account, even when skimming.:::
:::tip[Custom Title]This is a tip with a custom title.:::GitHub Syntax
NOTEThe GitHub syntax is also supported.
> [!NOTE]> The GitHub syntax is also supported.
> [!TIP]> The GitHub syntax is also supported.Spoilers
You can add spoilers to your text. The text also supports Markdown syntax.
The content
The content :spoiler[is hidden **ayyy**]!Embedding Media
Videos
You can embed videos from various platforms like YouTube or Bilibili by copying and pasting the embed code:
YouTube
Draft Posts
You can mark posts as drafts by setting draft: true in the frontmatter. Draft posts will not be visible to visitors but can be previewed during development.
When the article is ready for publication, update the “draft” field to “false” in the Frontmatter:
---title: Draft Examplepublished: 2024-01-11T04:40:26.381Ztags: [Markdown, Blogging, Demo]category: Examplesdraft: false---Here, we’ll explore how code blocks look using Expressive Code. The provided examples are based on the official documentation, which you can refer to for further details.
Expressive Code
Syntax Highlighting
Regular syntax highlighting
console.log('This code is syntax highlighted!')Rendering ANSI escape sequences
ANSI colors:- Regular: Red Green Yellow Blue Magenta Cyan- Bold: Red Green Yellow Blue Magenta Cyan- Dimmed: Red Green Yellow Blue Magenta Cyan
256 colors (showing colors 160-177):160 161 162 163 164 165166 167 168 169 170 171172 173 174 175 176 177
Full RGB colors:ForestGreen - RGB(34, 139, 34)
Text formatting: Bold Dimmed Italic UnderlineEditor & Terminal Frames
Code editor frames
console.log('Title attribute example')<div>File name comment example</div>Terminal frames
echo "This terminal frame has no title"Write-Output "This one has a title!"Overriding frame types
echo "Look ma, no frame!"# Without overriding, this would be a terminal framefunction Watch-Tail { Get-Content -Tail 20 -Wait $args }New-Alias tail Watch-TailText & Line Markers
Marking full lines & line ranges
// Line 1 - targeted by line number// Line 2// Line 3// Line 4 - targeted by line number// Line 5// Line 6// Line 7 - targeted by range "7-8"// Line 8 - targeted by range "7-8"Selecting line marker types (mark, ins, del)
function demo() { console.log('this line is marked as deleted') // This line and the next one are marked as inserted console.log('this is the second inserted line')
return 'this line uses the neutral default marker type'}Adding labels to line markers
<button role="button" {...props} value={value} className={buttonClassName} disabled={disabled} active={active}> {children && !active && (typeof children === 'string' ? <span>{children}</span> : children)}</button>Adding long labels on their own lines
<button role="button" {...props}
value={value} className={buttonClassName}
disabled={disabled} active={active}>
{children && !active && (typeof children === 'string' ? <span>{children}</span> : children)}</button>Using diff-like syntax
this line will be marked as insertedthis line will be marked as deletedthis is a regular line--- a/README.md+++ b/README.md@@ -1,3 +1,4 @@+this is an actual diff file-all contents will remain unmodified no whitespace will be removed eitherCombining syntax highlighting with diff-like syntax
function thisIsJavaScript() { // This entire block gets highlighted as JavaScript, // and we can still add diff markers to it! console.log('Old code to be removed') console.log('New and shiny code!')}Marking individual text inside lines
function demo() { // Mark any given text inside lines return 'Multiple matches of the given text are supported';}Regular expressions
console.log('The words yes and yep will be marked.')Escaping forward slashes
echo "Test" > /home/test.txtSelecting inline marker types (mark, ins, del)
function demo() { console.log('These are inserted and deleted marker types'); // The return statement uses the default marker type return true;}Word Wrap
Configuring word wrap per block
// Example with wrapfunction getLongString() { return 'This is a very long string that will most probably not fit into the available space unless the container is extremely wide'}// Example with wrap=falsefunction getLongString() { return 'This is a very long string that will most probably not fit into the available space unless the container is extremely wide'}Configuring indentation of wrapped lines
// Example with preserveIndent (enabled by default)function getLongString() { return 'This is a very long string that will most probably not fit into the available space unless the container is extremely wide'}// Example with preserveIndent=falsefunction getLongString() { return 'This is a very long string that will most probably not fit into the available space unless the container is extremely wide'}Collapsible Sections
5 collapsed lines
// All this boilerplate setup code will be collapsedimport { someBoilerplateEngine } from '@example/some-boilerplate'import { evenMoreBoilerplate } from '@example/even-more-boilerplate'
const engine = someBoilerplateEngine(evenMoreBoilerplate())
// This part of the code will be visible by defaultengine.doSomething(1, 2, 3, calcFn)
function calcFn() { // You can have multiple collapsed sections3 collapsed lines
const a = 1 const b = 2 const c = a + b
// This will remain visible console.log(`Calculation result: ${a} + ${b} = ${c}`) return c}
4 collapsed lines
// All this code until the end of the block will be collapsed againengine.closeConnection()engine.freeMemory()engine.shutdown({ reason: 'End of example boilerplate code' })Line Numbers
Displaying line numbers per block
// This code block will show line numbersconsole.log('Greetings from line 2!')console.log('I am on line 3')// Line numbers are disabled for this blockconsole.log('Hello?')console.log('Sorry, do you know what line I am on?')Changing the starting line number
console.log('Greetings from line 5!')console.log('I am on line 6')Inline math equations go in like so: . Display math should get its own line and be put in in double-dollarsigns:
And note that you can backslash-escape any punctuation characters which you wish to be displayed literally, ex.: `foo`, *bar*, etc.
Footnotes
-
This is the footnote content. ↩