|  | // Copyright 2011 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | /* | 
|  | Package present implements parsing and rendering of present files, | 
|  | which can be slide presentations as in golang.org/x/tools/cmd/present | 
|  | or articles as in golang.org/x/blog (the Go blog). | 
|  |  | 
|  | File Format | 
|  |  | 
|  | Present files begin with a header giving the title of the document | 
|  | and other metadata, which looks like: | 
|  |  | 
|  | # Title of document | 
|  | Subtitle of document | 
|  | 15:04 2 Jan 2006 | 
|  | Tags: foo, bar, baz | 
|  | Summary: This is a great document you want to read. | 
|  | OldURL: former-path-for-this-doc | 
|  |  | 
|  | The "# " prefix before the title indicates that this is | 
|  | a Markdown-enabled present file: it uses | 
|  | Markdown for text markup in the body of the file. | 
|  | If the "# " prefix is missing, the file uses | 
|  | legacy present markup, described below. | 
|  |  | 
|  | The date line may be written without a time: | 
|  | 2 Jan 2006 | 
|  | In this case, the time will be interpreted as 10am UTC on that date. | 
|  |  | 
|  | The tags line is a comma-separated list of tags that may be used to categorize | 
|  | the document. | 
|  |  | 
|  | The summary line gives a short summary used in blog feeds. | 
|  |  | 
|  | The old URL line, which may be repeated, gives an older (perhaps relative) URL | 
|  | for this document. | 
|  | A server might use these to generate appropriate redirects. | 
|  |  | 
|  | Only the title is required; | 
|  | the subtitle, date, tags, summary, and old URL lines are optional. | 
|  | In Markdown-enabled present, the summary defaults to being empty. | 
|  | In legacy present, the summary defaults to the first paragraph of text. | 
|  |  | 
|  | After the header come zero or more author blocks, like this: | 
|  |  | 
|  | Author Name | 
|  | Job title, Company | 
|  | joe@example.com | 
|  | https://url/ | 
|  | @twitter_name | 
|  |  | 
|  | The first line of the author block is conventionally the author name. | 
|  | Otherwise, the author section may contain a mixture of text, twitter names, and links. | 
|  | For slide presentations, only the plain text lines will be displayed on the | 
|  | first slide. | 
|  |  | 
|  | If multiple author blocks are listed, each new block must be preceded | 
|  | by its own blank line. | 
|  |  | 
|  | After the author blocks come the presentation slides or article sections, | 
|  | which can in turn have subsections. | 
|  | In Markdown-enabled present files, each slide or section begins with a "##" header line, | 
|  | subsections begin with a "###" header line, and so on. | 
|  | In legacy present files, each slide or section begins with a "*" header line, | 
|  | subsections begin with a "**" header line, and so on. | 
|  |  | 
|  | In addition to the marked-up text in a section (or subsection), | 
|  | a present file can contain present command invocations, each of which begins | 
|  | with a dot, as in: | 
|  |  | 
|  | .code x.go /^func main/,/^}/ | 
|  | .play y.go | 
|  | .image image.jpg | 
|  | .background image.jpg | 
|  | .iframe https://foo | 
|  | .link https://foo label | 
|  | .html file.html | 
|  | .caption _Gopher_ by [[https://instagram.com/reneefrench][Renee French]] | 
|  |  | 
|  | Other than the commands, the text in a section is interpreted | 
|  | either as Markdown or as legacy present markup. | 
|  |  | 
|  | Markdown Syntax | 
|  |  | 
|  | Markdown typically means the generic name for a family of similar markup languages. | 
|  | The specific variant used in present is CommonMark. | 
|  | See https://commonmark.org/help/tutorial/ for a quick tutorial. | 
|  |  | 
|  | In Markdown-enabled present, | 
|  | section headings can end in {#name} to set the HTML anchor ID for the heading to "name". | 
|  |  | 
|  | Lines beginning with "//" (outside of code blocks, of course) | 
|  | are treated as present comments and have no effect. | 
|  |  | 
|  | Lines beginning with ": " are treated as speaker notes, described below. | 
|  |  | 
|  | Example: | 
|  |  | 
|  | # Title of Talk | 
|  |  | 
|  | My Name | 
|  | 9 Mar 2020 | 
|  | me@example.com | 
|  |  | 
|  | ## Title of Slide or Section (must begin with ##) | 
|  |  | 
|  | Some Text | 
|  |  | 
|  | ### Subsection {#anchor} | 
|  |  | 
|  | - bullets | 
|  | - more bullets | 
|  | - a bullet continued | 
|  | on the next line | 
|  |  | 
|  | #### Sub-subsection | 
|  |  | 
|  | Some More text | 
|  |  | 
|  | Preformatted text (code block) | 
|  | is indented (by one tab, or four spaces) | 
|  |  | 
|  | Further Text, including command invocations. | 
|  |  | 
|  | ## Section 2: Example formatting {#fmt} | 
|  |  | 
|  | Formatting: | 
|  |  | 
|  | _italic_ | 
|  | // A comment that is completely ignored. | 
|  | : Speaker notes. | 
|  | **bold** | 
|  | `program` | 
|  | Markup—_especially italic text_—can easily be overused. | 
|  | _Why use scoped\_ptr_? Use plain **\*ptr** instead. | 
|  |  | 
|  | Visit [the Go home page](https://golang.org/). | 
|  |  | 
|  | Legacy Present Syntax | 
|  |  | 
|  | Compared to Markdown, | 
|  | in legacy present | 
|  | slides/sections use "*" instead of "##", | 
|  | whole-line comments begin with "#" instead of "//", | 
|  | bullet lists can only contain single (possibly wrapped) text lines, | 
|  | and the font styling and link syntaxes are subtly different. | 
|  |  | 
|  | Example: | 
|  |  | 
|  | Title of Talk | 
|  |  | 
|  | My Name | 
|  | 1 Jan 2013 | 
|  | me@example.com | 
|  |  | 
|  | * Title of Slide or Section (must begin with *) | 
|  |  | 
|  | Some Text | 
|  |  | 
|  | ** Subsection | 
|  |  | 
|  | - bullets | 
|  | - more bullets | 
|  | - a bullet continued | 
|  | on the next line (indented at least one space) | 
|  |  | 
|  | *** Sub-subsection | 
|  |  | 
|  | Some More text | 
|  |  | 
|  | Preformatted text (code block) | 
|  | is indented (however you like) | 
|  |  | 
|  | Further Text, including command invocations. | 
|  |  | 
|  | * Section 2: Example formatting | 
|  |  | 
|  | Formatting: | 
|  |  | 
|  | _italic_ | 
|  | *bold* | 
|  | `program` | 
|  | Markup—_especially_italic_text_—can easily be overused. | 
|  | _Why_use_scoped__ptr_? Use plain ***ptr* instead. | 
|  |  | 
|  | Visit [[https://golang.org][the Go home page]]. | 
|  |  | 
|  | Within the input for plain text or lists, text bracketed by font | 
|  | markers will be presented in italic, bold, or program font. | 
|  | Marker characters are _ (italic), * (bold) and ` (program font). | 
|  | An opening marker must be preceded by a space or punctuation | 
|  | character or else be at start of a line; similarly, a closing | 
|  | marker must be followed by a space or punctuation character or | 
|  | else be at the end of a line. Unmatched markers appear as plain text. | 
|  | There must be no spaces between markers. Within marked text, | 
|  | a single marker character becomes a space and a doubled single | 
|  | marker quotes the marker character. | 
|  |  | 
|  | Links can be included in any text with the form [[url][label]], or | 
|  | [[url]] to use the URL itself as the label. | 
|  |  | 
|  | Command Invocations | 
|  |  | 
|  | A number of special commands are available through invocations | 
|  | in the input text. Each such invocation contains a period as the | 
|  | first character on the line, followed immediately by the name of | 
|  | the function, followed by any arguments. A typical invocation might | 
|  | be | 
|  |  | 
|  | .play demo.go /^func show/,/^}/ | 
|  |  | 
|  | (except that the ".play" must be at the beginning of the line and | 
|  | not be indented as in this comment.) | 
|  |  | 
|  | Here follows a description of the functions: | 
|  |  | 
|  | code: | 
|  |  | 
|  | Injects program source into the output by extracting code from files | 
|  | and injecting them as HTML-escaped <pre> blocks.  The argument is | 
|  | a file name followed by an optional address that specifies what | 
|  | section of the file to display. The address syntax is similar in | 
|  | its simplest form to that of ed, but comes from sam and is more | 
|  | general. See | 
|  | https://plan9.io/sys/doc/sam/sam.html Table II | 
|  | for full details. The displayed block is always rounded out to a | 
|  | full line at both ends. | 
|  |  | 
|  | If no pattern is present, the entire file is displayed. | 
|  |  | 
|  | Any line in the program that ends with the four characters | 
|  | OMIT | 
|  | is deleted from the source before inclusion, making it easy | 
|  | to write things like | 
|  | .code test.go /START OMIT/,/END OMIT/ | 
|  | to find snippets like this | 
|  | tedious_code = boring_function() | 
|  | // START OMIT | 
|  | interesting_code = fascinating_function() | 
|  | // END OMIT | 
|  | and see only this: | 
|  | interesting_code = fascinating_function() | 
|  |  | 
|  | Also, inside the displayed text a line that ends | 
|  | // HL | 
|  | will be highlighted in the display. A highlighting mark may have a | 
|  | suffix word, such as | 
|  | // HLxxx | 
|  | Such highlights are enabled only if the code invocation ends with | 
|  | "HL" followed by the word: | 
|  | .code test.go /^type Foo/,/^}/ HLxxx | 
|  |  | 
|  | The .code function may take one or more flags immediately preceding | 
|  | the filename. This command shows test.go in an editable text area: | 
|  | .code -edit test.go | 
|  | This command shows test.go with line numbers: | 
|  | .code -numbers test.go | 
|  |  | 
|  | play: | 
|  |  | 
|  | The function "play" is the same as "code" but puts a button | 
|  | on the displayed source so the program can be run from the browser. | 
|  | Although only the selected text is shown, all the source is included | 
|  | in the HTML output so it can be presented to the compiler. | 
|  |  | 
|  | link: | 
|  |  | 
|  | Create a hyperlink. The syntax is 1 or 2 space-separated arguments. | 
|  | The first argument is always the HTTP URL.  If there is a second | 
|  | argument, it is the text label to display for this link. | 
|  |  | 
|  | .link https://golang.org golang.org | 
|  |  | 
|  | image: | 
|  |  | 
|  | The template uses the function "image" to inject picture files. | 
|  |  | 
|  | The syntax is simple: 1 or 3 space-separated arguments. | 
|  | The first argument is always the file name. | 
|  | If there are more arguments, they are the height and width; | 
|  | both must be present, or substituted with an underscore. | 
|  | Replacing a dimension argument with the underscore parameter | 
|  | preserves the aspect ratio of the image when scaling. | 
|  |  | 
|  | .image images/betsy.jpg 100 200 | 
|  | .image images/janet.jpg _ 300 | 
|  |  | 
|  | video: | 
|  |  | 
|  | The template uses the function "video" to inject video files. | 
|  |  | 
|  | The syntax is simple: 2 or 4 space-separated arguments. | 
|  | The first argument is always the file name. | 
|  | The second argument is always the file content-type. | 
|  | If there are more arguments, they are the height and width; | 
|  | both must be present, or substituted with an underscore. | 
|  | Replacing a dimension argument with the underscore parameter | 
|  | preserves the aspect ratio of the video when scaling. | 
|  |  | 
|  | .video videos/evangeline.mp4 video/mp4 400 600 | 
|  |  | 
|  | .video videos/mabel.ogg video/ogg 500 _ | 
|  |  | 
|  | background: | 
|  |  | 
|  | The template uses the function "background" to set the background image for | 
|  | a slide.  The only argument is the file name of the image. | 
|  |  | 
|  | .background images/susan.jpg | 
|  |  | 
|  | caption: | 
|  |  | 
|  | The template uses the function "caption" to inject figure captions. | 
|  |  | 
|  | The text after ".caption" is embedded in a figcaption element after | 
|  | processing styling and links as in standard text lines. | 
|  |  | 
|  | .caption _Gopher_ by [[https://instagram.com/reneefrench][Renee French]] | 
|  |  | 
|  | iframe: | 
|  |  | 
|  | The function "iframe" injects iframes (pages inside pages). | 
|  | Its syntax is the same as that of image. | 
|  |  | 
|  | html: | 
|  |  | 
|  | The function html includes the contents of the specified file as | 
|  | unescaped HTML. This is useful for including custom HTML elements | 
|  | that cannot be created using only the slide format. | 
|  | It is your responsibility to make sure the included HTML is valid and safe. | 
|  |  | 
|  | .html file.html | 
|  |  | 
|  | Presenter Notes | 
|  |  | 
|  | Lines that begin with ": " are treated as presenter notes, | 
|  | in both Markdown and legacy present syntax. | 
|  | By default, presenter notes are collected but ignored. | 
|  |  | 
|  | When running the present command with -notes, | 
|  | typing 'N' in your browser displaying your slides | 
|  | will create a second window displaying the notes. | 
|  | The second window is completely synced with the main | 
|  | window, except that presenter notes are only visible in the second window. | 
|  |  | 
|  | Notes may appear anywhere within the slide text. For example: | 
|  |  | 
|  | * Title of slide | 
|  |  | 
|  | Some text. | 
|  |  | 
|  | : Presenter notes (first paragraph) | 
|  |  | 
|  | Some more text. | 
|  |  | 
|  | : Presenter notes (subsequent paragraph(s)) | 
|  |  | 
|  | */ | 
|  | package present // import "golang.org/x/tools/present" |