diff --git a/Gopkg.lock b/Gopkg.lock index cb61ce6c0..b69bb2626 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -81,7 +81,7 @@ [[projects]] name = "github.com/gobuffalo/packr" - packages = [".","v2","v2/file","v2/file/resolver","v2/file/resolver/encoding/hex","v2/jam/parser","v2/plog"] + packages = ["v2","v2/file","v2/file/resolver","v2/file/resolver/encoding/hex","v2/jam/parser","v2/plog"] revision = "cda4ac25577350dac682c8715dc6659327232596" version = "v2.2.0" @@ -124,6 +124,12 @@ packages = ["OpenAPIv2","compiler","extensions"] revision = "0c5108395e2debce0d731cf0287ddf7242066aba" +[[projects]] + name = "github.com/gorilla/mux" + packages = ["."] + revision = "c5c6c98bc25355028a63748a498942a6398ccd22" + version = "v1.7.1" + [[projects]] name = "github.com/gregjones/httpcache" packages = [".","diskcache"] @@ -271,6 +277,35 @@ revision = "ffdc059bfe9ce6a4e144ba849dbedead332c6053" version = "v1.3.0" +[[projects]] + branch = "master" + name = "gitlab.com/golang-commonmark/html" + packages = ["."] + revision = "cfaf75183c4a5f0e44e3d51ece1065accafdd2b3" + +[[projects]] + branch = "master" + name = "gitlab.com/golang-commonmark/linkify" + packages = ["."] + revision = "c22b7bdb117955ff2cc0e3724083d35e3419d71e" + +[[projects]] + name = "gitlab.com/golang-commonmark/markdown" + packages = ["."] + revision = "772775880e1fbf39a7804149ed11c0f714ec89fe" + +[[projects]] + branch = "master" + name = "gitlab.com/golang-commonmark/mdurl" + packages = ["."] + revision = "e5bce34c34f29ecf232fec34f3982e55533ec14e" + +[[projects]] + branch = "master" + name = "gitlab.com/golang-commonmark/puny" + packages = ["."] + revision = "2cd490539afe7c6fc0eda6c59ef88fa93a00ea0d" + [[projects]] name = "go.uber.org/atomic" packages = ["."] @@ -389,6 +424,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "23f3629786ef5c144dfcbf51c3ef27cafa7f200acfdc9779a234a6419e6aeb6a" + inputs-digest = "0413cf32305d8e92a5f65d059d93e2bf151b8755f5a24088ef26ea12a148cd68" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 9dd199358..d71b6fbe1 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -48,3 +48,11 @@ [[constraint]] name = "github.com/gobuffalo/packr" version = "2.2.0" + +[[constraint]] + name = "github.com/gorilla/mux" + version = "1.7.1" + +[[constraint]] + revision = "772775880e1fbf39a7804149ed11c0f714ec89fe" + name = "gitlab.com/golang-commonmark/markdown" diff --git a/main.go b/main.go index c773caddd..9573ad7e7 100644 --- a/main.go +++ b/main.go @@ -22,7 +22,9 @@ import ( "io/ioutil" "net/http" "os" + "strings" + "github.com/gorilla/mux" conf "github.com/reactiveops/fairwinds/pkg/config" "github.com/reactiveops/fairwinds/pkg/dashboard" "github.com/reactiveops/fairwinds/pkg/kube" @@ -84,18 +86,24 @@ func main() { } func startDashboardServer(c conf.Configuration, k *kube.ResourceProvider, port int) { - http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { + router := mux.NewRouter() + router.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("OK")) }) - http.HandleFunc("/results.json", func(w http.ResponseWriter, r *http.Request) { + router.HandleFunc("/results.json", func(w http.ResponseWriter, r *http.Request) { dashboard.EndpointHandler(w, r, c, k) }) - http.HandleFunc("/favicon.ico", func(w http.ResponseWriter, r *http.Request) { + router.HandleFunc("/favicon.ico", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "public/favicon.ico") }) + router.HandleFunc("/details/{category}", func(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + category := vars["category"] + category = strings.Replace(category, ".md", "", -1) + dashboard.DetailsHandler(w, r, category) + }) fileServer := http.FileServer(dashboard.GetAssetBox()) - http.Handle("/static/", http.StripPrefix("/static/", fileServer)) - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/" { http.NotFound(w, r) return @@ -108,6 +116,8 @@ func startDashboardServer(c conf.Configuration, k *kube.ResourceProvider, port i } dashboard.MainHandler(w, r, auditData) }) + http.Handle("/static/", http.StripPrefix("/static/", fileServer)) + http.Handle("/", router) logrus.Infof("Starting Fairwinds dashboard server on port %d", port) logrus.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", port), nil)) diff --git a/pkg/dashboard/assets/css/check-details.css b/pkg/dashboard/assets/css/check-details.css new file mode 100644 index 000000000..84f14afe8 --- /dev/null +++ b/pkg/dashboard/assets/css/check-details.css @@ -0,0 +1,12 @@ +th, td { + padding: 4px 8px; + vertical-align: top; +} + +body { + font-family: "Helvetica", "Arial", sans-serif +} + +h1, h2, h3, h4, h5, h6 { + font-family: "Muli", "Helvetica", "Arial", sans-serif +} diff --git a/pkg/dashboard/assets/css/dashboard.css b/pkg/dashboard/assets/css/dashboard.css new file mode 100644 index 000000000..fee58230f --- /dev/null +++ b/pkg/dashboard/assets/css/dashboard.css @@ -0,0 +1,227 @@ +.charts { + height: 405px; +} + +.card.cluster { + margin-top: 15px; +} + +.card.namespace { + padding: 10px 20px; +} + +.card h3 { + margin: 0; + font-weight: 300; + font-size: 28px; + padding: 15px 20px 20px; +} + +.namespace h3 strong { + margin: 0; + font-weight: bold; +} + +.cluster-overview { + height: 204px; +} + +.cluster-overview .cluster-score { + width: 200px; + display: inline-block; + margin-left: 20px; +} + +.cluster-overview .cluster-score .weather { + font-size: 90px; + color: #444; + margin-bottom: 15px; +} + +.cluster-overview .cluster-score .sailing-message { + font-size: 16px; + line-height: 28px; + margin-left: 7px; + font-weight: 300; + color: #555; +} + +.cluster-overview .cluster-score .scores { + font-size: 16px; + margin-top: 10px; +} + +.cluster .expandable-table ul.message-list { + margin: 10px 26px; +} + +#clusterScoreChart { + width: 550px; + position: relative; + top: -227px; + left: 120px; +} + +.cluster-overview .result-messages { + margin: 0 20px; + display: inline-block; + position: relative; + left: -100px; + top: -45px; +} + +.cluster-overview .result-messages ul { + position: relative; + top: 0px; + left: 400px; + font-size: 20px; + line-height: 35px; +} + +.card.cluster .expandable-table { + margin-top: 20px; +} + +.card.cluster .detail-label { + display: inline-block; + min-width: 140px; + font-weight: bold; +} + +.expandable-table { + width: 100%; + border-spacing: 0; + border-collapse: collapse; +} + +.expandable-table tr { + height: 50px; +} + +.expandable-table td { + padding: 15px 20px; + margin: 0; + font-size: 18px; + border-top: 1px solid #eee; +} + +.expandable-table .resource-info .name { + cursor: pointer; +} + +.expandable-table .resource-info .caret-expander { + display: inline-block; + width: 15px; + height: 15px; + margin-right: 10px; + background-image: url('../images/caret-right.svg'); + background-size: 13px auto; + background-repeat: no-repeat; + background-position: 2px center; +} + +.expandable-table .resource-info.expanded .caret-expander { + background-image: url('../images/caret-bottom.svg'); + background-position: center 2px; +} + +.expandable-table .resource-info .expandable-content { + display: none; +} + +.expandable-table .resource-info.expanded .expandable-content { + display: block; +} + +.namespace .resource-info .result-messages { + color: #6a6a6a; +} + +.namespace .result-messages h4 { + font-weight: bold; + font-size: 15px; + margin: 15px 25px 6px; +} + +ul.message-list { + list-style-type: none; + font-size: 13px; + line-height: 20px; + margin: 5px 35px; + padding: 0; + color: #6a6a6a; +} + +ul.message-list li { + margin-bottom: 5px; +} + +ul.message-list li i.message-icon { + display: inline-block; + margin-right: 7px; + text-align: center; + width: 20px; + font-size: 17px; + font-weight: bold; + position: relative; + bottom: -3px; +} + +.result-messages .success i.message-icon { + color: #8BD2DC; +} + +.result-messages .warning i.message-icon { + color: #f26c21; +} + +.result-messages .error i.message-icon { + color: #a11f4c; +} + +a.more-info { + color: #6a6a6a; + text-decoration: none; +} + +.namespace .status-bar { + vertical-align: top; + padding-top: 18px; +} +.namespace .status-bar .status { + float: right; + animation: fadeIn 2s; +} + +.cluster .status { + width: 280px; +} +.namespace .status { + width: 200px; +} + +.status div { + height: 15px; + border-radius: 10px; +} + +.status .passing { + background-color: #8BD2DC; + float: left; +} + +.status .warning { + background-color: #f26c21; + float: left; +} + +.status .failing { + background-color: #a11f4c; + width: 100%; +} + +@keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + diff --git a/pkg/dashboard/assets/css/main.css b/pkg/dashboard/assets/css/main.css index 70fe0ecad..4ce90b859 100644 --- a/pkg/dashboard/assets/css/main.css +++ b/pkg/dashboard/assets/css/main.css @@ -2,50 +2,47 @@ body { margin: 0; font-family: 'Muli', 'Helvetica', 'Arial', sans-serif; background: #f5f5f5; + line-height: 1.3rem; } -.header { +.navbar { padding: 20px 20px 0; } -.header .header-content { +.navbar .navbar-content { margin: 0 auto; width: 900px; } -.header .header-right { +.navbar .navbar-right { padding: 15px; float: right; } -.header .logo { +.navbar .logo { width: 280px; } -.header span.oss-text { +.navbar span.oss-text { color: #23103A; display: block; font-size: 11px; margin: 3px 0; } -.header a { +.navbar a { text-decoration: none; } -.header .ro-logo { +.navbar .ro-logo { height: 40px; } -.dashboard-content { +.main-content { width: 960px; margin: 0 auto; } -.charts { - height: 405px; -} - .card { margin: 25px 20px; padding: 20px; @@ -55,225 +52,6 @@ body { border-radius: 5px; } -.card.cluster { - margin-top: 15px; -} - - -.card.namespace { - padding: 10px 20px; -} - -.card h3 { - margin: 0; - font-weight: 300; - font-size: 28px; - padding: 15px 20px 20px; -} - -.namespace h3 strong { - margin: 0; - font-weight: bold; -} - -.cluster-overview { - height: 204px; -} - -.cluster-overview .cluster-score { - width: 200px; - display: inline-block; - margin-left: 20px; -} - -.cluster-overview .cluster-score .weather { - font-size: 90px; - color: #444; - margin-bottom: 15px; -} - -.cluster-overview .cluster-score .sailing-message { - font-size: 16px; - line-height: 28px; - margin-left: 7px; - font-weight: 300; - color: #555; -} - -.cluster-overview .cluster-score .scores { - font-size: 16px; - margin-top: 10px; -} - -.cluster .expandable-table ul.message-list { - margin: 10px 26px; -} - -#clusterScoreChart { - width: 550px; - position: relative; - top: -242px; - left: 120px; -} - -.cluster-overview .result-messages { - margin: 0 20px; - display: inline-block; - position: relative; - left: -100px; - top: -45px; -} - -.cluster-overview .result-messages ul { - position: relative; - top: 0px; - left: 400px; - font-size: 20px; - line-height: 35px; -} - -.card.cluster .expandable-table { - margin-top: 20px; -} - -.card.cluster .detail-label { - display: inline-block; - min-width: 140px; - font-weight: bold; -} - -.expandable-table { - width: 100%; - border-spacing: 0; - border-collapse: collapse; -} - -.expandable-table tr { - height: 50px; -} - -.expandable-table td { - padding: 15px 20px; - margin: 0; - font-size: 18px; - border-top: 1px solid #eee; -} - -.expandable-table .resource-info .name { - cursor: pointer; -} - -.expandable-table .resource-info .caret-expander { - display: inline-block; - width: 15px; - height: 15px; - margin-right: 10px; - background-image: url('../images/caret-right.svg'); - background-size: 13px auto; - background-repeat: no-repeat; - background-position: 2px center; -} - -.expandable-table .resource-info.expanded .caret-expander { - background-image: url('../images/caret-bottom.svg'); - background-position: center 2px; -} - -.expandable-table .resource-info .expandable-content { - display: none; -} - -.expandable-table .resource-info.expanded .expandable-content { - display: block; -} - -.namespace .resource-info .result-messages { - color: #6a6a6a; -} - -.namespace .result-messages h4 { - font-weight: bold; - font-size: 15px; - margin: 15px 25px 6px; -} - -ul.message-list { - list-style-type: none; - font-size: 13px; - line-height: 20px; - margin: 5px 35px; - padding: 0; - color: #6a6a6a; -} - -ul.message-list li { - margin-bottom: 5px; -} - -ul.message-list li i { - display: inline-block; - margin-right: 7px; - text-align: center; - width: 20px; - font-size: 17px; - font-weight: bold; - position: relative; - bottom: -3px; -} - -.result-messages .success i { - color: #8BD2DC; -} - -.result-messages .warning i { - color: #f26c21; -} - -.result-messages .error i { - color: #a11f4c; -} - -.namespace .status-bar { - vertical-align: top; - padding-top: 18px; -} -.namespace .status-bar .status { - float: right; - animation: fadeIn 2s; -} - -.cluster .status { - width: 280px; -} -.namespace .status { - width: 200px; -} - -.status div { - height: 15px; - border-radius: 10px; -} - -.status .passing { - background-color: #8BD2DC; - float: left; -} - -.status .warning { - background-color: #f26c21; - float: left; -} - -.status .failing { - background-color: #a11f4c; - width: 100%; -} - -@keyframes fadeIn { - 0% {opacity: 0;} - 100% {opacity: 1;} -} - .footer { text-align: center; padding-top: 10px; @@ -288,3 +66,4 @@ ul.message-list li i { .footer a:hover { text-decoration: underline; } + diff --git a/pkg/dashboard/dashboard.go b/pkg/dashboard/dashboard.go index 5be8d4b9c..0d46f4f1d 100644 --- a/pkg/dashboard/dashboard.go +++ b/pkg/dashboard/dashboard.go @@ -25,24 +25,30 @@ import ( "github.com/reactiveops/fairwinds/pkg/kube" "github.com/reactiveops/fairwinds/pkg/validator" "github.com/sirupsen/logrus" + "gitlab.com/golang-commonmark/markdown" ) const ( // MainTemplateName is the main template MainTemplateName = "main.gohtml" - // HeaderTemplateName contains the navbar - HeaderTemplateName = "header.gohtml" + // HeadTemplateName contains styles and meta info + HeadTemplateName = "head.gohtml" + // NavbarTemplateName contains the navbar + NavbarTemplateName = "navbar.gohtml" // PreambleTemplateName contains an empty preamble that can be overridden PreambleTemplateName = "preamble.gohtml" // DashboardTemplateName contains the content of the dashboard DashboardTemplateName = "dashboard.gohtml" // FooterTemplateName contains the footer FooterTemplateName = "footer.gohtml" + // CheckDetailsTemplateName is a page for rendering details about a given check + CheckDetailsTemplateName = "check-details.gohtml" ) var ( templateBox = (*packr.Box)(nil) assetBox = (*packr.Box)(nil) + markdownBox = (*packr.Box)(nil) ) // GetAssetBox returns a binary-friendly set of assets packaged from disk @@ -61,6 +67,14 @@ func GetTemplateBox() *packr.Box { return templateBox } +// GetMarkdownBox returns a binary-friendly set of markdown files with error details +func GetMarkdownBox() *packr.Box { + if markdownBox == (*packr.Box)(nil) { + markdownBox = packr.New("Markdown", "../../docs") + } + return markdownBox +} + // TemplateData is passed to the dashboard HTML template type TemplateData struct { AuditData validator.AuditData @@ -77,16 +91,22 @@ func GetBaseTemplate(name string) (*template.Template, error) { "getGrade": getGrade, "getScore": getScore, "getIcon": getIcon, + "getCategoryLink": getCategoryLink, }) - templateBox := GetTemplateBox() templateFileNames := []string{ DashboardTemplateName, - HeaderTemplateName, + HeadTemplateName, + NavbarTemplateName, PreambleTemplateName, FooterTemplateName, MainTemplateName, } + return parseTemplateFiles(tmpl, templateFileNames) +} + +func parseTemplateFiles(tmpl *template.Template, templateFileNames []string) (*template.Template, error) { + templateBox := GetTemplateBox() for _, fname := range templateFileNames { templateFile, err := templateBox.Find(fname) if err != nil { @@ -101,6 +121,16 @@ func GetBaseTemplate(name string) (*template.Template, error) { return tmpl, nil } +func writeTemplate(tmpl *template.Template, data *TemplateData, w http.ResponseWriter) { + buf := &bytes.Buffer{} + err := tmpl.Execute(buf, data) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + buf.WriteTo(w) +} + // MainHandler gets template data and renders the dashboard with it. func MainHandler(w http.ResponseWriter, r *http.Request, auditData validator.AuditData) { jsonData, err := json.Marshal(auditData) @@ -120,23 +150,14 @@ func MainHandler(w http.ResponseWriter, r *http.Request, auditData validator.Aud http.Error(w, "Error getting template data", 500) return } - - buf := &bytes.Buffer{} - err = tmpl.ExecuteTemplate(buf, "main", templateData) - - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - buf.WriteTo(w) + writeTemplate(tmpl, &templateData, w) } // EndpointHandler gets template data and renders json with it. func EndpointHandler(w http.ResponseWriter, r *http.Request, c conf.Configuration, kubeResources *kube.ResourceProvider) { templateData, err := validator.RunAudit(c, kubeResources) if err != nil { - http.Error(w, "Error Fetching Deployments", 500) + http.Error(w, "Error Fetching Deployments", http.StatusInternalServerError) return } @@ -144,3 +165,31 @@ func EndpointHandler(w http.ResponseWriter, r *http.Request, c conf.Configuratio w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(templateData) } + +// DetailsHandler returns details for a given error type +func DetailsHandler(w http.ResponseWriter, r *http.Request, category string) { + box := GetMarkdownBox() + contents, err := box.Find(category + ".md") + if err != nil { + http.Error(w, "Error details not found for category "+category, http.StatusNotFound) + return + } + md := markdown.New(markdown.XHTMLOutput(true)) + detailsHTML := "{{ define \"details\" }}" + md.RenderToString(contents) + "{{ end }}" + + templateFileNames := []string{ + HeadTemplateName, + NavbarTemplateName, + CheckDetailsTemplateName, + FooterTemplateName, + } + tmpl := template.New("check-details") + tmpl, err = parseTemplateFiles(tmpl, templateFileNames) + if err != nil { + logrus.Printf("Error getting template data %v", err) + http.Error(w, "Error getting template data", 500) + return + } + tmpl.Parse(detailsHTML) + writeTemplate(tmpl, nil, w) +} diff --git a/pkg/dashboard/helpers.go b/pkg/dashboard/helpers.go index fa37adbda..065bd8b6b 100644 --- a/pkg/dashboard/helpers.go +++ b/pkg/dashboard/helpers.go @@ -16,6 +16,7 @@ package dashboard import ( "github.com/reactiveops/fairwinds/pkg/validator" + "strings" ) func getWarningWidth(counts validator.CountSummary, fullWidth int) uint { @@ -26,6 +27,10 @@ func getSuccessWidth(counts validator.CountSummary, fullWidth int) uint { return uint(float64(counts.Successes) / float64(counts.Successes+counts.Warnings+counts.Errors) * float64(fullWidth)) } +func getCategoryLink(category string) string { + return strings.Replace(strings.ToLower(category), " ", "-", -1) +} + func getGrade(rs validator.ResultSummary) string { score := getScore(rs) if score >= 97 { diff --git a/pkg/dashboard/templates/check-details.gohtml b/pkg/dashboard/templates/check-details.gohtml new file mode 100644 index 000000000..15352169f --- /dev/null +++ b/pkg/dashboard/templates/check-details.gohtml @@ -0,0 +1,17 @@ + + + +
+ {{ template "head" . }} + + + + + {{ template "navbar" . }} +okay
\n", + "markdown": "\nokay\n", + "example": 138, + "start_line": 2379 + }, + { + "end_line": 2414, + "section": "HTML blocks", + "html": "\nokay
\n", + "markdown": "\nokay\n", + "example": 139, + "start_line": 2398 + }, + { + "end_line": 2431, + "section": "HTML blocks", + "html": "\nfoo
\n", + "markdown": "\n*foo*\n", + "example": 143, + "start_line": 2463 + }, + { + "end_line": 2478, + "section": "HTML blocks", + "html": "*bar*\nbaz
\n", + "markdown": "*bar*\n*baz*\n", + "example": 144, + "start_line": 2472 + }, + { + "end_line": 2492, + "section": "HTML blocks", + "html": "1. *bar*\n", + "markdown": "1. *bar*\n", + "example": 145, + "start_line": 2484 + }, + { + "end_line": 2509, + "section": "HTML blocks", + "html": "\nokay
\n", + "markdown": "\nokay\n", + "example": 146, + "start_line": 2497 + }, + { + "end_line": 2529, + "section": "HTML blocks", + "html": "';\n\n?>\nokay
\n", + "markdown": "';\n\n?>\nokay\n", + "example": 147, + "start_line": 2515 + }, + { + "end_line": 2538, + "section": "HTML blocks", + "html": "\n", + "markdown": "\n", + "example": 148, + "start_line": 2534 + }, + { + "end_line": 2571, + "section": "HTML blocks", + "html": "\nokay
\n", + "markdown": "\nokay\n", + "example": 149, + "start_line": 2543 + }, + { + "end_line": 2584, + "section": "HTML blocks", + "html": " \n<!-- foo -->\n
\n",
+ "markdown": " \n\n \n",
+ "example": 150,
+ "start_line": 2576
+ },
+ {
+ "end_line": 2595,
+ "section": "HTML blocks",
+ "html": " <div>\n
\n",
+ "markdown": " Foo
\nFoo\n\nbaz
\n", + "markdown": "Foo\n\nbaz\n", + "example": 154, + "start_line": 2632 + }, + { + "end_line": 2683, + "section": "HTML blocks", + "html": "Emphasized text.
\n\nHi\n | \n
\nHi\n | \n\n
\n Hi\n | \n\n
[foo]: /url 'title
\nwith blank line'
\n[foo]
\n", + "markdown": "[foo]: /url 'title\n\nwith blank line'\n\n[foo]\n", + "example": 164, + "start_line": 2844 + }, + { + "end_line": 2866, + "section": "Link reference definitions", + "html": "\n", + "markdown": "[foo]:\n/url\n\n[foo]\n", + "example": 165, + "start_line": 2859 + }, + { + "end_line": 2878, + "section": "Link reference definitions", + "html": "[foo]:
\n[foo]
\n", + "markdown": "[foo]:\n\n[foo]\n", + "example": 166, + "start_line": 2871 + }, + { + "end_line": 2890, + "section": "Link reference definitions", + "html": "\n", + "markdown": "[foo]: /url\\bar\\*baz \"foo\\\"bar\\baz\"\n\n[foo]\n", + "example": 167, + "start_line": 2884 + }, + { + "end_line": 2901, + "section": "Link reference definitions", + "html": "\n", + "markdown": "[foo]\n\n[foo]: url\n", + "example": 168, + "start_line": 2895 + }, + { + "end_line": 2914, + "section": "Link reference definitions", + "html": "\n", + "markdown": "[foo]\n\n[foo]: first\n[foo]: second\n", + "example": 169, + "start_line": 2907 + }, + { + "end_line": 2926, + "section": "Link reference definitions", + "html": "\n", + "markdown": "[FOO]: /url\n\n[Foo]\n", + "example": 170, + "start_line": 2920 + }, + { + "end_line": 2935, + "section": "Link reference definitions", + "html": "\n", + "markdown": "[ΑΓΩ]: /φου\n\n[αγω]\n", + "example": 171, + "start_line": 2929 + }, + { + "end_line": 2944, + "section": "Link reference definitions", + "html": "", + "markdown": "[foo]: /url\n", + "example": 172, + "start_line": 2941 + }, + { + "end_line": 2956, + "section": "Link reference definitions", + "html": "bar
\n", + "markdown": "[\nfoo\n]: /url\nbar\n", + "example": 173, + "start_line": 2949 + }, + { + "end_line": 2966, + "section": "Link reference definitions", + "html": "[foo]: /url "title" ok
\n", + "markdown": "[foo]: /url \"title\" ok\n", + "example": 174, + "start_line": 2962 + }, + { + "end_line": 2976, + "section": "Link reference definitions", + "html": ""title" ok
\n", + "markdown": "[foo]: /url\n\"title\" ok\n", + "example": 175, + "start_line": 2971 + }, + { + "end_line": 2990, + "section": "Link reference definitions", + "html": "[foo]: /url "title"\n
\n[foo]
\n", + "markdown": " [foo]: /url \"title\"\n\n[foo]\n", + "example": 176, + "start_line": 2982 + }, + { + "end_line": 3006, + "section": "Link reference definitions", + "html": "[foo]: /url\n
\n[foo]
\n", + "markdown": "```\n[foo]: /url\n```\n\n[foo]\n", + "example": 177, + "start_line": 2996 + }, + { + "end_line": 3020, + "section": "Link reference definitions", + "html": "Foo\n[bar]: /baz
\n[bar]
\n", + "markdown": "Foo\n[bar]: /baz\n\n[bar]\n", + "example": 178, + "start_line": 3011 + }, + { + "end_line": 3035, + "section": "Link reference definitions", + "html": "\n\n", + "markdown": "# [Foo]\n[foo]: /url\n> bar\n", + "example": 179, + "start_line": 3026 + }, + { + "end_line": 3054, + "section": "Link reference definitions", + "html": "\n", + "markdown": "[foo]: /foo-url \"foo\"\n[bar]: /bar-url\n \"bar\"\n[baz]: /baz-url\n\n[foo],\n[bar],\n[baz]\n", + "example": 180, + "start_line": 3041 + }, + { + "end_line": 3070, + "section": "Link reference definitions", + "html": "\nbar
\n
\n\n", + "markdown": "[foo]\n\n> [foo]: /url\n", + "example": 181, + "start_line": 3062 + }, + { + "end_line": 3092, + "section": "Paragraphs", + "html": "
aaa
\nbbb
\n", + "markdown": "aaa\n\nbbb\n", + "example": 182, + "start_line": 3085 + }, + { + "end_line": 3108, + "section": "Paragraphs", + "html": "aaa\nbbb
\nccc\nddd
\n", + "markdown": "aaa\nbbb\n\nccc\nddd\n", + "example": 183, + "start_line": 3097 + }, + { + "end_line": 3121, + "section": "Paragraphs", + "html": "aaa
\nbbb
\n", + "markdown": "aaa\n\n\nbbb\n", + "example": 184, + "start_line": 3113 + }, + { + "end_line": 3132, + "section": "Paragraphs", + "html": "aaa\nbbb
\n", + "markdown": " aaa\n bbb\n", + "example": 185, + "start_line": 3126 + }, + { + "end_line": 3146, + "section": "Paragraphs", + "html": "aaa\nbbb\nccc
\n", + "markdown": "aaa\n bbb\n ccc\n", + "example": 186, + "start_line": 3138 + }, + { + "end_line": 3158, + "section": "Paragraphs", + "html": "aaa\nbbb
\n", + "markdown": " aaa\nbbb\n", + "example": 187, + "start_line": 3152 + }, + { + "end_line": 3168, + "section": "Paragraphs", + "html": "aaa\n
\nbbb
\n", + "markdown": " aaa\nbbb\n", + "example": 188, + "start_line": 3161 + }, + { + "end_line": 3181, + "section": "Paragraphs", + "html": "aaa
\nbbb
aaa
\n\n\n", + "markdown": "> # Foo\n> bar\n> baz\n", + "example": 191, + "start_line": 3258 + }, + { + "end_line": 3283, + "section": "Block quotes", + "html": "Foo
\nbar\nbaz
\n
\n\n", + "markdown": "># Foo\n>bar\n> baz\n", + "example": 192, + "start_line": 3273 + }, + { + "end_line": 3298, + "section": "Block quotes", + "html": "Foo
\nbar\nbaz
\n
\n\n", + "markdown": " > # Foo\n > bar\n > baz\n", + "example": 193, + "start_line": 3288 + }, + { + "end_line": 3312, + "section": "Block quotes", + "html": "Foo
\nbar\nbaz
\n
> # Foo\n> bar\n> baz\n
\n",
+ "markdown": " > # Foo\n > bar\n > baz\n",
+ "example": 194,
+ "start_line": 3303
+ },
+ {
+ "end_line": 3328,
+ "section": "Block quotes",
+ "html": "\n\n", + "markdown": "> # Foo\n> bar\nbaz\n", + "example": 195, + "start_line": 3318 + }, + { + "end_line": 3344, + "section": "Block quotes", + "html": "Foo
\nbar\nbaz
\n
\n\n", + "markdown": "> bar\nbaz\n> foo\n", + "example": 196, + "start_line": 3334 + }, + { + "end_line": 3366, + "section": "Block quotes", + "html": "bar\nbaz\nfoo
\n
\n\nfoo
\n
\n\n\n
\n- foo
\n
\n\n\nfoo\n
bar\n
\n",
+ "markdown": "> foo\n bar\n",
+ "example": 199,
+ "start_line": 3396
+ },
+ {
+ "end_line": 3419,
+ "section": "Block quotes",
+ "html": "\n\n\n
foo
\n
\n",
+ "markdown": "> ```\nfoo\n```\n",
+ "example": 200,
+ "start_line": 3409
+ },
+ {
+ "end_line": 3433,
+ "section": "Block quotes",
+ "html": "\n\n", + "markdown": "> foo\n - bar\n", + "example": 201, + "start_line": 3425 + }, + { + "end_line": 3454, + "section": "Block quotes", + "html": "foo\n- bar
\n
\n\n", + "markdown": ">\n", + "example": 202, + "start_line": 3449 + }, + { + "end_line": 3464, + "section": "Block quotes", + "html": "
\n\n", + "markdown": ">\n> \n> \n", + "example": 203, + "start_line": 3457 + }, + { + "end_line": 3477, + "section": "Block quotes", + "html": "
\n\n", + "markdown": ">\n> foo\n> \n", + "example": 204, + "start_line": 3469 + }, + { + "end_line": 3493, + "section": "Block quotes", + "html": "foo
\n
\n\nfoo
\n
\n\n", + "markdown": "> foo\n\n> bar\n", + "example": 205, + "start_line": 3482 + }, + { + "end_line": 3512, + "section": "Block quotes", + "html": "bar
\n
\n\n", + "markdown": "> foo\n> bar\n", + "example": 206, + "start_line": 3504 + }, + { + "end_line": 3526, + "section": "Block quotes", + "html": "foo\nbar
\n
\n\n", + "markdown": "> foo\n>\n> bar\n", + "example": 207, + "start_line": 3517 + }, + { + "end_line": 3539, + "section": "Block quotes", + "html": "foo
\nbar
\n
foo
\n\n\n", + "markdown": "foo\n> bar\n", + "example": 208, + "start_line": 3531 + }, + { + "end_line": 3557, + "section": "Block quotes", + "html": "bar
\n
\n\naaa
\n
\n\n", + "markdown": "> aaa\n***\n> bbb\n", + "example": 209, + "start_line": 3545 + }, + { + "end_line": 3571, + "section": "Block quotes", + "html": "bbb
\n
\n\n", + "markdown": "> bar\nbaz\n", + "example": 210, + "start_line": 3563 + }, + { + "end_line": 3583, + "section": "Block quotes", + "html": "bar\nbaz
\n
\n\nbar
\n
baz
\n", + "markdown": "> bar\n\nbaz\n", + "example": 211, + "start_line": 3574 + }, + { + "end_line": 3595, + "section": "Block quotes", + "html": "\n\nbar
\n
baz
\n", + "markdown": "> bar\n>\nbaz\n", + "example": 212, + "start_line": 3586 + }, + { + "end_line": 3614, + "section": "Block quotes", + "html": "\n\n", + "markdown": "> > > foo\nbar\n", + "example": 213, + "start_line": 3602 + }, + { + "end_line": 3631, + "section": "Block quotes", + "html": "\n\n\n\nfoo\nbar
\n
\n\n", + "markdown": ">>> foo\n> bar\n>>baz\n", + "example": 214, + "start_line": 3617 + }, + { + "end_line": 3651, + "section": "Block quotes", + "html": "\n\n\n\nfoo\nbar\nbaz
\n
\n\n\ncode\n
\n\n", + "markdown": "> code\n\n> not code\n", + "example": 215, + "start_line": 3639 + }, + { + "end_line": 3709, + "section": "List items", + "html": "not code
\n
A paragraph\nwith two lines.
\nindented code\n
\n\n\n", + "markdown": "A paragraph\nwith two lines.\n\n indented code\n\n> A block quote.\n", + "example": 216, + "start_line": 3694 + }, + { + "end_line": 3735, + "section": "List items", + "html": "A block quote.
\n
A paragraph\nwith two lines.
\nindented code\n
\n\n\nA block quote.
\n
two
\n", + "markdown": "- one\n\n two\n", + "example": 218, + "start_line": 3749 + }, + { + "end_line": 3772, + "section": "List items", + "html": "one
\ntwo
\n two\n
\n",
+ "markdown": " - one\n\n two\n",
+ "example": 220,
+ "start_line": 3775
+ },
+ {
+ "end_line": 3799,
+ "section": "List items",
+ "html": "one
\ntwo
\n\n\n", + "markdown": " > > 1. one\n>>\n>> two\n", + "example": 222, + "start_line": 3810 + }, + { + "end_line": 3850, + "section": "List items", + "html": "\n\n\n
\n- \n
\none
\ntwo
\n
\n\n", + "markdown": ">>- one\n>>\n > > two\n", + "example": 223, + "start_line": 3837 + }, + { + "end_line": 3863, + "section": "List items", + "html": "\n\n\n
\n- one
\ntwo
\n
-one
\n2.two
\n", + "markdown": "-one\n\n2.two\n", + "example": 224, + "start_line": 3856 + }, + { + "end_line": 3881, + "section": "List items", + "html": "foo
\nbar
\nfoo
\nbar\n
\nbaz
\n\n\nbam
\n
Foo
\nbar\n\n\nbaz\n
\n1234567890. not ok
\n", + "markdown": "1234567890. not ok\n", + "example": 229, + "start_line": 3945 + }, + { + "end_line": 3960, + "section": "List items", + "html": "-1. not ok
\n", + "markdown": "-1. not ok\n", + "example": 232, + "start_line": 3974 + }, + { + "end_line": 4010, + "section": "List items", + "html": "foo
\nbar\n
\nfoo
\nbar\n
\nindented code\n
\nparagraph
\nmore code\n
\n",
+ "markdown": " indented code\n\nparagraph\n\n more code\n",
+ "example": 235,
+ "start_line": 4034
+ },
+ {
+ "end_line": 4065,
+ "section": "List items",
+ "html": "indented code\n
\nparagraph
\nmore code\n
\n indented code\n
\nparagraph
\nmore code\n
\nfoo
\nbar
\n", + "markdown": " foo\n\nbar\n", + "example": 238, + "start_line": 4098 + }, + { + "end_line": 4117, + "section": "List items", + "html": "bar
\n", + "markdown": "- foo\n\n bar\n", + "example": 239, + "start_line": 4108 + }, + { + "end_line": 4136, + "section": "List items", + "html": "foo
\nbar
\nbar\n
\nbaz\n
\nfoo
\n", + "markdown": "-\n\n foo\n", + "example": 243, + "start_line": 4193 + }, + { + "end_line": 4217, + "section": "List items", + "html": "foo\n*
\nfoo\n1.
\n", + "markdown": "foo\n*\n\nfoo\n1.\n", + "example": 248, + "start_line": 4262 + }, + { + "end_line": 4303, + "section": "List items", + "html": "A paragraph\nwith two lines.
\nindented code\n
\n\n\nA block quote.
\n
A paragraph\nwith two lines.
\nindented code\n
\n\n\nA block quote.
\n
A paragraph\nwith two lines.
\nindented code\n
\n\n\nA block quote.
\n
1. A paragraph\n with two lines.\n\n indented code\n\n > A block quote.\n
\n",
+ "markdown": " 1. A paragraph\n with two lines.\n\n indented code\n\n > A block quote.\n",
+ "example": 252,
+ "start_line": 4356
+ },
+ {
+ "end_line": 4405,
+ "section": "List items",
+ "html": "A paragraph\nwith two lines.
\nindented code\n
\n\n\nA block quote.
\n
\n\n", + "markdown": "> 1. > Blockquote\ncontinued here.\n", + "example": 255, + "start_line": 4423 + }, + { + "end_line": 4454, + "section": "List items", + "html": "\n
\n- \n
\n\n\nBlockquote\ncontinued here.
\n
\n\n", + "markdown": "> 1. > Blockquote\n> continued here.\n", + "example": 256, + "start_line": 4440 + }, + { + "end_line": 4488, + "section": "List items", + "html": "\n
\n- \n
\n\n\nBlockquote\ncontinued here.
\n
Foo
\nThe number of windows in my house is\n14. The number of doors is 6.
\n", + "markdown": "The number of windows in my house is\n14. The number of doors is 6.\n", + "example": 267, + "start_line": 4920 + }, + { + "end_line": 4938, + "section": "Lists", + "html": "The number of windows in my house is
\nfoo
\nbar
\nbaz
\nbaz
\nbim
\nfoo
\nnotcode
\nfoo
\ncode\n
\n",
+ "markdown": "- foo\n\n notcode\n\n- foo\n\n\n\n code\n",
+ "example": 272,
+ "start_line": 5016
+ },
+ {
+ "end_line": 5069,
+ "section": "Lists",
+ "html": "a
\nb
\nc
\na
\nb
\nc
\na
\nc
\na
\nb
\nc
\nd
\na
\nb
\nd
\nb\n\n\n
\nb
\nc
\n\n\nb
\n
\n\nb
\n
c\n
\nfoo\n
\nbar
\nfoo
\nbaz
\na
\nd
\nhi
lo`
!"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~
\n", + "markdown": "\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\-\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\\\\\]\\^\\_\\`\\{\\|\\}\\~\n", + "example": 289, + "start_line": 5389 + }, + { + "end_line": 5403, + "section": "Backslash escapes", + "html": "\\\t\\A\\a\\ \\3\\φ\\«
\n", + "markdown": "\\\t\\A\\a\\ \\3\\φ\\«\n", + "example": 290, + "start_line": 5399 + }, + { + "end_line": 5427, + "section": "Backslash escapes", + "html": "*not emphasized*\n<br/> not a tag\n[not a link](/foo)\n`not code`\n1. not a list\n* not a list\n# not a heading\n[foo]: /url "not a reference"
\n", + "markdown": "\\*not emphasized*\n\\\\emphasis
\n", + "markdown": "\\\\*emphasis*\n", + "example": 292, + "start_line": 5432 + }, + { + "end_line": 5447, + "section": "Backslash escapes", + "html": "foo
\nbar
\\[\\`
\\[\\]\n
\n",
+ "markdown": " \\[\\]\n",
+ "example": 295,
+ "start_line": 5460
+ },
+ {
+ "end_line": 5475,
+ "section": "Backslash escapes",
+ "html": "\\[\\]\n
\n",
+ "markdown": "~~~\n\\[\\]\n~~~\n",
+ "example": 296,
+ "start_line": 5468
+ },
+ {
+ "end_line": 5482,
+ "section": "Backslash escapes",
+ "html": "\n",
+ "markdown": "foo\n
\n",
+ "markdown": "``` foo\\+bar\nfoo\n```\n",
+ "example": 301,
+ "start_line": 5511
+ },
+ {
+ "end_line": 5546,
+ "section": "Entity and numeric character references",
+ "html": "& © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸
\n", + "markdown": " & © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸\n", + "example": 302, + "start_line": 5538 + }, + { + "end_line": 5561, + "section": "Entity and numeric character references", + "html": "# Ӓ Ϡ � �
\n", + "markdown": "# Ӓ Ϡ \n", + "example": 303, + "start_line": 5557 + }, + { + "end_line": 5574, + "section": "Entity and numeric character references", + "html": "" ആ ಫ
\n", + "markdown": "" ആ ಫ\n", + "example": 304, + "start_line": 5570 + }, + { + "end_line": 5585, + "section": "Entity and numeric character references", + "html": "  &x; &#; &#x;\n&ThisIsNotDefined; &hi?;
\n", + "markdown": "  &x; \n&ThisIsNotDefined; &hi?;\n", + "example": 305, + "start_line": 5579 + }, + { + "end_line": 5596, + "section": "Entity and numeric character references", + "html": "©
\n", + "markdown": "©\n", + "example": 306, + "start_line": 5592 + }, + { + "end_line": 5606, + "section": "Entity and numeric character references", + "html": "&MadeUpEntity;
\n", + "markdown": "&MadeUpEntity;\n", + "example": 307, + "start_line": 5602 + }, + { + "end_line": 5617, + "section": "Entity and numeric character references", + "html": "\n", + "markdown": "\n", + "example": 308, + "start_line": 5613 + }, + { + "end_line": 5624, + "section": "Entity and numeric character references", + "html": "\n", + "markdown": "[foo](/föö \"föö\")\n", + "example": 309, + "start_line": 5620 + }, + { + "end_line": 5633, + "section": "Entity and numeric character references", + "html": "\n", + "markdown": "[foo]\n\n[foo]: /föö \"föö\"\n", + "example": 310, + "start_line": 5627 + }, + { + "end_line": 5643, + "section": "Entity and numeric character references", + "html": "foo\n
\n",
+ "markdown": "``` föö\nfoo\n```\n",
+ "example": 311,
+ "start_line": 5636
+ },
+ {
+ "end_line": 5653,
+ "section": "Entity and numeric character references",
+ "html": "föö
föfö\n
\n",
+ "markdown": " föfö\n",
+ "example": 313,
+ "start_line": 5656
+ },
+ {
+ "end_line": 5682,
+ "section": "Code spans",
+ "html": "foo
foo ` bar
``
foo
foo bar baz
a b
foo `` bar
foo\\
bar`
*foo*
[not a link](/foo
)
<a href="
">`
<http://foo.bar.
baz>`
```foo``
\n", + "markdown": "```foo``\n", + "example": 328, + "start_line": 5832 + }, + { + "end_line": 5843, + "section": "Code spans", + "html": "`foo
\n", + "markdown": "`foo\n", + "example": 329, + "start_line": 5839 + }, + { + "end_line": 5852, + "section": "Code spans", + "html": "`foobar
foo bar
\n", + "markdown": "*foo bar*\n", + "example": 331, + "start_line": 6061 + }, + { + "end_line": 6075, + "section": "Emphasis and strong emphasis", + "html": "a * foo bar*
\n", + "markdown": "a * foo bar*\n", + "example": 332, + "start_line": 6071 + }, + { + "end_line": 6086, + "section": "Emphasis and strong emphasis", + "html": "a*"foo"*
\n", + "markdown": "a*\"foo\"*\n", + "example": 333, + "start_line": 6082 + }, + { + "end_line": 6095, + "section": "Emphasis and strong emphasis", + "html": "* a *
\n", + "markdown": "* a *\n", + "example": 334, + "start_line": 6091 + }, + { + "end_line": 6104, + "section": "Emphasis and strong emphasis", + "html": "foobar
\n", + "markdown": "foo*bar*\n", + "example": 335, + "start_line": 6100 + }, + { + "end_line": 6111, + "section": "Emphasis and strong emphasis", + "html": "5678
\n", + "markdown": "5*6*78\n", + "example": 336, + "start_line": 6107 + }, + { + "end_line": 6120, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "_foo bar_\n", + "example": 337, + "start_line": 6116 + }, + { + "end_line": 6130, + "section": "Emphasis and strong emphasis", + "html": "_ foo bar_
\n", + "markdown": "_ foo bar_\n", + "example": 338, + "start_line": 6126 + }, + { + "end_line": 6140, + "section": "Emphasis and strong emphasis", + "html": "a_"foo"_
\n", + "markdown": "a_\"foo\"_\n", + "example": 339, + "start_line": 6136 + }, + { + "end_line": 6149, + "section": "Emphasis and strong emphasis", + "html": "foo_bar_
\n", + "markdown": "foo_bar_\n", + "example": 340, + "start_line": 6145 + }, + { + "end_line": 6156, + "section": "Emphasis and strong emphasis", + "html": "5_6_78
\n", + "markdown": "5_6_78\n", + "example": 341, + "start_line": 6152 + }, + { + "end_line": 6163, + "section": "Emphasis and strong emphasis", + "html": "пристаням_стремятся_
\n", + "markdown": "пристаням_стремятся_\n", + "example": 342, + "start_line": 6159 + }, + { + "end_line": 6173, + "section": "Emphasis and strong emphasis", + "html": "aa_"bb"_cc
\n", + "markdown": "aa_\"bb\"_cc\n", + "example": 343, + "start_line": 6169 + }, + { + "end_line": 6184, + "section": "Emphasis and strong emphasis", + "html": "foo-(bar)
\n", + "markdown": "foo-_(bar)_\n", + "example": 344, + "start_line": 6180 + }, + { + "end_line": 6196, + "section": "Emphasis and strong emphasis", + "html": "_foo*
\n", + "markdown": "_foo*\n", + "example": 345, + "start_line": 6192 + }, + { + "end_line": 6206, + "section": "Emphasis and strong emphasis", + "html": "*foo bar *
\n", + "markdown": "*foo bar *\n", + "example": 346, + "start_line": 6202 + }, + { + "end_line": 6217, + "section": "Emphasis and strong emphasis", + "html": "*foo bar\n*
\n", + "markdown": "*foo bar\n*\n", + "example": 347, + "start_line": 6211 + }, + { + "end_line": 6228, + "section": "Emphasis and strong emphasis", + "html": "*(*foo)
\n", + "markdown": "*(*foo)\n", + "example": 348, + "start_line": 6224 + }, + { + "end_line": 6238, + "section": "Emphasis and strong emphasis", + "html": "(foo)
\n", + "markdown": "*(*foo*)*\n", + "example": 349, + "start_line": 6234 + }, + { + "end_line": 6247, + "section": "Emphasis and strong emphasis", + "html": "foobar
\n", + "markdown": "*foo*bar\n", + "example": 350, + "start_line": 6243 + }, + { + "end_line": 6260, + "section": "Emphasis and strong emphasis", + "html": "_foo bar _
\n", + "markdown": "_foo bar _\n", + "example": 351, + "start_line": 6256 + }, + { + "end_line": 6270, + "section": "Emphasis and strong emphasis", + "html": "_(_foo)
\n", + "markdown": "_(_foo)\n", + "example": 352, + "start_line": 6266 + }, + { + "end_line": 6279, + "section": "Emphasis and strong emphasis", + "html": "(foo)
\n", + "markdown": "_(_foo_)_\n", + "example": 353, + "start_line": 6275 + }, + { + "end_line": 6288, + "section": "Emphasis and strong emphasis", + "html": "_foo_bar
\n", + "markdown": "_foo_bar\n", + "example": 354, + "start_line": 6284 + }, + { + "end_line": 6295, + "section": "Emphasis and strong emphasis", + "html": "_пристаням_стремятся
\n", + "markdown": "_пристаням_стремятся\n", + "example": 355, + "start_line": 6291 + }, + { + "end_line": 6302, + "section": "Emphasis and strong emphasis", + "html": "foo_bar_baz
\n", + "markdown": "_foo_bar_baz_\n", + "example": 356, + "start_line": 6298 + }, + { + "end_line": 6313, + "section": "Emphasis and strong emphasis", + "html": "(bar).
\n", + "markdown": "_(bar)_.\n", + "example": 357, + "start_line": 6309 + }, + { + "end_line": 6322, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "**foo bar**\n", + "example": 358, + "start_line": 6318 + }, + { + "end_line": 6332, + "section": "Emphasis and strong emphasis", + "html": "** foo bar**
\n", + "markdown": "** foo bar**\n", + "example": 359, + "start_line": 6328 + }, + { + "end_line": 6343, + "section": "Emphasis and strong emphasis", + "html": "a**"foo"**
\n", + "markdown": "a**\"foo\"**\n", + "example": 360, + "start_line": 6339 + }, + { + "end_line": 6352, + "section": "Emphasis and strong emphasis", + "html": "foobar
\n", + "markdown": "foo**bar**\n", + "example": 361, + "start_line": 6348 + }, + { + "end_line": 6361, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "__foo bar__\n", + "example": 362, + "start_line": 6357 + }, + { + "end_line": 6371, + "section": "Emphasis and strong emphasis", + "html": "__ foo bar__
\n", + "markdown": "__ foo bar__\n", + "example": 363, + "start_line": 6367 + }, + { + "end_line": 6381, + "section": "Emphasis and strong emphasis", + "html": "__\nfoo bar__
\n", + "markdown": "__\nfoo bar__\n", + "example": 364, + "start_line": 6375 + }, + { + "end_line": 6391, + "section": "Emphasis and strong emphasis", + "html": "a__"foo"__
\n", + "markdown": "a__\"foo\"__\n", + "example": 365, + "start_line": 6387 + }, + { + "end_line": 6400, + "section": "Emphasis and strong emphasis", + "html": "foo__bar__
\n", + "markdown": "foo__bar__\n", + "example": 366, + "start_line": 6396 + }, + { + "end_line": 6407, + "section": "Emphasis and strong emphasis", + "html": "5__6__78
\n", + "markdown": "5__6__78\n", + "example": 367, + "start_line": 6403 + }, + { + "end_line": 6414, + "section": "Emphasis and strong emphasis", + "html": "пристаням__стремятся__
\n", + "markdown": "пристаням__стремятся__\n", + "example": 368, + "start_line": 6410 + }, + { + "end_line": 6421, + "section": "Emphasis and strong emphasis", + "html": "foo, bar, baz
\n", + "markdown": "__foo, __bar__, baz__\n", + "example": 369, + "start_line": 6417 + }, + { + "end_line": 6432, + "section": "Emphasis and strong emphasis", + "html": "foo-(bar)
\n", + "markdown": "foo-__(bar)__\n", + "example": 370, + "start_line": 6428 + }, + { + "end_line": 6445, + "section": "Emphasis and strong emphasis", + "html": "**foo bar **
\n", + "markdown": "**foo bar **\n", + "example": 371, + "start_line": 6441 + }, + { + "end_line": 6458, + "section": "Emphasis and strong emphasis", + "html": "**(**foo)
\n", + "markdown": "**(**foo)\n", + "example": 372, + "start_line": 6454 + }, + { + "end_line": 6468, + "section": "Emphasis and strong emphasis", + "html": "(foo)
\n", + "markdown": "*(**foo**)*\n", + "example": 373, + "start_line": 6464 + }, + { + "end_line": 6477, + "section": "Emphasis and strong emphasis", + "html": "Gomphocarpus (Gomphocarpus physocarpus, syn.\nAsclepias physocarpa)
\n", + "markdown": "**Gomphocarpus (*Gomphocarpus physocarpus*, syn.\n*Asclepias physocarpa*)**\n", + "example": 374, + "start_line": 6471 + }, + { + "end_line": 6484, + "section": "Emphasis and strong emphasis", + "html": "foo "bar" foo
\n", + "markdown": "**foo \"*bar*\" foo**\n", + "example": 375, + "start_line": 6480 + }, + { + "end_line": 6493, + "section": "Emphasis and strong emphasis", + "html": "foobar
\n", + "markdown": "**foo**bar\n", + "example": 376, + "start_line": 6489 + }, + { + "end_line": 6505, + "section": "Emphasis and strong emphasis", + "html": "__foo bar __
\n", + "markdown": "__foo bar __\n", + "example": 377, + "start_line": 6501 + }, + { + "end_line": 6515, + "section": "Emphasis and strong emphasis", + "html": "__(__foo)
\n", + "markdown": "__(__foo)\n", + "example": 378, + "start_line": 6511 + }, + { + "end_line": 6525, + "section": "Emphasis and strong emphasis", + "html": "(foo)
\n", + "markdown": "_(__foo__)_\n", + "example": 379, + "start_line": 6521 + }, + { + "end_line": 6534, + "section": "Emphasis and strong emphasis", + "html": "__foo__bar
\n", + "markdown": "__foo__bar\n", + "example": 380, + "start_line": 6530 + }, + { + "end_line": 6541, + "section": "Emphasis and strong emphasis", + "html": "__пристаням__стремятся
\n", + "markdown": "__пристаням__стремятся\n", + "example": 381, + "start_line": 6537 + }, + { + "end_line": 6548, + "section": "Emphasis and strong emphasis", + "html": "foo__bar__baz
\n", + "markdown": "__foo__bar__baz__\n", + "example": 382, + "start_line": 6544 + }, + { + "end_line": 6559, + "section": "Emphasis and strong emphasis", + "html": "(bar).
\n", + "markdown": "__(bar)__.\n", + "example": 383, + "start_line": 6555 + }, + { + "end_line": 6571, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "*foo [bar](/url)*\n", + "example": 384, + "start_line": 6567 + }, + { + "end_line": 6580, + "section": "Emphasis and strong emphasis", + "html": "foo\nbar
\n", + "markdown": "*foo\nbar*\n", + "example": 385, + "start_line": 6574 + }, + { + "end_line": 6590, + "section": "Emphasis and strong emphasis", + "html": "foo bar baz
\n", + "markdown": "_foo __bar__ baz_\n", + "example": 386, + "start_line": 6586 + }, + { + "end_line": 6597, + "section": "Emphasis and strong emphasis", + "html": "foo bar baz
\n", + "markdown": "_foo _bar_ baz_\n", + "example": 387, + "start_line": 6593 + }, + { + "end_line": 6604, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "__foo_ bar_\n", + "example": 388, + "start_line": 6600 + }, + { + "end_line": 6611, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "*foo *bar**\n", + "example": 389, + "start_line": 6607 + }, + { + "end_line": 6618, + "section": "Emphasis and strong emphasis", + "html": "foo bar baz
\n", + "markdown": "*foo **bar** baz*\n", + "example": 390, + "start_line": 6614 + }, + { + "end_line": 6624, + "section": "Emphasis and strong emphasis", + "html": "foobarbaz
\n", + "markdown": "*foo**bar**baz*\n", + "example": 391, + "start_line": 6620 + }, + { + "end_line": 6649, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "***foo** bar*\n", + "example": 392, + "start_line": 6645 + }, + { + "end_line": 6656, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "*foo **bar***\n", + "example": 393, + "start_line": 6652 + }, + { + "end_line": 6663, + "section": "Emphasis and strong emphasis", + "html": "foobar
\n", + "markdown": "*foo**bar***\n", + "example": 394, + "start_line": 6659 + }, + { + "end_line": 6672, + "section": "Emphasis and strong emphasis", + "html": "foo bar baz bim bop
\n", + "markdown": "*foo **bar *baz* bim** bop*\n", + "example": 395, + "start_line": 6668 + }, + { + "end_line": 6679, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "*foo [*bar*](/url)*\n", + "example": 396, + "start_line": 6675 + }, + { + "end_line": 6688, + "section": "Emphasis and strong emphasis", + "html": "** is not an empty emphasis
\n", + "markdown": "** is not an empty emphasis\n", + "example": 397, + "start_line": 6684 + }, + { + "end_line": 6695, + "section": "Emphasis and strong emphasis", + "html": "**** is not an empty strong emphasis
\n", + "markdown": "**** is not an empty strong emphasis\n", + "example": 398, + "start_line": 6691 + }, + { + "end_line": 6708, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "**foo [bar](/url)**\n", + "example": 399, + "start_line": 6704 + }, + { + "end_line": 6717, + "section": "Emphasis and strong emphasis", + "html": "foo\nbar
\n", + "markdown": "**foo\nbar**\n", + "example": 400, + "start_line": 6711 + }, + { + "end_line": 6727, + "section": "Emphasis and strong emphasis", + "html": "foo bar baz
\n", + "markdown": "__foo _bar_ baz__\n", + "example": 401, + "start_line": 6723 + }, + { + "end_line": 6734, + "section": "Emphasis and strong emphasis", + "html": "foo bar baz
\n", + "markdown": "__foo __bar__ baz__\n", + "example": 402, + "start_line": 6730 + }, + { + "end_line": 6741, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "____foo__ bar__\n", + "example": 403, + "start_line": 6737 + }, + { + "end_line": 6748, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "**foo **bar****\n", + "example": 404, + "start_line": 6744 + }, + { + "end_line": 6755, + "section": "Emphasis and strong emphasis", + "html": "foo bar baz
\n", + "markdown": "**foo *bar* baz**\n", + "example": 405, + "start_line": 6751 + }, + { + "end_line": 6762, + "section": "Emphasis and strong emphasis", + "html": "foobarbaz
\n", + "markdown": "**foo*bar*baz**\n", + "example": 406, + "start_line": 6758 + }, + { + "end_line": 6769, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "***foo* bar**\n", + "example": 407, + "start_line": 6765 + }, + { + "end_line": 6776, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "**foo *bar***\n", + "example": 408, + "start_line": 6772 + }, + { + "end_line": 6787, + "section": "Emphasis and strong emphasis", + "html": "foo bar baz\nbim bop
\n", + "markdown": "**foo *bar **baz**\nbim* bop**\n", + "example": 409, + "start_line": 6781 + }, + { + "end_line": 6794, + "section": "Emphasis and strong emphasis", + "html": "foo bar
\n", + "markdown": "**foo [*bar*](/url)**\n", + "example": 410, + "start_line": 6790 + }, + { + "end_line": 6803, + "section": "Emphasis and strong emphasis", + "html": "__ is not an empty emphasis
\n", + "markdown": "__ is not an empty emphasis\n", + "example": 411, + "start_line": 6799 + }, + { + "end_line": 6810, + "section": "Emphasis and strong emphasis", + "html": "____ is not an empty strong emphasis
\n", + "markdown": "____ is not an empty strong emphasis\n", + "example": 412, + "start_line": 6806 + }, + { + "end_line": 6820, + "section": "Emphasis and strong emphasis", + "html": "foo ***
\n", + "markdown": "foo ***\n", + "example": 413, + "start_line": 6816 + }, + { + "end_line": 6827, + "section": "Emphasis and strong emphasis", + "html": "foo *
\n", + "markdown": "foo *\\**\n", + "example": 414, + "start_line": 6823 + }, + { + "end_line": 6834, + "section": "Emphasis and strong emphasis", + "html": "foo _
\n", + "markdown": "foo *_*\n", + "example": 415, + "start_line": 6830 + }, + { + "end_line": 6841, + "section": "Emphasis and strong emphasis", + "html": "foo *****
\n", + "markdown": "foo *****\n", + "example": 416, + "start_line": 6837 + }, + { + "end_line": 6848, + "section": "Emphasis and strong emphasis", + "html": "foo *
\n", + "markdown": "foo **\\***\n", + "example": 417, + "start_line": 6844 + }, + { + "end_line": 6855, + "section": "Emphasis and strong emphasis", + "html": "foo _
\n", + "markdown": "foo **_**\n", + "example": 418, + "start_line": 6851 + }, + { + "end_line": 6866, + "section": "Emphasis and strong emphasis", + "html": "*foo
\n", + "markdown": "**foo*\n", + "example": 419, + "start_line": 6862 + }, + { + "end_line": 6873, + "section": "Emphasis and strong emphasis", + "html": "foo*
\n", + "markdown": "*foo**\n", + "example": 420, + "start_line": 6869 + }, + { + "end_line": 6880, + "section": "Emphasis and strong emphasis", + "html": "*foo
\n", + "markdown": "***foo**\n", + "example": 421, + "start_line": 6876 + }, + { + "end_line": 6887, + "section": "Emphasis and strong emphasis", + "html": "***foo
\n", + "markdown": "****foo*\n", + "example": 422, + "start_line": 6883 + }, + { + "end_line": 6894, + "section": "Emphasis and strong emphasis", + "html": "foo*
\n", + "markdown": "**foo***\n", + "example": 423, + "start_line": 6890 + }, + { + "end_line": 6901, + "section": "Emphasis and strong emphasis", + "html": "foo***
\n", + "markdown": "*foo****\n", + "example": 424, + "start_line": 6897 + }, + { + "end_line": 6911, + "section": "Emphasis and strong emphasis", + "html": "foo ___
\n", + "markdown": "foo ___\n", + "example": 425, + "start_line": 6907 + }, + { + "end_line": 6918, + "section": "Emphasis and strong emphasis", + "html": "foo _
\n", + "markdown": "foo _\\__\n", + "example": 426, + "start_line": 6914 + }, + { + "end_line": 6925, + "section": "Emphasis and strong emphasis", + "html": "foo *
\n", + "markdown": "foo _*_\n", + "example": 427, + "start_line": 6921 + }, + { + "end_line": 6932, + "section": "Emphasis and strong emphasis", + "html": "foo _____
\n", + "markdown": "foo _____\n", + "example": 428, + "start_line": 6928 + }, + { + "end_line": 6939, + "section": "Emphasis and strong emphasis", + "html": "foo _
\n", + "markdown": "foo __\\___\n", + "example": 429, + "start_line": 6935 + }, + { + "end_line": 6946, + "section": "Emphasis and strong emphasis", + "html": "foo *
\n", + "markdown": "foo __*__\n", + "example": 430, + "start_line": 6942 + }, + { + "end_line": 6953, + "section": "Emphasis and strong emphasis", + "html": "_foo
\n", + "markdown": "__foo_\n", + "example": 431, + "start_line": 6949 + }, + { + "end_line": 6964, + "section": "Emphasis and strong emphasis", + "html": "foo_
\n", + "markdown": "_foo__\n", + "example": 432, + "start_line": 6960 + }, + { + "end_line": 6971, + "section": "Emphasis and strong emphasis", + "html": "_foo
\n", + "markdown": "___foo__\n", + "example": 433, + "start_line": 6967 + }, + { + "end_line": 6978, + "section": "Emphasis and strong emphasis", + "html": "___foo
\n", + "markdown": "____foo_\n", + "example": 434, + "start_line": 6974 + }, + { + "end_line": 6985, + "section": "Emphasis and strong emphasis", + "html": "foo_
\n", + "markdown": "__foo___\n", + "example": 435, + "start_line": 6981 + }, + { + "end_line": 6992, + "section": "Emphasis and strong emphasis", + "html": "foo___
\n", + "markdown": "_foo____\n", + "example": 436, + "start_line": 6988 + }, + { + "end_line": 7002, + "section": "Emphasis and strong emphasis", + "html": "foo
\n", + "markdown": "**foo**\n", + "example": 437, + "start_line": 6998 + }, + { + "end_line": 7009, + "section": "Emphasis and strong emphasis", + "html": "foo
\n", + "markdown": "*_foo_*\n", + "example": 438, + "start_line": 7005 + }, + { + "end_line": 7016, + "section": "Emphasis and strong emphasis", + "html": "foo
\n", + "markdown": "__foo__\n", + "example": 439, + "start_line": 7012 + }, + { + "end_line": 7023, + "section": "Emphasis and strong emphasis", + "html": "foo
\n", + "markdown": "_*foo*_\n", + "example": 440, + "start_line": 7019 + }, + { + "end_line": 7033, + "section": "Emphasis and strong emphasis", + "html": "foo
\n", + "markdown": "****foo****\n", + "example": 441, + "start_line": 7029 + }, + { + "end_line": 7040, + "section": "Emphasis and strong emphasis", + "html": "foo
\n", + "markdown": "____foo____\n", + "example": 442, + "start_line": 7036 + }, + { + "end_line": 7051, + "section": "Emphasis and strong emphasis", + "html": "foo
\n", + "markdown": "******foo******\n", + "example": 443, + "start_line": 7047 + }, + { + "end_line": 7060, + "section": "Emphasis and strong emphasis", + "html": "foo
\n", + "markdown": "***foo***\n", + "example": 444, + "start_line": 7056 + }, + { + "end_line": 7067, + "section": "Emphasis and strong emphasis", + "html": "foo
\n", + "markdown": "_____foo_____\n", + "example": 445, + "start_line": 7063 + }, + { + "end_line": 7076, + "section": "Emphasis and strong emphasis", + "html": "foo _bar baz_
\n", + "markdown": "*foo _bar* baz_\n", + "example": 446, + "start_line": 7072 + }, + { + "end_line": 7083, + "section": "Emphasis and strong emphasis", + "html": "foo bar *baz bim bam
\n", + "markdown": "*foo __bar *baz bim__ bam*\n", + "example": 447, + "start_line": 7079 + }, + { + "end_line": 7092, + "section": "Emphasis and strong emphasis", + "html": "**foo bar baz
\n", + "markdown": "**foo **bar baz**\n", + "example": 448, + "start_line": 7088 + }, + { + "end_line": 7099, + "section": "Emphasis and strong emphasis", + "html": "*foo bar baz
\n", + "markdown": "*foo *bar baz*\n", + "example": 449, + "start_line": 7095 + }, + { + "end_line": 7108, + "section": "Emphasis and strong emphasis", + "html": "*bar*
\n", + "markdown": "*[bar*](/url)\n", + "example": 450, + "start_line": 7104 + }, + { + "end_line": 7115, + "section": "Emphasis and strong emphasis", + "html": "_foo bar_
\n", + "markdown": "_foo [bar_](/url)\n", + "example": 451, + "start_line": 7111 + }, + { + "end_line": 7122, + "section": "Emphasis and strong emphasis", + "html": "*
\n", + "markdown": "*\n", + "example": 452, + "start_line": 7118 + }, + { + "end_line": 7129, + "section": "Emphasis and strong emphasis", + "html": "\n", + "markdown": "**\n", + "example": 453, + "start_line": 7125 + }, + { + "end_line": 7136, + "section": "Emphasis and strong emphasis", + "html": "\n", + "markdown": "__\n", + "example": 454, + "start_line": 7132 + }, + { + "end_line": 7143, + "section": "Emphasis and strong emphasis", + "html": "a *
a _
[link](/my uri)
\n", + "markdown": "[link](/my uri)\n", + "example": 463, + "start_line": 7276 + }, + { + "end_line": 7287, + "section": "Links", + "html": "[link](</my uri>)
\n", + "markdown": "[link]([link](foo\nbar)
\n", + "markdown": "[link](foo\nbar)\n", + "example": 465, + "start_line": 7290 + }, + { + "end_line": 7305, + "section": "Links", + "html": "[link](
[link](/url "title "and" title")
\n", + "markdown": "[link](/url \"title \"and\" title\")\n", + "example": 479, + "start_line": 7438 + }, + { + "end_line": 7451, + "section": "Links", + "html": "\n", + "markdown": "[link](/url 'title \"and\" title')\n", + "example": 480, + "start_line": 7447 + }, + { + "end_line": 7476, + "section": "Links", + "html": "\n", + "markdown": "[link]( /uri\n \"title\" )\n", + "example": 481, + "start_line": 7471 + }, + { + "end_line": 7486, + "section": "Links", + "html": "[link] (/uri)
\n", + "markdown": "[link] (/uri)\n", + "example": 482, + "start_line": 7482 + }, + { + "end_line": 7496, + "section": "Links", + "html": "\n", + "markdown": "[link [foo [bar]]](/uri)\n", + "example": 483, + "start_line": 7492 + }, + { + "end_line": 7503, + "section": "Links", + "html": "[link] bar](/uri)
\n", + "markdown": "[link] bar](/uri)\n", + "example": 484, + "start_line": 7499 + }, + { + "end_line": 7510, + "section": "Links", + "html": "[link bar
\n", + "markdown": "[link [bar](/uri)\n", + "example": 485, + "start_line": 7506 + }, + { + "end_line": 7517, + "section": "Links", + "html": "\n", + "markdown": "[link \\[bar](/uri)\n", + "example": 486, + "start_line": 7513 + }, + { + "end_line": 7526, + "section": "Links", + "html": "\n", + "markdown": "[link *foo **bar** `#`*](/uri)\n", + "example": 487, + "start_line": 7522 + }, + { + "end_line": 7533, + "section": "Links", + "html": "\n", + "markdown": "[![moon](moon.jpg)](/uri)\n", + "example": 488, + "start_line": 7529 + }, + { + "end_line": 7542, + "section": "Links", + "html": "[foo bar](/uri)
\n", + "markdown": "[foo [bar](/uri)](/uri)\n", + "example": 489, + "start_line": 7538 + }, + { + "end_line": 7549, + "section": "Links", + "html": "[foo [bar baz](/uri)](/uri)
\n", + "markdown": "[foo *[bar [baz](/uri)](/uri)*](/uri)\n", + "example": 490, + "start_line": 7545 + }, + { + "end_line": 7556, + "section": "Links", + "html": "\n", + "markdown": "![[[foo](uri1)](uri2)](uri3)\n", + "example": 491, + "start_line": 7552 + }, + { + "end_line": 7566, + "section": "Links", + "html": "*foo*
\n", + "markdown": "*[foo*](/uri)\n", + "example": 492, + "start_line": 7562 + }, + { + "end_line": 7573, + "section": "Links", + "html": "\n", + "markdown": "[foo *bar](baz*)\n", + "example": 493, + "start_line": 7569 + }, + { + "end_line": 7583, + "section": "Links", + "html": "foo [bar baz]
\n", + "markdown": "*foo [bar* baz]\n", + "example": 494, + "start_line": 7579 + }, + { + "end_line": 7593, + "section": "Links", + "html": "[foo
[foo](/uri)
[foohttp://example.com/?search=](uri)
\n", + "markdown": "[foo*foo*
\n", + "markdown": "*[foo*][ref]\n\n[ref]: /uri\n", + "example": 505, + "start_line": 7720 + }, + { + "end_line": 7735, + "section": "Links", + "html": "\n", + "markdown": "[foo *bar][ref]\n\n[ref]: /uri\n", + "example": 506, + "start_line": 7729 + }, + { + "end_line": 7747, + "section": "Links", + "html": "[foo
[foo][ref]
[foohttp://example.com/?search=][ref]
\n", + "markdown": "[fooТолпой is a Russian word.
\n", + "markdown": "[Толпой][Толпой] is a Russian word.\n\n[ТОЛПОЙ]: /url\n", + "example": 511, + "start_line": 7781 + }, + { + "end_line": 7800, + "section": "Links", + "html": "\n", + "markdown": "[Foo\n bar]: /url\n\n[Baz][Foo bar]\n", + "example": 512, + "start_line": 7793 + }, + { + "end_line": 7812, + "section": "Links", + "html": "[foo] bar
\n", + "markdown": "[foo] [bar]\n\n[bar]: /url \"title\"\n", + "example": 513, + "start_line": 7806 + }, + { + "end_line": 7823, + "section": "Links", + "html": "[foo]\nbar
\n", + "markdown": "[foo]\n[bar]\n\n[bar]: /url \"title\"\n", + "example": 514, + "start_line": 7815 + }, + { + "end_line": 7864, + "section": "Links", + "html": "\n", + "markdown": "[foo]: /url1\n\n[foo]: /url2\n\n[bar][foo]\n", + "example": 515, + "start_line": 7856 + }, + { + "end_line": 7877, + "section": "Links", + "html": "[bar][foo!]
\n", + "markdown": "[bar][foo\\!]\n\n[foo!]: /url\n", + "example": 516, + "start_line": 7871 + }, + { + "end_line": 7890, + "section": "Links", + "html": "[foo][ref[]
\n[ref[]: /uri
\n", + "markdown": "[foo][ref[]\n\n[ref[]: /uri\n", + "example": 517, + "start_line": 7883 + }, + { + "end_line": 7900, + "section": "Links", + "html": "[foo][ref[bar]]
\n[ref[bar]]: /uri
\n", + "markdown": "[foo][ref[bar]]\n\n[ref[bar]]: /uri\n", + "example": 518, + "start_line": 7893 + }, + { + "end_line": 7910, + "section": "Links", + "html": "[[[foo]]]
\n[[[foo]]]: /url
\n", + "markdown": "[[[foo]]]\n\n[[[foo]]]: /url\n", + "example": 519, + "start_line": 7903 + }, + { + "end_line": 7919, + "section": "Links", + "html": "\n", + "markdown": "[foo][ref\\[]\n\n[ref\\[]: /uri\n", + "example": 520, + "start_line": 7913 + }, + { + "end_line": 7930, + "section": "Links", + "html": "\n", + "markdown": "[bar\\\\]: /uri\n\n[bar\\\\]\n", + "example": 521, + "start_line": 7924 + }, + { + "end_line": 7942, + "section": "Links", + "html": "[]
\n[]: /uri
\n", + "markdown": "[]\n\n[]: /uri\n", + "example": 522, + "start_line": 7935 + }, + { + "end_line": 7956, + "section": "Links", + "html": "[\n]
\n[\n]: /uri
\n", + "markdown": "[\n ]\n\n[\n ]: /uri\n", + "example": 523, + "start_line": 7945 + }, + { + "end_line": 7974, + "section": "Links", + "html": "\n", + "markdown": "[foo][]\n\n[foo]: /url \"title\"\n", + "example": 524, + "start_line": 7968 + }, + { + "end_line": 7983, + "section": "Links", + "html": "\n", + "markdown": "[*foo* bar][]\n\n[*foo* bar]: /url \"title\"\n", + "example": 525, + "start_line": 7977 + }, + { + "end_line": 7994, + "section": "Links", + "html": "\n", + "markdown": "[Foo][]\n\n[foo]: /url \"title\"\n", + "example": 526, + "start_line": 7988 + }, + { + "end_line": 8009, + "section": "Links", + "html": "foo\n[]
\n", + "markdown": "[foo] \n[]\n\n[foo]: /url \"title\"\n", + "example": 527, + "start_line": 8001 + }, + { + "end_line": 8027, + "section": "Links", + "html": "\n", + "markdown": "[foo]\n\n[foo]: /url \"title\"\n", + "example": 528, + "start_line": 8021 + }, + { + "end_line": 8036, + "section": "Links", + "html": "\n", + "markdown": "[*foo* bar]\n\n[*foo* bar]: /url \"title\"\n", + "example": 529, + "start_line": 8030 + }, + { + "end_line": 8045, + "section": "Links", + "html": "[foo bar]
\n", + "markdown": "[[*foo* bar]]\n\n[*foo* bar]: /url \"title\"\n", + "example": 530, + "start_line": 8039 + }, + { + "end_line": 8054, + "section": "Links", + "html": "[[bar foo
\n", + "markdown": "[[bar [foo]\n\n[foo]: /url\n", + "example": 531, + "start_line": 8048 + }, + { + "end_line": 8065, + "section": "Links", + "html": "\n", + "markdown": "[Foo]\n\n[foo]: /url \"title\"\n", + "example": 532, + "start_line": 8059 + }, + { + "end_line": 8076, + "section": "Links", + "html": "foo bar
\n", + "markdown": "[foo] bar\n\n[foo]: /url\n", + "example": 533, + "start_line": 8070 + }, + { + "end_line": 8088, + "section": "Links", + "html": "[foo]
\n", + "markdown": "\\[foo]\n\n[foo]: /url \"title\"\n", + "example": 534, + "start_line": 8082 + }, + { + "end_line": 8100, + "section": "Links", + "html": "*foo*
\n", + "markdown": "[foo*]: /url\n\n*[foo*]\n", + "example": 535, + "start_line": 8094 + }, + { + "end_line": 8113, + "section": "Links", + "html": "\n", + "markdown": "[foo][bar]\n\n[foo]: /url1\n[bar]: /url2\n", + "example": 536, + "start_line": 8106 + }, + { + "end_line": 8121, + "section": "Links", + "html": "\n", + "markdown": "[foo][]\n\n[foo]: /url1\n", + "example": 537, + "start_line": 8115 + }, + { + "end_line": 8131, + "section": "Links", + "html": "\n", + "markdown": "[foo]()\n\n[foo]: /url1\n", + "example": 538, + "start_line": 8125 + }, + { + "end_line": 8139, + "section": "Links", + "html": "foo(not a link)
\n", + "markdown": "[foo](not a link)\n\n[foo]: /url1\n", + "example": 539, + "start_line": 8133 + }, + { + "end_line": 8150, + "section": "Links", + "html": "[foo]bar
\n", + "markdown": "[foo][bar][baz]\n\n[baz]: /url\n", + "example": 540, + "start_line": 8144 + }, + { + "end_line": 8163, + "section": "Links", + "html": "\n", + "markdown": "[foo][bar][baz]\n\n[baz]: /url1\n[bar]: /url2\n", + "example": 541, + "start_line": 8156 + }, + { + "end_line": 8176, + "section": "Links", + "html": "[foo]bar
\n", + "markdown": "[foo][bar][baz]\n\n[baz]: /url1\n[foo]: /url2\n", + "example": 542, + "start_line": 8169 + }, + { + "end_line": 8196, + "section": "Images", + "html": "\n", + "markdown": "![foo](/url \"title\")\n", + "example": 543, + "start_line": 8192 + }, + { + "end_line": 8205, + "section": "Images", + "html": "\n", + "markdown": "![foo *bar*]\n\n[foo *bar*]: train.jpg \"train & tracks\"\n", + "example": 544, + "start_line": 8199 + }, + { + "end_line": 8212, + "section": "Images", + "html": "\n", + "markdown": "![foo ![bar](/url)](/url2)\n", + "example": 545, + "start_line": 8208 + }, + { + "end_line": 8219, + "section": "Images", + "html": "\n", + "markdown": "![foo [bar](/url)](/url2)\n", + "example": 546, + "start_line": 8215 + }, + { + "end_line": 8235, + "section": "Images", + "html": "\n", + "markdown": "![foo *bar*][]\n\n[foo *bar*]: train.jpg \"train & tracks\"\n", + "example": 547, + "start_line": 8229 + }, + { + "end_line": 8244, + "section": "Images", + "html": "\n", + "markdown": "![foo *bar*][foobar]\n\n[FOOBAR]: train.jpg \"train & tracks\"\n", + "example": 548, + "start_line": 8238 + }, + { + "end_line": 8251, + "section": "Images", + "html": "\n", + "markdown": "![foo](train.jpg)\n", + "example": 549, + "start_line": 8247 + }, + { + "end_line": 8258, + "section": "Images", + "html": "My
\n", + "markdown": "My ![foo bar](/path/to/train.jpg \"title\" )\n", + "example": 550, + "start_line": 8254 + }, + { + "end_line": 8265, + "section": "Images", + "html": "\n", + "markdown": "![foo](\n[]
\n", + "markdown": "![foo] \n[]\n\n[foo]: /url \"title\"\n", + "example": 558, + "start_line": 8329 + }, + { + "end_line": 8348, + "section": "Images", + "html": "\n", + "markdown": "![foo]\n\n[foo]: /url \"title\"\n", + "example": 559, + "start_line": 8342 + }, + { + "end_line": 8357, + "section": "Images", + "html": "\n", + "markdown": "![*foo* bar]\n\n[*foo* bar]: /url \"title\"\n", + "example": 560, + "start_line": 8351 + }, + { + "end_line": 8369, + "section": "Images", + "html": "![[foo]]
\n[[foo]]: /url "title"
\n", + "markdown": "![[foo]]\n\n[[foo]]: /url \"title\"\n", + "example": 561, + "start_line": 8362 + }, + { + "end_line": 8380, + "section": "Images", + "html": "\n", + "markdown": "![Foo]\n\n[foo]: /url \"title\"\n", + "example": 562, + "start_line": 8374 + }, + { + "end_line": 8392, + "section": "Images", + "html": "![foo]
\n", + "markdown": "!\\[foo]\n\n[foo]: /url \"title\"\n", + "example": 563, + "start_line": 8386 + }, + { + "end_line": 8404, + "section": "Images", + "html": "!foo
\n", + "markdown": "\\![foo]\n\n[foo]: /url \"title\"\n", + "example": 564, + "start_line": 8398 + }, + { + "end_line": 8435, + "section": "Autolinks", + "html": "\n", + "markdown": "http://foo.bar.baz/test?q=hello&id=22&boolean
\n", + "markdown": "<http://foo.bar/baz bim>
\n", + "markdown": "<foo+@bar.example.com>
\n", + "markdown": "<>
\n", + "markdown": "<>\n", + "example": 578, + "start_line": 8552 + }, + { + "end_line": 8563, + "section": "Autolinks", + "html": "< http://foo.bar >
\n", + "markdown": "< http://foo.bar >\n", + "example": 579, + "start_line": 8559 + }, + { + "end_line": 8570, + "section": "Autolinks", + "html": "<m:abc>
\n", + "markdown": "<foo.bar.baz>
\n", + "markdown": "http://example.com
\n", + "markdown": "http://example.com\n", + "example": 582, + "start_line": 8580 + }, + { + "end_line": 8591, + "section": "Autolinks", + "html": "foo@bar.example.com
\n", + "markdown": "foo@bar.example.com\n", + "example": 583, + "start_line": 8587 + }, + { + "end_line": 8673, + "section": "Raw HTML", + "html": "\n", + "markdown": "Foo
<33> <__>
\n", + "markdown": "<33> <__>\n", + "example": 589, + "start_line": 8718 + }, + { + "end_line": 8731, + "section": "Raw HTML", + "html": "<a h*#ref="hi">
\n", + "markdown": "\n", + "example": 590, + "start_line": 8727 + }, + { + "end_line": 8740, + "section": "Raw HTML", + "html": "<a href="hi'> <a href=hi'>
\n", + "markdown": " \n", + "example": 591, + "start_line": 8736 + }, + { + "end_line": 8751, + "section": "Raw HTML", + "html": "< a><\nfoo><bar/ >
\n", + "markdown": "< a><\nfoo><a href='bar'title=title>
\n", + "markdown": "\n", + "example": 593, + "start_line": 8756 + }, + { + "end_line": 8769, + "section": "Raw HTML", + "html": "</a href="foo">
\n", + "markdown": "\n", + "example": 595, + "start_line": 8774 + }, + { + "end_line": 8789, + "section": "Raw HTML", + "html": "foo
\n", + "markdown": "foo \n", + "example": 596, + "start_line": 8783 + }, + { + "end_line": 8796, + "section": "Raw HTML", + "html": "foo <!-- not a comment -- two hyphens -->
\n", + "markdown": "foo \n", + "example": 597, + "start_line": 8792 + }, + { + "end_line": 8808, + "section": "Raw HTML", + "html": "foo <!--> foo -->
\nfoo <!-- foo--->
\n", + "markdown": "foo foo -->\n\nfoo \n", + "example": 598, + "start_line": 8801 + }, + { + "end_line": 8817, + "section": "Raw HTML", + "html": "foo
\n", + "markdown": "foo \n", + "example": 599, + "start_line": 8813 + }, + { + "end_line": 8826, + "section": "Raw HTML", + "html": "foo
\n", + "markdown": "foo \n", + "example": 600, + "start_line": 8822 + }, + { + "end_line": 8835, + "section": "Raw HTML", + "html": "foo &<]]>
\n", + "markdown": "foo &<]]>\n", + "example": 601, + "start_line": 8831 + }, + { + "end_line": 8845, + "section": "Raw HTML", + "html": "\n", + "markdown": "foo \n", + "example": 602, + "start_line": 8841 + }, + { + "end_line": 8854, + "section": "Raw HTML", + "html": "\n", + "markdown": "foo \n", + "example": 603, + "start_line": 8850 + }, + { + "end_line": 8861, + "section": "Raw HTML", + "html": "<a href=""">
\n", + "markdown": "\n", + "example": 604, + "start_line": 8857 + }, + { + "end_line": 8877, + "section": "Hard line breaks", + "html": "foo
\nbaz
foo
\nbaz
foo
\nbaz
foo
\nbar
foo
\nbar
foo
\nbar
foo
\nbar
code span
code\\ span
foo\\
\n", + "markdown": "foo\\\n", + "example": 616, + "start_line": 8986 + }, + { + "end_line": 8997, + "section": "Hard line breaks", + "html": "foo
\n", + "markdown": "foo \n", + "example": 617, + "start_line": 8993 + }, + { + "end_line": 9004, + "section": "Hard line breaks", + "html": "foo\nbaz
\n", + "markdown": "foo\nbaz\n", + "example": 620, + "start_line": 9022 + }, + { + "end_line": 9040, + "section": "Soft line breaks", + "html": "foo\nbaz
\n", + "markdown": "foo \n baz\n", + "example": 621, + "start_line": 9034 + }, + { + "end_line": 9058, + "section": "Textual content", + "html": "hello $.;'there
\n", + "markdown": "hello $.;'there\n", + "example": 622, + "start_line": 9054 + }, + { + "end_line": 9065, + "section": "Textual content", + "html": "Foo χρῆν
\n", + "markdown": "Foo χρῆν\n", + "example": 623, + "start_line": 9061 + }, + { + "end_line": 9074, + "section": "Textual content", + "html": "Multiple spaces
\n", + "markdown": "Multiple spaces\n", + "example": 624, + "start_line": 9070 + } +] diff --git a/vendor/gitlab.com/golang-commonmark/markdown/spec/spec-0.28.txt b/vendor/gitlab.com/golang-commonmark/markdown/spec/spec-0.28.txt new file mode 100644 index 000000000..9fd584139 --- /dev/null +++ b/vendor/gitlab.com/golang-commonmark/markdown/spec/spec-0.28.txt @@ -0,0 +1,9414 @@ +--- +title: CommonMark Spec +author: John MacFarlane +version: 0.28 +date: '2017-08-01' +license: '[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)' +... + +# Introduction + +## What is Markdown? + +Markdown is a plain text format for writing structured documents, +based on conventions for indicating formatting in email +and usenet posts. It was developed by John Gruber (with +help from Aaron Swartz) and released in 2004 in the form of a +[syntax description](http://daringfireball.net/projects/markdown/syntax) +and a Perl script (`Markdown.pl`) for converting Markdown to +HTML. In the next decade, dozens of implementations were +developed in many languages. Some extended the original +Markdown syntax with conventions for footnotes, tables, and +other document elements. Some allowed Markdown documents to be +rendered in formats other than HTML. Websites like Reddit, +StackOverflow, and GitHub had millions of people using Markdown. +And Markdown started to be used beyond the web, to author books, +articles, slide shows, letters, and lecture notes. + +What distinguishes Markdown from many other lightweight markup +syntaxes, which are often easier to write, is its readability. +As Gruber writes: + +> The overriding design goal for Markdown's formatting syntax is +> to make it as readable as possible. The idea is that a +> Markdown-formatted document should be publishable as-is, as +> plain text, without looking like it's been marked up with tags +> or formatting instructions. +> (` tags? Can a list be partially "loose" and partially + "tight"? What should we do with a list like this? + + ``` markdown + 1. one + + 2. two + 3. three + ``` + + Or this? + + ``` markdown + 1. one + - a + + - b + 2. two + ``` + + (There are some relevant comments by John Gruber + [here](http://article.gmane.org/gmane.text.markdown.general/2554).) + +5. Can list markers be indented? Can ordered list markers be right-aligned? + + ``` markdown + 8. item 1 + 9. item 2 + 10. item 2a + ``` + +6. Is this one list with a thematic break in its second item, + or two lists separated by a thematic break? + + ``` markdown + * a + * * * * * + * b + ``` + +7. When list markers change from numbers to bullets, do we have + two lists or one? (The Markdown syntax description suggests two, + but the perl scripts and many other implementations produce one.) + + ``` markdown + 1. fee + 2. fie + - foe + - fum + ``` + +8. What are the precedence rules for the markers of inline structure? + For example, is the following a valid link, or does the code span + take precedence ? + + ``` markdown + [a backtick (`)](/url) and [another backtick (`)](/url). + ``` + +9. What are the precedence rules for markers of emphasis and strong + emphasis? For example, how should the following be parsed? + + ``` markdown + *foo *bar* baz* + ``` + +10. What are the precedence rules between block-level and inline-level + structure? For example, how should the following be parsed? + + ``` markdown + - `a long code span can contain a hyphen like this + - and it can screw things up` + ``` + +11. Can list items include section headings? (`Markdown.pl` does not + allow this, but does allow blockquotes to include headings.) + + ``` markdown + - # Heading + ``` + +12. Can list items be empty? + + ``` markdown + * a + * + * b + ``` + +13. Can link references be defined inside block quotes or list items? + + ``` markdown + > Blockquote [foo]. + > + > [foo]: /url + ``` + +14. If there are multiple definitions for the same reference, which takes + precedence? + + ``` markdown + [foo]: /url1 + [foo]: /url2 + + [foo][] + ``` + +In the absence of a spec, early implementers consulted `Markdown.pl` +to resolve these ambiguities. But `Markdown.pl` was quite buggy, and +gave manifestly bad results in many cases, so it was not a +satisfactory replacement for a spec. + +Because there is no unambiguous spec, implementations have diverged +considerably. As a result, users are often surprised to find that +a document that renders one way on one system (say, a github wiki) +renders differently on another (say, converting to docbook using +pandoc). To make matters worse, because nothing in Markdown counts +as a "syntax error," the divergence often isn't discovered right away. + +## About this document + +This document attempts to specify Markdown syntax unambiguously. +It contains many examples with side-by-side Markdown and +HTML. These are intended to double as conformance tests. An +accompanying script `spec_tests.py` can be used to run the tests +against any Markdown program: + + python test/spec_tests.py --spec spec.txt --program PROGRAM + +Since this document describes how Markdown is to be parsed into +an abstract syntax tree, it would have made sense to use an abstract +representation of the syntax tree instead of HTML. But HTML is capable +of representing the structural distinctions we need to make, and the +choice of HTML for the tests makes it possible to run the tests against +an implementation without writing an abstract syntax tree renderer. + +This document is generated from a text file, `spec.txt`, written +in Markdown with a small extension for the side-by-side tests. +The script `tools/makespec.py` can be used to convert `spec.txt` into +HTML or CommonMark (which can then be converted into other formats). + +In the examples, the `→` character is used to represent tabs. + +# Preliminaries + +## Characters and lines + +Any sequence of [characters] is a valid CommonMark +document. + +A [character](@) is a Unicode code point. Although some +code points (for example, combining accents) do not correspond to +characters in an intuitive sense, all code points count as characters +for purposes of this spec. + +This spec does not specify an encoding; it thinks of lines as composed +of [characters] rather than bytes. A conforming parser may be limited +to a certain encoding. + +A [line](@) is a sequence of zero or more [characters] +other than newline (`U+000A`) or carriage return (`U+000D`), +followed by a [line ending] or by the end of file. + +A [line ending](@) is a newline (`U+000A`), a carriage return +(`U+000D`) not followed by a newline, or a carriage return and a +following newline. + +A line containing no characters, or a line containing only spaces +(`U+0020`) or tabs (`U+0009`), is called a [blank line](@). + +The following definitions of character classes will be used in this spec: + +A [whitespace character](@) is a space +(`U+0020`), tab (`U+0009`), newline (`U+000A`), line tabulation (`U+000B`), +form feed (`U+000C`), or carriage return (`U+000D`). + +[Whitespace](@) is a sequence of one or more [whitespace +characters]. + +A [Unicode whitespace character](@) is +any code point in the Unicode `Zs` general category, or a tab (`U+0009`), +carriage return (`U+000D`), newline (`U+000A`), or form feed +(`U+000C`). + +[Unicode whitespace](@) is a sequence of one +or more [Unicode whitespace characters]. + +A [space](@) is `U+0020`. + +A [non-whitespace character](@) is any character +that is not a [whitespace character]. + +An [ASCII punctuation character](@) +is `!`, `"`, `#`, `$`, `%`, `&`, `'`, `(`, `)`, +`*`, `+`, `,`, `-`, `.`, `/`, `:`, `;`, `<`, `=`, `>`, `?`, `@`, +`[`, `\`, `]`, `^`, `_`, `` ` ``, `{`, `|`, `}`, or `~`. + +A [punctuation character](@) is an [ASCII +punctuation character] or anything in +the general Unicode categories `Pc`, `Pd`, `Pe`, `Pf`, `Pi`, `Po`, or `Ps`. + +## Tabs + +Tabs in lines are not expanded to [spaces]. However, +in contexts where whitespace helps to define block structure, +tabs behave as if they were replaced by spaces with a tab stop +of 4 characters. + +Thus, for example, a tab can be used instead of four spaces +in an indented code block. (Note, however, that internal +tabs are passed through as literal tabs, not expanded to +spaces.) + +```````````````````````````````` example +→foo→baz→→bim +. +
foo→baz→→bim
+
+````````````````````````````````
+
+```````````````````````````````` example
+ →foo→baz→→bim
+.
+foo→baz→→bim
+
+````````````````````````````````
+
+```````````````````````````````` example
+ a→a
+ ὐ→a
+.
+a→a
+ὐ→a
+
+````````````````````````````````
+
+In the following example, a continuation paragraph of a list
+item is indented with a tab; this has exactly the same effect
+as indentation with four spaces would:
+
+```````````````````````````````` example
+ - foo
+
+→bar
+.
+foo
+bar
+foo
+ bar
+
+++```````````````````````````````` + +```````````````````````````````` example +-→→foo +. ++foo +
foo
+
+foo
+bar
+
+````````````````````````````````
+
+```````````````````````````````` example
+ - foo
+ - bar
+→ - baz
+.
++++
+```````````````````````````````` + + +```````````````````````````````` example +=== +. +===
+```````````````````````````````` + + +Not enough characters: + +```````````````````````````````` example +-- +** +__ +. +-- +** +__
+```````````````````````````````` + + +One to three spaces indent are allowed: + +```````````````````````````````` example + *** + *** + *** +. +***
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+Foo
+ ***
+.
+Foo +***
+```````````````````````````````` + + +More than three characters may be used: + +```````````````````````````````` example +_____________________________________ +. +_ _ _ _ a
+a------
+---a---
+```````````````````````````````` + + +It is required that all of the [non-whitespace characters] be the same. +So, this is not a thematic break: + +```````````````````````````````` example + *-* +. +-
+```````````````````````````````` + + +Thematic breaks do not need blank lines before or after: + +```````````````````````````````` example +- foo +*** +- bar +. +Foo
+bar
+```````````````````````````````` + + +If a line of dashes that meets the above conditions for being a +thematic break could also be interpreted as the underline of a [setext +heading], the interpretation as a +[setext heading] takes precedence. Thus, for example, +this is a setext heading, not a paragraph followed by a thematic break: + +```````````````````````````````` example +Foo +--- +bar +. +bar
+```````````````````````````````` + + +When both a thematic break and a list item are possible +interpretations of a line, the thematic break takes precedence: + +```````````````````````````````` example +* Foo +* * * +* Bar +. +####### foo
+```````````````````````````````` + + +At least one space is required between the `#` characters and the +heading's contents, unless the heading is empty. Note that many +implementations currently do not require the space. However, the +space was required by the +[original ATX implementation](http://www.aaronsw.com/2002/atx/atx.py), +and it helps prevent things like the following from being parsed as +headings: + +```````````````````````````````` example +#5 bolt + +#hashtag +. +#5 bolt
+#hashtag
+```````````````````````````````` + + +This is not a heading, because the first `#` is escaped: + +```````````````````````````````` example +\## foo +. +## foo
+```````````````````````````````` + + +Contents are parsed as inlines: + +```````````````````````````````` example +# foo *bar* \*baz\* +. +# foo
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo
+ # bar
+.
+foo +# bar
+```````````````````````````````` + + +A closing sequence of `#` characters is optional: + +```````````````````````````````` example +## foo ## + ### bar ### +. +Foo bar
+Bar foo
+```````````````````````````````` + + +ATX headings can be empty: + +```````````````````````````````` example +## +# +### ### +. + + + +```````````````````````````````` + + +## Setext headings + +A [setext heading](@) consists of one or more +lines of text, each containing at least one [non-whitespace +character], with no more than 3 spaces indentation, followed by +a [setext heading underline]. The lines of text must be such +that, were they not followed by the setext heading underline, +they would be interpreted as a paragraph: they cannot be +interpretable as a [code fence], [ATX heading][ATX headings], +[block quote][block quotes], [thematic break][thematic breaks], +[list item][list items], or [HTML block][HTML blocks]. + +A [setext heading underline](@) is a sequence of +`=` characters or a sequence of `-` characters, with no more than 3 +spaces indentation and any number of trailing spaces. If a line +containing a single `-` can be interpreted as an +empty [list items], it should be interpreted this way +and not as a [setext heading underline]. + +The heading is a level 1 heading if `=` characters are used in +the [setext heading underline], and a level 2 heading if `-` +characters are used. The contents of the heading are the result +of parsing the preceding lines of text as CommonMark inline +content. + +In general, a setext heading need not be preceded or followed by a +blank line. However, it cannot interrupt a paragraph, so when a +setext heading comes after a paragraph, a blank line is needed between +them. + +Simple examples: + +```````````````````````````````` example +Foo *bar* +========= + +Foo *bar* +--------- +. +Foo
+---
+
+Foo
+
+Foo +---
+```````````````````````````````` + + +The setext heading underline cannot contain internal spaces: + +```````````````````````````````` example +Foo += = + +Foo +--- - +. +Foo += =
+Foo
+`
+of dashes"/>
+```````````````````````````````` + + +The setext heading underline cannot be a [lazy continuation +line] in a list item or block quote: + +```````````````````````````````` example +> Foo +--- +. +++Foo
+
++```````````````````````````````` + + +```````````````````````````````` example +- Foo +--- +. +foo +bar +===
+
Baz
+```````````````````````````````` + + +Setext headings cannot be empty: + +```````````````````````````````` example + +==== +. +====
+```````````````````````````````` + + +Setext heading text lines must not be interpretable as block +constructs other than paragraphs. So, the line of dashes +in these examples gets interpreted as a thematic break: + +```````````````````````````````` example +--- +--- +. +foo
+
+++foo
+
Foo
+baz
+```````````````````````````````` + + +Authors who want interpretation 2 can put blank lines around +the thematic break, + +```````````````````````````````` example +Foo +bar + +--- + +baz +. +Foo +bar
+baz
+```````````````````````````````` + + +or use a thematic break that cannot count as a [setext heading +underline], such as + +```````````````````````````````` example +Foo +bar +* * * +baz +. +Foo +bar
+baz
+```````````````````````````````` + + +Authors who want interpretation 3 can use backslash escapes: + +```````````````````````````````` example +Foo +bar +\--- +baz +. +Foo +bar +--- +baz
+```````````````````````````````` + + +## Indented code blocks + +An [indented code block](@) is composed of one or more +[indented chunks] separated by blank lines. +An [indented chunk](@) is a sequence of non-blank lines, +each indented four or more spaces. The contents of the code block are +the literal contents of the lines, including trailing +[line endings], minus four spaces of indentation. +An indented code block has no [info string]. + +An indented code block cannot interrupt a paragraph, so there must be +a blank line between a paragraph and a following indented code block. +(A blank line is not needed, however, between a code block and a following +paragraph.) + +```````````````````````````````` example + a simple + indented code block +. +a simple
+ indented code block
+
+````````````````````````````````
+
+
+If there is any ambiguity between an interpretation of indentation
+as a code block and as indicating that material belongs to a [list
+item][list items], the list item interpretation takes precedence:
+
+```````````````````````````````` example
+ - foo
+
+ bar
+.
+foo
+bar
+foo
+<a/>
+*hi*
+
+- one
+
+````````````````````````````````
+
+
+Here we have three chunks separated by blank lines:
+
+```````````````````````````````` example
+ chunk1
+
+ chunk2
+
+
+
+ chunk3
+.
+chunk1
+
+chunk2
+
+
+
+chunk3
+
+````````````````````````````````
+
+
+Any initial spaces beyond four will be included in the content, even
+in interior blank lines:
+
+```````````````````````````````` example
+ chunk1
+
+ chunk2
+.
+chunk1
+
+ chunk2
+
+````````````````````````````````
+
+
+An indented code block cannot interrupt a paragraph. (This
+allows hanging indents and the like.)
+
+```````````````````````````````` example
+Foo
+ bar
+
+.
+Foo +bar
+```````````````````````````````` + + +However, any non-blank line with fewer than four leading spaces ends +the code block immediately. So a paragraph may occur immediately +after indented code: + +```````````````````````````````` example + foo +bar +. +foo
+
+bar
+```````````````````````````````` + + +And indented code can occur immediately before and after other kinds of +blocks: + +```````````````````````````````` example +# Heading + foo +Heading +------ + foo +---- +. +foo
+
+foo
+
+ foo
+bar
+
+````````````````````````````````
+
+
+Blank lines preceding or following an indented code block
+are not included in it:
+
+```````````````````````````````` example
+
+
+ foo
+
+
+.
+foo
+
+````````````````````````````````
+
+
+Trailing spaces are included in the code block's content:
+
+```````````````````````````````` example
+ foo
+.
+foo
+
+````````````````````````````````
+
+
+
+## Fenced code blocks
+
+A [code fence](@) is a sequence
+of at least three consecutive backtick characters (`` ` ``) or
+tildes (`~`). (Tildes and backticks cannot be mixed.)
+A [fenced code block](@)
+begins with a code fence, indented no more than three spaces.
+
+The line with the opening code fence may optionally contain some text
+following the code fence; this is trimmed of leading and trailing
+spaces and called the [info string](@).
+The [info string] may not contain any backtick
+characters. (The reason for this restriction is that otherwise
+some inline code would be incorrectly interpreted as the
+beginning of a fenced code block.)
+
+The content of the code block consists of all subsequent lines, until
+a closing [code fence] of the same type as the code block
+began with (backticks or tildes), and with at least as many backticks
+or tildes as the opening code fence. If the leading code fence is
+indented N spaces, then up to N spaces of indentation are removed from
+each line of the content (if present). (If a content line is not
+indented, it is preserved unchanged. If it is indented less than N
+spaces, all of the indentation is removed.)
+
+The closing code fence may be indented up to three spaces, and may be
+followed only by spaces, which are ignored. If the end of the
+containing block (or document) is reached and no closing code fence
+has been found, the code block contains all of the lines after the
+opening code fence until the end of the containing block (or
+document). (An alternative spec would require backtracking in the
+event that a closing code fence is not found. But this makes parsing
+much less efficient, and there seems to be no real down side to the
+behavior described here.)
+
+A fenced code block may interrupt a paragraph, and does not require
+a blank line either before or after.
+
+The content of a code fence is treated as literal text, not parsed
+as inlines. The first word of the [info string] is typically used to
+specify the language of the code sample, and rendered in the `class`
+attribute of the `code` tag. However, this spec does not mandate any
+particular treatment of the [info string].
+
+Here is a simple example with backticks:
+
+```````````````````````````````` example
+```
+<
+ >
+```
+.
+<
+ >
+
+````````````````````````````````
+
+
+With tildes:
+
+```````````````````````````````` example
+~~~
+<
+ >
+~~~
+.
+<
+ >
+
+````````````````````````````````
+
+Fewer than three backticks is not enough:
+
+```````````````````````````````` example
+``
+foo
+``
+.
+foo
aaa
+~~~
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~
+aaa
+```
+~~~
+.
+aaa
+```
+
+````````````````````````````````
+
+
+The closing code fence must be at least as long as the opening fence:
+
+```````````````````````````````` example
+````
+aaa
+```
+``````
+.
+aaa
+```
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~~
+aaa
+~~~
+~~~~
+.
+aaa
+~~~
+
+````````````````````````````````
+
+
+Unclosed code blocks are closed by the end of the document
+(or the enclosing [block quote][block quotes] or [list item][list items]):
+
+```````````````````````````````` example
+```
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+`````
+
+```
+aaa
+.
+
+```
+aaa
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+> ```
+> aaa
+
+bbb
+.
++++aaa +
bbb
+```````````````````````````````` + + +A code block can have all empty lines as its content: + +```````````````````````````````` example +``` + + +``` +. +
+
+
+````````````````````````````````
+
+
+A code block can be empty:
+
+```````````````````````````````` example
+```
+```
+.
+
+````````````````````````````````
+
+
+Fences can be indented. If the opening fence is indented,
+content lines will have equivalent opening indentation removed,
+if present:
+
+```````````````````````````````` example
+ ```
+ aaa
+aaa
+```
+.
+aaa
+aaa
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ```
+aaa
+ aaa
+aaa
+ ```
+.
+aaa
+aaa
+aaa
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ```
+ aaa
+ aaa
+ aaa
+ ```
+.
+aaa
+ aaa
+aaa
+
+````````````````````````````````
+
+
+Four spaces indentation produces an indented code block:
+
+```````````````````````````````` example
+ ```
+ aaa
+ ```
+.
+```
+aaa
+```
+
+````````````````````````````````
+
+
+Closing fences may be indented by 0-3 spaces, and their indentation
+need not match that of the opening fence:
+
+```````````````````````````````` example
+```
+aaa
+ ```
+.
+aaa
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ```
+aaa
+ ```
+.
+aaa
+
+````````````````````````````````
+
+
+This is not a closing fence, because it is indented 4 spaces:
+
+```````````````````````````````` example
+```
+aaa
+ ```
+.
+aaa
+ ```
+
+````````````````````````````````
+
+
+
+Code fences (opening and closing) cannot contain internal spaces:
+
+```````````````````````````````` example
+``` ```
+aaa
+.
+
+aaa
aaa
+~~~ ~~
+
+````````````````````````````````
+
+
+Fenced code blocks can interrupt paragraphs, and can be followed
+directly by paragraphs, without a blank line between:
+
+```````````````````````````````` example
+foo
+```
+bar
+```
+baz
+.
+foo
+bar
+
+baz
+```````````````````````````````` + + +Other blocks can also occur before and after fenced code blocks +without an intervening blank line: + +```````````````````````````````` example +foo +--- +~~~ +bar +~~~ +# baz +. +bar
+
+def foo(x)
+ return 3
+end
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~~ ruby startline=3 $%@#$
+def foo(x)
+ return 3
+end
+~~~~~~~
+.
+def foo(x)
+ return 3
+end
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+````;
+````
+.
+
+````````````````````````````````
+
+
+[Info strings] for backtick code blocks cannot contain backticks:
+
+```````````````````````````````` example
+``` aa ```
+foo
+.
+aa
+foo
``` aaa
+
+````````````````````````````````
+
+
+
+## HTML blocks
+
+An [HTML block](@) is a group of lines that is treated
+as raw HTML (and will not be escaped in HTML output).
+
+There are seven kinds of [HTML block], which can be defined
+by their start and end conditions. The block begins with a line that
+meets a [start condition](@) (after up to three spaces
+optional indentation). It ends with the first subsequent line that
+meets a matching [end condition](@), or the last line of
+the document or other [container block]), if no line is encountered that meets the
+[end condition]. If the first line meets both the [start condition]
+and the [end condition], the block will contain just that line.
+
+1. **Start condition:** line begins with the string ``, ``, or `` (case-insensitive; it
+need not match the start tag).
+
+2. **Start condition:** line begins with the string ``.
+
+3. **Start condition:** line begins with the string ``.\
+**End condition:** line contains the string `?>`.
+
+4. **Start condition:** line begins with the string ``.
+
+5. **Start condition:** line begins with the string
+``.
+
+6. **Start condition:** line begins the string `<` or ``
+followed by one of the strings (case-insensitive) `address`,
+`article`, `aside`, `base`, `basefont`, `blockquote`, `body`,
+`caption`, `center`, `col`, `colgroup`, `dd`, `details`, `dialog`,
+`dir`, `div`, `dl`, `dt`, `fieldset`, `figcaption`, `figure`,
+`footer`, `form`, `frame`, `frameset`,
+`h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `head`, `header`, `hr`,
+`html`, `iframe`, `legend`, `li`, `link`, `main`, `menu`, `menuitem`,
+`meta`, `nav`, `noframes`, `ol`, `optgroup`, `option`, `p`, `param`,
+`section`, `source`, `summary`, `table`, `tbody`, `td`,
+`tfoot`, `th`, `thead`, `title`, `tr`, `track`, `ul`, followed
+by [whitespace], the end of the line, the string `>`, or
+the string `/>`.\
+**End condition:** line is followed by a [blank line].
+
+7. **Start condition:** line begins with a complete [open tag]
+or [closing tag] (with any [tag name] other than `script`,
+`style`, or `pre`) followed only by [whitespace]
+or the end of the line.\
+**End condition:** line is followed by a [blank line].
+
+HTML blocks continue until they are closed by their appropriate
+[end condition], or the last line of the document or other [container block].
+This means any HTML **within an HTML block** that might otherwise be recognised
+as a start condition will be ignored by the parser and passed through as-is,
+without changing the parser's state.
+
+For instance, `` within a HTML block started by `