| // 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). | |
| This package assumes presentation authors are trusted, | |
| and should not be used with untrusted inputs. | |
| # 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 11am 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 either explicit labels | |
| or the URL itself as the label. For example: | |
| [[url][label]] | |
| [[url]] | |
| # 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" |