diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -436,6 +436,7 @@ 'ConpherenceViewController' => 'applications/conpherence/controller/ConpherenceViewController.php', 'CountdownEditConduitAPIMethod' => 'applications/countdown/conduit/CountdownEditConduitAPIMethod.php', 'CountdownSearchConduitAPIMethod' => 'applications/countdown/conduit/CountdownSearchConduitAPIMethod.php', + 'CowsayReferenceController' => 'applications/reference/src/controller/CowsayReferenceController.php', 'DarkConsoleController' => 'applications/console/controller/DarkConsoleController.php', 'DarkConsoleCore' => 'applications/console/core/DarkConsoleCore.php', 'DarkConsoleDataController' => 'applications/console/controller/DarkConsoleDataController.php', @@ -1304,6 +1305,7 @@ 'FeedStoryNotificationGarbageCollector' => 'applications/notification/garbagecollector/FeedStoryNotificationGarbageCollector.php', 'FerretConfigurableSearchFunction' => 'applications/search/ferret/function/FerretConfigurableSearchFunction.php', 'FerretSearchFunction' => 'applications/search/ferret/function/FerretSearchFunction.php', + 'FigletReferenceController' => 'applications/reference/src/controller/FigletReferenceController.php', 'FileAllocateConduitAPIMethod' => 'applications/files/conduit/FileAllocateConduitAPIMethod.php', 'FileConduitAPIMethod' => 'applications/files/conduit/FileConduitAPIMethod.php', 'FileCreateMailReceiver' => 'applications/files/mail/FileCreateMailReceiver.php', @@ -5878,7 +5880,11 @@ 'ProjectSearchConduitAPIMethod' => 'applications/project/conduit/ProjectSearchConduitAPIMethod.php', 'QueryFormattingTestCase' => 'infrastructure/storage/__tests__/QueryFormattingTestCase.php', 'QueryFuture' => 'infrastructure/storage/future/QueryFuture.php', + 'ReferenceApplication' => 'applications/reference/src/application/ReferenceApplication.php', + 'ReferenceController' => 'applications/reference/src/controller/ReferenceController.php', 'RemarkupProcessConduitAPIMethod' => 'applications/remarkup/conduit/RemarkupProcessConduitAPIMethod.php', + 'RemarkupReferenceController' => 'applications/reference/src/controller/RemarkupReferenceController.php', + 'RemarkupSyntaxDocumentationProvider' => 'infrastructure/markup/interface/RemarkupSyntaxDocumentationProvider.php', 'RemarkupValue' => 'applications/remarkup/RemarkupValue.php', 'RepositoryConduitAPIMethod' => 'applications/repository/conduit/RepositoryConduitAPIMethod.php', 'RepositoryQueryConduitAPIMethod' => 'applications/repository/conduit/RepositoryQueryConduitAPIMethod.php', @@ -6444,6 +6450,7 @@ 'ConpherenceViewController' => 'ConpherenceController', 'CountdownEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', 'CountdownSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'CowsayReferenceController' => 'ReferenceController', 'DarkConsoleController' => 'PhabricatorController', 'DarkConsoleCore' => 'Phobject', 'DarkConsoleDataController' => 'PhabricatorController', @@ -7404,6 +7411,7 @@ 'FeedStoryNotificationGarbageCollector' => 'PhabricatorGarbageCollector', 'FerretConfigurableSearchFunction' => 'FerretSearchFunction', 'FerretSearchFunction' => 'Phobject', + 'FigletReferenceController' => 'ReferenceController', 'FileAllocateConduitAPIMethod' => 'FileConduitAPIMethod', 'FileConduitAPIMethod' => 'ConduitAPIMethod', 'FileCreateMailReceiver' => 'PhabricatorApplicationMailReceiver', @@ -11211,12 +11219,18 @@ 'PhabricatorRegistrationProfile' => 'Phobject', 'PhabricatorRemarkupCachePurger' => 'PhabricatorCachePurger', 'PhabricatorRemarkupControl' => 'AphrontFormTextAreaControl', - 'PhabricatorRemarkupCowsayBlockInterpreter' => 'PhutilRemarkupBlockInterpreter', + 'PhabricatorRemarkupCowsayBlockInterpreter' => array( + 'PhutilRemarkupBlockInterpreter', + 'RemarkupSyntaxDocumentationProvider', + ), 'PhabricatorRemarkupCustomBlockRule' => 'PhutilRemarkupBlockRule', 'PhabricatorRemarkupCustomInlineRule' => 'PhutilRemarkupRule', 'PhabricatorRemarkupDocumentEngine' => 'PhabricatorDocumentEngine', 'PhabricatorRemarkupEditField' => 'PhabricatorEditField', - 'PhabricatorRemarkupFigletBlockInterpreter' => 'PhutilRemarkupBlockInterpreter', + 'PhabricatorRemarkupFigletBlockInterpreter' => array( + 'PhutilRemarkupBlockInterpreter', + 'RemarkupSyntaxDocumentationProvider', + ), 'PhabricatorRemarkupHyperlinkEngineExtension' => 'PhutilRemarkupHyperlinkEngineExtension', 'PhabricatorRemarkupUIExample' => 'PhabricatorUIExample', 'PhabricatorRemoveEmailUserLogType' => 'PhabricatorUserLogType', @@ -12793,7 +12807,10 @@ 'ProjectSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', 'QueryFormattingTestCase' => 'PhabricatorTestCase', 'QueryFuture' => 'Future', + 'ReferenceApplication' => 'PhabricatorApplication', + 'ReferenceController' => 'PhabricatorController', 'RemarkupProcessConduitAPIMethod' => 'ConduitAPIMethod', + 'RemarkupReferenceController' => 'ReferenceController', 'RemarkupValue' => 'Phobject', 'RepositoryConduitAPIMethod' => 'ConduitAPIMethod', 'RepositoryQueryConduitAPIMethod' => 'RepositoryConduitAPIMethod', diff --git a/src/applications/reference/src/application/ReferenceApplication.php b/src/applications/reference/src/application/ReferenceApplication.php new file mode 100644 --- /dev/null +++ b/src/applications/reference/src/application/ReferenceApplication.php @@ -0,0 +1,27 @@ + array( + 'remarkup/' => 'RemarkupReferenceController', + 'cowsay/' => 'CowsayReferenceController', + 'figlet/' => 'FigletReferenceController', + ), + ); + } + +} diff --git a/src/applications/reference/src/controller/CowsayReferenceController.php b/src/applications/reference/src/controller/CowsayReferenceController.php new file mode 100644 --- /dev/null +++ b/src/applications/reference/src/controller/CowsayReferenceController.php @@ -0,0 +1,291 @@ +getJokes(); + shuffle($jokes); + + $j = 0; + + foreach ($directories as $directory) { + foreach (Filesystem::listDirectory($directory, false) as $cow_file) { + $matches = null; + if (!preg_match('/^(.*)\.cow$/', $cow_file, $matches)) { + continue; + } + $cow_name = $matches[1]; + $cow_name = phutil_utf8_strtolower($cow_name); + + $joke = $jokes[$j % count($jokes)]; + + $content .= "\n=== ".$cow_name; + $content .= "\n```"; + $content .= "\ncowsay(cow='".$cow_name."'){{{{$joke}}}}"; + $content .= "\n```"; + $content .= "\ncowsay(cow='".$cow_name."'){{{{$joke}}}}"; + $content .= "\n"; + + $j++; + } + } + + $content .= "\n"; + $content .= '== Parameters'; + + $joke = $jokes[$j % count($jokes)]; + $j++; + + $content .= "\n=== eyes"; + $content .= "\n```"; + $content .= "\ncowsay(cow='cow', eyes='-x'){{{{$joke}}}}"; + $content .= "\n```"; + $content .= "\ncowsay(cow='cow', eyes='-x'){{{{$joke}}}}"; + $content .= "\n"; + + $joke = $jokes[$j % count($jokes)]; + $j++; + + $content .= "\n=== think"; + $content .= "\n```"; + $content .= "\ncowsay(cow='cow', think=1){{{{$joke}}}}"; + $content .= "\n```"; + $content .= "\ncowsay(cow='cow', think=1){{{{$joke}}}}"; + $content .= "\n"; + + $joke = $jokes[$j % count($jokes)]; + $j++; + + $content .= "\n=== tongue"; + $content .= "\n```"; + $content .= "\ncowsay(cow='cow', tongue=U){{{{$joke}}}}"; + $content .= "\n```"; + $content .= "\ncowsay(cow='cow', tongue=U){{{{$joke}}}}"; + $content .= "\n"; + + return $content; + } +} diff --git a/src/applications/reference/src/controller/FigletReferenceController.php b/src/applications/reference/src/controller/FigletReferenceController.php new file mode 100644 --- /dev/null +++ b/src/applications/reference/src/controller/FigletReferenceController.php @@ -0,0 +1,39 @@ +getRequest(); + $viewer = $request->getViewer(); + + $content = $this->getContent(); + + $remarkup_view = id(new PHUIRemarkupView($viewer, $content)) + ->setContextObject($this) + ->setRemarkupOption('uri.same-window', true) + ->setRemarkupOption(PHUIRemarkupView::OPTION_GENERATE_TOC, true) + ->setRemarkupOption(PHUIRemarkupView::OPTION_PRESERVE_LINEBREAKS, false) + ->setGenerateTableOfContents(true); + + $content = $remarkup_view->render(); + + $toc = $remarkup_view->getTableOfContents(); + $toc = $this->formatToc($toc); + + $document = id(new PHUIDocumentView()) + ->addClass('reference-documentation') + ->setToc($toc) + ->appendChild($remarkup_view); + + $crumbs = $this->buildApplicationCrumbs(); + + return $this->newPage() + ->setTitle($this->getTitle()) + ->setCrumbs($crumbs) + ->appendChild($document); + } + + protected function buildApplicationCrumbs() { + $crumbs = array(); + + $application = $this->getCurrentApplication(); + if ($application) { + $icon = $application->getIcon(); + if (!$icon) { + $icon = 'fa-puzzle'; + } + + $crumbs[] = id(new PHUICrumbView()) + ->setName($this->getTitle()) + ->setIcon($icon); + } + + $view = new PHUICrumbsView(); + foreach ($crumbs as $crumb) { + $view->addCrumb($crumb); + } + + return $view; + } + + protected function formatToc($toc) { + + if ($toc) { + $toc = phutil_tag_div('phui-document-toc-content', array( + phutil_tag_div( + 'phui-document-toc-header', + pht('Contents')), + $toc, + )); + } + + return $toc; + } +} diff --git a/src/applications/reference/src/controller/RemarkupReferenceController.php b/src/applications/reference/src/controller/RemarkupReferenceController.php new file mode 100644 --- /dev/null +++ b/src/applications/reference/src/controller/RemarkupReferenceController.php @@ -0,0 +1,762 @@ + Quoted Text + + Use `- ` or `* ` for bulleted lists, and `# ` for numbered lists. + Use ``` or indent two spaces for code. + Use %%% for a literal block. + Use | ... | ... for tables. + += Basic Styling = + +Format **basic text styles** like this: + + **bold text** + //italic text// + `monospaced text` + ##monospaced text## + ~~deleted text~~ + __underlined text__ + !!highlighted text!! + +Those produce **bold text**, //italic text//, `monospaced text`, ##monospaced +text##, ~~deleted text~~, __underlined text__, and !!highlighted text!! +respectively. + += Layout = + +Make **headers** like this: + + = Large Header = + + == Smaller Header == + + ===== Very Small Header ===== + + Alternate Large Header + ====================== + + Alternate Smaller Header + ------------------------ + +You can optionally omit the trailing `=` signs -- that is, these are the same: + + == Smaller Header == + + == Smaller Header + +This produces headers like the ones in this document. Make sure you have an +empty line before and after the header. + +Lists +===== + +Make **lists** by beginning each item with a `-` or a `*`: + + lang=text + - milk + - eggs + - bread + + * duck + * duck + * goose + +This produces a list like this: + + - milk + - eggs + - bread + +(Note that you need to put a space after the `-` or `*`.) + +You can make numbered lists with a `#` instead of `-` or `*`: + + # Articuno + # Zapdos + # Moltres + +Numbered lists can also be started with `1.` or `1)`. If you use a number other +than `1`, the list will start at that number instead. For example, this: + +``` + 200) OK + 201) Created + 202) Accepted +``` + +...produces this: + + 200) OK + 201) Created + 202) Accepted + +You can also nest lists: + +```- Body + - Head + - Arm + - Elbow + - Hand + # Thumb + # Index + # Middle + # Ring + # Pinkie + - Leg + - Knee + - Foot``` + +...which produces: + + - Body + - Head + - Arm + - Elbow + - Hand + # Thumb + # Index + # Middle + # Ring + # Pinkie + - Leg + - Knee + - Foot + +If you prefer, you can indent lists using multiple characters to show indent +depth, like this: + +```- Tree +-- Branch +--- Twig``` + +As expected, this produces: + +- Tree +-- Branch +--- Twig + +You can add checkboxes to items by prefacing them with `[ ]` or `[X]`, like +this: + +``` + - [X] Preheat oven to 450 degrees. + - [ ] Zest 35 lemons. +``` + +When rendered, this produces: + + - [X] Preheat oven to 450 degrees. + - [ ] Zest 35 lemons. + +Code Blocks +=========== + +Make **code blocks** by indenting two spaces: + + f(x, y); + +You can also use three backticks to enclose the code block: + + ```f(x, y); + g(f);``` + +You can specify a language for syntax highlighting with `lang=xxx`: + + lang=text + lang=html + ... + +When using fenced code blocks (triple backticks) you can simply append the +language right after the backticks, like this: ##```html## + +This will highlight the block using a highlighter for that language, if one is +available (in most cases, this means you need to configure Pygments): + + lang=html + ... + +You can also use a `COUNTEREXAMPLE` header to show that a block of code is +bad and shouldn't be copied: + + lang=text + COUNTEREXAMPLE + function f() { + global \$\$variable_variable; + } + +This produces a block like this: + + COUNTEREXAMPLE + function f() { + global \$\$variable_variable; + } + +You can use `lines=N` to limit the vertical size of a chunk of code, and +`name=some_name.ext` to give it a name. For example, this: + + lang=text + lang=html, name=example.html, lines=12, counterexample + ... + +...produces this: + + lang=html, name=example.html, lines=12, counterexample +

