Markdown เพื่อสร้างหน้าและสารบัญ?


357

ฉันเริ่มใช้ markdown เพื่อจดบันทึก

ฉันใช้ทำเครื่องหมายเพื่อดูบันทึกย่อมาร์คดาวน์และความสวยงาม

แต่เมื่อโน้ตของฉันยาวขึ้นฉันพบว่ามันยากที่จะค้นหาสิ่งที่ฉันต้องการ

ฉันรู้ว่ามาร์คดาวน์สามารถสร้างตารางได้ แต่สามารถสร้างสารบัญข้ามไปยังส่วนต่างๆหรือกำหนดส่วนของหน้าในมาร์คดาวน์ได้หรือไม่

หรือจะมีผู้อ่าน / บรรณาธิการ markdown ที่สามารถทำสิ่งนั้นได้ การค้นหาจะเป็นคุณสมบัติที่ดีที่จะมีเช่นกัน

ในระยะสั้นฉันต้องการทำให้มันเป็นเครื่องมือการจดบันทึกและฟังก์ชั่นที่ยอดเยี่ยมเช่นการเขียนหนังสือ ฯลฯ


2
หากคุณต้องการใช้เครื่องมือ javascript / node.js ลองทำเครื่องหมาย
-toc

@jonschlinkert คุณควรส่งเป็นคำตอบ! ขณะนี้คำตอบแนะนำเฉพาะเครื่องมือที่ไม่ว่างหรือ Python ไม่ใช่ตัวเลือกที่ยอดเยี่ยม
Domi

8
ฉันอาจจะพูดถึงว่าในน้ำยาง\tableofcontentsนี้จะประสบความสำเร็จกับ ถ้าล้อจะถูกคิดค้นใหม่ก็จะดีกว่าที่จะคัดลอกชิ้นส่วนที่ดี
Eero Aaltonen


ในทำนองเดียวกัน reStructuredText มีในตัวคำสั่งสำหรับตารางของเนื้อหา.. contents::ที่อยู่ในรูปแบบที่ง่ายที่สุดในลักษณะเช่นเดียวกับ
saaj

คำตอบ:


37

MultiMarkdown Composerดูเหมือนจะสร้างสารบัญเพื่อช่วยในการแก้ไข

นอกจากนี้ยังอาจจะมีหนึ่งหรือห้องสมุดอื่น ๆ ที่สามารถสร้างสารบัญ: ดูงูหลาม Markdown TOC ขยาย


17
นักแต่งเพลง MultiMarkdown เป็น MacOS เท่านั้น
chmike

1
การทำงานลิงค์ TOC ของ Python Markdown: python-markdown.github.io/extensions/toc
John

2
แอพไม่พร้อมใช้งานในภูมิภาคสหราชอาณาจักร
kenorb

ส่วนขยาย TOC สร้าง HTML tocs ไม่ใช่ Markdown เป็นที่น่าทึ่งว่ามันยาก
rjurney

394

คุณสามารถลองได้

