Package Demo: p/moul/md
This document demonstrates the features of the gno.land/p/moul/md package, showing both the source code and the rendered result for each feature.
Note: The md package provides helper functions to generate markdown programmatically, making it easier to create dynamic documentation and content.
Text Formatting
Bold Text
1md.Bold("Important text")
Result: Important text
Italic Text
1md.Italic("Emphasized text")
Result: Emphasized text
Strikethrough Text
1md.Strikethrough("Deprecated feature")
Result: Deprecated feature
Combined Formatting
1md.Bold(md.Italic("Very important"))
Result: Very important
Headers
The package supports all six levels of markdown headers:
1md.H1("Main Title")
2md.H2("Section")
3md.H3("Subsection")
4md.H4("Sub-subsection")
5md.H5("Minor heading")
6md.H6("Smallest heading")
Result:
Main Title
Section
Subsection
Sub-subsection
Minor heading
Smallest heading
Lists
Bullet Lists
1items := []string{
2    "First item",
3    "Second item",
4    "Third item with\nmultiple lines",
5}
6md.BulletList(items)
Result:
- First item
 - Second item
 - Third item with multiple lines
 
Ordered Lists
1steps := []string{
2    "First step",
3    "Second step",
4    "Third step with\nadditional details",
5}
6md.OrderedList(steps)
Result:
- First step
 - Second step
 - Third step with additional details
 
Todo Lists
1tasks := []string{
2    "Completed task",
3    "Another completed task",
4    "Pending task",
5    "Another pending task",
6}
7completed := []bool{true, true, false, false}
8md.TodoList(tasks, completed)
Result:
- Completed task
 - Another completed task
 - Pending task
 - Another pending task
 
Nested Lists
 1md.BulletItem("Parent item") +
 2md.Nested(
 3    md.BulletItem("Nested item 1") +
 4    md.BulletItem("Nested item 2") +
 5    md.Nested(
 6        md.BulletItem("Deeply nested"),
 7        "    ",
 8    ),
 9    "  ",
10)
Result:
- Parent item
- Nested item 1
 - Nested item 2
- Deeply nested
 
 
 
Links and Images
Regular Links
1md.Link("Gno Homepage", "https://gno.land")
Result: Gno Homepage
User Links
1md.UserLink("moul")
Result: @moul
1md.UserLink("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
Result: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5
Images
1md.Image("Gno Logo", "/public/imgs/gnoland.svg")
Result:
Clickable Images
1md.InlineImageWithLink("Click me!", "/public/imgs/gnoland.svg", "https://gno.land")
Code
Inline Code
1"Use " + md.InlineCode("gno test") + " to run tests"
Result: Use gno test to run tests
Simple Code Block
1md.CodeBlock("func main() {\n    println(\"Hello, Gno!\")\n}")
Result:
func main() {
    println("Hello, Gno!")
}
Language-specific Code Block
1md.LanguageCodeBlock("go", "package main\n\nfunc main() {\n    println(\"Hello!\")\n}")
Result:
1package main
2
3func main() {
4    println("Hello!")
5}
Blockquotes
1md.Blockquote("This is an important note.")
Result:
This is an important note.
1md.Blockquote("Multi-line quotes\nare also supported\nwith proper formatting.")
Result:
Multi-line quotes are also supported with proper formatting.
Advanced Features
Collapsible Sections
1md.CollapsibleSection("Click to expand", "Hidden content here!")
Result:
Hidden content here!
Two Columns
1md.Columns([]string{
2    "Left column content",
3    "Right column content",
4}, false)
Result:
Left column content
Right column content
Multiple Columns (3 per row)
1md.ColumnsN([]string{
2    "Item 1", "Item 2", "Item 3",
3    "Item 4", "Item 5", "Item 6",
4}, 3, true)
Result:
Item 1
Item 2
Item 3
Item 4
Item 5
Item 6
Utility Functions
Horizontal Rule
1md.HorizontalRule()
Result:
Footnotes
1"This has a footnote[1].\n\n" + md.Footnote("1", "Footnote content here.")
Result: This has a footnote[1].
[1]: Footnote content here.
Paragraphs
1md.Paragraph("This ensures proper spacing.")
Result: This ensures proper spacing.
Practical Example
Here's a complete example showing how to build a rich user profile page using columns, images, and various md features:
 1// Example function that generates a rich user profile with balanced columns
 2func RenderProfile(username, name, bio string, avatar string, tasks []string, completed []bool) string {
 3    // First row: Avatar/Basic Info | Bio
 4    avatarSection := md.Image(name + " avatar", avatar) + "\n\n" +
 5        md.H3("Basic Info") +
 6        md.BulletList([]string{
 7            md.Bold("Name:") + " " + name,
 8            md.Bold("Username:") + " " + md.UserLink(username),
 9            md.Bold("Status:") + " 🟢 Active",
10            md.Bold("Joined:") + " January 2024",
11        })
12    
13    bioSection := md.H3("Bio") +
14        md.Blockquote(bio)
15    
16    // Second row: Tasks | Links
17    tasksSection := md.H3("Current Tasks") +
18        md.TodoList(tasks, completed)
19    
20    linksSection := md.H3("Links") +
21        md.BulletList([]string{
22            md.Link("GitHub", "https://github.com/" + username),
23            md.Link("Portfolio", "https://example.com/" + username),
24            md.Link("LinkedIn", "https://linkedin.com/in/" + username),
25        })
26    
27    // Combine with main title and two sets of columns
28    return md.H1("User Profile: " + name) +
29        md.HorizontalRule() +
30        md.Columns([]string{avatarSection, bioSection}, true) +
31        "\n" +
32        md.Columns([]string{tasksSection, linksSection}, true)
33}
34
35// Usage:
36profile := RenderProfile(
37    "johndoe",
38    "John Doe", 
39    "Passionate Gno developer building the future of smart contracts. Love working with blockchain technology and contributing to open source.",
40    "/public/imgs/gnoland.svg",
41    []string{"Complete Gno tutorial", "Build first realm", "Deploy to testnet", "Write documentation"},
42    []bool{true, true, false, false},
43)
Result when called with the above parameters:
User Profile: John Doe
Bio
Passionate Gno developer building the future of smart contracts. Love working with blockchain technology and contributing to open source.
Current Tasks
- Complete Gno tutorial
 - Build first realm
 - Deploy to testnet
 - Write documentation
 
Best Practices
- Prioritize code readability over performance in Render() - use clear variable names, logical grouping, and readable concatenation for humans
 - Use the md package for all programmatic markdown generation in Render() methods
 - Combine functions for complex formatting: 
md.Bold(md.Italic("text")) - Use 
md.Paragraph()to ensure proper spacing between elements - Leverage 
md.ColumnsN()for responsive layouts 
See Also
- gno.land/p/moul/md - The md package source code
 - Markdown on Gno - Comprehensive guide on Gno Flavored Markdown syntax