Apple

+

Apricot

+

Avocado

+

Banana

+

Bilberry

+

Blackberry

+

Blackcurrant

+

Blueberry

+

Currant

+

Cherry

+

Cherimoya

+

Clementine

+

Date

+

Damson

+

Durian

+

Eggplant

+

Elderberry

+

Feijoa

+

Gooseberry

+

Grape

+

Grapefruit

+

Guava

+

Huckleberry

+

Jackfruit

+

Jambul

+

Kiwi fruit

+

Kumquat

+

Legume

+

Lemon

+

Lime

+

Lychee

+

Mandarine

+

Mango

+

Mangostine

+

Melon

+ + +You can use the `NOTE:`, `WARNING:` or `IMPORTANT:` elements to call attention +to an important idea. + +For example, write this: + +``` +NOTE: Best practices in proton pack operation include not crossing the streams. +``` + +...to produce this: + +NOTE: Best practices in proton pack operation include not crossing the streams. + +Using `WARNING:` or `IMPORTANT:` at the beginning of the line changes the +color of the callout: + +WARNING: Crossing the streams can result in total protonic reversal! + +IMPORTANT: Don't cross the streams! + +In addition, you can use `(NOTE)`, `(WARNING)`, or `(IMPORTANT)` to get the +same effect but without `(NOTE)`, `(WARNING)`, or `(IMPORTANT)` appearing in +the rendered result. For example, this callout uses `(NOTE)`: + +(NOTE) Dr. Egon Spengler is the best resource for additional proton pack + questions. + + +Dividers +======== + +You can divide sections by putting three or more dashes on a line by +themselves. This creates a divider or horizontal rule similar to an `
` +tag, like this one: + +--- + +The dashes need to appear on their own line and be separated from other +content. For example, like this: + +``` +This section will be visually separated. + +--- + +On an entirely different topic, ... +``` + + += Linking URIs = + +URIs are automatically linked: http://phorge.it/ + +If you have a URI with problematic characters in it, like +"`http://comma.org/,`", you can surround it with angle brackets: + + + +This will force the parser to consume the whole URI: + +You can also use create named links, where you choose the displayed text. These +work within Phorge or on the internet at large: + + [[/herald/transcript/ | Herald Transcripts]] + [[http://www.boring-legal-documents.com/ | exciting legal documents]] + +Markdown-style links are also supported: + + [Toil](http://www.trouble.com) + += Linking to Objects = + +You can link to Phorge objects, such as Differential revisions, Diffusion +commits and Maniphest tasks, by mentioning the name of an object: + + D123 # Link to Differential revision D123 + rX123 # Link to SVN commit 123 from the "X" repository + rXaf3192cd5 # Link to Git commit "af3192cd5..." from the "X" repository. + # You must specify at least 7 characters of the hash. + T123 # Link to Maniphest task T123 + +You can also link directly to a comment in Maniphest and Differential (these +can be found on the date stamp of any transaction/comment): + + T123#412 # Link to comment id #412 of task T123 + +See the Phorge configuration setting `remarkup.ignored-object-names` to +modify this behavior. + += Embedding Objects + +You can also generate full-name references to some objects by using braces: + + {D123} # Link to Differential revision D123 with the full name + {T123} # Link to Maniphest task T123 with the full name + +These references will also show when an object changes state (for instance, a +task or revision is closed). Some types of objects support rich embedding. + +== Linking to Project Tags + +Projects can be linked to with the use of a hashtag `#`. This works by default +using the name of the Project (lowercase, underscored). Additionally you +can set multiple additional hashtags by editing the Project details. + + #qa, #quality_assurance + +== Embedding Mocks (Pholio) + +You can embed a Pholio mock by using braces to refer to it: + + {M123} + +By default the first four images from the mock set are displayed. This behavior +can be overridden with the **image** option. With the **image** option you can +provide one or more image IDs to display. + +You can set the image (or images) to display like this: + + {M123, image=12345} + {M123, image=12345 & 6789} + +== Embedding Pastes + +You can embed a Paste using braces: + + {P123} + +You can adjust the embed height with the `lines` option: + + {P123, lines=15} + +You can highlight specific lines with the `highlight` option: + + {P123, highlight=15} + {P123, highlight="23-25, 31"} + +== Embedding Images + +You can embed an image or other file by using braces to refer to it: + + {F123} + +In most interfaces, you can drag-and-drop an image from your computer into the +text area to upload and reference it. + +Some browsers (e.g. Chrome) support uploading an image data just by pasting them +from clipboard into the text area. + +You can set file display options like this: + + {F123, layout=left, float, size=full, alt="a duckling"} + +Valid options for all files are: + + - **layout** left (default), center, right, inline, link (render a link + instead of a thumbnail for images) + - **name** with `layout=link` or for non-images, use this name for the link + text + - **alt** Provide alternate text for assistive technologies. + +Image files support these options: + + - **float** If layout is set to left or right, the image will be floated so + text wraps around it. + - **size** thumb (default), full + - **width** Scale image to a specific width. + - **height** Scale image to a specific height. + +Audio and video files support these options: + + - **media**: Specify the media type as `audio` or `video`. This allows you + to disambiguate how file format which may contain either audio or video + should be rendered. + - **loop**: Loop this media. + - **autoplay**: Automatically begin playing this media. + +== Embedding Countdowns + +You can embed a countdown by using braces: + + {C123} + += Quoting Text = + +To quote text, preface it with an `>`: + + > This is quoted text. + +This appears like this: + +> This is quoted text. + += Embedding Media = + +If you set a configuration flag, you can embed media directly in text: + + - **remarkup.enable-embedded-youtube**: allows you to paste in YouTube videos + and have them render inline. + +This option is disabled by default because it has security and/or +silliness implications. Carefully read the description before enabling it. + += Image Macros = + +You can upload image macros (More Stuff -> Macro) which will replace text +strings with the image you specify. For instance, you could upload an image of a +dancing banana to create a macro named "peanutbutterjellytime", and then any +time you type that string on a separate line it will be replaced with the image +of a dancing banana. + += Memes = + +You can also use image macros in the context of memes. For example, if you +have an image macro named `grumpy`, you can create a meme by doing the +following: + + {meme, src = grumpy, above = toptextgoeshere, below = bottomtextgoeshere} + +By default, the font used to create the text for the meme is `tuffy.ttf`. For +the more authentic feel of `impact.ttf`, you simply have to place the Impact +TrueType font in the Phorge subfolder `/resources/font/`. If Remarkup +detects the presence of `impact.ttf`, it will automatically use it. + += Mentioning Users = + +In Differential and Maniphest, you can mention another user by writing: + + @username + +When you submit your comment, this will add them as a CC on the revision or task +if they aren't already CC'd. + +Icons +===== + +You can add icons to comments using the `{icon ...}` syntax. For example: + + {icon camera} + +This renders: {icon camera} + +You can select a color for icons: + + {icon camera color=blue} + +This renders: {icon camera color=blue} + +For a list of available icons and colors, check the UIExamples application. +(The icons are sourced from +[[ https://fontawesome.com/v4.7.0/icons/ | FontAwesome ]], so you can also +browse the collection there.) + +You can add `spin` to make the icon spin: + + {icon cog spin} + +This renders: {icon cog spin} + + += Phriction Documents = + +You can link to Phriction documents with a name or path: + + Make sure you sign and date your [[legal/Letter of Marque and Reprisal]]! + +By default, the link will render with the document title as the link name. +With a pipe (`|`), you can retitle the link. Use this to mislead your +opponents: + + Check out these [[legal/boring_documents/ | exciting legal documents]]! + +Links to pages which do not exist are shown in red. Links to pages which exist +but which the viewer does not have permission to see are shown with a lock +icon, and the link will not disclose the page title. + +If you begin a link path with `./` or `../`, the remainder of the path will be +evaluated relative to the current wiki page. For example, if you are writing +content for the document `fruit/` a link to `[[./guava]]` is the same as a link +to `[[fruit/guava]]` from elsewhere. + +Relative links may use `../` to transverse up the document tree. From the +`produce/vegetables/` page, you can use `[[../fruit/guava]]` to link to the +`produce/fruit/guava` page. + +Relative links do not work when used outside of wiki pages. For example, +you can't use a relative link in a comment on a task, because there is no +reasonable place for the link to start resolving from. + +When documents are moved, relative links are not automatically updated: they +are preserved as currently written. After moving a document, you may need to +review and adjust any relative links it contains. + + += Literal Blocks = + +To place text in a literal block use `%%%`: + + %%%Text that won't be processed by remarkup + [[http://www.example.com | example]] + %%% + +Remarkup will not process the text inside of literal blocks (other than to +escape HTML and preserve line breaks). + += Tables = + +Remarkup supports simple table syntax. For example, this: + +``` +| Fruit | Color | Price | Peel? +| ----- | ----- | ----- | ----- +| Apple | red | `\$0.93` | no +| Banana | yellow | `\$0.19` | **YES** +``` + +...produces this: + +| Fruit | Color | Price | Peel? +| ----- | ----- | ----- | ----- +| Apple | red | `\$0.93` | no +| Banana | yellow | `\$0.19` | **YES** + +Remarkup also supports a simplified HTML table syntax. For example, this: + +``` + + + + + + + + + + + + + + + + + + + +
FruitColorPricePeel?
Applered`\$0.93`no
Bananayellow`\$0.19`**YES**
+``` + +...produces this: + + + + + + + + + + + + + + + + + + + + +
FruitColorPricePeel?
Applered`\$0.93`no
Bananayellow`\$0.19`**YES**
+ +Some general notes about this syntax: + + - your tags must all be properly balanced; + - your tags must NOT include attributes (`` is OK, `` is + not); + - you can use other Remarkup rules (like **bold**, //italics//, etc.) inside + table cells. + +Navigation Sequences +==================== + +You can use `{nav ...}` to render a stylized navigation sequence when helping +someone to locate something. This can be useful when writing documentation. +For example, you could give someone directions to purchase lemons: + +{nav icon=home, name=Home > +Grocery Store > +Produce Section > +icon=lemon-o, name=Lemons} + +To render this example, use this markup: + +``` +{nav icon=home, name=Home > +Grocery Store > +Produce Section > +icon=lemon-o, name=Lemons} +``` + +In general: + + - Separate sections with `>`. + - Each section can just have a name to add an element to the navigation + sequence, or a list of key-value pairs. + - Supported keys are `icon`, `name`, `type` and `href`. + - The `type` option can be set to `instructions` to indicate that an element + is asking the user to make a choice or follow specific instructions. + +Keystrokes +========== + +You can use `{key ...}` to render a stylized keystroke. For example, this: + +``` +Press {key M} to view the starmap. +``` + +...renders this: + +> Press {key M} to view the starmap. + +You can also render sequences with modifier keys. This: + +``` +Use {key command option shift 3} to take a screenshot. +Press {key down down-right right LP} to activate the hadoken technique. +``` + +...renders this: + +> Use {key command option shift 3} to take a screenshot. +> Press {key down down-right right LP} to activate the hadoken technique. + + +Anchors +======== + +You can use `{anchor #xyz}` to create a document anchor and later link to +it directly with `#xyz` in the URI. + +Headers also automatically create named anchors. + +If you navigate to `#xyz` in your browser location bar, the page will scroll +to the first anchor with "xyz" as a prefix of the anchor name. + + += Fullscreen Mode = + +Remarkup editors provide a fullscreen composition mode. This can make it easier +to edit large blocks of text, or improve focus by removing distractions. You can +exit **Fullscreen** mode by clicking the button again or by pressing escape. +EOTEXT; + + $remarkup_syntax_documentation_providers = id(new PhutilClassMapQuery()) + ->setAncestorClass('RemarkupSyntaxDocumentationProvider') + ->execute(); + + // add custom Remarkup help + $content .= "\r\n\r\n"; + foreach ($remarkup_syntax_documentation_providers as $doc_provider) { + $content .= $doc_provider->getDocumentation()."\r\n\r\n"; + } + + return $content; + } +} diff --git a/src/infrastructure/markup/interface/RemarkupSyntaxDocumentationProvider.php b/src/infrastructure/markup/interface/RemarkupSyntaxDocumentationProvider.php new file mode 100644 --- /dev/null +++ b/src/infrastructure/markup/interface/RemarkupSyntaxDocumentationProvider.php @@ -0,0 +1,5 @@ + pht('Help'), 'align' => 'right', - 'href' => PhabricatorEnv::getDoclink('Remarkup Reference'), + 'href' => '/reference/remarkup/', ); $mode_actions = array();