# Table of Contents
1. [Example](#example)
2. [Example2](#example2)
3. [Third Example](#third-example)
4. [Fourth Example](#fourth-examplehttpwwwfourthexamplecom)


## Example
## Example2
## Third Example
## [Fourth Example](http://www.fourthexample.com) 

10
ตัวอย่างที่ 3 ด้านบนไม่ทำงาน ## Example ## "Example2" ## Third Example<a name="third-example" /> เป็นวิธีเดียวที่ฉันจะเอามันไปกลืนช่องว่างได้ แน่นอนแท็กที่ 3 จะตีความเป็น - #Third- ตามด้วยเว้นวรรค - แล้วคำว่าตัวอย่าง - ในตัวอย่างของคุณด้านบน? ยัติภังค์ไม่ทำงานเลย ขอบคุณ
twobob

ตัวอย่างมีไว้เพื่อใช้เป็นตัวอย่างสำหรับมากกว่าหนึ่งคำ ทุกคำแบ่งออกเป็นไม่มีตัวพิมพ์ใหญ่และไม่มีช่องว่าง
Rick

6
ทำงานได้ดีใน RStudio เพียงแค่ต้องการเพิ่มว่า umlauts ภาษาเยอรมันเช่นüจำเป็นต้องเขียนโดยไม่ต้องเครื่องหมายบน umlaut เช่น1. [Einführung](#einfuhrung)
steinbock

4
Anchors ไม่ได้ถูกสร้างโดยอัตโนมัติสำหรับส่วนหัวใน Bitbucket v4.5.2
Mike Rylander

1
ตัวอย่างที่สี่คือสิ่งที่ฉันกำลังมองหา ขอบคุณ!
kenecaswell

219

นี่เป็นวิธีที่มีประโยชน์ ควรสร้างการอ้างอิงแบบคลิกได้ในตัวแก้ไข MarkDown ใด ๆ

# Table of contents
1. [Introduction](#introduction)
2. [Some paragraph](#paragraph1)
    1. [Sub paragraph](#subparagraph1)
3. [Another paragraph](#paragraph2)

## This is the introduction <a name="introduction"></a>
Some introduction text, formatted in heading 2 style

## Some paragraph <a name="paragraph1"></a>
The first paragraph text

### Sub paragraph <a name="subparagraph1"></a>
This is a sub paragraph, formatted in heading 3 style

## Another paragraph <a name="paragraph2"></a>
The second paragraph text

ผลิต:

สารบัญ

  1. บทนำ
  2. บางย่อหน้า
    1. ย่อหน้าย่อย
  3. อีกวรรคหนึ่ง

นี่คือการแนะนำ

ข้อความแนะนำตัวบางส่วนจัดรูปแบบในสไตล์หัวเรื่อง 2

บางย่อหน้า

ข้อความในย่อหน้าแรก

ย่อหน้าย่อย

นี่คือย่อหน้าย่อยที่จัดรูปแบบในสไตล์หัวเรื่อง 3

อีกวรรคหนึ่ง

ข้อความในย่อหน้าที่สอง


22
ฉันต้องการวางแท็กจุดยึดบนบรรทัดด้านบนส่วนหัวดังนั้นเมื่อมีการคลิกลิงก์ส่วนหัวจะปรากฏขึ้นบนหน้า
mgarey

4
นี่เป็นสิ่งเดียวที่มีประโยชน์สำหรับฉัน ด้วยชื่อเรื่องยาวมันเป็นไปไม่ได้ที่จะทำโดยไม่มีแท็กสมอ
Matt Fletcher

นี่เป็นสิ่งที่ดีจริงๆ ฉันเริ่มวางสารบัญลงในสมุดบันทึก Jupyter ของฉันเพื่อเลื่อนดูส่วนต่างๆอย่างรวดเร็ว
jackdbd

@mgarey ใส่สมอก่อน:## <a name="foo" /> Foo
tobias_k

40

สำหรับผู้ใช้รหัส Visual Studioความคิดที่ดีคือใช้ปลั๊กอินMarkdown TOC

หากต้องการติดตั้งให้เปิด VS Code Quick Open ( Control/⌘+ P) วางคำสั่งต่อไปนี้แล้วกด Enter

ext install markdown-toc

และเพื่อสร้าง TOC เปิดจานคำสั่ง ( Control/⌘+ Shift+ P) และเลือกMarkdown TOC:Insert/Update optionหรือการใช้งาน+Control/⌘MT


7
หมายเหตุ: ฉันเพิ่งพบว่าการใช้สต็อก VSCode คุณสามารถสร้างลิงค์มาร์คดาวน์ไปที่ส่วนหัว: [Section Foo](#foo-header-title)และมันยังทำงานนอกโหมดแสดงตัวอย่าง (เช่นในมาร์คอัปแบบธรรมดา)
kitsu.eb

4
อีกทางเลือกหนึ่งสำหรับ VSCode คือvscode-markdownซึ่งมีคุณสมบัติหลายอย่างรวมถึง
ToC

26

คุณสามารถลองใช้ruby script นี้เพื่อสร้าง TOC จากไฟล์ markdown

 #!/usr/bin/env ruby

require 'uri'

fileName = ARGV[0]
fileName = "README.md" if !fileName

File.open(fileName, 'r') do |f|
  inside_code_snippet = false
  f.each_line do |line|
    forbidden_words = ['Table of contents', 'define', 'pragma']
    inside_code_snippet = !inside_code_snippet if line.start_with?('```')
    next if !line.start_with?("#") || forbidden_words.any? { |w| line =~ /#{w}/ } || inside_code_snippet

    title = line.gsub("#", "").strip
    href = URI::encode title.gsub(" ", "-").downcase
    puts "  " * (line.count("#")-1) + "* [#{title}](\##{href})"
  end
end

ที่ดี! เพียงแค่ทราบอาจต้องการเพิ่มifndef, includeและendifหมู่สั่ง preprocessor อื่น ๆ ที่จะต้องห้ามรายการคำ นอกจากนี้การกำหนดรายการออกจากขอบเขตของลูปจะต้องหลีกเลี่ยงการรวมตัวกับการวนซ้ำแต่ละครั้ง นอกจากนี้จะรับความคิดเห็นของภาษาใด ๆ ที่ใช้#ไวยากรณ์ความคิดเห็นรวมถึง Ruby ซึ่งไม่ดี ฉันยินดีที่จะแก้ไขหากคุณต้องการ อย่างไรก็ตามนี่เป็นการเริ่มต้นที่ดีและทำงานได้ดีสำหรับวัตถุประสงค์ของฉัน ขอบคุณมาก!
Jeff Klein

สิ่งนี้ใช้ได้กับส่วนหัวของ atx เท่านั้น (เช่นที่ขึ้นต้นด้วย#) ไม่ใช่กับ setext (ขีดเส้นใต้)
gozzilli

ขอบคุณสำหรับสิ่งนี้หากคุณกำลังใช้สิ่งนี้เพื่อ redcarpet บนรางคุณควรไปด้วย title.parameterizehref ขอบคุณ!
Alexis

25

มี 2 ​​วิธีในการสร้างTOC (สรุป) ในเอกสาร markdown ของคุณ

1. ด้วยตนเอง

# My Table of content
- [Section 1](#id-section1)
- [Section 2](#id-section2)

<div id='id-section1'/>
## Section 1
<div id='id-section2'/>
## Section 2

2. โดยทางโปรแกรม

คุณสามารถใช้ตัวอย่างสคริปต์ที่สร้างบทสรุปสำหรับคุณดูโครงการของฉันบน github - summarizeMD -

ฉันได้ลองใช้โมดูลสคริปต์ / npm อื่น ๆ (เช่นdoctoc ) แต่ไม่มีใครทำซ้ำ TOC ด้วยจุดยึดที่ทำงาน


`` <div id = ... 'ไม่รู้จัก MarkdownPad2 (Windows)
chmike

ใช้งานได้ในโฟลเดอร์เดียวกันเท่านั้น แต่ใช้ไม่ได้กับส่วนหัวของข้อความ
gozzilli

25
# Table of Contents
1. [Example](#example)
2. [Example2](#example2)
3. [Third Example](#third-example)

## Example [](#){name=example}
## Example2 [](#){name=example2}
## [Third Example](#){name=third-example}

หากคุณใช้เครื่องหมายพิเศษอย่าลืมว่าคุณสามารถเพิ่มคุณสมบัติพิเศษให้กับลิงก์ส่วนหัวรหัสรั้วและรูปภาพ
https://michelf.ca/projects/php-markdown/extra/#spe-attr


11

แท็ก Anchor ที่สร้างโดยตัวแยกวิเคราะห์มาร์กดาวน์ต่างกันจะไม่เท่ากัน

หากคุณกำลังทำงานกับ Markdown parsers GFM (GitHub Flavoured Markdown) หรือ Redcarpet ฉันเขียน Vim plugin เพื่อจัดการสารบัญ

คุณสมบัติ

  1. สร้างสารบัญสำหรับไฟล์ Markdown

    ตัวแยกวิเคราะห์ Markdown ที่รองรับ:

    • GFM (Markit ปรุงรส GitHub)
    • พรมแดง
  2. อัปเดตสารบัญที่มีอยู่

  3. อัปเดตสารบัญที่มีอยู่โดยอัตโนมัติเมื่อบันทึก

ภาพหน้าจอ

เป็นกลุ่ม-markdown-toc

การใช้

สร้างสารบัญ

เลื่อนเคอร์เซอร์ไปที่บรรทัดที่คุณต้องการผนวกสารบัญจากนั้นพิมพ์คำสั่งด้านล่างที่เหมาะกับคุณ คำสั่งจะสร้างส่วนหัวหลังจากเคอร์เซอร์ลงในสารบัญ

  1. :GenTocGFM

    สร้างสารบัญในสไตล์ลิงค์ GFM

    คำสั่งนี้เหมาะสำหรับไฟล์ Markdown ในที่เก็บ GitHub เช่น README.md และไฟล์ Markdown สำหรับ GitBook

  2. :GenTocRedcarpet

    สร้างสารบัญในรูปแบบลิงก์ Redcarpet

    คำสั่งนี้เหมาะสำหรับ Jekyll หรือที่อื่น ๆ ใช้ Redcarpet เป็นเครื่องมือแยกวิเคราะห์ Markdown

    คุณสามารถดูที่นี่เพื่อทราบความแตกต่างระหว่างลิงค์ Toc สไตล์ของ GFM และ Redcarpet

อัปเดตสารบัญที่มีอยู่ด้วยตนเอง

โดยทั่วไปคุณไม่จำเป็นต้องดำเนินการใด ๆ สารบัญที่มีอยู่จะอัปเดตอัตโนมัติเมื่อบันทึกตามค่าเริ่มต้น หากคุณต้องการทำด้วยตนเองเพียงใช้:UpdateTocคำสั่ง

ดาวน์โหลดและเอกสาร

https://github.com/mzlogin/vim-markdown-toc


10

นอกจากนี้คุณยังสามารถใช้pandocการ"มีดสวิสกองทัพ" สำหรับการแปลงรูปแบบ "มาร์กอัปหนึ่งไปยังอีก" มันสามารถสร้างสารบัญโดยอัตโนมัติในเอกสารผลลัพธ์หากคุณระบุ--tocอาร์กิวเมนต์

คำแนะนำ:หากคุณต้องการสารบัญในhtmlเอาต์พุตคุณต้องจัดหา-sสิ่งที่สร้างเอกสารแบบสแตนด์อโลน

ตัวอย่างบรรทัดคำสั่งเชลล์:

./pandoc -s --toc input.md -o output.html



7

คุณสามารถสร้างมันได้โดยใช้ bash one-liner ถือว่าไฟล์ markdown FILE.mdของคุณเรียกว่า

echo "## Contents" ; echo ; 
cat FILE.md | grep '^## ' | grep -v Contents | sed 's/^## //' | 
  while read -r title ; do 
    link=$(echo $title | tr 'A-Z ' 'a-z-') ; 
    echo "- [$title](#$link)" ; 
    done

มันเยี่ยมมาก จะคุ้มค่าที่จะเขียนใหม่เป็นสคริปต์ที่เหมาะสมโดยมีชื่อไฟล์เป็นอาร์กิวเมนต์และอาจมีการจัดการส่วนย่อย
MasterScrat

6

ฉันเพิ่งเขียนรหัสส่วนขยายสำหรับpython-markdownซึ่งใช้ parser เพื่อดึงส่วนหัวและเอาท์พุท TOC เป็นรายการที่ไม่มีการเรียงลำดับที่จัดรูปแบบมาร์กดาวน์พร้อมลิงก์ท้องถิ่น ไฟล์นี้คือ

... และควรวางไว้ในmarkdown/extensions/ไดเรกทอรีในการติดตั้ง markdown จากนั้นสิ่งที่คุณต้องทำคือพิมพ์<a>แท็กanchor ที่มีแอid="..."ททริบิวเป็นข้อมูลอ้างอิง - ดังนั้นสำหรับข้อความอินพุตดังนี้:

$ cat test.md 
Hello
=====

## <a id="sect one"></a>SECTION ONE ##

something here

### <a id='sect two'>eh</a>SECTION TWO ###

something else

#### SECTION THREE

nothing here

### <a id="four"></a>SECTION FOUR

also...

... ส่วนขยายสามารถเรียกได้ดังนี้:

$ python -m markdown -x md_toc test.md 
* Hello
    * [SECTION ONE](#sect one)
        * [SECTION TWO](#sect two)
            * SECTION THREE
        * [SECTION FOUR](#four)

... และจากนั้นคุณสามารถวางกลับ toc นี้ในเอกสาร markdown ของคุณ (หรือมีทางลัดในโปรแกรมแก้ไขข้อความของคุณที่เรียกใช้สคริปต์ในเอกสารที่เปิดอยู่ในปัจจุบันแล้วแทรก TOC ที่เป็นผลลัพธ์ในเอกสารเดียวกัน)

โปรดทราบว่าเวอร์ชันที่เก่ากว่าpython-markdownไม่มี__main__.pyโมดูลดังนั้นการเรียกใช้บรรทัดคำสั่งดังกล่าวจะไม่ทำงานสำหรับเวอร์ชันเหล่านั้น


6

ดังที่กล่าวไว้ในคำตอบอื่น ๆ มีหลายวิธีในการสร้างสารบัญโดยอัตโนมัติ ส่วนใหญ่เป็นซอฟต์แวร์โอเพ่นซอร์สและสามารถปรับให้เข้ากับความต้องการของคุณ

อย่างไรก็ตามสิ่งที่ฉันขาดหายไปคือการจัดรูปแบบที่ดึงดูดสายตาสำหรับสารบัญโดยใช้ตัวเลือกที่ จำกัด ที่ Markdown มีให้ เรามาพร้อมกับสิ่งต่อไปนี้:

รหัส

## Content

**[1. Markdown](#heading--1)**

  * [1.1. Markdown formatting cheatsheet](#heading--1-1)
  * [1.2. Markdown formatting details](#heading--1-2)

**[2. BBCode formatting](#heading--2)**

  * [2.1. Basic text formatting](#heading--2-1)

      * [2.1.1. Not so basic text formatting](#heading--2-1-1)

  * [2.2. Lists, Images, Code](#heading--2-2)
  * [2.3. Special features](#heading--2-3)

----

ภายในเอกสารของคุณคุณจะวางเครื่องหมายส่วนย่อยเป้าหมายดังนี้:

<div id="heading--1-1"/>
### 1.1. Markdown formatting cheatsheet

ขึ้นอยู่กับตำแหน่งและวิธีการที่คุณใช้ Markdown สิ่งต่อไปนี้ควรใช้งานได้และให้รหัส Markdown ที่ดูดีกว่า:

### 1.1. Markdown formatting cheatsheet <a name="heading--1-1"/>

ตัวอย่างการเรนเดอร์

เนื้อหา

1. Markdown

2. การจัดรูปแบบ BBCode


ข้อดี

  • คุณสามารถเพิ่มบทและบทย่อยได้หลายระดับตามที่คุณต้องการ ในสารบัญสิ่งเหล่านี้จะปรากฏเป็นรายการที่ไม่เรียงลำดับซ้อนกันในระดับที่ลึกกว่า

  • ไม่มีการใช้รายการสั่งซื้อ สิ่งเหล่านี้จะสร้างการเยื้องไม่เชื่อมโยงจำนวนและไม่สามารถใช้เพื่อสร้างการจัดหมวดหมู่เลขทศนิยมเช่น "1.1"

  • ไม่มีการใช้รายการสำหรับระดับแรก ที่นี่การใช้รายการที่ไม่มีการเรียงลำดับเป็นไปได้ แต่ไม่จำเป็น: การเยื้องและกระสุนเพียงเพิ่มความยุ่งเหยิงที่มองเห็นและไม่มีฟังก์ชั่นที่นี่ดังนั้นเราจึงไม่ใช้รายการสำหรับระดับ ToC แรกเลย

  • ให้ความสำคัญกับภาพในส่วนระดับแรกในสารบัญโดยพิมพ์ตัวหนา

  • เครื่องหมายย่อยของสั้น ๆ ที่มีความหมายซึ่งมีลักษณะ "สวยงาม" ในแถบ URL ของเบราว์เซอร์เช่น#heading--1-1แทนที่จะเป็นเครื่องหมายที่มีชิ้นส่วนที่เปลี่ยนรูปของหัวเรื่องจริง

  • รหัสใช้ส่วนหัว H2 ( ## …) สำหรับส่วน, ส่วนหัว H3 ( ### …) สำหรับส่วนหัวย่อย ฯลฯ ทำให้รหัสแหล่งที่มาอ่านง่ายขึ้นเพราะ## …ให้เบาะแสภาพที่แข็งแกร่งเมื่อเลื่อนผ่านเมื่อเปรียบเทียบกับกรณีที่ส่วนจะเริ่มต้นด้วยส่วนหัว H1 ( # …) มันยังคงมีเหตุผลในขณะที่คุณใช้หัวข้อ H1 สำหรับชื่อเอกสารเอง

  • สุดท้ายเราเพิ่มกฎแนวนอนที่ดีเพื่อแยกสารบัญจากเนื้อหาจริง

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเทคนิคนี้และวิธีที่เราใช้มันภายในซอฟต์แวร์ฟอรั่มการสนทนา , ดูที่นี่


5

ฉันเขียนสคริปต์ python ที่แยกวิเคราะห์ไฟล์ markdown และส่งออกสารบัญเป็นรายการ markdown: md-to-toc

ไม่เหมือนกับสคริปต์อื่น ๆ ที่ฉันพบ md-to-toc สนับสนุนชื่อซ้ำอย่างถูกต้อง นอกจากนี้ยังไม่ต้องใช้การเชื่อมต่ออินเทอร์เน็ตดังนั้นจึงสามารถใช้งานได้กับไฟล์ md ใด ๆ ไม่ใช่เฉพาะที่มีอยู่ใน repo สาธารณะ


5

ใน Visual Studio รหัส (VSCode) คุณสามารถใช้นามสกุลMarkdown All in One

เมื่อติดตั้งแล้วให้ทำตามขั้นตอนด้านล่าง:

  1. กดCTRL+ SHIFT+P
  2. เลือกMarkdown: สร้างสารบัญ

4

ฉันเพิ่งเริ่มทำสิ่งเดียวกัน (จดบันทึกใน Markdown) ผมใช้ Sublime Text 2 กับปลั๊กอิน MarkdownPreview ในตัว markdown parser [TOC]สนับสนุน


1
ข้อความประเสริฐ 3 ยังมีปลั๊กอินสำหรับสร้าง toc: packagecontrol.io/packages/MarkdownTOC
fangda


4

บน Gitlab, markdown รองรับสิ่งนี้: [[_TOC_]]


1
โซลูชันนี้ใช้งานไม่ได้อีกต่อไปอาจเป็นเพราะ GitLab ย้ายจาก Redcarpet เป็น kramdown โปรดดูรายการสิ่งที่ต้องทำ: gitlab.com/gitlab-org/gitlab-docs/merge_requests/108
Amadeu Barbosa

ทำงานใน Gollum v5 ด้วย
user2394284

4

เพียงใช้โปรแกรมแก้ไขข้อความด้วยปลั๊กอิน

บรรณาธิการของคุณอาจมีแพ็คเกจ / ปลั๊กอินเพื่อจัดการสิ่งนี้ให้คุณ ตัวอย่างเช่นในEmacsคุณสามารถติดตั้งเครื่องกำเนิด TOC ของmarkdown-toc จากนั้นเมื่อคุณแก้ไขเพียงโทรซ้ำ ๆM-x markdown-toc-generate-or-refresh-tocแล้วที่คุณแก้ไขเพียงโทรซ้ำแล้วซ้ำอีกนั่นเป็นสิ่งที่คุ้มค่ากับการผูกกุญแจหากคุณต้องการทำบ่อยๆ การสร้าง TOC ง่าย ๆ โดยที่ไม่ทำให้เอกสารของคุณสกปรกด้วยแองเคอร์ HTML

บรรณาธิการอื่น ๆ มีปลั๊กอินที่คล้ายกันดังนั้นรายการยอดนิยมจึงเป็นดังนี้:


2

ตามคำตอบ albertodebortoli สร้างฟังก์ชันด้วยการตรวจสอบเพิ่มเติมและทดแทนเครื่องหมายวรรคตอน

# @fn       def generate_table_of_contents markdown # {{{
# @brief    Generates table of contents for given markdown text
#
# @param    [String]  markdown Markdown string e.g. File.read('README.md')
#
# @return   [String]  Table of content in markdown format.
#
def generate_table_of_contents markdown
  table_of_contents = ""
  i_section = 0
  # to track markdown code sections, because e.g. ruby comments also start with #
  inside_code_section = false
  markdown.each_line do |line|
    inside_code_section = !inside_code_section if line.start_with?('```')

    forbidden_words = ['Table of contents', 'define', 'pragma']
    next if !line.start_with?('#') || inside_code_section || forbidden_words.any? { |w| line =~ /#{w}/ }

    title = line.gsub("#", "").strip
    href = title.gsub(/(^[!.?:\(\)]+|[!.?:\(\)]+$)/, '').gsub(/[!.,?:; \(\)-]+/, "-").downcase

    bullet = line.count("#") > 1 ? " *" : "#{i_section += 1}."
    table_of_contents << "  " * (line.count("#") - 1) + "#{bullet} [#{title}](\##{href})\n"
  end
  table_of_contents
end


2

สำหรับฉันแล้วโซลูชันที่เสนอโดย @Tum นั้นทำงานได้อย่างมีเสน่ห์สำหรับสารบัญซึ่งมี 2 ระดับ อย่างไรก็ตามสำหรับระดับที่ 3 มันไม่ทำงาน มันไม่ได้แสดงลิงค์เป็น 2 ระดับแรกมันแสดงข้อความธรรมดา3.5.1. [bla bla bla](#blablabla) <br>แทน

โซลูชันของฉันคือส่วนเสริมของ @Tum (ซึ่งง่ายมาก) สำหรับผู้ที่ต้องการสารบัญที่มี 3 ระดับขึ้นไป

ในระดับที่สองแท็บง่าย ๆ จะทำการเยื้องอย่างถูกต้องสำหรับคุณ แต่มันไม่รองรับ 2 แท็บ แต่คุณต้องใช้หนึ่งแท็บและเพิ่มเป็นจำนวนมาก&nbsp;เท่าที่คุณต้องการเพื่อจัดระดับ 3 อย่างถูกต้อง

นี่คือตัวอย่างการใช้ 4 ระดับ (ระดับที่สูงขึ้นมันจะแย่ลง):

# Table of Contents
1. [Title](#title) <br>
    1.1. [sub-title](#sub_title) <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.1.1. [sub-sub-title](#sub_sub_title)
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.1.1.1. [sub-sub-sub-title](#sub_sub_sub_title)

# Title <a name="title"></a>
Heading 1

## Sub-Title <a name="sub_title"></a>
Heading 2

### Sub-Sub-Title <a name="sub_sub_title"></a>
Heading 3

#### Sub-Sub-Sub-Title <a name="sub_sub_sub_title"></a>
Heading 4

สิ่งนี้จะให้ผลลัพธ์ต่อไปนี้โดยที่ทุกองค์ประกอบของสารบัญเป็นลิงค์ไปยังส่วนที่เกี่ยวข้อง หมายเหตุยัง<br>เพื่อที่จะเพิ่มบรรทัดใหม่แทนที่จะเป็นในบรรทัดเดียวกัน

สารบัญ

  1. หัวข้อ
    1.1 หัวข้อย่อย
           1.1.1 หัวข้อย่อย
                     1.1.1.1 Sub-Sub-Sub-ชื่อเรื่อง

หัวข้อ

หัวข้อ 1

Sub-ชื่อเรื่อง

หัวข้อ 2

Sub-Sub-ชื่อเรื่อง

หัวข้อ 3

Sub-Sub-Sub-ชื่อเรื่อง

หัวข้อ 4


1

ขึ้นอยู่กับเวิร์กโฟลว์ของคุณคุณอาจต้องการดูstrapdown

นั่นคือทางแยกของต้นฉบับ ( http://strapdownjs.com ) ที่เพิ่มการสร้างสารบัญ

มีไฟล์กำหนดค่า apache ใน repo (อาจยังไม่ได้รับการปรับปรุงอย่างถูกต้อง) เพื่อตัด markdown แบบธรรมดาหากคุณไม่ต้องการเขียนในไฟล์ html


1

ฉันไม่แน่ใจว่าเอกสารอะไรเป็นทางการสำหรับ markdown ข้ามอ้างอิงสามารถเขียนได้เพียงในวงเล็บหรือวงเล็บที่ว่างเปล่า[Heading][Heading][]

ทั้งสองทำงานโดยใช้pandoc ดังนั้นฉันจึงสร้างสคริปต์ทุบตีด่วนซึ่งจะแทนที่ $ TOCในไฟล์ md ด้วย TOC (คุณจะต้องมี envsubst ที่อาจไม่ได้เป็นส่วนหนึ่งของ distro ของคุณ)

#!/bin/bash
filename=$1
__TOC__=$(grep "^##" $filename | sed -e 's/ /1. /;s/^##//;s/#/   /g;s/\. \(.*\)$/. [\1][]/')
export __TOC__
envsubst '$__TOC__' < $filename

1

หากคุณบังเอิญใช้Eclipseคุณสามารถใช้ทางลัดCtrl+ O(เค้าร่าง) สิ่งนี้จะแสดงสารบัญเทียบเท่าและอนุญาตให้ค้นหาในหัวเรื่องของส่วน (เติมข้อความอัตโนมัติ)

คุณสามารถเปิดมุมมองโครงร่าง (หน้าต่าง -> แสดงมุมมอง -> โครงร่าง) แต่ไม่มีการค้นหาการเติมข้อความอัตโนมัติ


1

ใช้toc.pyซึ่งเป็นสคริปต์หลามเล็ก ๆ ที่สร้างสารบัญสำหรับการทำเครื่องหมายของคุณ

การใช้งาน:

  • ในไฟล์ Markdown ของคุณเพิ่ม<toc>ตำแหน่งที่คุณต้องการให้สารบัญวาง
  • $python toc.py README.md(ใช้ชื่อไฟล์ markdown ของคุณแทนREADME.md )

ไชโย!


สคริปต์ของคุณดี แต่ไม่ได้สร้างสมอก่อนชื่อแต่ละ จำเป็นอย่างน้อยใน bitbucket
Paul Rougieux

1

ฉันใช้https://github.com/ekalinin/github-markdown-tocซึ่งมียูทิลิตีบรรทัดคำสั่งที่สร้างสารบัญโดยอัตโนมัติจากเอกสารมาร์กอัป

ไม่มีปลั๊กอินหรือมาโครหรือการพึ่งพาอื่น ๆ หลังจากติดตั้งยูทิลิตี้เพียงวางเอาต์พุตของยูทิลิตี้ไปยังตำแหน่งในเอกสารที่คุณต้องการสารบัญ ใช้งานง่ายมาก

$ cat README.md | ./gh-md-toc -

1

หากไฟล์ Markdown ของคุณจะแสดงใน repo บน bitbucket.org คุณควรเพิ่ม[TOC]ที่ตำแหน่งที่คุณต้องการสารบัญ มันจะถูกสร้างขึ้นโดยอัตโนมัติ ข้อมูลเพิ่มเติมที่นี่:

https://confluence.atlassian.com/bitbucket/add-a-table-of-contents-to-a-wiki-221451163.html


1

มีสคริปต์ Ruby ชื่อmdtoc.rbที่สามารถสร้างตารางเนื้อหาของ GFM Markdown ได้โดยอัตโนมัติและคล้ายกัน แต่แตกต่างจากสคริปต์อื่น ๆ เล็กน้อยที่โพสต์ที่นี่

รับไฟล์ Markdown อินพุตเช่น:

# Lorem Ipsum

Lorem ipsum dolor sit amet, mei alienum adipiscing te, has no possit delicata. Te nominavi suavitate sed, quis alia cum no, has an malis dictas explicari. At mel nonumes eloquentiam, eos ea dicat nullam. Sed eirmod gubergren scripserit ne, mei timeam nonumes te. Qui ut tale sonet consul, vix integre oportere an. Duis ullum at ius.

## Et cum

Et cum affert dolorem habemus. Sale malis at mel. Te pri copiosae hendrerit. Cu nec agam iracundia necessitatibus, tibique corpora adipisci qui cu. Et vix causae consetetur deterruisset, ius ea inermis quaerendum.

### His ut

His ut feugait consectetuer, id mollis nominati has, in usu insolens tractatos. Nemore viderer torquatos qui ei, corpora adipiscing ex nec. Debet vivendum ne nec, ipsum zril choro ex sed. Doming probatus euripidis vim cu, habeo apeirian et nec. Ludus pertinacia an pro, in accusam menandri reformidans nam, sed in tantas semper impedit.

### Doctus voluptua

Doctus voluptua his eu, cu ius mazim invidunt incorrupte. Ad maiorum sensibus mea. Eius posse sonet no vim, te paulo postulant salutatus ius, augue persequeris eum cu. Pro omnesque salutandi evertitur ea, an mea fugit gloriatur. Pro ne menandri intellegam, in vis clita recusabo sensibus. Usu atqui scaevola an.

## Id scripta

Id scripta alterum pri, nam audiam labitur reprehendunt at. No alia putent est. Eos diam bonorum oportere ad. Sit ad admodum constituto, vide democritum id eum. Ex singulis laboramus vis, ius no minim libris deleniti, euismod sadipscing vix id.

มันสร้างสารบัญนี้:

$ mdtoc.rb FILE.md 
#### Table of contents

1. [Et cum](#et-cum)
    * [His ut](#his-ut)
    * [Doctus voluptua](#doctus-voluptua)
2. [Id scripta](#id-scripta)

ดูโพสต์บล็อกของฉันในหัวข้อนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.