Reworking the config
This commit is contained in:
parent
03fe0b650f
commit
2ba1f4053f
76
README.md
76
README.md
@ -1,24 +1,25 @@
|
|||||||
**TM Docs** is an auto documentation generator that uses your folder structure and Markdown files to create custom documentation on the fly. It helps create great looking documentation in a developer friendly way.
|
**Daux.io** is an documentation generator that uses a simple folder structure and Markdown files to create custom documentation on the fly. It helps you create great looking documentation in a developer friendly way.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
|
* 100% Mobile responsive
|
||||||
* Supports GitHub Flavored Markdown
|
* Supports GitHub Flavored Markdown
|
||||||
* Auto Syntax Highlighting
|
* Auto Syntax Highlighting
|
||||||
* Auto Generated Navigation
|
* Auto Generated Navigation
|
||||||
* 12 Built-In Bootstrap Themes
|
* 4 Built-In Themes or roll your own
|
||||||
* 35 Syntax Highlighting Themes
|
|
||||||
* Shareable/Linkable SEO Friendly URLs
|
* Shareable/Linkable SEO Friendly URLs
|
||||||
* Built On Bootstrap
|
* Built On Bootstrap
|
||||||
* No Build Step
|
* No Build Step
|
||||||
* Git/SVN Friendly
|
* Git/SVN Friendly
|
||||||
|
* Optional code float layout
|
||||||
|
|
||||||
## Demos
|
## Demos
|
||||||
|
|
||||||
This is a list of sites using TM-Docs:
|
This is a list of sites using Daux.io:
|
||||||
|
|
||||||
* [TodayCMS Docs](http://docs.todaymade.com)
|
* [TodayCMS Docs](http://docs.todaymade.com)
|
||||||
|
|
||||||
Do you use TM-Docs? Send me a pull request or open an [issue](https://github.com/justinwalsh/tm-docs/issues) and I will add you to the list.
|
Do you use Daux.io? Send me a pull request or open an [issue](https://github.com/justinwalsh/tm-docs/issues) and I will add you to the list.
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
@ -26,13 +27,13 @@ Download this repository as a zip, and unpack. Copy the files to a web server th
|
|||||||
|
|
||||||
## Folders
|
## Folders
|
||||||
|
|
||||||
The generator will look for folders in the `/docs` folder. Add your folders inside the `/docs` folder. This project contains some example folders and files to get you started. It also contains a `Markdown Tests` folder which contains the official suite of tests for checking the functionality of the Markdown parser.
|
The generator will look for folders in the `/docs` folder. Add your folders inside the `/docs` folder. This project contains some example folders and files to get you started.
|
||||||
|
|
||||||
You can nest the folders any number of levels to get the exact structure you want. The folder structure will be converted to the nested navigation.
|
You can nest folders any number of levels to get the exact structure you want. The folder structure will be converted to the nested navigation.
|
||||||
|
|
||||||
## Files
|
## Files
|
||||||
|
|
||||||
The generator will look for Markdown files inside the `/docs` folder and any of your subfolders.
|
The generator will look for Markdown files inside the `/docs` folder and any of the subfolders within /docs.
|
||||||
|
|
||||||
You must use the `.md` file extension for your files. Also, you must use underscores instead of spaces. Here are some example file names and what they will be converted to:
|
You must use the `.md` file extension for your files. Also, you must use underscores instead of spaces. Here are some example file names and what they will be converted to:
|
||||||
|
|
||||||
@ -49,61 +50,82 @@ You must use the `.md` file extension for your files. Also, you must use undersc
|
|||||||
|
|
||||||
## Sorting
|
## Sorting
|
||||||
|
|
||||||
To sort your files and folders in a specific way, you can prefix them with a number and underscore, e.g. `/docs/01_Hello_World.md` and `/docs/05_Features.md` This will list *Hello World* before *Features*, overriding the alpha-numeric sorting, which is the default. The numbers will be stripped out of the navigation.
|
To sort your files and folders in a specific way, you can prefix them with a number and underscore, e.g. `/docs/01_Hello_World.md` and `/docs/05_Features.md` This will list *Hello World* before *Features*, overriding the deafult alpha-numeric sorting. The numbers will be stripped out of the navigation and urls.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
To customize the look and feel of your documentation, you can create a `config.json` file in the of the `/docs` folder. The `config.json` file is a simple JSON object that you can use to change some of the basic settings of the documentation.
|
To customize the look and feel of your documentation, you can create a `config.json` file in the of the `/docs` folder. The `config.json` file is a simple JSON object that you can use to change some of the basic settings of the documentation.
|
||||||
|
|
||||||
**Title:**
|
###Title:
|
||||||
Change the title bar in the docs
|
Change the title bar in the docs
|
||||||
|
|
||||||
{
|
{
|
||||||
"title": "TM-Docs the Todaymade Documentation Generator"
|
"title": "Daux.io"
|
||||||
}
|
}
|
||||||
|
|
||||||
**Default Homepage:**
|
###Default Homepage:
|
||||||
Set the default page someone is redirected to if they visit `/`
|
Set the default page someone is redirected to if they visit `/`
|
||||||
|
|
||||||
{
|
{
|
||||||
"homepage": "/Getting_Started"
|
"homepage": "/Getting_Started"
|
||||||
}
|
}
|
||||||
|
|
||||||
**Bootstrap Theme:**
|
###Themes:
|
||||||
We support the 12 Bootstrap themes from Bootswatch. To use on of the themes, just set this option to the lowercase name of the theme.
|
We have 4 built-in Bootstrap themes. To use one of the themes, just set the `theme` option to one of the following:
|
||||||
|
|
||||||
View the <a href="http://bootswatch.com/" target="_blank">**Demos**</a>
|
* blue
|
||||||
|
* green
|
||||||
|
* navy
|
||||||
|
* red
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"theme": "blue"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
###Custom Theme:
|
||||||
|
To create a custom color scheme, set the `theme` property to `custom` and then define the required colors. Copy the following configuration to get started:
|
||||||
|
|
||||||
{
|
{
|
||||||
"theme": "spacelab"
|
"theme": "custom"
|
||||||
|
"colors": {
|
||||||
|
"sidebar-background": "#f7f7f7",
|
||||||
|
"sidebar-hover": "#c5c5cb",
|
||||||
|
"lines": "#e7e7e9",
|
||||||
|
"dark": "#3f4657",
|
||||||
|
"light": "#82becd",
|
||||||
|
"text": "#2d2d2d",
|
||||||
|
"syntax-string": "#022e99",
|
||||||
|
"syntax-comment": "#84989b",
|
||||||
|
"syntax-number": "#2f9b92",
|
||||||
|
"syntax-label": "#840d7a"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
**Syntax Highlighting:**
|
###Code Floating:
|
||||||
We support all of the available themes for highlight.js. To use one of the themes, set this option to one of the available style names.
|
By deafult your code blocks will be floated to a column on the right side of your content. To disable this feature, set the `float` property to `false`.
|
||||||
|
|
||||||
View the <a href="http://softwaremaniacs.org/media/soft/highlight/test.html" target="_blank">**Demos**</a>
|
|
||||||
View the <a href="https://github.com/isagalaev/highlight.js/tree/master/src/styles" target="_blank">**Possible Option Values**</a>
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"hightlight": "dark"
|
"float": false
|
||||||
}
|
}
|
||||||
|
|
||||||
**Github Repo:**
|
|
||||||
|
###Github Repo:
|
||||||
Add a 'Fork me on Github' ribbon.
|
Add a 'Fork me on Github' ribbon.
|
||||||
|
|
||||||
{
|
{
|
||||||
"repo": "justinwalsh/tm-docs"
|
"repo": "justinwalsh/tm-docs"
|
||||||
}
|
}
|
||||||
|
|
||||||
**Twitter:**
|
###Twitter:
|
||||||
Include twitter follow buttons in the sidebar.
|
Include twitter follow buttons in the sidebar.
|
||||||
|
|
||||||
{
|
{
|
||||||
"twitter": ["justin_walsh", "todaymade"]
|
"twitter": ["justin_walsh", "todaymade"]
|
||||||
}
|
}
|
||||||
|
|
||||||
**Links:**
|
###Links:
|
||||||
Include custom links in the sidebar.
|
Include custom links in the sidebar.
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -116,7 +138,7 @@ Include custom links in the sidebar.
|
|||||||
|
|
||||||
## Running Locally
|
## Running Locally
|
||||||
|
|
||||||
You can run the docs locally using <a href="http://gruntjs.com/" target="_blank">Grunt.js</a>
|
You can run the docs locally using <a href="http://gruntjs.com/" target="_blank">Grunt.js</a> I assume you are familiar with how to use Grunt and have the latest version of PHP 5.4 installed which is able to run a webserver.
|
||||||
|
|
||||||
**Requirements:**
|
**Requirements:**
|
||||||
|
|
||||||
@ -129,4 +151,4 @@ This project contains a package.json file, so once you have the requirements ins
|
|||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
If you need help using TM Docs, or have found a bug, please create an issue on the <a href="http://localhost:8085" target="_blank">Github repo</a>.
|
If you need help using Daux.io, or have found a bug, please create an issue on the <a href="https://github.com/justinwalsh/tm-docs/issues" target="_blank">Github repo</a>.
|
@ -1,24 +1,26 @@
|
|||||||
**TM Docs** is an auto documentation generator that uses your folder structure and Markdown files to create custom documentation on the fly. It helps create great looking documentation in a developer friendly way.
|
**Daux.io** is an documentation generator that uses a simple folder structure and Markdown files to create custom documentation on the fly. It helps you create great looking documentation in a developer friendly way.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
|
* 100% Mobile responsive
|
||||||
* Supports GitHub Flavored Markdown
|
* Supports GitHub Flavored Markdown
|
||||||
|
* Auto created homepage/landing page
|
||||||
* Auto Syntax Highlighting
|
* Auto Syntax Highlighting
|
||||||
* Auto Generated Navigation
|
* Auto Generated Navigation
|
||||||
* 12 Built-In Bootstrap Themes
|
* 4 Built-In Themes or roll your own
|
||||||
* 35 Syntax Highlighting Themes
|
|
||||||
* Shareable/Linkable SEO Friendly URLs
|
* Shareable/Linkable SEO Friendly URLs
|
||||||
* Built On Bootstrap
|
* Built On Bootstrap
|
||||||
* No Build Step
|
* No Build Step
|
||||||
* Git/SVN Friendly
|
* Git/SVN Friendly
|
||||||
|
* Optional code float layout
|
||||||
|
|
||||||
## Demos
|
## Demos
|
||||||
|
|
||||||
This is a list of sites using TM-Docs:
|
This is a list of sites using Daux.io:
|
||||||
|
|
||||||
* [TodayCMS Docs](http://docs.todaymade.com)
|
* [TodayCMS Docs](http://docs.todaymade.com)
|
||||||
|
|
||||||
Do you use TM-Docs? Send me a pull request or open an [issue](https://github.com/justinwalsh/tm-docs/issues) and I will add you to the list.
|
Do you use Daux.io? Send me a pull request or open an [issue](https://github.com/justinwalsh/tm-docs/issues) and I will add you to the list.
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
@ -26,13 +28,13 @@ Download this repository as a zip, and unpack. Copy the files to a web server th
|
|||||||
|
|
||||||
## Folders
|
## Folders
|
||||||
|
|
||||||
The generator will look for folders in the `/docs` folder. Add your folders inside the `/docs` folder. This project contains some example folders and files to get you started. It also contains a `Markdown Tests` folder which contains the official suite of tests for checking the functionality of the Markdown parser.
|
The generator will look for folders in the `/docs` folder. Add your folders inside the `/docs` folder. This project contains some example folders and files to get you started.
|
||||||
|
|
||||||
You can nest the folders any number of levels to get the exact structure you want. The folder structure will be converted to the nested navigation.
|
You can nest folders any number of levels to get the exact structure you want. The folder structure will be converted to the nested navigation.
|
||||||
|
|
||||||
## Files
|
## Files
|
||||||
|
|
||||||
The generator will look for Markdown files inside the `/docs` folder and any of your subfolders.
|
The generator will look for Markdown files inside the `/docs` folder and any of the subfolders within /docs.
|
||||||
|
|
||||||
You must use the `.md` file extension for your files. Also, you must use underscores instead of spaces. Here are some example file names and what they will be converted to:
|
You must use the `.md` file extension for your files. Also, you must use underscores instead of spaces. Here are some example file names and what they will be converted to:
|
||||||
|
|
||||||
@ -49,61 +51,82 @@ You must use the `.md` file extension for your files. Also, you must use undersc
|
|||||||
|
|
||||||
## Sorting
|
## Sorting
|
||||||
|
|
||||||
To sort your files and folders in a specific way, you can prefix them with a number and underscore, e.g. `/docs/01_Hello_World.md` and `/docs/05_Features.md` This will list *Hello World* before *Features*, overriding the alpha-numeric sorting, which is the default. The numbers will be stripped out of the navigation.
|
To sort your files and folders in a specific way, you can prefix them with a number and underscore, e.g. `/docs/01_Hello_World.md` and `/docs/05_Features.md` This will list *Hello World* before *Features*, overriding the deafult alpha-numeric sorting. The numbers will be stripped out of the navigation and urls.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
To customize the look and feel of your documentation, you can create a `config.json` file in the of the `/docs` folder. The `config.json` file is a simple JSON object that you can use to change some of the basic settings of the documentation.
|
To customize the look and feel of your documentation, you can create a `config.json` file in the of the `/docs` folder. The `config.json` file is a simple JSON object that you can use to change some of the basic settings of the documentation.
|
||||||
|
|
||||||
**Title:**
|
###Title:
|
||||||
Change the title bar in the docs
|
Change the title bar in the docs
|
||||||
|
|
||||||
{
|
{
|
||||||
"title": "TM-Docs the Todaymade Documentation Generator"
|
"title": "Daux.io"
|
||||||
}
|
}
|
||||||
|
|
||||||
**Default Homepage:**
|
###Default Homepage:
|
||||||
Set the default page someone is redirected to if they visit `/`
|
Set the default page someone is redirected to if they visit `/`
|
||||||
|
|
||||||
{
|
{
|
||||||
"homepage": "/Getting_Started"
|
"homepage": "/Getting_Started"
|
||||||
}
|
}
|
||||||
|
|
||||||
**Bootstrap Theme:**
|
###Themes:
|
||||||
We support the 12 Bootstrap themes from Bootswatch. To use on of the themes, just set this option to the lowercase name of the theme.
|
We have 4 built-in Bootstrap themes. To use one of the themes, just set the `theme` option to one of the following:
|
||||||
|
|
||||||
View the <a href="http://bootswatch.com/" target="_blank">**Demos**</a>
|
* blue
|
||||||
|
* green
|
||||||
|
* navy
|
||||||
|
* red
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"theme": "blue"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
###Custom Theme:
|
||||||
|
To create a custom color scheme, set the `theme` property to `custom` and then define the required colors. Copy the following configuration to get started:
|
||||||
|
|
||||||
{
|
{
|
||||||
"theme": "spacelab"
|
"theme": "custom",
|
||||||
|
"colors": {
|
||||||
|
"sidebar-background": "#f7f7f7",
|
||||||
|
"sidebar-hover": "#c5c5cb",
|
||||||
|
"lines": "#e7e7e9",
|
||||||
|
"dark": "#3f4657",
|
||||||
|
"light": "#82becd",
|
||||||
|
"text": "#2d2d2d",
|
||||||
|
"syntax-string": "#022e99",
|
||||||
|
"syntax-comment": "#84989b",
|
||||||
|
"syntax-number": "#2f9b92",
|
||||||
|
"syntax-label": "#840d7a"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
**Syntax Highlighting:**
|
###Code Floating:
|
||||||
We support all of the available themes for highlight.js. To use one of the themes, set this option to one of the available style names.
|
By deafult your code blocks will be floated to a column on the right side of your content. To disable this feature, set the `float` property to `false`.
|
||||||
|
|
||||||
View the <a href="http://softwaremaniacs.org/media/soft/highlight/test.html" target="_blank">**Demos**</a>
|
|
||||||
View the <a href="https://github.com/isagalaev/highlight.js/tree/master/src/styles" target="_blank">**Possible Option Values**</a>
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"hightlight": "dark"
|
"float": false
|
||||||
}
|
}
|
||||||
|
|
||||||
**Github Repo:**
|
|
||||||
|
###Github Repo:
|
||||||
Add a 'Fork me on Github' ribbon.
|
Add a 'Fork me on Github' ribbon.
|
||||||
|
|
||||||
{
|
{
|
||||||
"repo": "justinwalsh/tm-docs"
|
"repo": "justinwalsh/tm-docs"
|
||||||
}
|
}
|
||||||
|
|
||||||
**Twitter:**
|
###Twitter:
|
||||||
Include twitter follow buttons in the sidebar.
|
Include twitter follow buttons in the sidebar.
|
||||||
|
|
||||||
{
|
{
|
||||||
"twitter": ["justin_walsh", "todaymade"]
|
"twitter": ["justin_walsh", "todaymade"]
|
||||||
}
|
}
|
||||||
|
|
||||||
**Links:**
|
###Links:
|
||||||
Include custom links in the sidebar.
|
Include custom links in the sidebar.
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -116,7 +139,7 @@ Include custom links in the sidebar.
|
|||||||
|
|
||||||
## Running Locally
|
## Running Locally
|
||||||
|
|
||||||
You can run the docs locally using <a href="http://gruntjs.com/" target="_blank">Grunt.js</a>
|
You can run the docs locally using <a href="http://gruntjs.com/" target="_blank">Grunt.js</a> I assume you are familiar with how to use Grunt and have the latest version of PHP 5.4 installed which is able to run a webserver.
|
||||||
|
|
||||||
**Requirements:**
|
**Requirements:**
|
||||||
|
|
||||||
@ -129,4 +152,4 @@ This project contains a package.json file, so once you have the requirements ins
|
|||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
If you need help using TM Docs, or have found a bug, please create an issue on the <a href="http://localhost:8085" target="_blank">Github repo</a>.
|
If you need help using Daux.io, or have found a bug, please create an issue on the <a href="https://github.com/justinwalsh/tm-docs/issues" target="_blank">Github repo</a>.
|
@ -1,21 +0,0 @@
|
|||||||
AT&T has an ampersand in their name.
|
|
||||||
|
|
||||||
AT&T is another way to write it.
|
|
||||||
|
|
||||||
This & that.
|
|
||||||
|
|
||||||
4 < 5.
|
|
||||||
|
|
||||||
6 > 5.
|
|
||||||
|
|
||||||
Here's a [link] [1] with an ampersand in the URL.
|
|
||||||
|
|
||||||
Here's a link with an amersand in the link text: [AT&T] [2].
|
|
||||||
|
|
||||||
Here's an inline [link](/script?foo=1&bar=2).
|
|
||||||
|
|
||||||
Here's an inline [link](</script?foo=1&bar=2>).
|
|
||||||
|
|
||||||
|
|
||||||
[1]: http://example.com/?foo=1&bar=2
|
|
||||||
[2]: http://att.com/ "AT&T"
|
|
@ -1,13 +0,0 @@
|
|||||||
Link: <http://example.com/>.
|
|
||||||
|
|
||||||
With an ampersand: <http://example.com/?foo=1&bar=2>
|
|
||||||
|
|
||||||
* In a list?
|
|
||||||
* <http://example.com/>
|
|
||||||
* It should.
|
|
||||||
|
|
||||||
> Blockquoted: <http://example.com/>
|
|
||||||
|
|
||||||
Auto-links should not occur here: `<http://example.com/>`
|
|
||||||
|
|
||||||
or here: <http://example.com/>
|
|
@ -1,104 +0,0 @@
|
|||||||
These should all get escaped:
|
|
||||||
|
|
||||||
Backslash: \\
|
|
||||||
|
|
||||||
Backtick: \`
|
|
||||||
|
|
||||||
Asterisk: \*
|
|
||||||
|
|
||||||
Underscore: \_
|
|
||||||
|
|
||||||
Left brace: \{
|
|
||||||
|
|
||||||
Right brace: \}
|
|
||||||
|
|
||||||
Left bracket: \[
|
|
||||||
|
|
||||||
Right bracket: \]
|
|
||||||
|
|
||||||
Left paren: \(
|
|
||||||
|
|
||||||
Right paren: \)
|
|
||||||
|
|
||||||
Greater-than: \>
|
|
||||||
|
|
||||||
Hash: \#
|
|
||||||
|
|
||||||
Period: \.
|
|
||||||
|
|
||||||
Bang: \!
|
|
||||||
|
|
||||||
Plus: \+
|
|
||||||
|
|
||||||
Minus: \-
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
These should not, because they occur within a code block:
|
|
||||||
|
|
||||||
Backslash: \\
|
|
||||||
|
|
||||||
Backtick: \`
|
|
||||||
|
|
||||||
Asterisk: \*
|
|
||||||
|
|
||||||
Underscore: \_
|
|
||||||
|
|
||||||
Left brace: \{
|
|
||||||
|
|
||||||
Right brace: \}
|
|
||||||
|
|
||||||
Left bracket: \[
|
|
||||||
|
|
||||||
Right bracket: \]
|
|
||||||
|
|
||||||
Left paren: \(
|
|
||||||
|
|
||||||
Right paren: \)
|
|
||||||
|
|
||||||
Greater-than: \>
|
|
||||||
|
|
||||||
Hash: \#
|
|
||||||
|
|
||||||
Period: \.
|
|
||||||
|
|
||||||
Bang: \!
|
|
||||||
|
|
||||||
Plus: \+
|
|
||||||
|
|
||||||
Minus: \-
|
|
||||||
|
|
||||||
|
|
||||||
Nor should these, which occur in code spans:
|
|
||||||
|
|
||||||
Backslash: `\\`
|
|
||||||
|
|
||||||
Backtick: `` \` ``
|
|
||||||
|
|
||||||
Asterisk: `\*`
|
|
||||||
|
|
||||||
Underscore: `\_`
|
|
||||||
|
|
||||||
Left brace: `\{`
|
|
||||||
|
|
||||||
Right brace: `\}`
|
|
||||||
|
|
||||||
Left bracket: `\[`
|
|
||||||
|
|
||||||
Right bracket: `\]`
|
|
||||||
|
|
||||||
Left paren: `\(`
|
|
||||||
|
|
||||||
Right paren: `\)`
|
|
||||||
|
|
||||||
Greater-than: `\>`
|
|
||||||
|
|
||||||
Hash: `\#`
|
|
||||||
|
|
||||||
Period: `\.`
|
|
||||||
|
|
||||||
Bang: `\!`
|
|
||||||
|
|
||||||
Plus: `\+`
|
|
||||||
|
|
||||||
Minus: `\-`
|
|
@ -1,11 +0,0 @@
|
|||||||
> Example:
|
|
||||||
>
|
|
||||||
> sub status {
|
|
||||||
> print "working";
|
|
||||||
> }
|
|
||||||
>
|
|
||||||
> Or:
|
|
||||||
>
|
|
||||||
> sub status {
|
|
||||||
> return "working";
|
|
||||||
> }
|
|
@ -1,8 +0,0 @@
|
|||||||
In Markdown 1.0.0 and earlier. Version
|
|
||||||
8. This line turns into a list item.
|
|
||||||
Because a hard-wrapped line in the
|
|
||||||
middle of a paragraph looked like a
|
|
||||||
list item.
|
|
||||||
|
|
||||||
Here's one with a bullet.
|
|
||||||
* criminey.
|
|
@ -1,67 +0,0 @@
|
|||||||
Dashes:
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
- - -
|
|
||||||
|
|
||||||
- - -
|
|
||||||
|
|
||||||
- - -
|
|
||||||
|
|
||||||
- - -
|
|
||||||
|
|
||||||
- - -
|
|
||||||
|
|
||||||
|
|
||||||
Asterisks:
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
* * *
|
|
||||||
|
|
||||||
* * *
|
|
||||||
|
|
||||||
* * *
|
|
||||||
|
|
||||||
* * *
|
|
||||||
|
|
||||||
* * *
|
|
||||||
|
|
||||||
|
|
||||||
Underscores:
|
|
||||||
|
|
||||||
___
|
|
||||||
|
|
||||||
___
|
|
||||||
|
|
||||||
___
|
|
||||||
|
|
||||||
___
|
|
||||||
|
|
||||||
___
|
|
||||||
|
|
||||||
_ _ _
|
|
||||||
|
|
||||||
_ _ _
|
|
||||||
|
|
||||||
_ _ _
|
|
||||||
|
|
||||||
_ _ _
|
|
||||||
|
|
||||||
_ _ _
|
|
@ -1,14 +0,0 @@
|
|||||||
Simple block on one line:
|
|
||||||
|
|
||||||
<div>foo</div>
|
|
||||||
|
|
||||||
And nested without indentation:
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<div>
|
|
||||||
<div>
|
|
||||||
foo
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>bar</div>
|
|
||||||
</div>
|
|
@ -1,69 +0,0 @@
|
|||||||
Here's a simple block:
|
|
||||||
|
|
||||||
<div>
|
|
||||||
foo
|
|
||||||
</div>
|
|
||||||
|
|
||||||
This should be a code block, though:
|
|
||||||
|
|
||||||
<div>
|
|
||||||
foo
|
|
||||||
</div>
|
|
||||||
|
|
||||||
As should this:
|
|
||||||
|
|
||||||
<div>foo</div>
|
|
||||||
|
|
||||||
Now, nested:
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<div>
|
|
||||||
<div>
|
|
||||||
foo
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
This should just be an HTML comment:
|
|
||||||
|
|
||||||
<!-- Comment -->
|
|
||||||
|
|
||||||
Multiline:
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Blah
|
|
||||||
Blah
|
|
||||||
-->
|
|
||||||
|
|
||||||
Code block:
|
|
||||||
|
|
||||||
<!-- Comment -->
|
|
||||||
|
|
||||||
Just plain comment, with trailing spaces on the line:
|
|
||||||
|
|
||||||
<!-- foo -->
|
|
||||||
|
|
||||||
Code:
|
|
||||||
|
|
||||||
<hr />
|
|
||||||
|
|
||||||
Hr's:
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<hr/>
|
|
||||||
|
|
||||||
<hr />
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<hr/>
|
|
||||||
|
|
||||||
<hr />
|
|
||||||
|
|
||||||
<hr class="foo" id="bar" />
|
|
||||||
|
|
||||||
<hr class="foo" id="bar"/>
|
|
||||||
|
|
||||||
<hr class="foo" id="bar" >
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
Paragraph one.
|
|
||||||
|
|
||||||
<!-- This is a simple comment -->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
This is another comment.
|
|
||||||
-->
|
|
||||||
|
|
||||||
Paragraph two.
|
|
||||||
|
|
||||||
<!-- one comment block -- -- with two comments -->
|
|
||||||
|
|
||||||
The end.
|
|
@ -1,9 +0,0 @@
|
|||||||
Just a [URL](/url/).
|
|
||||||
|
|
||||||
[URL and title](/url/ "title").
|
|
||||||
|
|
||||||
[URL and title](/url/ "title preceded by two spaces").
|
|
||||||
|
|
||||||
[URL and title](/url/ "title preceded by a tab").
|
|
||||||
|
|
||||||
[Empty]().
|
|
@ -1,31 +0,0 @@
|
|||||||
Foo [bar] [1].
|
|
||||||
|
|
||||||
Foo [bar][1].
|
|
||||||
|
|
||||||
Foo [bar]
|
|
||||||
[1].
|
|
||||||
|
|
||||||
[1]: /url/ "Title"
|
|
||||||
|
|
||||||
|
|
||||||
With [embedded [brackets]] [b].
|
|
||||||
|
|
||||||
|
|
||||||
Indented [once][].
|
|
||||||
|
|
||||||
Indented [twice][].
|
|
||||||
|
|
||||||
Indented [thrice][].
|
|
||||||
|
|
||||||
Indented [four][] times.
|
|
||||||
|
|
||||||
[once]: /url
|
|
||||||
|
|
||||||
[twice]: /url
|
|
||||||
|
|
||||||
[thrice]: /url
|
|
||||||
|
|
||||||
[four]: /url
|
|
||||||
|
|
||||||
|
|
||||||
[b]: /url/
|
|
@ -1,7 +0,0 @@
|
|||||||
Foo [bar][].
|
|
||||||
|
|
||||||
Foo [bar](/url/ "Title with "quotes" inside").
|
|
||||||
|
|
||||||
|
|
||||||
[bar]: /url/ "Title with "quotes" inside"
|
|
||||||
|
|
@ -1,306 +0,0 @@
|
|||||||
Markdown: Basics
|
|
||||||
================
|
|
||||||
|
|
||||||
<ul id="ProjectSubmenu">
|
|
||||||
<li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li>
|
|
||||||
<li><a class="selected" title="Markdown Basics">Basics</a></li>
|
|
||||||
<li><a href="/projects/markdown/syntax" title="Markdown Syntax Documentation">Syntax</a></li>
|
|
||||||
<li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li>
|
|
||||||
<li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
|
|
||||||
Getting the Gist of Markdown's Formatting Syntax
|
|
||||||
------------------------------------------------
|
|
||||||
|
|
||||||
This page offers a brief overview of what it's like to use Markdown.
|
|
||||||
The [syntax page] [s] provides complete, detailed documentation for
|
|
||||||
every feature, but Markdown should be very easy to pick up simply by
|
|
||||||
looking at a few examples of it in action. The examples on this page
|
|
||||||
are written in a before/after style, showing example syntax and the
|
|
||||||
HTML output produced by Markdown.
|
|
||||||
|
|
||||||
It's also helpful to simply try Markdown out; the [Dingus] [d] is a
|
|
||||||
web application that allows you type your own Markdown-formatted text
|
|
||||||
and translate it to XHTML.
|
|
||||||
|
|
||||||
**Note:** This document is itself written using Markdown; you
|
|
||||||
can [see the source for it by adding '.text' to the URL] [src].
|
|
||||||
|
|
||||||
[s]: /projects/markdown/syntax "Markdown Syntax"
|
|
||||||
[d]: /projects/markdown/dingus "Markdown Dingus"
|
|
||||||
[src]: /projects/markdown/basics.text
|
|
||||||
|
|
||||||
|
|
||||||
## Paragraphs, Headers, Blockquotes ##
|
|
||||||
|
|
||||||
A paragraph is simply one or more consecutive lines of text, separated
|
|
||||||
by one or more blank lines. (A blank line is any line that looks like a
|
|
||||||
blank line -- a line containing nothing spaces or tabs is considered
|
|
||||||
blank.) Normal paragraphs should not be intended with spaces or tabs.
|
|
||||||
|
|
||||||
Markdown offers two styles of headers: *Setext* and *atx*.
|
|
||||||
Setext-style headers for `<h1>` and `<h2>` are created by
|
|
||||||
"underlining" with equal signs (`=`) and hyphens (`-`), respectively.
|
|
||||||
To create an atx-style header, you put 1-6 hash marks (`#`) at the
|
|
||||||
beginning of the line -- the number of hashes equals the resulting
|
|
||||||
HTML header level.
|
|
||||||
|
|
||||||
Blockquotes are indicated using email-style '`>`' angle brackets.
|
|
||||||
|
|
||||||
Markdown:
|
|
||||||
|
|
||||||
A First Level Header
|
|
||||||
====================
|
|
||||||
|
|
||||||
A Second Level Header
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
Now is the time for all good men to come to
|
|
||||||
the aid of their country. This is just a
|
|
||||||
regular paragraph.
|
|
||||||
|
|
||||||
The quick brown fox jumped over the lazy
|
|
||||||
dog's back.
|
|
||||||
|
|
||||||
### Header 3
|
|
||||||
|
|
||||||
> This is a blockquote.
|
|
||||||
>
|
|
||||||
> This is the second paragraph in the blockquote.
|
|
||||||
>
|
|
||||||
> ## This is an H2 in a blockquote
|
|
||||||
|
|
||||||
|
|
||||||
Output:
|
|
||||||
|
|
||||||
<h1>A First Level Header</h1>
|
|
||||||
|
|
||||||
<h2>A Second Level Header</h2>
|
|
||||||
|
|
||||||
<p>Now is the time for all good men to come to
|
|
||||||
the aid of their country. This is just a
|
|
||||||
regular paragraph.</p>
|
|
||||||
|
|
||||||
<p>The quick brown fox jumped over the lazy
|
|
||||||
dog's back.</p>
|
|
||||||
|
|
||||||
<h3>Header 3</h3>
|
|
||||||
|
|
||||||
<blockquote>
|
|
||||||
<p>This is a blockquote.</p>
|
|
||||||
|
|
||||||
<p>This is the second paragraph in the blockquote.</p>
|
|
||||||
|
|
||||||
<h2>This is an H2 in a blockquote</h2>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Phrase Emphasis ###
|
|
||||||
|
|
||||||
Markdown uses asterisks and underscores to indicate spans of emphasis.
|
|
||||||
|
|
||||||
Markdown:
|
|
||||||
|
|
||||||
Some of these words *are emphasized*.
|
|
||||||
Some of these words _are emphasized also_.
|
|
||||||
|
|
||||||
Use two asterisks for **strong emphasis**.
|
|
||||||
Or, if you prefer, __use two underscores instead__.
|
|
||||||
|
|
||||||
Output:
|
|
||||||
|
|
||||||
<p>Some of these words <em>are emphasized</em>.
|
|
||||||
Some of these words <em>are emphasized also</em>.</p>
|
|
||||||
|
|
||||||
<p>Use two asterisks for <strong>strong emphasis</strong>.
|
|
||||||
Or, if you prefer, <strong>use two underscores instead</strong>.</p>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Lists ##
|
|
||||||
|
|
||||||
Unordered (bulleted) lists use asterisks, pluses, and hyphens (`*`,
|
|
||||||
`+`, and `-`) as list markers. These three markers are
|
|
||||||
interchangable; this:
|
|
||||||
|
|
||||||
* Candy.
|
|
||||||
* Gum.
|
|
||||||
* Booze.
|
|
||||||
|
|
||||||
this:
|
|
||||||
|
|
||||||
+ Candy.
|
|
||||||
+ Gum.
|
|
||||||
+ Booze.
|
|
||||||
|
|
||||||
and this:
|
|
||||||
|
|
||||||
- Candy.
|
|
||||||
- Gum.
|
|
||||||
- Booze.
|
|
||||||
|
|
||||||
all produce the same output:
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Candy.</li>
|
|
||||||
<li>Gum.</li>
|
|
||||||
<li>Booze.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
Ordered (numbered) lists use regular numbers, followed by periods, as
|
|
||||||
list markers:
|
|
||||||
|
|
||||||
1. Red
|
|
||||||
2. Green
|
|
||||||
3. Blue
|
|
||||||
|
|
||||||
Output:
|
|
||||||
|
|
||||||
<ol>
|
|
||||||
<li>Red</li>
|
|
||||||
<li>Green</li>
|
|
||||||
<li>Blue</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
If you put blank lines between items, you'll get `<p>` tags for the
|
|
||||||
list item text. You can create multi-paragraph list items by indenting
|
|
||||||
the paragraphs by 4 spaces or 1 tab:
|
|
||||||
|
|
||||||
* A list item.
|
|
||||||
|
|
||||||
With multiple paragraphs.
|
|
||||||
|
|
||||||
* Another item in the list.
|
|
||||||
|
|
||||||
Output:
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><p>A list item.</p>
|
|
||||||
<p>With multiple paragraphs.</p></li>
|
|
||||||
<li><p>Another item in the list.</p></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Links ###
|
|
||||||
|
|
||||||
Markdown supports two styles for creating links: *inline* and
|
|
||||||
*reference*. With both styles, you use square brackets to delimit the
|
|
||||||
text you want to turn into a link.
|
|
||||||
|
|
||||||
Inline-style links use parentheses immediately after the link text.
|
|
||||||
For example:
|
|
||||||
|
|
||||||
This is an [example link](http://example.com/).
|
|
||||||
|
|
||||||
Output:
|
|
||||||
|
|
||||||
<p>This is an <a href="http://example.com/">
|
|
||||||
example link</a>.</p>
|
|
||||||
|
|
||||||
Optionally, you may include a title attribute in the parentheses:
|
|
||||||
|
|
||||||
This is an [example link](http://example.com/ "With a Title").
|
|
||||||
|
|
||||||
Output:
|
|
||||||
|
|
||||||
<p>This is an <a href="http://example.com/" title="With a Title">
|
|
||||||
example link</a>.</p>
|
|
||||||
|
|
||||||
Reference-style links allow you to refer to your links by names, which
|
|
||||||
you define elsewhere in your document:
|
|
||||||
|
|
||||||
I get 10 times more traffic from [Google][1] than from
|
|
||||||
[Yahoo][2] or [MSN][3].
|
|
||||||
|
|
||||||
[1]: http://google.com/ "Google"
|
|
||||||
[2]: http://search.yahoo.com/ "Yahoo Search"
|
|
||||||
[3]: http://search.msn.com/ "MSN Search"
|
|
||||||
|
|
||||||
Output:
|
|
||||||
|
|
||||||
<p>I get 10 times more traffic from <a href="http://google.com/"
|
|
||||||
title="Google">Google</a> than from <a href="http://search.yahoo.com/"
|
|
||||||
title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/"
|
|
||||||
title="MSN Search">MSN</a>.</p>
|
|
||||||
|
|
||||||
The title attribute is optional. Link names may contain letters,
|
|
||||||
numbers and spaces, but are *not* case sensitive:
|
|
||||||
|
|
||||||
I start my morning with a cup of coffee and
|
|
||||||
[The New York Times][NY Times].
|
|
||||||
|
|
||||||
[ny times]: http://www.nytimes.com/
|
|
||||||
|
|
||||||
Output:
|
|
||||||
|
|
||||||
<p>I start my morning with a cup of coffee and
|
|
||||||
<a href="http://www.nytimes.com/">The New York Times</a>.</p>
|
|
||||||
|
|
||||||
|
|
||||||
### Images ###
|
|
||||||
|
|
||||||
Image syntax is very much like link syntax.
|
|
||||||
|
|
||||||
Inline (titles are optional):
|
|
||||||
|
|
||||||
![alt text](/path/to/img.jpg "Title")
|
|
||||||
|
|
||||||
Reference-style:
|
|
||||||
|
|
||||||
![alt text][id]
|
|
||||||
|
|
||||||
[id]: /path/to/img.jpg "Title"
|
|
||||||
|
|
||||||
Both of the above examples produce the same output:
|
|
||||||
|
|
||||||
<img src="/path/to/img.jpg" alt="alt text" title="Title" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Code ###
|
|
||||||
|
|
||||||
In a regular paragraph, you can create code span by wrapping text in
|
|
||||||
backtick quotes. Any ampersands (`&`) and angle brackets (`<` or
|
|
||||||
`>`) will automatically be translated into HTML entities. This makes
|
|
||||||
it easy to use Markdown to write about HTML example code:
|
|
||||||
|
|
||||||
I strongly recommend against using any `<blink>` tags.
|
|
||||||
|
|
||||||
I wish SmartyPants used named entities like `—`
|
|
||||||
instead of decimal-encoded entites like `—`.
|
|
||||||
|
|
||||||
Output:
|
|
||||||
|
|
||||||
<p>I strongly recommend against using any
|
|
||||||
<code><blink></code> tags.</p>
|
|
||||||
|
|
||||||
<p>I wish SmartyPants used named entities like
|
|
||||||
<code>&mdash;</code> instead of decimal-encoded
|
|
||||||
entites like <code>&#8212;</code>.</p>
|
|
||||||
|
|
||||||
|
|
||||||
To specify an entire block of pre-formatted code, indent every line of
|
|
||||||
the block by 4 spaces or 1 tab. Just like with code spans, `&`, `<`,
|
|
||||||
and `>` characters will be escaped automatically.
|
|
||||||
|
|
||||||
Markdown:
|
|
||||||
|
|
||||||
If you want your page to validate under XHTML 1.0 Strict,
|
|
||||||
you've got to put paragraph tags in your blockquotes:
|
|
||||||
|
|
||||||
<blockquote>
|
|
||||||
<p>For example.</p>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
Output:
|
|
||||||
|
|
||||||
<p>If you want your page to validate under XHTML 1.0 Strict,
|
|
||||||
you've got to put paragraph tags in your blockquotes:</p>
|
|
||||||
|
|
||||||
<pre><code><blockquote>
|
|
||||||
<p>For example.</p>
|
|
||||||
</blockquote>
|
|
||||||
</code></pre>
|
|
@ -1,888 +0,0 @@
|
|||||||
Markdown: Syntax
|
|
||||||
================
|
|
||||||
|
|
||||||
<ul id="ProjectSubmenu">
|
|
||||||
<li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li>
|
|
||||||
<li><a href="/projects/markdown/basics" title="Markdown Basics">Basics</a></li>
|
|
||||||
<li><a class="selected" title="Markdown Syntax Documentation">Syntax</a></li>
|
|
||||||
<li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li>
|
|
||||||
<li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
|
|
||||||
* [Overview](#overview)
|
|
||||||
* [Philosophy](#philosophy)
|
|
||||||
* [Inline HTML](#html)
|
|
||||||
* [Automatic Escaping for Special Characters](#autoescape)
|
|
||||||
* [Block Elements](#block)
|
|
||||||
* [Paragraphs and Line Breaks](#p)
|
|
||||||
* [Headers](#header)
|
|
||||||
* [Blockquotes](#blockquote)
|
|
||||||
* [Lists](#list)
|
|
||||||
* [Code Blocks](#precode)
|
|
||||||
* [Horizontal Rules](#hr)
|
|
||||||
* [Span Elements](#span)
|
|
||||||
* [Links](#link)
|
|
||||||
* [Emphasis](#em)
|
|
||||||
* [Code](#code)
|
|
||||||
* [Images](#img)
|
|
||||||
* [Miscellaneous](#misc)
|
|
||||||
* [Backslash Escapes](#backslash)
|
|
||||||
* [Automatic Links](#autolink)
|
|
||||||
|
|
||||||
|
|
||||||
**Note:** This document is itself written using Markdown; you
|
|
||||||
can [see the source for it by adding '.text' to the URL][src].
|
|
||||||
|
|
||||||
[src]: /projects/markdown/syntax.text
|
|
||||||
|
|
||||||
* * *
|
|
||||||
|
|
||||||
<h2 id="overview">Overview</h2>
|
|
||||||
|
|
||||||
<h3 id="philosophy">Philosophy</h3>
|
|
||||||
|
|
||||||
Markdown is intended to be as easy-to-read and easy-to-write as is feasible.
|
|
||||||
|
|
||||||
Readability, however, is emphasized above all else. 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. While
|
|
||||||
Markdown's syntax has been influenced by several existing text-to-HTML
|
|
||||||
filters -- including [Setext] [1], [atx] [2], [Textile] [3], [reStructuredText] [4],
|
|
||||||
[Grutatext] [5], and [EtText] [6] -- the single biggest source of
|
|
||||||
inspiration for Markdown's syntax is the format of plain text email.
|
|
||||||
|
|
||||||
[1]: http://docutils.sourceforge.net/mirror/setext.html
|
|
||||||
[2]: http://www.aaronsw.com/2002/atx/
|
|
||||||
[3]: http://textism.com/tools/textile/
|
|
||||||
[4]: http://docutils.sourceforge.net/rst.html
|
|
||||||
[5]: http://www.triptico.com/software/grutatxt.html
|
|
||||||
[6]: http://ettext.taint.org/doc/
|
|
||||||
|
|
||||||
To this end, Markdown's syntax is comprised entirely of punctuation
|
|
||||||
characters, which punctuation characters have been carefully chosen so
|
|
||||||
as to look like what they mean. E.g., asterisks around a word actually
|
|
||||||
look like \*emphasis\*. Markdown lists look like, well, lists. Even
|
|
||||||
blockquotes look like quoted passages of text, assuming you've ever
|
|
||||||
used email.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3 id="html">Inline HTML</h3>
|
|
||||||
|
|
||||||
Markdown's syntax is intended for one purpose: to be used as a
|
|
||||||
format for *writing* for the web.
|
|
||||||
|
|
||||||
Markdown is not a replacement for HTML, or even close to it. Its
|
|
||||||
syntax is very small, corresponding only to a very small subset of
|
|
||||||
HTML tags. The idea is *not* to create a syntax that makes it easier
|
|
||||||
to insert HTML tags. In my opinion, HTML tags are already easy to
|
|
||||||
insert. The idea for Markdown is to make it easy to read, write, and
|
|
||||||
edit prose. HTML is a *publishing* format; Markdown is a *writing*
|
|
||||||
format. Thus, Markdown's formatting syntax only addresses issues that
|
|
||||||
can be conveyed in plain text.
|
|
||||||
|
|
||||||
For any markup that is not covered by Markdown's syntax, you simply
|
|
||||||
use HTML itself. There's no need to preface it or delimit it to
|
|
||||||
indicate that you're switching from Markdown to HTML; you just use
|
|
||||||
the tags.
|
|
||||||
|
|
||||||
The only restrictions are that block-level HTML elements -- e.g. `<div>`,
|
|
||||||
`<table>`, `<pre>`, `<p>`, etc. -- must be separated from surrounding
|
|
||||||
content by blank lines, and the start and end tags of the block should
|
|
||||||
not be indented with tabs or spaces. Markdown is smart enough not
|
|
||||||
to add extra (unwanted) `<p>` tags around HTML block-level tags.
|
|
||||||
|
|
||||||
For example, to add an HTML table to a Markdown article:
|
|
||||||
|
|
||||||
This is a regular paragraph.
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<td>Foo</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
This is another regular paragraph.
|
|
||||||
|
|
||||||
Note that Markdown formatting syntax is not processed within block-level
|
|
||||||
HTML tags. E.g., you can't use Markdown-style `*emphasis*` inside an
|
|
||||||
HTML block.
|
|
||||||
|
|
||||||
Span-level HTML tags -- e.g. `<span>`, `<cite>`, or `<del>` -- can be
|
|
||||||
used anywhere in a Markdown paragraph, list item, or header. If you
|
|
||||||
want, you can even use HTML tags instead of Markdown formatting; e.g. if
|
|
||||||
you'd prefer to use HTML `<a>` or `<img>` tags instead of Markdown's
|
|
||||||
link or image syntax, go right ahead.
|
|
||||||
|
|
||||||
Unlike block-level HTML tags, Markdown syntax *is* processed within
|
|
||||||
span-level tags.
|
|
||||||
|
|
||||||
|
|
||||||
<h3 id="autoescape">Automatic Escaping for Special Characters</h3>
|
|
||||||
|
|
||||||
In HTML, there are two characters that demand special treatment: `<`
|
|
||||||
and `&`. Left angle brackets are used to start tags; ampersands are
|
|
||||||
used to denote HTML entities. If you want to use them as literal
|
|
||||||
characters, you must escape them as entities, e.g. `<`, and
|
|
||||||
`&`.
|
|
||||||
|
|
||||||
Ampersands in particular are bedeviling for web writers. If you want to
|
|
||||||
write about 'AT&T', you need to write '`AT&T`'. You even need to
|
|
||||||
escape ampersands within URLs. Thus, if you want to link to:
|
|
||||||
|
|
||||||
http://images.google.com/images?num=30&q=larry+bird
|
|
||||||
|
|
||||||
you need to encode the URL as:
|
|
||||||
|
|
||||||
http://images.google.com/images?num=30&q=larry+bird
|
|
||||||
|
|
||||||
in your anchor tag `href` attribute. Needless to say, this is easy to
|
|
||||||
forget, and is probably the single most common source of HTML validation
|
|
||||||
errors in otherwise well-marked-up web sites.
|
|
||||||
|
|
||||||
Markdown allows you to use these characters naturally, taking care of
|
|
||||||
all the necessary escaping for you. If you use an ampersand as part of
|
|
||||||
an HTML entity, it remains unchanged; otherwise it will be translated
|
|
||||||
into `&`.
|
|
||||||
|
|
||||||
So, if you want to include a copyright symbol in your article, you can write:
|
|
||||||
|
|
||||||
©
|
|
||||||
|
|
||||||
and Markdown will leave it alone. But if you write:
|
|
||||||
|
|
||||||
AT&T
|
|
||||||
|
|
||||||
Markdown will translate it to:
|
|
||||||
|
|
||||||
AT&T
|
|
||||||
|
|
||||||
Similarly, because Markdown supports [inline HTML](#html), if you use
|
|
||||||
angle brackets as delimiters for HTML tags, Markdown will treat them as
|
|
||||||
such. But if you write:
|
|
||||||
|
|
||||||
4 < 5
|
|
||||||
|
|
||||||
Markdown will translate it to:
|
|
||||||
|
|
||||||
4 < 5
|
|
||||||
|
|
||||||
However, inside Markdown code spans and blocks, angle brackets and
|
|
||||||
ampersands are *always* encoded automatically. This makes it easy to use
|
|
||||||
Markdown to write about HTML code. (As opposed to raw HTML, which is a
|
|
||||||
terrible format for writing about HTML syntax, because every single `<`
|
|
||||||
and `&` in your example code needs to be escaped.)
|
|
||||||
|
|
||||||
|
|
||||||
* * *
|
|
||||||
|
|
||||||
|
|
||||||
<h2 id="block">Block Elements</h2>
|
|
||||||
|
|
||||||
|
|
||||||
<h3 id="p">Paragraphs and Line Breaks</h3>
|
|
||||||
|
|
||||||
A paragraph is simply one or more consecutive lines of text, separated
|
|
||||||
by one or more blank lines. (A blank line is any line that looks like a
|
|
||||||
blank line -- a line containing nothing but spaces or tabs is considered
|
|
||||||
blank.) Normal paragraphs should not be intended with spaces or tabs.
|
|
||||||
|
|
||||||
The implication of the "one or more consecutive lines of text" rule is
|
|
||||||
that Markdown supports "hard-wrapped" text paragraphs. This differs
|
|
||||||
significantly from most other text-to-HTML formatters (including Movable
|
|
||||||
Type's "Convert Line Breaks" option) which translate every line break
|
|
||||||
character in a paragraph into a `<br />` tag.
|
|
||||||
|
|
||||||
When you *do* want to insert a `<br />` break tag using Markdown, you
|
|
||||||
end a line with two or more spaces, then type return.
|
|
||||||
|
|
||||||
Yes, this takes a tad more effort to create a `<br />`, but a simplistic
|
|
||||||
"every line break is a `<br />`" rule wouldn't work for Markdown.
|
|
||||||
Markdown's email-style [blockquoting][bq] and multi-paragraph [list items][l]
|
|
||||||
work best -- and look better -- when you format them with hard breaks.
|
|
||||||
|
|
||||||
[bq]: #blockquote
|
|
||||||
[l]: #list
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3 id="header">Headers</h3>
|
|
||||||
|
|
||||||
Markdown supports two styles of headers, [Setext] [1] and [atx] [2].
|
|
||||||
|
|
||||||
Setext-style headers are "underlined" using equal signs (for first-level
|
|
||||||
headers) and dashes (for second-level headers). For example:
|
|
||||||
|
|
||||||
This is an H1
|
|
||||||
=============
|
|
||||||
|
|
||||||
This is an H2
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Any number of underlining `=`'s or `-`'s will work.
|
|
||||||
|
|
||||||
Atx-style headers use 1-6 hash characters at the start of the line,
|
|
||||||
corresponding to header levels 1-6. For example:
|
|
||||||
|
|
||||||
# This is an H1
|
|
||||||
|
|
||||||
## This is an H2
|
|
||||||
|
|
||||||
###### This is an H6
|
|
||||||
|
|
||||||
Optionally, you may "close" atx-style headers. This is purely
|
|
||||||
cosmetic -- you can use this if you think it looks better. The
|
|
||||||
closing hashes don't even need to match the number of hashes
|
|
||||||
used to open the header. (The number of opening hashes
|
|
||||||
determines the header level.) :
|
|
||||||
|
|
||||||
# This is an H1 #
|
|
||||||
|
|
||||||
## This is an H2 ##
|
|
||||||
|
|
||||||
### This is an H3 ######
|
|
||||||
|
|
||||||
|
|
||||||
<h3 id="blockquote">Blockquotes</h3>
|
|
||||||
|
|
||||||
Markdown uses email-style `>` characters for blockquoting. If you're
|
|
||||||
familiar with quoting passages of text in an email message, then you
|
|
||||||
know how to create a blockquote in Markdown. It looks best if you hard
|
|
||||||
wrap the text and put a `>` before every line:
|
|
||||||
|
|
||||||
> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
|
|
||||||
> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
|
|
||||||
> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
|
|
||||||
>
|
|
||||||
> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
|
|
||||||
> id sem consectetuer libero luctus adipiscing.
|
|
||||||
|
|
||||||
Markdown allows you to be lazy and only put the `>` before the first
|
|
||||||
line of a hard-wrapped paragraph:
|
|
||||||
|
|
||||||
> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
|
|
||||||
consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
|
|
||||||
Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
|
|
||||||
|
|
||||||
> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
|
|
||||||
id sem consectetuer libero luctus adipiscing.
|
|
||||||
|
|
||||||
Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by
|
|
||||||
adding additional levels of `>`:
|
|
||||||
|
|
||||||
> This is the first level of quoting.
|
|
||||||
>
|
|
||||||
> > This is nested blockquote.
|
|
||||||
>
|
|
||||||
> Back to the first level.
|
|
||||||
|
|
||||||
Blockquotes can contain other Markdown elements, including headers, lists,
|
|
||||||
and code blocks:
|
|
||||||
|
|
||||||
> ## This is a header.
|
|
||||||
>
|
|
||||||
> 1. This is the first list item.
|
|
||||||
> 2. This is the second list item.
|
|
||||||
>
|
|
||||||
> Here's some example code:
|
|
||||||
>
|
|
||||||
> return shell_exec("echo $input | $markdown_script");
|
|
||||||
|
|
||||||
Any decent text editor should make email-style quoting easy. For
|
|
||||||
example, with BBEdit, you can make a selection and choose Increase
|
|
||||||
Quote Level from the Text menu.
|
|
||||||
|
|
||||||
|
|
||||||
<h3 id="list">Lists</h3>
|
|
||||||
|
|
||||||
Markdown supports ordered (numbered) and unordered (bulleted) lists.
|
|
||||||
|
|
||||||
Unordered lists use asterisks, pluses, and hyphens -- interchangably
|
|
||||||
-- as list markers:
|
|
||||||
|
|
||||||
* Red
|
|
||||||
* Green
|
|
||||||
* Blue
|
|
||||||
|
|
||||||
is equivalent to:
|
|
||||||
|
|
||||||
+ Red
|
|
||||||
+ Green
|
|
||||||
+ Blue
|
|
||||||
|
|
||||||
and:
|
|
||||||
|
|
||||||
- Red
|
|
||||||
- Green
|
|
||||||
- Blue
|
|
||||||
|
|
||||||
Ordered lists use numbers followed by periods:
|
|
||||||
|
|
||||||
1. Bird
|
|
||||||
2. McHale
|
|
||||||
3. Parish
|
|
||||||
|
|
||||||
It's important to note that the actual numbers you use to mark the
|
|
||||||
list have no effect on the HTML output Markdown produces. The HTML
|
|
||||||
Markdown produces from the above list is:
|
|
||||||
|
|
||||||
<ol>
|
|
||||||
<li>Bird</li>
|
|
||||||
<li>McHale</li>
|
|
||||||
<li>Parish</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
If you instead wrote the list in Markdown like this:
|
|
||||||
|
|
||||||
1. Bird
|
|
||||||
1. McHale
|
|
||||||
1. Parish
|
|
||||||
|
|
||||||
or even:
|
|
||||||
|
|
||||||
3. Bird
|
|
||||||
1. McHale
|
|
||||||
8. Parish
|
|
||||||
|
|
||||||
you'd get the exact same HTML output. The point is, if you want to,
|
|
||||||
you can use ordinal numbers in your ordered Markdown lists, so that
|
|
||||||
the numbers in your source match the numbers in your published HTML.
|
|
||||||
But if you want to be lazy, you don't have to.
|
|
||||||
|
|
||||||
If you do use lazy list numbering, however, you should still start the
|
|
||||||
list with the number 1. At some point in the future, Markdown may support
|
|
||||||
starting ordered lists at an arbitrary number.
|
|
||||||
|
|
||||||
List markers typically start at the left margin, but may be indented by
|
|
||||||
up to three spaces. List markers must be followed by one or more spaces
|
|
||||||
or a tab.
|
|
||||||
|
|
||||||
To make lists look nice, you can wrap items with hanging indents:
|
|
||||||
|
|
||||||
* Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
|
|
||||||
Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
|
|
||||||
viverra nec, fringilla in, laoreet vitae, risus.
|
|
||||||
* Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
|
|
||||||
Suspendisse id sem consectetuer libero luctus adipiscing.
|
|
||||||
|
|
||||||
But if you want to be lazy, you don't have to:
|
|
||||||
|
|
||||||
* Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
|
|
||||||
Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
|
|
||||||
viverra nec, fringilla in, laoreet vitae, risus.
|
|
||||||
* Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
|
|
||||||
Suspendisse id sem consectetuer libero luctus adipiscing.
|
|
||||||
|
|
||||||
If list items are separated by blank lines, Markdown will wrap the
|
|
||||||
items in `<p>` tags in the HTML output. For example, this input:
|
|
||||||
|
|
||||||
* Bird
|
|
||||||
* Magic
|
|
||||||
|
|
||||||
will turn into:
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Bird</li>
|
|
||||||
<li>Magic</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
But this:
|
|
||||||
|
|
||||||
* Bird
|
|
||||||
|
|
||||||
* Magic
|
|
||||||
|
|
||||||
will turn into:
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><p>Bird</p></li>
|
|
||||||
<li><p>Magic</p></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
List items may consist of multiple paragraphs. Each subsequent
|
|
||||||
paragraph in a list item must be intended by either 4 spaces
|
|
||||||
or one tab:
|
|
||||||
|
|
||||||
1. This is a list item with two paragraphs. Lorem ipsum dolor
|
|
||||||
sit amet, consectetuer adipiscing elit. Aliquam hendrerit
|
|
||||||
mi posuere lectus.
|
|
||||||
|
|
||||||
Vestibulum enim wisi, viverra nec, fringilla in, laoreet
|
|
||||||
vitae, risus. Donec sit amet nisl. Aliquam semper ipsum
|
|
||||||
sit amet velit.
|
|
||||||
|
|
||||||
2. Suspendisse id sem consectetuer libero luctus adipiscing.
|
|
||||||
|
|
||||||
It looks nice if you indent every line of the subsequent
|
|
||||||
paragraphs, but here again, Markdown will allow you to be
|
|
||||||
lazy:
|
|
||||||
|
|
||||||
* This is a list item with two paragraphs.
|
|
||||||
|
|
||||||
This is the second paragraph in the list item. You're
|
|
||||||
only required to indent the first line. Lorem ipsum dolor
|
|
||||||
sit amet, consectetuer adipiscing elit.
|
|
||||||
|
|
||||||
* Another item in the same list.
|
|
||||||
|
|
||||||
To put a blockquote within a list item, the blockquote's `>`
|
|
||||||
delimiters need to be indented:
|
|
||||||
|
|
||||||
* A list item with a blockquote:
|
|
||||||
|
|
||||||
> This is a blockquote
|
|
||||||
> inside a list item.
|
|
||||||
|
|
||||||
To put a code block within a list item, the code block needs
|
|
||||||
to be indented *twice* -- 8 spaces or two tabs:
|
|
||||||
|
|
||||||
* A list item with a code block:
|
|
||||||
|
|
||||||
<code goes here>
|
|
||||||
|
|
||||||
|
|
||||||
It's worth noting that it's possible to trigger an ordered list by
|
|
||||||
accident, by writing something like this:
|
|
||||||
|
|
||||||
1986. What a great season.
|
|
||||||
|
|
||||||
In other words, a *number-period-space* sequence at the beginning of a
|
|
||||||
line. To avoid this, you can backslash-escape the period:
|
|
||||||
|
|
||||||
1986\. What a great season.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3 id="precode">Code Blocks</h3>
|
|
||||||
|
|
||||||
Pre-formatted code blocks are used for writing about programming or
|
|
||||||
markup source code. Rather than forming normal paragraphs, the lines
|
|
||||||
of a code block are interpreted literally. Markdown wraps a code block
|
|
||||||
in both `<pre>` and `<code>` tags.
|
|
||||||
|
|
||||||
To produce a code block in Markdown, simply indent every line of the
|
|
||||||
block by at least 4 spaces or 1 tab. For example, given this input:
|
|
||||||
|
|
||||||
This is a normal paragraph:
|
|
||||||
|
|
||||||
This is a code block.
|
|
||||||
|
|
||||||
Markdown will generate:
|
|
||||||
|
|
||||||
<p>This is a normal paragraph:</p>
|
|
||||||
|
|
||||||
<pre><code>This is a code block.
|
|
||||||
</code></pre>
|
|
||||||
|
|
||||||
One level of indentation -- 4 spaces or 1 tab -- is removed from each
|
|
||||||
line of the code block. For example, this:
|
|
||||||
|
|
||||||
Here is an example of AppleScript:
|
|
||||||
|
|
||||||
tell application "Foo"
|
|
||||||
beep
|
|
||||||
end tell
|
|
||||||
|
|
||||||
will turn into:
|
|
||||||
|
|
||||||
<p>Here is an example of AppleScript:</p>
|
|
||||||
|
|
||||||
<pre><code>tell application "Foo"
|
|
||||||
beep
|
|
||||||
end tell
|
|
||||||
</code></pre>
|
|
||||||
|
|
||||||
A code block continues until it reaches a line that is not indented
|
|
||||||
(or the end of the article).
|
|
||||||
|
|
||||||
Within a code block, ampersands (`&`) and angle brackets (`<` and `>`)
|
|
||||||
are automatically converted into HTML entities. This makes it very
|
|
||||||
easy to include example HTML source code using Markdown -- just paste
|
|
||||||
it and indent it, and Markdown will handle the hassle of encoding the
|
|
||||||
ampersands and angle brackets. For example, this:
|
|
||||||
|
|
||||||
<div class="footer">
|
|
||||||
© 2004 Foo Corporation
|
|
||||||
</div>
|
|
||||||
|
|
||||||
will turn into:
|
|
||||||
|
|
||||||
<pre><code><div class="footer">
|
|
||||||
&copy; 2004 Foo Corporation
|
|
||||||
</div>
|
|
||||||
</code></pre>
|
|
||||||
|
|
||||||
Regular Markdown syntax is not processed within code blocks. E.g.,
|
|
||||||
asterisks are just literal asterisks within a code block. This means
|
|
||||||
it's also easy to use Markdown to write about Markdown's own syntax.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3 id="hr">Horizontal Rules</h3>
|
|
||||||
|
|
||||||
You can produce a horizontal rule tag (`<hr />`) by placing three or
|
|
||||||
more hyphens, asterisks, or underscores on a line by themselves. If you
|
|
||||||
wish, you may use spaces between the hyphens or asterisks. Each of the
|
|
||||||
following lines will produce a horizontal rule:
|
|
||||||
|
|
||||||
* * *
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
*****
|
|
||||||
|
|
||||||
- - -
|
|
||||||
|
|
||||||
---------------------------------------
|
|
||||||
|
|
||||||
_ _ _
|
|
||||||
|
|
||||||
|
|
||||||
* * *
|
|
||||||
|
|
||||||
<h2 id="span">Span Elements</h2>
|
|
||||||
|
|
||||||
<h3 id="link">Links</h3>
|
|
||||||
|
|
||||||
Markdown supports two style of links: *inline* and *reference*.
|
|
||||||
|
|
||||||
In both styles, the link text is delimited by [square brackets].
|
|
||||||
|
|
||||||
To create an inline link, use a set of regular parentheses immediately
|
|
||||||
after the link text's closing square bracket. Inside the parentheses,
|
|
||||||
put the URL where you want the link to point, along with an *optional*
|
|
||||||
title for the link, surrounded in quotes. For example:
|
|
||||||
|
|
||||||
This is [an example](http://example.com/ "Title") inline link.
|
|
||||||
|
|
||||||
[This link](http://example.net/) has no title attribute.
|
|
||||||
|
|
||||||
Will produce:
|
|
||||||
|
|
||||||
<p>This is <a href="http://example.com/" title="Title">
|
|
||||||
an example</a> inline link.</p>
|
|
||||||
|
|
||||||
<p><a href="http://example.net/">This link</a> has no
|
|
||||||
title attribute.</p>
|
|
||||||
|
|
||||||
If you're referring to a local resource on the same server, you can
|
|
||||||
use relative paths:
|
|
||||||
|
|
||||||
See my [About](/about/) page for details.
|
|
||||||
|
|
||||||
Reference-style links use a second set of square brackets, inside
|
|
||||||
which you place a label of your choosing to identify the link:
|
|
||||||
|
|
||||||
This is [an example][id] reference-style link.
|
|
||||||
|
|
||||||
You can optionally use a space to separate the sets of brackets:
|
|
||||||
|
|
||||||
This is [an example] [id] reference-style link.
|
|
||||||
|
|
||||||
Then, anywhere in the document, you define your link label like this,
|
|
||||||
on a line by itself:
|
|
||||||
|
|
||||||
[id]: http://example.com/ "Optional Title Here"
|
|
||||||
|
|
||||||
That is:
|
|
||||||
|
|
||||||
* Square brackets containing the link identifier (optionally
|
|
||||||
indented from the left margin using up to three spaces);
|
|
||||||
* followed by a colon;
|
|
||||||
* followed by one or more spaces (or tabs);
|
|
||||||
* followed by the URL for the link;
|
|
||||||
* optionally followed by a title attribute for the link, enclosed
|
|
||||||
in double or single quotes.
|
|
||||||
|
|
||||||
The link URL may, optionally, be surrounded by angle brackets:
|
|
||||||
|
|
||||||
[id]: <http://example.com/> "Optional Title Here"
|
|
||||||
|
|
||||||
You can put the title attribute on the next line and use extra spaces
|
|
||||||
or tabs for padding, which tends to look better with longer URLs:
|
|
||||||
|
|
||||||
[id]: http://example.com/longish/path/to/resource/here
|
|
||||||
"Optional Title Here"
|
|
||||||
|
|
||||||
Link definitions are only used for creating links during Markdown
|
|
||||||
processing, and are stripped from your document in the HTML output.
|
|
||||||
|
|
||||||
Link definition names may constist of letters, numbers, spaces, and punctuation -- but they are *not* case sensitive. E.g. these two links:
|
|
||||||
|
|
||||||
[link text][a]
|
|
||||||
[link text][A]
|
|
||||||
|
|
||||||
are equivalent.
|
|
||||||
|
|
||||||
The *implicit link name* shortcut allows you to omit the name of the
|
|
||||||
link, in which case the link text itself is used as the name.
|
|
||||||
Just use an empty set of square brackets -- e.g., to link the word
|
|
||||||
"Google" to the google.com web site, you could simply write:
|
|
||||||
|
|
||||||
[Google][]
|
|
||||||
|
|
||||||
And then define the link:
|
|
||||||
|
|
||||||
[Google]: http://google.com/
|
|
||||||
|
|
||||||
Because link names may contain spaces, this shortcut even works for
|
|
||||||
multiple words in the link text:
|
|
||||||
|
|
||||||
Visit [Daring Fireball][] for more information.
|
|
||||||
|
|
||||||
And then define the link:
|
|
||||||
|
|
||||||
[Daring Fireball]: http://daringfireball.net/
|
|
||||||
|
|
||||||
Link definitions can be placed anywhere in your Markdown document. I
|
|
||||||
tend to put them immediately after each paragraph in which they're
|
|
||||||
used, but if you want, you can put them all at the end of your
|
|
||||||
document, sort of like footnotes.
|
|
||||||
|
|
||||||
Here's an example of reference links in action:
|
|
||||||
|
|
||||||
I get 10 times more traffic from [Google] [1] than from
|
|
||||||
[Yahoo] [2] or [MSN] [3].
|
|
||||||
|
|
||||||
[1]: http://google.com/ "Google"
|
|
||||||
[2]: http://search.yahoo.com/ "Yahoo Search"
|
|
||||||
[3]: http://search.msn.com/ "MSN Search"
|
|
||||||
|
|
||||||
Using the implicit link name shortcut, you could instead write:
|
|
||||||
|
|
||||||
I get 10 times more traffic from [Google][] than from
|
|
||||||
[Yahoo][] or [MSN][].
|
|
||||||
|
|
||||||
[google]: http://google.com/ "Google"
|
|
||||||
[yahoo]: http://search.yahoo.com/ "Yahoo Search"
|
|
||||||
[msn]: http://search.msn.com/ "MSN Search"
|
|
||||||
|
|
||||||
Both of the above examples will produce the following HTML output:
|
|
||||||
|
|
||||||
<p>I get 10 times more traffic from <a href="http://google.com/"
|
|
||||||
title="Google">Google</a> than from
|
|
||||||
<a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a>
|
|
||||||
or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p>
|
|
||||||
|
|
||||||
For comparison, here is the same paragraph written using
|
|
||||||
Markdown's inline link style:
|
|
||||||
|
|
||||||
I get 10 times more traffic from [Google](http://google.com/ "Google")
|
|
||||||
than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or
|
|
||||||
[MSN](http://search.msn.com/ "MSN Search").
|
|
||||||
|
|
||||||
The point of reference-style links is not that they're easier to
|
|
||||||
write. The point is that with reference-style links, your document
|
|
||||||
source is vastly more readable. Compare the above examples: using
|
|
||||||
reference-style links, the paragraph itself is only 81 characters
|
|
||||||
long; with inline-style links, it's 176 characters; and as raw HTML,
|
|
||||||
it's 234 characters. In the raw HTML, there's more markup than there
|
|
||||||
is text.
|
|
||||||
|
|
||||||
With Markdown's reference-style links, a source document much more
|
|
||||||
closely resembles the final output, as rendered in a browser. By
|
|
||||||
allowing you to move the markup-related metadata out of the paragraph,
|
|
||||||
you can add links without interrupting the narrative flow of your
|
|
||||||
prose.
|
|
||||||
|
|
||||||
|
|
||||||
<h3 id="em">Emphasis</h3>
|
|
||||||
|
|
||||||
Markdown treats asterisks (`*`) and underscores (`_`) as indicators of
|
|
||||||
emphasis. Text wrapped with one `*` or `_` will be wrapped with an
|
|
||||||
HTML `<em>` tag; double `*`'s or `_`'s will be wrapped with an HTML
|
|
||||||
`<strong>` tag. E.g., this input:
|
|
||||||
|
|
||||||
*single asterisks*
|
|
||||||
|
|
||||||
_single underscores_
|
|
||||||
|
|
||||||
**double asterisks**
|
|
||||||
|
|
||||||
__double underscores__
|
|
||||||
|
|
||||||
will produce:
|
|
||||||
|
|
||||||
<em>single asterisks</em>
|
|
||||||
|
|
||||||
<em>single underscores</em>
|
|
||||||
|
|
||||||
<strong>double asterisks</strong>
|
|
||||||
|
|
||||||
<strong>double underscores</strong>
|
|
||||||
|
|
||||||
You can use whichever style you prefer; the lone restriction is that
|
|
||||||
the same character must be used to open and close an emphasis span.
|
|
||||||
|
|
||||||
Emphasis can be used in the middle of a word:
|
|
||||||
|
|
||||||
un*fucking*believable
|
|
||||||
|
|
||||||
But if you surround an `*` or `_` with spaces, it'll be treated as a
|
|
||||||
literal asterisk or underscore.
|
|
||||||
|
|
||||||
To produce a literal asterisk or underscore at a position where it
|
|
||||||
would otherwise be used as an emphasis delimiter, you can backslash
|
|
||||||
escape it:
|
|
||||||
|
|
||||||
\*this text is surrounded by literal asterisks\*
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3 id="code">Code</h3>
|
|
||||||
|
|
||||||
To indicate a span of code, wrap it with backtick quotes (`` ` ``).
|
|
||||||
Unlike a pre-formatted code block, a code span indicates code within a
|
|
||||||
normal paragraph. For example:
|
|
||||||
|
|
||||||
Use the `printf()` function.
|
|
||||||
|
|
||||||
will produce:
|
|
||||||
|
|
||||||
<p>Use the <code>printf()</code> function.</p>
|
|
||||||
|
|
||||||
To include a literal backtick character within a code span, you can use
|
|
||||||
multiple backticks as the opening and closing delimiters:
|
|
||||||
|
|
||||||
``There is a literal backtick (`) here.``
|
|
||||||
|
|
||||||
which will produce this:
|
|
||||||
|
|
||||||
<p><code>There is a literal backtick (`) here.</code></p>
|
|
||||||
|
|
||||||
The backtick delimiters surrounding a code span may include spaces --
|
|
||||||
one after the opening, one before the closing. This allows you to place
|
|
||||||
literal backtick characters at the beginning or end of a code span:
|
|
||||||
|
|
||||||
A single backtick in a code span: `` ` ``
|
|
||||||
|
|
||||||
A backtick-delimited string in a code span: `` `foo` ``
|
|
||||||
|
|
||||||
will produce:
|
|
||||||
|
|
||||||
<p>A single backtick in a code span: <code>`</code></p>
|
|
||||||
|
|
||||||
<p>A backtick-delimited string in a code span: <code>`foo`</code></p>
|
|
||||||
|
|
||||||
With a code span, ampersands and angle brackets are encoded as HTML
|
|
||||||
entities automatically, which makes it easy to include example HTML
|
|
||||||
tags. Markdown will turn this:
|
|
||||||
|
|
||||||
Please don't use any `<blink>` tags.
|
|
||||||
|
|
||||||
into:
|
|
||||||
|
|
||||||
<p>Please don't use any <code><blink></code> tags.</p>
|
|
||||||
|
|
||||||
You can write this:
|
|
||||||
|
|
||||||
`—` is the decimal-encoded equivalent of `—`.
|
|
||||||
|
|
||||||
to produce:
|
|
||||||
|
|
||||||
<p><code>&#8212;</code> is the decimal-encoded
|
|
||||||
equivalent of <code>&mdash;</code>.</p>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3 id="img">Images</h3>
|
|
||||||
|
|
||||||
Admittedly, it's fairly difficult to devise a "natural" syntax for
|
|
||||||
placing images into a plain text document format.
|
|
||||||
|
|
||||||
Markdown uses an image syntax that is intended to resemble the syntax
|
|
||||||
for links, allowing for two styles: *inline* and *reference*.
|
|
||||||
|
|
||||||
Inline image syntax looks like this:
|
|
||||||
|
|
||||||
![Alt text](/path/to/img.jpg)
|
|
||||||
|
|
||||||
![Alt text](/path/to/img.jpg "Optional title")
|
|
||||||
|
|
||||||
That is:
|
|
||||||
|
|
||||||
* An exclamation mark: `!`;
|
|
||||||
* followed by a set of square brackets, containing the `alt`
|
|
||||||
attribute text for the image;
|
|
||||||
* followed by a set of parentheses, containing the URL or path to
|
|
||||||
the image, and an optional `title` attribute enclosed in double
|
|
||||||
or single quotes.
|
|
||||||
|
|
||||||
Reference-style image syntax looks like this:
|
|
||||||
|
|
||||||
![Alt text][id]
|
|
||||||
|
|
||||||
Where "id" is the name of a defined image reference. Image references
|
|
||||||
are defined using syntax identical to link references:
|
|
||||||
|
|
||||||
[id]: url/to/image "Optional title attribute"
|
|
||||||
|
|
||||||
As of this writing, Markdown has no syntax for specifying the
|
|
||||||
dimensions of an image; if this is important to you, you can simply
|
|
||||||
use regular HTML `<img>` tags.
|
|
||||||
|
|
||||||
|
|
||||||
* * *
|
|
||||||
|
|
||||||
|
|
||||||
<h2 id="misc">Miscellaneous</h2>
|
|
||||||
|
|
||||||
<h3 id="autolink">Automatic Links</h3>
|
|
||||||
|
|
||||||
Markdown supports a shortcut style for creating "automatic" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this:
|
|
||||||
|
|
||||||
<http://example.com/>
|
|
||||||
|
|
||||||
Markdown will turn this into:
|
|
||||||
|
|
||||||
<a href="http://example.com/">http://example.com/</a>
|
|
||||||
|
|
||||||
Automatic links for email addresses work similarly, except that
|
|
||||||
Markdown will also perform a bit of randomized decimal and hex
|
|
||||||
entity-encoding to help obscure your address from address-harvesting
|
|
||||||
spambots. For example, Markdown will turn this:
|
|
||||||
|
|
||||||
<address@example.com>
|
|
||||||
|
|
||||||
into something like this:
|
|
||||||
|
|
||||||
<a href="mailto:addre
|
|
||||||
ss@example.co
|
|
||||||
m">address@exa
|
|
||||||
mple.com</a>
|
|
||||||
|
|
||||||
which will render in a browser as a clickable link to "address@example.com".
|
|
||||||
|
|
||||||
(This sort of entity-encoding trick will indeed fool many, if not
|
|
||||||
most, address-harvesting bots, but it definitely won't fool all of
|
|
||||||
them. It's better than nothing, but an address published in this way
|
|
||||||
will probably eventually start receiving spam.)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3 id="backslash">Backslash Escapes</h3>
|
|
||||||
|
|
||||||
Markdown allows you to use backslash escapes to generate literal
|
|
||||||
characters which would otherwise have special meaning in Markdown's
|
|
||||||
formatting syntax. For example, if you wanted to surround a word with
|
|
||||||
literal asterisks (instead of an HTML `<em>` tag), you can backslashes
|
|
||||||
before the asterisks, like this:
|
|
||||||
|
|
||||||
\*literal asterisks\*
|
|
||||||
|
|
||||||
Markdown provides backslash escapes for the following characters:
|
|
||||||
|
|
||||||
\ backslash
|
|
||||||
` backtick
|
|
||||||
* asterisk
|
|
||||||
_ underscore
|
|
||||||
{} curly braces
|
|
||||||
[] square brackets
|
|
||||||
() parentheses
|
|
||||||
# hash mark
|
|
||||||
+ plus sign
|
|
||||||
- minus sign (hyphen)
|
|
||||||
. dot
|
|
||||||
! exclamation mark
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
> foo
|
|
||||||
>
|
|
||||||
> > bar
|
|
||||||
>
|
|
||||||
> foo
|
|
@ -1,122 +0,0 @@
|
|||||||
## Unordered
|
|
||||||
|
|
||||||
Asterisks tight:
|
|
||||||
|
|
||||||
* asterisk 1
|
|
||||||
* asterisk 2
|
|
||||||
* asterisk 3
|
|
||||||
|
|
||||||
|
|
||||||
Asterisks loose:
|
|
||||||
|
|
||||||
* asterisk 1
|
|
||||||
|
|
||||||
* asterisk 2
|
|
||||||
|
|
||||||
* asterisk 3
|
|
||||||
|
|
||||||
* * *
|
|
||||||
|
|
||||||
Pluses tight:
|
|
||||||
|
|
||||||
+ Plus 1
|
|
||||||
+ Plus 2
|
|
||||||
+ Plus 3
|
|
||||||
|
|
||||||
|
|
||||||
Pluses loose:
|
|
||||||
|
|
||||||
+ Plus 1
|
|
||||||
|
|
||||||
+ Plus 2
|
|
||||||
|
|
||||||
+ Plus 3
|
|
||||||
|
|
||||||
* * *
|
|
||||||
|
|
||||||
|
|
||||||
Minuses tight:
|
|
||||||
|
|
||||||
- Minus 1
|
|
||||||
- Minus 2
|
|
||||||
- Minus 3
|
|
||||||
|
|
||||||
|
|
||||||
Minuses loose:
|
|
||||||
|
|
||||||
- Minus 1
|
|
||||||
|
|
||||||
- Minus 2
|
|
||||||
|
|
||||||
- Minus 3
|
|
||||||
|
|
||||||
|
|
||||||
## Ordered
|
|
||||||
|
|
||||||
Tight:
|
|
||||||
|
|
||||||
1. First
|
|
||||||
2. Second
|
|
||||||
3. Third
|
|
||||||
|
|
||||||
and:
|
|
||||||
|
|
||||||
1. One
|
|
||||||
2. Two
|
|
||||||
3. Three
|
|
||||||
|
|
||||||
|
|
||||||
Loose using tabs:
|
|
||||||
|
|
||||||
1. First
|
|
||||||
|
|
||||||
2. Second
|
|
||||||
|
|
||||||
3. Third
|
|
||||||
|
|
||||||
and using spaces:
|
|
||||||
|
|
||||||
1. One
|
|
||||||
|
|
||||||
2. Two
|
|
||||||
|
|
||||||
3. Three
|
|
||||||
|
|
||||||
Multiple paragraphs:
|
|
||||||
|
|
||||||
1. Item 1, graf one.
|
|
||||||
|
|
||||||
Item 2. graf two. The quick brown fox jumped over the lazy dog's
|
|
||||||
back.
|
|
||||||
|
|
||||||
2. Item 2.
|
|
||||||
|
|
||||||
3. Item 3.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Nested
|
|
||||||
|
|
||||||
* Tab
|
|
||||||
* Tab
|
|
||||||
* Tab
|
|
||||||
|
|
||||||
Here's another:
|
|
||||||
|
|
||||||
1. First
|
|
||||||
2. Second:
|
|
||||||
* Fee
|
|
||||||
* Fie
|
|
||||||
* Foe
|
|
||||||
3. Third
|
|
||||||
|
|
||||||
Same thing but with paragraphs:
|
|
||||||
|
|
||||||
1. First
|
|
||||||
|
|
||||||
2. Second:
|
|
||||||
* Fee
|
|
||||||
* Fie
|
|
||||||
* Foe
|
|
||||||
|
|
||||||
3. Third
|
|
@ -1,7 +0,0 @@
|
|||||||
***This is strong and em.***
|
|
||||||
|
|
||||||
So is ***this*** word.
|
|
||||||
|
|
||||||
___This is strong and em.___
|
|
||||||
|
|
||||||
So is ___this___ word.
|
|
@ -1,21 +0,0 @@
|
|||||||
+ this is a list item
|
|
||||||
indented with tabs
|
|
||||||
|
|
||||||
+ this is a list item
|
|
||||||
indented with spaces
|
|
||||||
|
|
||||||
Code:
|
|
||||||
|
|
||||||
this code block is indented by one tab
|
|
||||||
|
|
||||||
And:
|
|
||||||
|
|
||||||
this code block is indented by two tabs
|
|
||||||
|
|
||||||
And:
|
|
||||||
|
|
||||||
+ this is an example list item
|
|
||||||
indented with tabs
|
|
||||||
|
|
||||||
+ this is an example list item
|
|
||||||
indented with spaces
|
|
@ -1,5 +0,0 @@
|
|||||||
> A list within a blockquote:
|
|
||||||
>
|
|
||||||
> * asterisk 1
|
|
||||||
> * asterisk 2
|
|
||||||
> * asterisk 3
|
|
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"title": "DAUX.IO",
|
"title": "DAUX.IO",
|
||||||
"homepage": "/Getting_Started",
|
"tagline": "The Easiest Way To Document Your App",
|
||||||
"theme": "bootstrap",
|
"image": "/img/app.png",
|
||||||
"hightlight": "none",
|
"theme": "blue",
|
||||||
"repo": "justinwalsh/tm-docs",
|
"repo": "justinwalsh/tm-docs",
|
||||||
"twitter": ["justin_walsh", "todaymade"],
|
"twitter": ["justin_walsh", "todaymade"],
|
||||||
"links": {
|
"links": {
|
||||||
|
4
docs/index.md
Normal file
4
docs/index.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
This is my homepage content!
|
||||||
|
|
||||||
|
* Its really cool
|
||||||
|
* Yes it is
|
BIN
img/app.png
Normal file
BIN
img/app.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 208 KiB |
912
index.php
912
index.php
@ -1,7 +1,7 @@
|
|||||||
<?
|
<?
|
||||||
/*
|
/*
|
||||||
|
|
||||||
TM Docs
|
Daux.io
|
||||||
==================
|
==================
|
||||||
|
|
||||||
Description
|
Description
|
||||||
@ -9,16 +9,25 @@ Description
|
|||||||
|
|
||||||
This is a tool for auto-generating documentation based on markdown files
|
This is a tool for auto-generating documentation based on markdown files
|
||||||
located in the /docs folder of the project. To see all of the available
|
located in the /docs folder of the project. To see all of the available
|
||||||
options and to read more about how to use the library, visit the github
|
options and to read more about how to use the generator, visit:
|
||||||
repo page:
|
|
||||||
|
http://daux.io
|
||||||
|
|
||||||
https://github.com/justinwalsh/tm-docs
|
|
||||||
|
|
||||||
Author
|
Author
|
||||||
------
|
------
|
||||||
Justin Walsh (Todaymade): justin@todaymade.com, @justin_walsh
|
Justin Walsh (Todaymade): justin@todaymade.com, @justin_walsh
|
||||||
|
Garrett Moon (Todaymade): garrett@todaymade.com, @garrett_moon
|
||||||
|
|
||||||
|
|
||||||
|
Feedback & Suggestions
|
||||||
|
----
|
||||||
|
|
||||||
|
To give us feedback or to suggest an idea, please create an request on the the
|
||||||
|
Github issue tracker:
|
||||||
|
|
||||||
|
https://github.com/justinwalsh/tm-docs/issues
|
||||||
|
|
||||||
Bugs
|
Bugs
|
||||||
----
|
----
|
||||||
|
|
||||||
@ -26,9 +35,6 @@ To file bug reports please create an issue using the github issue tracker:
|
|||||||
|
|
||||||
https://github.com/justinwalsh/tm-docs/issues
|
https://github.com/justinwalsh/tm-docs/issues
|
||||||
|
|
||||||
Please include with your report: (1) the example input; (2) the output you
|
|
||||||
expected; (3) the output Markdown actually produced.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright and License
|
Copyright and License
|
||||||
---------------------
|
---------------------
|
||||||
@ -57,760 +63,12 @@ software, even if advised of the possibility of such damage.
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Start of Markdown Class *************************************
|
ini_set('display_errors', 1);
|
||||||
//////////////////////////////////////////////////////////////
|
error_reporting(E_ALL);
|
||||||
|
require_once('libs/functions.php');
|
||||||
|
|
||||||
#
|
$options = get_options();
|
||||||
# Markdown Extra - A text-to-HTML conversion tool for web writers
|
$tree = get_tree("docs");
|
||||||
#
|
|
||||||
# PHP Markdown & Extra
|
|
||||||
# Copyright (c) 2004-2009 Michel Fortin
|
|
||||||
# <http://michelf.com/projects/php-markdown/>
|
|
||||||
#
|
|
||||||
# Original Markdown
|
|
||||||
# Copyright (c) 2004-2006 John Gruber
|
|
||||||
# <http://daringfireball.net/projects/markdown/>
|
|
||||||
#
|
|
||||||
define('MARKDOWN_VERSION',"1.0.1n");define('MARKDOWNEXTRA_VERSION',"1.2.4");define('MARKDOWN_EMPTY_ELEMENT_SUFFIX'," />");define('MARKDOWN_TAB_WIDTH',4);define('MARKDOWN_FN_LINK_TITLE',"");define('MARKDOWN_FN_BACKLINK_TITLE',"");define('MARKDOWN_FN_LINK_CLASS',"");define('MARKDOWN_FN_BACKLINK_CLASS',"");define('MARKDOWN_WP_POSTS',true);define('MARKDOWN_WP_COMMENTS',true);define('MARKDOWN_PARSER_CLASS','MarkdownExtra_Parser');function Markdown($text){static $parser;if(!isset($parser)){$parser_class=MARKDOWN_PARSER_CLASS;$parser=new $parser_class;}return $parser->transform($text);}class Markdown_Parser{var $nested_brackets_depth=6;var $nested_brackets_re;var $nested_url_parenthesis_depth=4;var $nested_url_parenthesis_re;var $escape_chars='\`*_{}[]()>#+-.!';var $escape_chars_re;var $empty_element_suffix=MARKDOWN_EMPTY_ELEMENT_SUFFIX;var $tab_width=MARKDOWN_TAB_WIDTH;var $no_markup=false;var $no_entities=false;var $predef_urls=array();var $predef_titles=array();function Markdown_Parser(){$this->_initDetab();$this->prepareItalicsAndBold();$this->nested_brackets_re=str_repeat('(?>[^\[\]]+|\[',$this->nested_brackets_depth).str_repeat('\])*',$this->nested_brackets_depth);$this->nested_url_parenthesis_re=str_repeat('(?>[^()\s]+|\(',$this->nested_url_parenthesis_depth).str_repeat('(?>\)))*',$this->nested_url_parenthesis_depth);$this->escape_chars_re='['.preg_quote($this->escape_chars).']';asort($this->document_gamut);asort($this->block_gamut);asort($this->span_gamut);}var $urls=array();var $titles=array();var $html_hashes=array();var $in_anchor=false;function setup(){$this->urls=$this->predef_urls;$this->titles=$this->predef_titles;$this->html_hashes=array();$in_anchor=false;}function teardown(){$this->urls=array();$this->titles=array();$this->html_hashes=array();}function transform($text){$this->setup();$text=preg_replace('{^\xEF\xBB\xBF|\x1A}','',$text);$text=preg_replace('{\r\n?}',"\n",$text);$text.="\n\n";$text=$this->detab($text);$text=$this->hashHTMLBlocks($text);$text=preg_replace('/^[ ]+$/m','',$text);foreach($this->document_gamut as $method=>$priority){$text=$this->$method($text);}$this->teardown();return $text."\n";}var $document_gamut=array("stripLinkDefinitions"=>20,"runBasicBlockGamut"=>30,);function stripLinkDefinitions($text){$less_than_tab=$this->tab_width-1;$text=preg_replace_callback('{
|
|
||||||
^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1
|
|
||||||
[ ]*
|
|
||||||
\n? # maybe *one* newline
|
|
||||||
[ ]*
|
|
||||||
(?:
|
|
||||||
<(.+?)> # url = $2
|
|
||||||
|
|
|
||||||
(\S+?) # url = $3
|
|
||||||
)
|
|
||||||
[ ]*
|
|
||||||
\n? # maybe one newline
|
|
||||||
[ ]*
|
|
||||||
(?:
|
|
||||||
(?<=\s) # lookbehind for whitespace
|
|
||||||
["(]
|
|
||||||
(.*?) # title = $4
|
|
||||||
[")]
|
|
||||||
[ ]*
|
|
||||||
)? # title is optional
|
|
||||||
(?:\n+|\Z)
|
|
||||||
}xm',array(&$this,'_stripLinkDefinitions_callback'),$text);return $text;}function _stripLinkDefinitions_callback($matches){$link_id=strtolower($matches[1]);$url=$matches[2]==''?$matches[3]:$matches[2];$this->urls[$link_id]=$url;$this->titles[$link_id]=&$matches[4];return '';}function hashHTMLBlocks($text){if($this->no_markup)return $text;$less_than_tab=$this->tab_width-1;$block_tags_a_re='ins|del';$block_tags_b_re='p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'.'script|noscript|form|fieldset|iframe|math';$nested_tags_level=4;$attr='
|
|
||||||
(?> # optional tag attributes
|
|
||||||
\s # starts with whitespace
|
|
||||||
(?>
|
|
||||||
[^>"/]+ # text outside quotes
|
|
||||||
|
|
|
||||||
/+(?!>) # slash not followed by ">"
|
|
||||||
|
|
|
||||||
"[^"]*" # text inside double quotes (tolerate ">")
|
|
||||||
|
|
|
||||||
\'[^\']*\' # text inside single quotes (tolerate ">")
|
|
||||||
)*
|
|
||||||
)?
|
|
||||||
';$content=str_repeat('
|
|
||||||
(?>
|
|
||||||
[^<]+ # content without tag
|
|
||||||
|
|
|
||||||
<\2 # nested opening tag
|
|
||||||
'.$attr.' # attributes
|
|
||||||
(?>
|
|
||||||
/>
|
|
||||||
|
|
|
||||||
>',$nested_tags_level).'.*?'.str_repeat('
|
|
||||||
</\2\s*> # closing nested tag
|
|
||||||
)
|
|
||||||
|
|
|
||||||
<(?!/\2\s*> # other tags with a different name
|
|
||||||
)
|
|
||||||
)*',$nested_tags_level);$content2=str_replace('\2','\3',$content);$text=preg_replace_callback('{(?>
|
|
||||||
(?>
|
|
||||||
(?<=\n\n) # Starting after a blank line
|
|
||||||
| # or
|
|
||||||
\A\n? # the beginning of the doc
|
|
||||||
)
|
|
||||||
( # save in $1
|
|
||||||
|
|
||||||
# Match from `\n<tag>` to `</tag>\n`, handling nested tags
|
|
||||||
# in between.
|
|
||||||
|
|
||||||
[ ]{0,'.$less_than_tab.'}
|
|
||||||
<('.$block_tags_b_re.')# start tag = $2
|
|
||||||
'.$attr.'> # attributes followed by > and \n
|
|
||||||
'.$content.' # content, support nesting
|
|
||||||
</\2> # the matching end tag
|
|
||||||
[ ]* # trailing spaces/tabs
|
|
||||||
(?=\n+|\Z) # followed by a newline or end of document
|
|
||||||
|
|
||||||
| # Special version for tags of group a.
|
|
||||||
|
|
||||||
[ ]{0,'.$less_than_tab.'}
|
|
||||||
<('.$block_tags_a_re.')# start tag = $3
|
|
||||||
'.$attr.'>[ ]*\n # attributes followed by >
|
|
||||||
'.$content2.' # content, support nesting
|
|
||||||
</\3> # the matching end tag
|
|
||||||
[ ]* # trailing spaces/tabs
|
|
||||||
(?=\n+|\Z) # followed by a newline or end of document
|
|
||||||
|
|
||||||
| # Special case just for <hr />. It was easier to make a special
|
|
||||||
# case than to make the other regex more complicated.
|
|
||||||
|
|
||||||
[ ]{0,'.$less_than_tab.'}
|
|
||||||
<(hr) # start tag = $2
|
|
||||||
'.$attr.' # attributes
|
|
||||||
/?> # the matching end tag
|
|
||||||
[ ]*
|
|
||||||
(?=\n{2,}|\Z) # followed by a blank line or end of document
|
|
||||||
|
|
||||||
| # Special case for standalone HTML comments:
|
|
||||||
|
|
||||||
[ ]{0,'.$less_than_tab.'}
|
|
||||||
(?s:
|
|
||||||
<!-- .*? -->
|
|
||||||
)
|
|
||||||
[ ]*
|
|
||||||
(?=\n{2,}|\Z) # followed by a blank line or end of document
|
|
||||||
|
|
||||||
| # PHP and ASP-style processor instructions (<? and <%)
|
|
||||||
|
|
||||||
[ ]{0,'.$less_than_tab.'}
|
|
||||||
(?s:
|
|
||||||
<([?%]) # $2
|
|
||||||
.*?
|
|
||||||
\2>
|
|
||||||
)
|
|
||||||
[ ]*
|
|
||||||
(?=\n{2,}|\Z) # followed by a blank line or end of document
|
|
||||||
|
|
||||||
)
|
|
||||||
)}Sxmi',array(&$this,'_hashHTMLBlocks_callback'),$text);return $text;}function _hashHTMLBlocks_callback($matches){$text=$matches[1];$key=$this->hashBlock($text);return "\n\n$key\n\n";}function hashPart($text,$boundary='X'){$text=$this->unhash($text);static $i=0;$key="$boundary\x1A".++$i.$boundary;$this->html_hashes[$key]=$text;return $key;}function hashBlock($text){return $this->hashPart($text,'B');}var $block_gamut=array("doHeaders"=>10,"doHorizontalRules"=>20,"doLists"=>40,"doCodeBlocks"=>50,"doBlockQuotes"=>60,);function runBlockGamut($text){$text=$this->hashHTMLBlocks($text);return $this->runBasicBlockGamut($text);}function runBasicBlockGamut($text){foreach($this->block_gamut as $method=>$priority){$text=$this->$method($text);}$text=$this->formParagraphs($text);return $text;}function doHorizontalRules($text){return preg_replace('{
|
|
||||||
^[ ]{0,3} # Leading space
|
|
||||||
([-*_]) # $1: First marker
|
|
||||||
(?> # Repeated marker group
|
|
||||||
[ ]{0,2} # Zero, one, or two spaces.
|
|
||||||
\1 # Marker character
|
|
||||||
){2,} # Group repeated at least twice
|
|
||||||
[ ]* # Tailing spaces
|
|
||||||
$ # End of line.
|
|
||||||
}mx',"\n".$this->hashBlock("<hr$this->empty_element_suffix")."\n",$text);}var $span_gamut=array("parseSpan"=>-30,"doImages"=>10,"doAnchors"=>20,"doAutoLinks"=>30,"encodeAmpsAndAngles"=>40,"doItalicsAndBold"=>50,"doHardBreaks"=>60,);function runSpanGamut($text){foreach($this->span_gamut as $method=>$priority){$text=$this->$method($text);}return $text;}function doHardBreaks($text){return preg_replace_callback('/ {2,}\n/',array(&$this,'_doHardBreaks_callback'),$text);}function _doHardBreaks_callback($matches){return $this->hashPart("<br$this->empty_element_suffix\n");}function doAnchors($text){if($this->in_anchor)return $text;$this->in_anchor=true;$text=preg_replace_callback('{
|
|
||||||
( # wrap whole match in $1
|
|
||||||
\[
|
|
||||||
('.$this->nested_brackets_re.') # link text = $2
|
|
||||||
\]
|
|
||||||
|
|
||||||
[ ]? # one optional space
|
|
||||||
(?:\n[ ]*)? # one optional newline followed by spaces
|
|
||||||
|
|
||||||
\[
|
|
||||||
(.*?) # id = $3
|
|
||||||
\]
|
|
||||||
)
|
|
||||||
}xs',array(&$this,'_doAnchors_reference_callback'),$text);$text=preg_replace_callback('{
|
|
||||||
( # wrap whole match in $1
|
|
||||||
\[
|
|
||||||
('.$this->nested_brackets_re.') # link text = $2
|
|
||||||
\]
|
|
||||||
\( # literal paren
|
|
||||||
[ \n]*
|
|
||||||
(?:
|
|
||||||
<(.+?)> # href = $3
|
|
||||||
|
|
|
||||||
('.$this->nested_url_parenthesis_re.') # href = $4
|
|
||||||
)
|
|
||||||
[ \n]*
|
|
||||||
( # $5
|
|
||||||
([\'"]) # quote char = $6
|
|
||||||
(.*?) # Title = $7
|
|
||||||
\6 # matching quote
|
|
||||||
[ \n]* # ignore any spaces/tabs between closing quote and )
|
|
||||||
)? # title is optional
|
|
||||||
\)
|
|
||||||
)
|
|
||||||
}xs',array(&$this,'_doAnchors_inline_callback'),$text);$text=preg_replace_callback('{
|
|
||||||
( # wrap whole match in $1
|
|
||||||
\[
|
|
||||||
([^\[\]]+) # link text = $2; can\'t contain [ or ]
|
|
||||||
\]
|
|
||||||
)
|
|
||||||
}xs',array(&$this,'_doAnchors_reference_callback'),$text);$this->in_anchor=false;return $text;}function _doAnchors_reference_callback($matches){$whole_match=$matches[1];$link_text=$matches[2];$link_id=&$matches[3];if($link_id==""){$link_id=$link_text;}$link_id=strtolower($link_id);$link_id=preg_replace('{[ ]?\n}',' ',$link_id);if(isset($this->urls[$link_id])){$url=$this->urls[$link_id];$url=$this->encodeAttribute($url);$result="<a href=\"$url\"";if(isset($this->titles[$link_id])){$title=$this->titles[$link_id];$title=$this->encodeAttribute($title);$result.=" title=\"$title\"";}$link_text=$this->runSpanGamut($link_text);$result.=">$link_text</a>";$result=$this->hashPart($result);}else {$result=$whole_match;}return $result;}function _doAnchors_inline_callback($matches){$whole_match=$matches[1];$link_text=$this->runSpanGamut($matches[2]);$url=$matches[3]==''?$matches[4]:$matches[3];$title=&$matches[7];$url=$this->encodeAttribute($url);$result="<a href=\"$url\"";if(isset($title)){$title=$this->encodeAttribute($title);$result.=" title=\"$title\"";}$link_text=$this->runSpanGamut($link_text);$result.=">$link_text</a>";return $this->hashPart($result);}function doImages($text){$text=preg_replace_callback('{
|
|
||||||
( # wrap whole match in $1
|
|
||||||
!\[
|
|
||||||
('.$this->nested_brackets_re.') # alt text = $2
|
|
||||||
\]
|
|
||||||
|
|
||||||
[ ]? # one optional space
|
|
||||||
(?:\n[ ]*)? # one optional newline followed by spaces
|
|
||||||
|
|
||||||
\[
|
|
||||||
(.*?) # id = $3
|
|
||||||
\]
|
|
||||||
|
|
||||||
)
|
|
||||||
}xs',array(&$this,'_doImages_reference_callback'),$text);$text=preg_replace_callback('{
|
|
||||||
( # wrap whole match in $1
|
|
||||||
!\[
|
|
||||||
('.$this->nested_brackets_re.') # alt text = $2
|
|
||||||
\]
|
|
||||||
\s? # One optional whitespace character
|
|
||||||
\( # literal paren
|
|
||||||
[ \n]*
|
|
||||||
(?:
|
|
||||||
<(\S*)> # src url = $3
|
|
||||||
|
|
|
||||||
('.$this->nested_url_parenthesis_re.') # src url = $4
|
|
||||||
)
|
|
||||||
[ \n]*
|
|
||||||
( # $5
|
|
||||||
([\'"]) # quote char = $6
|
|
||||||
(.*?) # title = $7
|
|
||||||
\6 # matching quote
|
|
||||||
[ \n]*
|
|
||||||
)? # title is optional
|
|
||||||
\)
|
|
||||||
)
|
|
||||||
}xs',array(&$this,'_doImages_inline_callback'),$text);return $text;}function _doImages_reference_callback($matches){$whole_match=$matches[1];$alt_text=$matches[2];$link_id=strtolower($matches[3]);if($link_id==""){$link_id=strtolower($alt_text);}$alt_text=$this->encodeAttribute($alt_text);if(isset($this->urls[$link_id])){$url=$this->encodeAttribute($this->urls[$link_id]);$result="<img src=\"$url\" alt=\"$alt_text\"";if(isset($this->titles[$link_id])){$title=$this->titles[$link_id];$title=$this->encodeAttribute($title);$result.=" title=\"$title\"";}$result.=$this->empty_element_suffix;$result=$this->hashPart($result);}else {$result=$whole_match;}return $result;}function _doImages_inline_callback($matches){$whole_match=$matches[1];$alt_text=$matches[2];$url=$matches[3]==''?$matches[4]:$matches[3];$title=&$matches[7];$alt_text=$this->encodeAttribute($alt_text);$url=$this->encodeAttribute($url);$result="<img src=\"$url\" alt=\"$alt_text\"";if(isset($title)){$title=$this->encodeAttribute($title);$result.=" title=\"$title\"";}$result.=$this->empty_element_suffix;return $this->hashPart($result);}function doHeaders($text){$text=preg_replace_callback('{ ^(.+?)[ ]*\n(=+|-+)[ ]*\n+ }mx',array(&$this,'_doHeaders_callback_setext'),$text);$text=preg_replace_callback('{
|
|
||||||
^(\#{1,6}) # $1 = string of #\'s
|
|
||||||
[ ]*
|
|
||||||
(.+?) # $2 = Header text
|
|
||||||
[ ]*
|
|
||||||
\#* # optional closing #\'s (not counted)
|
|
||||||
\n+
|
|
||||||
}xm',array(&$this,'_doHeaders_callback_atx'),$text);return $text;}function _doHeaders_callback_setext($matches){if($matches[2]=='-'&&preg_match('{^-(?: |$)}',$matches[1]))return $matches[0];$level=$matches[2]{0}=='='?1:2;$block="<h$level>".$this->runSpanGamut($matches[1])."</h$level>";return "\n".$this->hashBlock($block)."\n\n";}function _doHeaders_callback_atx($matches){$level=strlen($matches[1]);$block="<h$level>".$this->runSpanGamut($matches[2])."</h$level>";return "\n".$this->hashBlock($block)."\n\n";}function doLists($text){$less_than_tab=$this->tab_width-1;$marker_ul_re='[*+-]';$marker_ol_re='\d+[.]';$marker_any_re="(?:$marker_ul_re|$marker_ol_re)";$markers_relist=array($marker_ul_re=>$marker_ol_re,$marker_ol_re=>$marker_ul_re,);foreach($markers_relist as $marker_re=>$other_marker_re){$whole_list_re='
|
|
||||||
( # $1 = whole list
|
|
||||||
( # $2
|
|
||||||
([ ]{0,'.$less_than_tab.'}) # $3 = number of spaces
|
|
||||||
('.$marker_re.') # $4 = first list item marker
|
|
||||||
[ ]+
|
|
||||||
)
|
|
||||||
(?s:.+?)
|
|
||||||
( # $5
|
|
||||||
\z
|
|
||||||
|
|
|
||||||
\n{2,}
|
|
||||||
(?=\S)
|
|
||||||
(?! # Negative lookahead for another list item marker
|
|
||||||
[ ]*
|
|
||||||
'.$marker_re.'[ ]+
|
|
||||||
)
|
|
||||||
|
|
|
||||||
(?= # Lookahead for another kind of list
|
|
||||||
\n
|
|
||||||
\3 # Must have the same indentation
|
|
||||||
'.$other_marker_re.'[ ]+
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
';if($this->list_level){$text=preg_replace_callback('{
|
|
||||||
^
|
|
||||||
'.$whole_list_re.'
|
|
||||||
}mx',array(&$this,'_doLists_callback'),$text);}else {$text=preg_replace_callback('{
|
|
||||||
(?:(?<=\n)\n|\A\n?) # Must eat the newline
|
|
||||||
'.$whole_list_re.'
|
|
||||||
}mx',array(&$this,'_doLists_callback'),$text);}}return $text;}function _doLists_callback($matches){$marker_ul_re='[*+-]';$marker_ol_re='\d+[.]';$marker_any_re="(?:$marker_ul_re|$marker_ol_re)";$list=$matches[1];$list_type=preg_match("/$marker_ul_re/",$matches[4])?"ul":"ol";$marker_any_re=($list_type=="ul"?$marker_ul_re:$marker_ol_re);$list.="\n";$result=$this->processListItems($list,$marker_any_re);$result=$this->hashBlock("<$list_type>\n".$result."</$list_type>");return "\n".$result."\n\n";}var $list_level=0;function processListItems($list_str,$marker_any_re){$this->list_level++;$list_str=preg_replace("/\n{2,}\\z/","\n",$list_str);$list_str=preg_replace_callback('{
|
|
||||||
(\n)? # leading line = $1
|
|
||||||
(^[ ]*) # leading whitespace = $2
|
|
||||||
('.$marker_any_re.' # list marker and space = $3
|
|
||||||
(?:[ ]+|(?=\n)) # space only required if item is not empty
|
|
||||||
)
|
|
||||||
((?s:.*?)) # list item text = $4
|
|
||||||
(?:(\n+(?=\n))|\n) # tailing blank line = $5
|
|
||||||
(?= \n* (\z | \2 ('.$marker_any_re.') (?:[ ]+|(?=\n))))
|
|
||||||
}xm',array(&$this,'_processListItems_callback'),$list_str);$this->list_level--;return $list_str;}function _processListItems_callback($matches){$item=$matches[4];$leading_line=&$matches[1];$leading_space=&$matches[2];$marker_space=$matches[3];$tailing_blank_line=&$matches[5];if($leading_line||$tailing_blank_line||preg_match('/\n{2,}/',$item)){$item=$leading_space.str_repeat(' ',strlen($marker_space)).$item;$item=$this->runBlockGamut($this->outdent($item)."\n");}else {$item=$this->doLists($this->outdent($item));$item=preg_replace('/\n+$/','',$item);$item=$this->runSpanGamut($item);}return "<li>".$item."</li>\n";}function doCodeBlocks($text){$text=preg_replace_callback('{
|
|
||||||
(?:\n\n|\A\n?)
|
|
||||||
( # $1 = the code block -- one or more lines, starting with a space/tab
|
|
||||||
(?>
|
|
||||||
[ ]{'.$this->tab_width.'} # Lines must start with a tab or a tab-width of spaces
|
|
||||||
.*\n+
|
|
||||||
)+
|
|
||||||
)
|
|
||||||
((?=^[ ]{0,'.$this->tab_width.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
|
|
||||||
}xm',array(&$this,'_doCodeBlocks_callback'),$text);return $text;}function _doCodeBlocks_callback($matches){$codeblock=$matches[1];$codeblock=$this->outdent($codeblock);$codeblock=htmlspecialchars($codeblock,ENT_NOQUOTES);$codeblock=preg_replace('/\A\n+|\n+\z/','',$codeblock);$codeblock="<pre><code>$codeblock\n</code></pre>";return "\n\n".$this->hashBlock($codeblock)."\n\n";}function makeCodeSpan($code){$code=htmlspecialchars(trim($code),ENT_NOQUOTES);return $this->hashPart("<code>$code</code>");}var $em_relist=array(''=>'(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S|$)(?![.,:;]\s)','*'=>'(?<=\S|^)(?<!\*)\*(?!\*)','_'=>'(?<=\S|^)(?<!_)_(?!_)',);var $strong_relist=array(''=>'(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S|$)(?![.,:;]\s)','**'=>'(?<=\S|^)(?<!\*)\*\*(?!\*)','__'=>'(?<=\S|^)(?<!_)__(?!_)',);var $em_strong_relist=array(''=>'(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S|$)(?![.,:;]\s)','***'=>'(?<=\S|^)(?<!\*)\*\*\*(?!\*)','___'=>'(?<=\S|^)(?<!_)___(?!_)',);var $em_strong_prepared_relist;function prepareItalicsAndBold(){foreach($this->em_relist as $em=>$em_re){foreach($this->strong_relist as $strong=>$strong_re){$token_relist=array();if(isset($this->em_strong_relist["$em$strong"])){$token_relist[]=$this->em_strong_relist["$em$strong"];}$token_relist[]=$em_re;$token_relist[]=$strong_re;$token_re='{('.implode('|',$token_relist).')}';$this->em_strong_prepared_relist["$em$strong"]=$token_re;}}}function doItalicsAndBold($text){$token_stack=array('');$text_stack=array('');$em='';$strong='';$tree_char_em=false;while(1){$token_re=$this->em_strong_prepared_relist["$em$strong"];$parts=preg_split($token_re,$text,2,PREG_SPLIT_DELIM_CAPTURE);$text_stack[0].=$parts[0];$token=&$parts[1];$text=&$parts[2];if(empty($token)){while($token_stack[0]){$text_stack[1].=array_shift($token_stack);$text_stack[0].=array_shift($text_stack);}break;}$token_len=strlen($token);if($tree_char_em){if($token_len==3){array_shift($token_stack);$span=array_shift($text_stack);$span=$this->runSpanGamut($span);$span="<strong><em>$span</em></strong>";$text_stack[0].=$this->hashPart($span);$em='';$strong='';}else {$token_stack[0]=str_repeat($token{0},3-$token_len);$tag=$token_len==2?"strong":"em";$span=$text_stack[0];$span=$this->runSpanGamut($span);$span="<$tag>$span</$tag>";$text_stack[0]=$this->hashPart($span);$$tag='';}$tree_char_em=false;}else if($token_len==3){if($em){for($i=0;$i<2;++$i){$shifted_token=array_shift($token_stack);$tag=strlen($shifted_token)==2?"strong":"em";$span=array_shift($text_stack);$span=$this->runSpanGamut($span);$span="<$tag>$span</$tag>";$text_stack[0].=$this->hashPart($span);$$tag='';}}else {$em=$token{0};$strong="$em$em";array_unshift($token_stack,$token);array_unshift($text_stack,'');$tree_char_em=true;}}else if($token_len==2){if($strong){if(strlen($token_stack[0])==1){$text_stack[1].=array_shift($token_stack);$text_stack[0].=array_shift($text_stack);}array_shift($token_stack);$span=array_shift($text_stack);$span=$this->runSpanGamut($span);$span="<strong>$span</strong>";$text_stack[0].=$this->hashPart($span);$strong='';}else {array_unshift($token_stack,$token);array_unshift($text_stack,'');$strong=$token;}}else {if($em){if(strlen($token_stack[0])==1){array_shift($token_stack);$span=array_shift($text_stack);$span=$this->runSpanGamut($span);$span="<em>$span</em>";$text_stack[0].=$this->hashPart($span);$em='';}else {$text_stack[0].=$token;}}else {array_unshift($token_stack,$token);array_unshift($text_stack,'');$em=$token;}}}return $text_stack[0];}function doBlockQuotes($text){$text=preg_replace_callback('/
|
|
||||||
( # Wrap whole match in $1
|
|
||||||
(?>
|
|
||||||
^[ ]*>[ ]? # ">" at the start of a line
|
|
||||||
.+\n # rest of the first line
|
|
||||||
(.+\n)* # subsequent consecutive lines
|
|
||||||
\n* # blanks
|
|
||||||
)+
|
|
||||||
)
|
|
||||||
/xm',array(&$this,'_doBlockQuotes_callback'),$text);return $text;}function _doBlockQuotes_callback($matches){$bq=$matches[1];$bq=preg_replace('/^[ ]*>[ ]?|^[ ]+$/m','',$bq);$bq=$this->runBlockGamut($bq);$bq=preg_replace('/^/m'," ",$bq);$bq=preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',array(&$this,'_doBlockQuotes_callback2'),$bq);return "\n".$this->hashBlock("<blockquote>\n$bq\n</blockquote>")."\n\n";}function _doBlockQuotes_callback2($matches){$pre=$matches[1];$pre=preg_replace('/^ /m','',$pre);return $pre;}function formParagraphs($text){$text=preg_replace('/\A\n+|\n+\z/','',$text);$grafs=preg_split('/\n{2,}/',$text,-1,PREG_SPLIT_NO_EMPTY);foreach($grafs as $key=>$value){if(!preg_match('/^B\x1A[0-9]+B$/',$value)){$value=$this->runSpanGamut($value);$value=preg_replace('/^([ ]*)/',"<p>",$value);$value.="</p>";$grafs[$key]=$this->unhash($value);}else {$graf=$value;$block=$this->html_hashes[$graf];$graf=$block;$grafs[$key]=$graf;}}return implode("\n\n",$grafs);}function encodeAttribute($text){$text=$this->encodeAmpsAndAngles($text);$text=str_replace('"','"',$text);return $text;}function encodeAmpsAndAngles($text){if($this->no_entities){$text=str_replace('&','&',$text);}else {$text=preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/','&',$text);;}$text=str_replace('<','<',$text);return $text;}function doAutoLinks($text){$text=preg_replace_callback('{<((https?|ftp|dict):[^\'">\s]+)>}i',array(&$this,'_doAutoLinks_url_callback'),$text);$text=preg_replace_callback('{
|
|
||||||
<
|
|
||||||
(?:mailto:)?
|
|
||||||
(
|
|
||||||
(?:
|
|
||||||
[-!#$%&\'*+/=?^_`.{|}~\w\x80-\xFF]+
|
|
||||||
|
|
|
||||||
".*?"
|
|
||||||
)
|
|
||||||
\@
|
|
||||||
(?:
|
|
||||||
[-a-z0-9\x80-\xFF]+(\.[-a-z0-9\x80-\xFF]+)*\.[a-z]+
|
|
||||||
|
|
|
||||||
\[[\d.a-fA-F:]+\] # IPv4 & IPv6
|
|
||||||
)
|
|
||||||
)
|
|
||||||
>
|
|
||||||
}xi',array(&$this,'_doAutoLinks_email_callback'),$text);return $text;}function _doAutoLinks_url_callback($matches){$url=$this->encodeAttribute($matches[1]);$link="<a href=\"$url\">$url</a>";return $this->hashPart($link);}function _doAutoLinks_email_callback($matches){$address=$matches[1];$link=$this->encodeEmailAddress($address);return $this->hashPart($link);}function encodeEmailAddress($addr){$addr="mailto:".$addr;$chars=preg_split('/(?<!^)(?!$)/',$addr);$seed=(int)abs(crc32($addr)/strlen($addr));foreach($chars as $key=>$char){$ord=ord($char);if($ord<128){$r=($seed*(1+$key))%100;if($r>90&&$char!='@');else if($r<45)$chars[$key]='&#x'.dechex($ord).';';else $chars[$key]='&#'.$ord.';';}}$addr=implode('',$chars);$text=implode('',array_slice($chars,7));$addr="<a href=\"$addr\">$text</a>";return $addr;}function parseSpan($str){$output='';$span_re='{
|
|
||||||
(
|
|
||||||
\\\\'.$this->escape_chars_re.'
|
|
||||||
|
|
|
||||||
(?<![`\\\\])
|
|
||||||
`+ # code span marker
|
|
||||||
'.($this->no_markup?'':'
|
|
||||||
|
|
|
||||||
<!-- .*? --> # comment
|
|
||||||
|
|
|
||||||
<\?.*?\?> | <%.*?%> # processing instruction
|
|
||||||
|
|
|
||||||
<[/!$]?[-a-zA-Z0-9:_]+ # regular tags
|
|
||||||
(?>
|
|
||||||
\s
|
|
||||||
(?>[^"\'>]+|"[^"]*"|\'[^\']*\')*
|
|
||||||
)?
|
|
||||||
>
|
|
||||||
').'
|
|
||||||
)
|
|
||||||
}xs';while(1){$parts=preg_split($span_re,$str,2,PREG_SPLIT_DELIM_CAPTURE);if($parts[0]!=""){$output.=$parts[0];}if(isset($parts[1])){$output.=$this->handleSpanToken($parts[1],$parts[2]);$str=$parts[2];}else {break;}}return $output;}function handleSpanToken($token,&$str){switch($token{0}){case "\\":return $this->hashPart("&#".ord($token{1}).";");case "`":if(preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm',$str,$matches)){$str=$matches[2];$codespan=$this->makeCodeSpan($matches[1]);return $this->hashPart($codespan);}return $token;default:return $this->hashPart($token);}}function outdent($text){return preg_replace('/^(\t|[ ]{1,'.$this->tab_width.'})/m','',$text);}var $utf8_strlen='mb_strlen';function detab($text){$text=preg_replace_callback('/^.*\t.*$/m',array(&$this,'_detab_callback'),$text);return $text;}function _detab_callback($matches){$line=$matches[0];$strlen=$this->utf8_strlen;$blocks=explode("\t",$line);$line=$blocks[0];unset($blocks[0]);foreach($blocks as $block){$amount=$this->tab_width-$strlen($line,'UTF-8')%$this->tab_width;$line.=str_repeat(" ",$amount).$block;}return $line;}function _initDetab(){if(function_exists($this->utf8_strlen))return;$this->utf8_strlen=create_function('$text','return preg_match_all(
|
|
||||||
"/[\\\\x00-\\\\xBF]|[\\\\xC0-\\\\xFF][\\\\x80-\\\\xBF]*/",
|
|
||||||
$text, $m);');}function unhash($text){return preg_replace_callback('/(.)\x1A[0-9]+\1/',array(&$this,'_unhash_callback'),$text);}function _unhash_callback($matches){return $this->html_hashes[$matches[0]];}}class MarkdownExtra_Parser extends Markdown_Parser{var $fn_id_prefix="";var $fn_link_title=MARKDOWN_FN_LINK_TITLE;var $fn_backlink_title=MARKDOWN_FN_BACKLINK_TITLE;var $fn_link_class=MARKDOWN_FN_LINK_CLASS;var $fn_backlink_class=MARKDOWN_FN_BACKLINK_CLASS;var $predef_abbr=array();function MarkdownExtra_Parser(){$this->escape_chars.=':|';$this->document_gamut+=array("doFencedCodeBlocks"=>5,"stripFootnotes"=>15,"stripAbbreviations"=>25,"appendFootnotes"=>50,);$this->block_gamut+=array("doFencedCodeBlocks"=>5,"doTables"=>15,"doDefLists"=>45,);$this->span_gamut+=array("doFootnotes"=>5,"doAbbreviations"=>70,);parent::Markdown_Parser();}var $footnotes=array();var $footnotes_ordered=array();var $abbr_desciptions=array();var $abbr_word_re='';var $footnote_counter=1;function setup(){parent::setup();$this->footnotes=array();$this->footnotes_ordered=array();$this->abbr_desciptions=array();$this->abbr_word_re='';$this->footnote_counter=1;foreach($this->predef_abbr as $abbr_word=>$abbr_desc){if($this->abbr_word_re)$this->abbr_word_re.='|';$this->abbr_word_re.=preg_quote($abbr_word);$this->abbr_desciptions[$abbr_word]=trim($abbr_desc);}}function teardown(){$this->footnotes=array();$this->footnotes_ordered=array();$this->abbr_desciptions=array();$this->abbr_word_re='';parent::teardown();}var $block_tags_re='p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend';var $context_block_tags_re='script|noscript|math|ins|del';var $contain_span_tags_re='p|h[1-6]|li|dd|dt|td|th|legend|address';var $clean_tags_re='script|math';var $auto_close_tags_re='hr|img';function hashHTMLBlocks($text){list($text,)=$this->_hashHTMLBlocks_inMarkdown($text);return $text;}function _hashHTMLBlocks_inMarkdown($text,$indent=0,$enclosing_tag_re='',$span=false){if($text==='')return array('','');$newline_before_re='/(?:^\n?|\n\n)*$/';$newline_after_re='{
|
|
||||||
^ # Start of text following the tag.
|
|
||||||
(?>[ ]*<!--.*?-->)? # Optional comment.
|
|
||||||
[ ]*\n # Must be followed by newline.
|
|
||||||
}xs';$block_tag_re='{
|
|
||||||
( # $2: Capture hole tag.
|
|
||||||
</? # Any opening or closing tag.
|
|
||||||
(?> # Tag name.
|
|
||||||
'.$this->block_tags_re.' |
|
|
||||||
'.$this->context_block_tags_re.' |
|
|
||||||
'.$this->clean_tags_re.' |
|
|
||||||
(?!\s)'.$enclosing_tag_re.'
|
|
||||||
)
|
|
||||||
(?:
|
|
||||||
(?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name.
|
|
||||||
(?>
|
|
||||||
".*?" | # Double quotes (can contain `>`)
|
|
||||||
\'.*?\' | # Single quotes (can contain `>`)
|
|
||||||
.+? # Anything but quotes and `>`.
|
|
||||||
)*?
|
|
||||||
)?
|
|
||||||
> # End of tag.
|
|
||||||
|
|
|
||||||
<!-- .*? --> # HTML Comment
|
|
||||||
|
|
|
||||||
<\?.*?\?> | <%.*?%> # Processing instruction
|
|
||||||
|
|
|
||||||
<!\[CDATA\[.*?\]\]> # CData Block
|
|
||||||
|
|
|
||||||
# Code span marker
|
|
||||||
`+
|
|
||||||
'.(!$span?' # If not in span.
|
|
||||||
|
|
|
||||||
# Indented code block
|
|
||||||
(?: ^[ ]*\n | ^ | \n[ ]*\n )
|
|
||||||
[ ]{'.($indent+4).'}[^\n]* \n
|
|
||||||
(?>
|
|
||||||
(?: [ ]{'.($indent+4).'}[^\n]* | [ ]* ) \n
|
|
||||||
)*
|
|
||||||
|
|
|
||||||
# Fenced code block marker
|
|
||||||
(?> ^ | \n )
|
|
||||||
[ ]{'.($indent).'}~~~+[ ]*\n
|
|
||||||
':'').' # End (if not is span).
|
|
||||||
)
|
|
||||||
}xs';$depth=0;$parsed="";do{$parts=preg_split($block_tag_re,$text,2,PREG_SPLIT_DELIM_CAPTURE);if($span){$void=$this->hashPart("",':');$newline="$void\n";$parts[0]=$void.str_replace("\n",$newline,$parts[0]).$void;}$parsed.=$parts[0];if(count($parts)<3){$text="";break;}$tag=$parts[1];$text=$parts[2];$tag_re=preg_quote($tag);if($tag{0}=="`"){$tag_re=preg_quote($tag);if(preg_match('{^(?>.+?|\n(?!\n))*?(?<!`)'.$tag_re.'(?!`)}',$text,$matches)){$parsed.=$tag.$matches[0];$text=substr($text,strlen($matches[0]));}else {$parsed.=$tag;}}else if($tag{0}=="\n"||$tag{0}==" "){$parsed.=$tag;}else if($tag{0}=="~"){$tag_re=preg_quote(trim($tag));if(preg_match('{^(?>.*\n)+?'.$tag_re.' *\n}',$text,$matches)){$parsed.=$tag.$matches[0];$text=substr($text,strlen($matches[0]));}else {$parsed.=$tag;}}else if(preg_match('{^<(?:'.$this->block_tags_re.')\b}',$tag)||(preg_match('{^<(?:'.$this->context_block_tags_re.')\b}',$tag)&&preg_match($newline_before_re,$parsed)&&preg_match($newline_after_re,$text))){list($block_text,$text)=$this->_hashHTMLBlocks_inHTML($tag.$text,"hashBlock",true);$parsed.="\n\n$block_text\n\n";}else if(preg_match('{^<(?:'.$this->clean_tags_re.')\b}',$tag)||$tag{1}=='!'||$tag{1}=='?'){list($block_text,$text)=$this->_hashHTMLBlocks_inHTML($tag.$text,"hashClean",false);$parsed.=$block_text;}else if($enclosing_tag_re!==''&&preg_match('{^</?(?:'.$enclosing_tag_re.')\b}',$tag)){if($tag{1}=='/')$depth--;else if($tag{strlen($tag)-2}!='/')$depth++;if($depth<0){$text=$tag.$text;break;}$parsed.=$tag;}else {$parsed.=$tag;}}while($depth>=0);return array($parsed,$text);}function _hashHTMLBlocks_inHTML($text,$hash_method,$md_attr){if($text==='')return array('','');$markdown_attr_re='
|
|
||||||
{
|
|
||||||
\s* # Eat whitespace before the `markdown` attribute
|
|
||||||
markdown
|
|
||||||
\s*=\s*
|
|
||||||
(?>
|
|
||||||
(["\']) # $1: quote delimiter
|
|
||||||
(.*?) # $2: attribute value
|
|
||||||
\1 # matching delimiter
|
|
||||||
|
|
|
||||||
([^\s>]*) # $3: unquoted attribute value
|
|
||||||
)
|
|
||||||
() # $4: make $3 always defined (avoid warnings)
|
|
||||||
}xs';$tag_re='{
|
|
||||||
( # $2: Capture hole tag.
|
|
||||||
</? # Any opening or closing tag.
|
|
||||||
[\w:$]+ # Tag name.
|
|
||||||
(?:
|
|
||||||
(?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name.
|
|
||||||
(?>
|
|
||||||
".*?" | # Double quotes (can contain `>`)
|
|
||||||
\'.*?\' | # Single quotes (can contain `>`)
|
|
||||||
.+? # Anything but quotes and `>`.
|
|
||||||
)*?
|
|
||||||
)?
|
|
||||||
> # End of tag.
|
|
||||||
|
|
|
||||||
<!-- .*? --> # HTML Comment
|
|
||||||
|
|
|
||||||
<\?.*?\?> | <%.*?%> # Processing instruction
|
|
||||||
|
|
|
||||||
<!\[CDATA\[.*?\]\]> # CData Block
|
|
||||||
)
|
|
||||||
}xs';$original_text=$text;$depth=0;$block_text="";$parsed="";if(preg_match('/^<([\w:$]*)\b/',$text,$matches))$base_tag_name_re=$matches[1];do{$parts=preg_split($tag_re,$text,2,PREG_SPLIT_DELIM_CAPTURE);if(count($parts)<3){return array($original_text{0},substr($original_text,1));}$block_text.=$parts[0];$tag=$parts[1];$text=$parts[2];if(preg_match('{^</?(?:'.$this->auto_close_tags_re.')\b}',$tag)||$tag{1}=='!'||$tag{1}=='?'){$block_text.=$tag;}else {if(preg_match('{^</?'.$base_tag_name_re.'\b}',$tag)){if($tag{1}=='/')$depth--;else if($tag{strlen($tag)-2}!='/')$depth++;}if($md_attr&&preg_match($markdown_attr_re,$tag,$attr_m)&&preg_match('/^1|block|span$/',$attr_m[2].$attr_m[3])){$tag=preg_replace($markdown_attr_re,'',$tag);$this->mode=$attr_m[2].$attr_m[3];$span_mode=$this->mode=='span'||$this->mode!='block'&&preg_match('{^<(?:'.$this->contain_span_tags_re.')\b}',$tag);if(preg_match('/(?:^|\n)( *?)(?! ).*?$/',$block_text,$matches)){$strlen=$this->utf8_strlen;$indent=$strlen($matches[1],'UTF-8');}else {$indent=0;}$block_text.=$tag;$parsed.=$this->$hash_method($block_text);preg_match('/^<([\w:$]*)\b/',$tag,$matches);$tag_name_re=$matches[1];list($block_text,$text)=$this->_hashHTMLBlocks_inMarkdown($text,$indent,$tag_name_re,$span_mode);if($indent>0){$block_text=preg_replace("/^[ ]{1,$indent}/m","",$block_text);}if(!$span_mode)$parsed.="\n\n$block_text\n\n";else $parsed.="$block_text";$block_text="";}else $block_text.=$tag;}}while($depth>0);$parsed.=$this->$hash_method($block_text);return array($parsed,$text);}function hashClean($text){return $this->hashPart($text,'C');}function doHeaders($text){$text=preg_replace_callback('{
|
|
||||||
(^.+?) # $1: Header text
|
|
||||||
(?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # $2: Id attribute
|
|
||||||
[ ]*\n(=+|-+)[ ]*\n+ # $3: Header footer
|
|
||||||
}mx',array(&$this,'_doHeaders_callback_setext'),$text);$text=preg_replace_callback('{
|
|
||||||
^(\#{1,6}) # $1 = string of #\'s
|
|
||||||
[ ]*
|
|
||||||
(.+?) # $2 = Header text
|
|
||||||
[ ]*
|
|
||||||
\#* # optional closing #\'s (not counted)
|
|
||||||
(?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # id attribute
|
|
||||||
[ ]*
|
|
||||||
\n+
|
|
||||||
}xm',array(&$this,'_doHeaders_callback_atx'),$text);return $text;}function _doHeaders_attr($attr){if(empty($attr))return "";return " id=\"$attr\"";}function _doHeaders_callback_setext($matches){if($matches[3]=='-'&&preg_match('{^- }',$matches[1]))return $matches[0];$level=$matches[3]{0}=='='?1:2;$attr=$this->_doHeaders_attr($id=&$matches[2]);$block="<h$level$attr>".$this->runSpanGamut($matches[1])."</h$level>";return "\n".$this->hashBlock($block)."\n\n";}function _doHeaders_callback_atx($matches){$level=strlen($matches[1]);$attr=$this->_doHeaders_attr($id=&$matches[3]);$block="<h$level$attr>".$this->runSpanGamut($matches[2])."</h$level>";return "\n".$this->hashBlock($block)."\n\n";}function doTables($text){$less_than_tab=$this->tab_width-1;$text=preg_replace_callback('
|
|
||||||
{
|
|
||||||
^ # Start of a line
|
|
||||||
[ ]{0,'.$less_than_tab.'} # Allowed whitespace.
|
|
||||||
[|] # Optional leading pipe (present)
|
|
||||||
(.+) \n # $1: Header row (at least one pipe)
|
|
||||||
|
|
||||||
[ ]{0,'.$less_than_tab.'} # Allowed whitespace.
|
|
||||||
[|] ([ ]*[-:]+[-| :]*) \n # $2: Header underline
|
|
||||||
|
|
||||||
( # $3: Cells
|
|
||||||
(?>
|
|
||||||
[ ]* # Allowed whitespace.
|
|
||||||
[|] .* \n # Row content.
|
|
||||||
)*
|
|
||||||
)
|
|
||||||
(?=\n|\Z) # Stop at final double newline.
|
|
||||||
}xm',array(&$this,'_doTable_leadingPipe_callback'),$text);$text=preg_replace_callback('
|
|
||||||
{
|
|
||||||
^ # Start of a line
|
|
||||||
[ ]{0,'.$less_than_tab.'} # Allowed whitespace.
|
|
||||||
(\S.*[|].*) \n # $1: Header row (at least one pipe)
|
|
||||||
|
|
||||||
[ ]{0,'.$less_than_tab.'} # Allowed whitespace.
|
|
||||||
([-:]+[ ]*[|][-| :]*) \n # $2: Header underline
|
|
||||||
|
|
||||||
( # $3: Cells
|
|
||||||
(?>
|
|
||||||
.* [|] .* \n # Row content
|
|
||||||
)*
|
|
||||||
)
|
|
||||||
(?=\n|\Z) # Stop at final double newline.
|
|
||||||
}xm',array(&$this,'_DoTable_callback'),$text);return $text;}function _doTable_leadingPipe_callback($matches){$head=$matches[1];$underline=$matches[2];$content=$matches[3];$content=preg_replace('/^ *[|]/m','',$content);return $this->_doTable_callback(array($matches[0],$head,$underline,$content));}function _doTable_callback($matches){$head=$matches[1];$underline=$matches[2];$content=$matches[3];$head=preg_replace('/[|] *$/m','',$head);$underline=preg_replace('/[|] *$/m','',$underline);$content=preg_replace('/[|] *$/m','',$content);$separators=preg_split('/ *[|] */',$underline);foreach($separators as $n=>$s){if(preg_match('/^ *-+: *$/',$s))$attr[$n]=' align="right"';else if(preg_match('/^ *:-+: *$/',$s))$attr[$n]=' align="center"';else if(preg_match('/^ *:-+ *$/',$s))$attr[$n]=' align="left"';else $attr[$n]='';}$head=$this->parseSpan($head);$headers=preg_split('/ *[|] */',$head);$col_count=count($headers);$text="<table>\n";$text.="<thead>\n";$text.="<tr>\n";foreach($headers as $n=>$header)$text.=" <th$attr[$n]>".$this->runSpanGamut(trim($header))."</th>\n";$text.="</tr>\n";$text.="</thead>\n";$rows=explode("\n",trim($content,"\n"));$text.="<tbody>\n";foreach($rows as $row){$row=$this->parseSpan($row);$row_cells=preg_split('/ *[|] */',$row,$col_count);$row_cells=array_pad($row_cells,$col_count,'');$text.="<tr>\n";foreach($row_cells as $n=>$cell)$text.=" <td$attr[$n]>".$this->runSpanGamut(trim($cell))."</td>\n";$text.="</tr>\n";}$text.="</tbody>\n";$text.="</table>";return $this->hashBlock($text)."\n";}function doDefLists($text){$less_than_tab=$this->tab_width-1;$whole_list_re='(?>
|
|
||||||
( # $1 = whole list
|
|
||||||
( # $2
|
|
||||||
[ ]{0,'.$less_than_tab.'}
|
|
||||||
((?>.*\S.*\n)+) # $3 = defined term
|
|
||||||
\n?
|
|
||||||
[ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
|
|
||||||
)
|
|
||||||
(?s:.+?)
|
|
||||||
( # $4
|
|
||||||
\z
|
|
||||||
|
|
|
||||||
\n{2,}
|
|
||||||
(?=\S)
|
|
||||||
(?! # Negative lookahead for another term
|
|
||||||
[ ]{0,'.$less_than_tab.'}
|
|
||||||
(?: \S.*\n )+? # defined term
|
|
||||||
\n?
|
|
||||||
[ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
|
|
||||||
)
|
|
||||||
(?! # Negative lookahead for another definition
|
|
||||||
[ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)';$text=preg_replace_callback('{
|
|
||||||
(?>\A\n?|(?<=\n\n))
|
|
||||||
'.$whole_list_re.'
|
|
||||||
}mx',array(&$this,'_doDefLists_callback'),$text);return $text;}function _doDefLists_callback($matches){$list=$matches[1];$result=trim($this->processDefListItems($list));$result="<dl>\n".$result."\n</dl>";return $this->hashBlock($result)."\n\n";}function processDefListItems($list_str){$less_than_tab=$this->tab_width-1;$list_str=preg_replace("/\n{2,}\\z/","\n",$list_str);$list_str=preg_replace_callback('{
|
|
||||||
(?>\A\n?|\n\n+) # leading line
|
|
||||||
( # definition terms = $1
|
|
||||||
[ ]{0,'.$less_than_tab.'} # leading whitespace
|
|
||||||
(?![:][ ]|[ ]) # negative lookahead for a definition
|
|
||||||
# mark (colon) or more whitespace.
|
|
||||||
(?> \S.* \n)+? # actual term (not whitespace).
|
|
||||||
)
|
|
||||||
(?=\n?[ ]{0,3}:[ ]) # lookahead for following line feed
|
|
||||||
# with a definition mark.
|
|
||||||
}xm',array(&$this,'_processDefListItems_callback_dt'),$list_str);$list_str=preg_replace_callback('{
|
|
||||||
\n(\n+)? # leading line = $1
|
|
||||||
( # marker space = $2
|
|
||||||
[ ]{0,'.$less_than_tab.'} # whitespace before colon
|
|
||||||
[:][ ]+ # definition mark (colon)
|
|
||||||
)
|
|
||||||
((?s:.+?)) # definition text = $3
|
|
||||||
(?= \n+ # stop at next definition mark,
|
|
||||||
(?: # next term or end of text
|
|
||||||
[ ]{0,'.$less_than_tab.'} [:][ ] |
|
|
||||||
<dt> | \z
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}xm',array(&$this,'_processDefListItems_callback_dd'),$list_str);return $list_str;}function _processDefListItems_callback_dt($matches){$terms=explode("\n",trim($matches[1]));$text='';foreach($terms as $term){$term=$this->runSpanGamut(trim($term));$text.="\n<dt>".$term."</dt>";}return $text."\n";}function _processDefListItems_callback_dd($matches){$leading_line=$matches[1];$marker_space=$matches[2];$def=$matches[3];if($leading_line||preg_match('/\n{2,}/',$def)){$def=str_repeat(' ',strlen($marker_space)).$def;$def=$this->runBlockGamut($this->outdent($def."\n\n"));$def="\n".$def."\n";}else {$def=rtrim($def);$def=$this->runSpanGamut($this->outdent($def));}return "\n<dd>".$def."</dd>\n";}function doFencedCodeBlocks($text){$less_than_tab=$this->tab_width;$text=preg_replace_callback('{
|
|
||||||
(?:\n|\A)
|
|
||||||
# 1: Opening marker
|
|
||||||
(
|
|
||||||
~{3,} # Marker: three tilde or more.
|
|
||||||
)
|
|
||||||
[ ]* \n # Whitespace and newline following marker.
|
|
||||||
|
|
||||||
# 2: Content
|
|
||||||
(
|
|
||||||
(?>
|
|
||||||
(?!\1 [ ]* \n) # Not a closing marker.
|
|
||||||
.*\n+
|
|
||||||
)+
|
|
||||||
)
|
|
||||||
|
|
||||||
# Closing marker.
|
|
||||||
\1 [ ]* \n
|
|
||||||
}xm',array(&$this,'_doFencedCodeBlocks_callback'),$text);return $text;}function _doFencedCodeBlocks_callback($matches){$codeblock=$matches[2];$codeblock=htmlspecialchars($codeblock,ENT_NOQUOTES);$codeblock=preg_replace_callback('/^\n+/',array(&$this,'_doFencedCodeBlocks_newlines'),$codeblock);$codeblock="<pre><code>$codeblock</code></pre>";return "\n\n".$this->hashBlock($codeblock)."\n\n";}function _doFencedCodeBlocks_newlines($matches){return str_repeat("<br$this->empty_element_suffix",strlen($matches[0]));}var $em_relist=array(''=>'(?:(?<!\*)\*(?!\*)|(?<![a-zA-Z0-9_])_(?!_))(?=\S|$)(?![.,:;]\s)','*'=>'(?<=\S|^)(?<!\*)\*(?!\*)','_'=>'(?<=\S|^)(?<!_)_(?![a-zA-Z0-9_])',);var $strong_relist=array(''=>'(?:(?<!\*)\*\*(?!\*)|(?<![a-zA-Z0-9_])__(?!_))(?=\S|$)(?![.,:;]\s)','**'=>'(?<=\S|^)(?<!\*)\*\*(?!\*)','__'=>'(?<=\S|^)(?<!_)__(?![a-zA-Z0-9_])',);var $em_strong_relist=array(''=>'(?:(?<!\*)\*\*\*(?!\*)|(?<![a-zA-Z0-9_])___(?!_))(?=\S|$)(?![.,:;]\s)','***'=>'(?<=\S|^)(?<!\*)\*\*\*(?!\*)','___'=>'(?<=\S|^)(?<!_)___(?![a-zA-Z0-9_])',);function formParagraphs($text){$text=preg_replace('/\A\n+|\n+\z/','',$text);$grafs=preg_split('/\n{2,}/',$text,-1,PREG_SPLIT_NO_EMPTY);foreach($grafs as $key=>$value){$value=trim($this->runSpanGamut($value));$is_p=!preg_match('/^B\x1A[0-9]+B|^C\x1A[0-9]+C$/',$value);if($is_p){$value="<p>$value</p>";}$grafs[$key]=$value;}$text=implode("\n\n",$grafs);$text=$this->unhash($text);return $text;}function stripFootnotes($text){$less_than_tab=$this->tab_width-1;$text=preg_replace_callback('{
|
|
||||||
^[ ]{0,'.$less_than_tab.'}\[\^(.+?)\][ ]?: # note_id = $1
|
|
||||||
[ ]*
|
|
||||||
\n? # maybe *one* newline
|
|
||||||
( # text = $2 (no blank lines allowed)
|
|
||||||
(?:
|
|
||||||
.+ # actual text
|
|
||||||
|
|
|
||||||
\n # newlines but
|
|
||||||
(?!\[\^.+?\]:\s)# negative lookahead for footnote marker.
|
|
||||||
(?!\n+[ ]{0,3}\S)# ensure line is not blank and followed
|
|
||||||
# by non-indented content
|
|
||||||
)*
|
|
||||||
)
|
|
||||||
}xm',array(&$this,'_stripFootnotes_callback'),$text);return $text;}function _stripFootnotes_callback($matches){$note_id=$this->fn_id_prefix.$matches[1];$this->footnotes[$note_id]=$this->outdent($matches[2]);return '';}function doFootnotes($text){if(!$this->in_anchor){$text=preg_replace('{\[\^(.+?)\]}',"F\x1Afn:\\1\x1A:",$text);}return $text;}function appendFootnotes($text){$text=preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',array(&$this,'_appendFootnotes_callback'),$text);if(!empty($this->footnotes_ordered)){$text.="\n\n";$text.="<div class=\"footnotes\">\n";$text.="<hr".$this->empty_element_suffix."\n";$text.="<ol>\n\n";$attr=" rev=\"footnote\"";if($this->fn_backlink_class!=""){$class=$this->fn_backlink_class;$class=$this->encodeAttribute($class);$attr.=" class=\"$class\"";}if($this->fn_backlink_title!=""){$title=$this->fn_backlink_title;$title=$this->encodeAttribute($title);$attr.=" title=\"$title\"";}$num=0;while(!empty($this->footnotes_ordered)){$footnote=reset($this->footnotes_ordered);$note_id=key($this->footnotes_ordered);unset($this->footnotes_ordered[$note_id]);$footnote.="\n";$footnote=$this->runBlockGamut("$footnote\n");$footnote=preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',array(&$this,'_appendFootnotes_callback'),$footnote);$attr=str_replace("%%",++$num,$attr);$note_id=$this->encodeAttribute($note_id);$backlink="<a href=\"#fnref:$note_id\"$attr>↩</a>";if(preg_match('{</p>$}',$footnote)){$footnote=substr($footnote,0,-4)." $backlink</p>";}else {$footnote.="\n\n<p>$backlink</p>";}$text.="<li id=\"fn:$note_id\">\n";$text.=$footnote."\n";$text.="</li>\n\n";}$text.="</ol>\n";$text.="</div>";}return $text;}function _appendFootnotes_callback($matches){$node_id=$this->fn_id_prefix.$matches[1];if(isset($this->footnotes[$node_id])){$this->footnotes_ordered[$node_id]=$this->footnotes[$node_id];unset($this->footnotes[$node_id]);$num=$this->footnote_counter++;$attr=" rel=\"footnote\"";if($this->fn_link_class!=""){$class=$this->fn_link_class;$class=$this->encodeAttribute($class);$attr.=" class=\"$class\"";}if($this->fn_link_title!=""){$title=$this->fn_link_title;$title=$this->encodeAttribute($title);$attr.=" title=\"$title\"";}$attr=str_replace("%%",$num,$attr);$node_id=$this->encodeAttribute($node_id);return "<sup id=\"fnref:$node_id\">"."<a href=\"#fn:$node_id\"$attr>$num</a>"."</sup>";}return "[^".$matches[1]."]";}function stripAbbreviations($text){$less_than_tab=$this->tab_width-1;$text=preg_replace_callback('{
|
|
||||||
^[ ]{0,'.$less_than_tab.'}\*\[(.+?)\][ ]?: # abbr_id = $1
|
|
||||||
(.*) # text = $2 (no blank lines allowed)
|
|
||||||
}xm',array(&$this,'_stripAbbreviations_callback'),$text);return $text;}function _stripAbbreviations_callback($matches){$abbr_word=$matches[1];$abbr_desc=$matches[2];if($this->abbr_word_re)$this->abbr_word_re.='|';$this->abbr_word_re.=preg_quote($abbr_word);$this->abbr_desciptions[$abbr_word]=trim($abbr_desc);return '';}function doAbbreviations($text){if($this->abbr_word_re){$text=preg_replace_callback('{'.'(?<![\w\x1A])'.'(?:'.$this->abbr_word_re.')'.'(?![\w\x1A])'.'}',array(&$this,'_doAbbreviations_callback'),$text);}return $text;}function _doAbbreviations_callback($matches){$abbr=$matches[0];if(isset($this->abbr_desciptions[$abbr])){$desc=$this->abbr_desciptions[$abbr];if(empty($desc)){return $this->hashPart("<abbr>$abbr</abbr>");}else {$desc=$this->encodeAttribute($desc);return $this->hashPart("<abbr title=\"$desc\">$abbr</abbr>");}}else {return $matches[0];}}}define('MARKDOWNEXTRAEXTENDED_VERSION',"0.3");function MarkdownExtended($text,$default_claases=array()){$parser=new MarkdownExtraExtended_Parser($default_claases);return $parser->transform($text);}class MarkdownExtraExtended_Parser extends MarkdownExtra_Parser{var $block_tags_re='figure|figcaption|p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend';var $default_classes;function MarkdownExtraExtended_Parser($default_classes=array()){$default_classes=$default_classes;$this->block_gamut+=array("doFencedFigures"=>7,);parent::MarkdownExtra_Parser();}function transform($text){$text=parent::transform($text);return $text;}function doHardBreaks($text){return preg_replace_callback('/ *\n/',array(&$this,'_doHardBreaks_callback'),$text);}function doBlockQuotes($text){$text=preg_replace_callback('/
|
|
||||||
(?>^[ ]*>[ ]?
|
|
||||||
(?:\((.+?)\))?
|
|
||||||
[ ]*(.+\n(?:.+\n)*)
|
|
||||||
)+
|
|
||||||
/xm',array(&$this,'_doBlockQuotes_callback'),$text);return $text;}function _doBlockQuotes_callback($matches){$cite=$matches[1];$bq='> '.$matches[2];$bq=preg_replace('/^[ ]*>[ ]?|^[ ]+$/m','',$bq);$bq=$this->runBlockGamut($bq);$bq=preg_replace('/^/m'," ",$bq);$bq=preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',array(&$this,'_doBlockQuotes_callback2'),$bq);$res="<blockquote";$res.=empty($cite)?">":" cite=\"$cite\">";$res.="\n$bq\n</blockquote>";return "\n".$this->hashBlock($res)."\n\n";}function doFencedCodeBlocks($text){$less_than_tab=$this->tab_width;$text=preg_replace_callback('{
|
|
||||||
(?:\n|\A)
|
|
||||||
# 1: Opening marker
|
|
||||||
(
|
|
||||||
~{3,}|`{3,} # Marker: three tilde or more.
|
|
||||||
)
|
|
||||||
|
|
||||||
[ ]?(\w+)?(?:,[ ]?(\d+))?[ ]* \n # Whitespace and newline following marker.
|
|
||||||
|
|
||||||
# 3: Content
|
|
||||||
(
|
|
||||||
(?>
|
|
||||||
(?!\1 [ ]* \n) # Not a closing marker.
|
|
||||||
.*\n+
|
|
||||||
)+
|
|
||||||
)
|
|
||||||
|
|
||||||
# Closing marker.
|
|
||||||
\1 [ ]* \n
|
|
||||||
}xm',array(&$this,'_doFencedCodeBlocks_callback'),$text);return $text;}function _doFencedCodeBlocks_callback($matches){$codeblock=$matches[4];$codeblock=htmlspecialchars($codeblock,ENT_NOQUOTES);$codeblock=preg_replace_callback('/^\n+/',array(&$this,'_doFencedCodeBlocks_newlines'),$codeblock);$cb=empty($matches[3])?"<pre><code":"<pre class=\"linenums:$matches[3]\"><code";$cb.=empty($matches[2])?">":" class=\"language-$matches[2]\">";$cb.="$codeblock</code></pre>";return "\n\n".$this->hashBlock($cb)."\n\n";}function doFencedFigures($text){$text=preg_replace_callback('{
|
|
||||||
(?:\n|\A)
|
|
||||||
# 1: Opening marker
|
|
||||||
(
|
|
||||||
={3,} # Marker: equal sign.
|
|
||||||
)
|
|
||||||
|
|
||||||
[ ]?(?:\[([^\]]+)\])?[ ]* \n # Whitespace and newline following marker.
|
|
||||||
|
|
||||||
# 3: Content
|
|
||||||
(
|
|
||||||
(?>
|
|
||||||
(?!\1 [ ]?(?:\[([^\]]+)\])?[ ]* \n) # Not a closing marker.
|
|
||||||
.*\n+
|
|
||||||
)+
|
|
||||||
)
|
|
||||||
|
|
||||||
# Closing marker.
|
|
||||||
\1 [ ]?(?:\[([^\]]+)\])?[ ]* \n
|
|
||||||
}xm',array(&$this,'_doFencedFigures_callback'),$text);return $text;}function _doFencedFigures_callback($matches){$topcaption=empty($matches[2])?null:$this->runBlockGamut($matches[2]);$bottomcaption=empty($matches[5])?null:$this->runBlockGamut($matches[5]);$figure=$matches[3];$figure=$this->runBlockGamut($figure);$figure=preg_replace('/^/m'," ",$figure);$figure=preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',array(&$this,'_doBlockQuotes_callback2'),$figure);$res="<figure>";if(!empty($topcaption)){$res.="\n<figcaption>$topcaption</figcaption>";}$res.="\n$figure\n";if(!empty($bottomcaption)&&empty($topcaption)){$res.="<figcaption>$bottomcaption</figcaption>";}$res.="</figure>";return "\n".$this->hashBlock($res)."\n\n";}}
|
|
||||||
|
|
||||||
// End of Markdown Class *************************************
|
|
||||||
//////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
$version = '1.0';
|
|
||||||
|
|
||||||
// TM-Docs Functions
|
|
||||||
function get_options() {
|
|
||||||
$options = array(
|
|
||||||
'title' => "Documentation",
|
|
||||||
'homepage' => false,
|
|
||||||
'theme' => 'spacelab',
|
|
||||||
'hightlight' => 'github',
|
|
||||||
'repo' => false,
|
|
||||||
'twitter' => array(),
|
|
||||||
'links' => array()
|
|
||||||
);
|
|
||||||
|
|
||||||
// Load User Config
|
|
||||||
$config_file = './docs/config.json';
|
|
||||||
if (file_exists($config_file)) {
|
|
||||||
$config = json_decode(file_get_contents($config_file), true);
|
|
||||||
$options = array_merge($options, $config);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Homepage Redirect?
|
|
||||||
$path = url_path();
|
|
||||||
if ($path === '/') {
|
|
||||||
// Custom Homepage?
|
|
||||||
if ($options['homepage']) {
|
|
||||||
header('Location: '.$options['homepage']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $options;
|
|
||||||
}
|
|
||||||
|
|
||||||
function load_page($tree) {
|
|
||||||
$branch = find_branch($tree);
|
|
||||||
|
|
||||||
if (isset($branch['type']) && $branch['type'] == 'file') {
|
|
||||||
$html = '<div class="page-header"><h1>'. $branch['title'] . '</h1></div>';
|
|
||||||
$html .= MarkdownExtended(file_get_contents($branch['path']));
|
|
||||||
return $html;
|
|
||||||
} else {
|
|
||||||
return "Oh No. That page dosn't exist";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function find_branch($tree) {
|
|
||||||
$path = url_params();
|
|
||||||
foreach($path as $peice) {
|
|
||||||
if (isset($tree[$peice])) {
|
|
||||||
if ($tree[$peice]['type'] == 'folder') {
|
|
||||||
$tree = $tree[$peice]['tree'];
|
|
||||||
} else {
|
|
||||||
$tree = $tree[$peice];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $tree;
|
|
||||||
}
|
|
||||||
|
|
||||||
function url_path() {
|
|
||||||
$url = parse_url($_SERVER['REQUEST_URI']);
|
|
||||||
$url = $url['path'];
|
|
||||||
return $url;
|
|
||||||
}
|
|
||||||
|
|
||||||
function url_params() {
|
|
||||||
$url = url_path();
|
|
||||||
$params = explode('/', trim($url, '/'));
|
|
||||||
return $params;
|
|
||||||
}
|
|
||||||
|
|
||||||
function clean_sort($text) {
|
|
||||||
// Remove .md file extension
|
|
||||||
$text = str_replace('.md', '', $text);
|
|
||||||
|
|
||||||
// Remove sort placeholder
|
|
||||||
$parts = explode('_', $text);
|
|
||||||
if (isset($parts[0]) && is_numeric($parts[0])) {
|
|
||||||
unset($parts[0]);
|
|
||||||
}
|
|
||||||
$text = implode('_', $parts);
|
|
||||||
|
|
||||||
return $text;
|
|
||||||
}
|
|
||||||
|
|
||||||
function clean_name($text) {
|
|
||||||
$text = str_replace('_', ' ', $text);
|
|
||||||
return $text;
|
|
||||||
}
|
|
||||||
|
|
||||||
function build_nav($tree, $url_params = false) {
|
|
||||||
if (!is_array($url_params)) {
|
|
||||||
$url_params = url_params();
|
|
||||||
}
|
|
||||||
$url_path = url_path();
|
|
||||||
$html = '<ul class="nav nav-list">';
|
|
||||||
foreach($tree as $key => $val) {
|
|
||||||
// Active Tree Node
|
|
||||||
if (isset($url_params[0]) && $url_params[0] == $val['clean']) {
|
|
||||||
array_shift($url_params);
|
|
||||||
|
|
||||||
// Final Node
|
|
||||||
if ($url_path == $val['url']) {
|
|
||||||
$html .= '<li class="active">';
|
|
||||||
} else {
|
|
||||||
$html .= '<li class="open">';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$html .= '<li>';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($val['type'] == 'folder') {
|
|
||||||
$html .= '<a href="#" class="aj-nav folder">'.$val['name'].'</a>';
|
|
||||||
$html .= build_nav($val['tree'], $url_params);
|
|
||||||
} else {
|
|
||||||
$html .= '<a href="'.$val['url'].'">'.$val['name'].'</a>';
|
|
||||||
}
|
|
||||||
|
|
||||||
$html .= '</li>';
|
|
||||||
}
|
|
||||||
$html .= '</ul>';
|
|
||||||
return $html;
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_tree($path = '.', $clean_path = '', $title = ''){
|
|
||||||
$tree = array();
|
|
||||||
$ignore = array('config.json', 'cgi-bin', '.', '..');
|
|
||||||
$dh = @opendir($path);
|
|
||||||
$index = 0;
|
|
||||||
|
|
||||||
// Loop through the directory
|
|
||||||
while(false !== ($file = readdir($dh))){
|
|
||||||
|
|
||||||
// Check that this file is not to be ignored
|
|
||||||
if(!in_array($file, $ignore)) {
|
|
||||||
$full_path = "$path/$file";
|
|
||||||
$clean_sort = clean_sort($file);
|
|
||||||
$url = $clean_path . '/' . $clean_sort;
|
|
||||||
$clean_name = clean_name($clean_sort);
|
|
||||||
|
|
||||||
// Title
|
|
||||||
if (empty($title)) {
|
|
||||||
$full_title = $clean_name;
|
|
||||||
} else {
|
|
||||||
$full_title = $title . ': ' . $clean_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(is_dir("$path/$file")) {
|
|
||||||
// Directory
|
|
||||||
$tree[$clean_sort] = array(
|
|
||||||
'type' => 'folder',
|
|
||||||
'name' => $clean_name,
|
|
||||||
'title' => $full_title,
|
|
||||||
'path' => $full_path,
|
|
||||||
'clean' => $clean_sort,
|
|
||||||
'url' => $url,
|
|
||||||
'tree'=> get_tree($full_path, $url, $full_title)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
// File
|
|
||||||
$tree[$clean_sort] = array(
|
|
||||||
'type' => 'file',
|
|
||||||
'name' => $clean_name,
|
|
||||||
'title' => $full_title,
|
|
||||||
'path' => $full_path,
|
|
||||||
'clean' => $clean_sort,
|
|
||||||
'url' => $url,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$index++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the directory handle
|
|
||||||
closedir($dh);
|
|
||||||
|
|
||||||
return $tree;
|
|
||||||
}
|
|
||||||
|
|
||||||
// App Code
|
|
||||||
$options = get_options();
|
|
||||||
$tree = get_tree("docs");
|
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
@ -818,87 +76,101 @@ $tree = get_tree("docs");
|
|||||||
<title><?=$options['title']; ?></title>
|
<title><?=$options['title']; ?></title>
|
||||||
<!-- Mobile -->
|
<!-- Mobile -->
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<!-- Bootstrap -->
|
|
||||||
<link rel="stylesheet" href="/js/bootstrap.min.js">
|
|
||||||
<!-- Custom -->
|
|
||||||
<link href='http://fonts.googleapis.com/css?family=Roboto+Slab:400,700,300,100' rel='stylesheet' type='text/css'>
|
|
||||||
<link rel="stylesheet" href="/css/daux-blue.css">
|
|
||||||
|
|
||||||
|
<!-- Font -->
|
||||||
|
<link href='http://fonts.googleapis.com/css?family=Roboto+Slab:400,700,300,100' rel='stylesheet' type='text/css'>
|
||||||
|
|
||||||
|
<!-- LESS -->
|
||||||
|
<? if ($options['colors']) { ?>
|
||||||
|
<style type="text/less">
|
||||||
|
<? foreach($options['colors'] as $k => $v) { ?>
|
||||||
|
@<?=$k;?>: <?=$v;?>;
|
||||||
|
<? } ?>
|
||||||
|
@import "/less/import/daux-base.less";
|
||||||
|
</style>
|
||||||
|
<script src="/js/less.min.js"></script>
|
||||||
|
<? } else { ?>
|
||||||
|
<link rel="stylesheet" href="/css/daux-<?=$options['theme'];?>.css">
|
||||||
|
<? } ?>
|
||||||
|
|
||||||
<!-- hightlight.js -->
|
<!-- hightlight.js -->
|
||||||
<script src="http://yandex.st/highlightjs/7.3/highlight.min.js"></script>
|
<script src="/js/highlight.min.js"></script>
|
||||||
<script>hljs.initHighlightingOnLoad();</script>
|
<script>hljs.initHighlightingOnLoad();</script>
|
||||||
|
|
||||||
<!-- Navigation -->
|
<!-- Navigation -->
|
||||||
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
|
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
|
||||||
<script type='text/javascript'>
|
<script src="/js/custom.js"></script>
|
||||||
$(function() {
|
|
||||||
$('.aj-nav').click(function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
$(this).parent().siblings().find('ul').slideUp();
|
|
||||||
$(this).next().slideToggle();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Bootstrap Table Class
|
|
||||||
$('table').addClass('table');
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<? if ($options['repo']) { ?>
|
<? if ($homepage) { ?>
|
||||||
<a href="https://github.com/<?=$options['repo']; ?>" target="_blank" id="github-ribbon"><img src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub"></a>
|
<!-- Hompage -->
|
||||||
<? } ?>
|
<h1><?=$options['title'];?></h1>
|
||||||
<div class="container-fluid wrapper">
|
|
||||||
<div class="navbar navbar-fixed-top">
|
|
||||||
<div class="navbar-inner">
|
|
||||||
<a class="brand pull-left" href="/"><?=$options['title']; ?></a>
|
|
||||||
<p class="navbar-text pull-right">
|
|
||||||
Generated by <a href="https://github.com/justinwalsh/tm-docs">Daux.io</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row-fluid columns content">
|
<? if ($options['tagline']) { ?>
|
||||||
<div class="left-column article-tree span3">
|
<h2><?=$options['tagline'];?></h2>
|
||||||
<!-- For Mobile -->
|
<? } ?>
|
||||||
<div class="responsive-collapse">
|
|
||||||
<button type="button" class="btn btn-sidebar" data-toggle="collapse" data-target="#sub-nav-collapse">
|
<? if ($options['image']) { ?>
|
||||||
<span class="icon-bar"></span>
|
<img width="800" src="<?=$options['image'];?>" alt="<?=$options['title'];?>">
|
||||||
<span class="icon-bar"></span>
|
<? } ?>
|
||||||
<span class="icon-bar"></span>
|
|
||||||
</button>
|
<? echo load_page($tree); ?>
|
||||||
|
|
||||||
|
<? } else { ?>
|
||||||
|
<!-- Docs -->
|
||||||
|
<? if ($options['repo']) { ?>
|
||||||
|
<a href="https://github.com/<?=$options['repo']; ?>" target="_blank" id="github-ribbon"><img src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub"></a>
|
||||||
|
<? } ?>
|
||||||
|
<div class="container-fluid wrapper">
|
||||||
|
<div class="navbar navbar-fixed-top">
|
||||||
|
<div class="navbar-inner">
|
||||||
|
<a class="brand pull-left" href="/"><?=$options['title']; ?></a>
|
||||||
|
<p class="navbar-text pull-right">
|
||||||
|
Generated by <a href="http://daux.io">Daux.io</a>
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div id="sub-nav-collapse" class="collapse in">
|
</div>
|
||||||
<!-- Navigation -->
|
|
||||||
<? echo build_nav($tree); ?>
|
|
||||||
|
|
||||||
<!-- Links -->
|
<div class="row-fluid columns content">
|
||||||
<? if (!empty($options['links'])) { ?>
|
<div class="left-column article-tree span3">
|
||||||
<div class="well well-sidebar">
|
<!-- For Mobile -->
|
||||||
<? foreach($options['links'] as $name => $url) { ?>
|
<div class="responsive-collapse">
|
||||||
<a href="<?=$url;?>" target="_blank"><?=$name;?></a><br>
|
<button type="button" class="btn btn-sidebar" data-toggle="collapse" data-target="#sub-nav-collapse">
|
||||||
<? } ?>
|
<span class="icon-bar"></span>
|
||||||
<!-- Twitter -->
|
<span class="icon-bar"></span>
|
||||||
<? if (!empty($options['twitter'])) { ?>
|
<span class="icon-bar"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div id="sub-nav-collapse" class="collapse in">
|
||||||
|
<!-- Navigation -->
|
||||||
|
<? echo build_nav($tree); ?>
|
||||||
|
|
||||||
|
<? if (!empty($options['links']) || !empty($options['twitter'])) { ?>
|
||||||
|
<div class="well well-sidebar">
|
||||||
|
<!-- Links -->
|
||||||
|
<? foreach($options['links'] as $name => $url) { ?>
|
||||||
|
<a href="<?=$url;?>" target="_blank"><?=$name;?></a><br>
|
||||||
|
<? } ?>
|
||||||
|
<!-- Twitter -->
|
||||||
<? foreach($options['twitter'] as $handle) { ?>
|
<? foreach($options['twitter'] as $handle) { ?>
|
||||||
<div class="twitter">
|
<div class="twitter">
|
||||||
<hr/>
|
<hr/>
|
||||||
<iframe allowtransparency="true" frameborder="0" scrolling="no" style="width:162px; height:20px;" src="https://platform.twitter.com/widgets/follow_button.html?screen_name=<?=$handle;?>&show_count=false"></iframe>
|
<iframe allowtransparency="true" frameborder="0" scrolling="no" style="width:162px; height:20px;" src="https://platform.twitter.com/widgets/follow_button.html?screen_name=<?=$handle;?>&show_count=false"></iframe>
|
||||||
</div>
|
</div>
|
||||||
<? } ?>
|
<? } ?>
|
||||||
<? } ?>
|
</div>
|
||||||
</div>
|
<? } ?>
|
||||||
<? } ?>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="right-column <?=($options['float']?'float-view':''); ?> content-area span9">
|
||||||
<div class="right-column float-view content-area span9">
|
<div class="content-page">
|
||||||
<div class="content-page">
|
<article>
|
||||||
<article>
|
<? echo load_page($tree); ?>
|
||||||
<? echo load_page($tree); ?>
|
</article>
|
||||||
</article>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<? } ?>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
10
js/custom.js
Normal file
10
js/custom.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
$(function() {
|
||||||
|
$('.aj-nav').click(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
$(this).parent().siblings().find('ul').slideUp();
|
||||||
|
$(this).next().slideToggle();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Bootstrap Table Class
|
||||||
|
$('table').addClass('table');
|
||||||
|
});
|
1
js/highlight.min.js
vendored
Normal file
1
js/highlight.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
9
js/less.min.js
vendored
Normal file
9
js/less.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -35,7 +35,7 @@
|
|||||||
filter: ~"alpha(opacity=@{opperc})";
|
filter: ~"alpha(opacity=@{opperc})";
|
||||||
}
|
}
|
||||||
|
|
||||||
@import "import/bootstrap.min.less";
|
@import "bootstrap.min.less";
|
||||||
|
|
||||||
/* ===========================================================================================
|
/* ===========================================================================================
|
||||||
Base CSS
|
Base CSS
|
||||||
|
225
libs/functions.php
Normal file
225
libs/functions.php
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
<?
|
||||||
|
|
||||||
|
/*
|
||||||
|
* WARNING: DO NOT EDIT THIS FILE.
|
||||||
|
* If you edit this file, you will not be able to update to new versions of
|
||||||
|
* Daux.io without overwritting your changes. Instead use the config.json file
|
||||||
|
* in the /docs folder to customize your documentation.
|
||||||
|
*
|
||||||
|
* Learn more about what you can customize here: http://daux.io
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once('libs/markdown_extended.php');
|
||||||
|
|
||||||
|
// Check for homepage
|
||||||
|
$path = url_path();
|
||||||
|
if ($path === '/' || $path === '') {
|
||||||
|
$homepage = true;
|
||||||
|
} else {
|
||||||
|
$homepage = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TM-Docs Functions
|
||||||
|
function get_options() {
|
||||||
|
$options = array(
|
||||||
|
'title' => "Documentation",
|
||||||
|
'tagline' => false,
|
||||||
|
'image' => false,
|
||||||
|
'homepage' => false,
|
||||||
|
'theme' => 'blue',
|
||||||
|
'float' => true,
|
||||||
|
'repo' => false,
|
||||||
|
'twitter' => array(),
|
||||||
|
'links' => array(),
|
||||||
|
'colors' => false
|
||||||
|
);
|
||||||
|
|
||||||
|
// Load User Config
|
||||||
|
$config_file = './docs/config.json';
|
||||||
|
if (file_exists($config_file)) {
|
||||||
|
$config = json_decode(file_get_contents($config_file), true);
|
||||||
|
$options = array_merge($options, $config);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($options['theme'] !== 'custom') {
|
||||||
|
// Load Theme
|
||||||
|
if (!in_array($options['theme'], array("blue","navy","green","red"))) {
|
||||||
|
echo "<strong>Daux.io Config Error:</strong><br>The theme you set is not not a valid option. Please use one of the following options: " . join(array_keys($themes), ', ') . ' or <a href="http://daux.io">learn more</a> about how to customize the colors.';
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (empty($options['colors'])) {
|
||||||
|
echo '<strong>Daux.io Config Error:</strong><br>You are trying to use a custom theme, but did not setup your color options in the config. <a href="http://daux.io">Learn more</a> about how to customize the colors.';
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Homepage Redirect?
|
||||||
|
$path = url_path();
|
||||||
|
if ($path === '/') {
|
||||||
|
// Custom Homepage?
|
||||||
|
if ($options['homepage']) {
|
||||||
|
header('Location: '.$options['homepage']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $options;
|
||||||
|
}
|
||||||
|
|
||||||
|
function load_page($tree) {
|
||||||
|
$branch = find_branch($tree);
|
||||||
|
|
||||||
|
if (isset($branch['type']) && $branch['type'] == 'file') {
|
||||||
|
$html = '';
|
||||||
|
if ($branch['name'] !== 'index') {
|
||||||
|
$html .= '<div class="page-header"><h1>'. $branch['title'] . '</h1></div>';
|
||||||
|
}
|
||||||
|
$html .= MarkdownExtended(file_get_contents($branch['path']));
|
||||||
|
return $html;
|
||||||
|
} else {
|
||||||
|
return "Oh No. That page dosn't exist";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function find_branch($tree) {
|
||||||
|
$path = url_params();
|
||||||
|
foreach($path as $peice) {
|
||||||
|
// Check for homepage
|
||||||
|
if (empty($peice)) {
|
||||||
|
$peice = 'index';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($tree[$peice])) {
|
||||||
|
if ($tree[$peice]['type'] == 'folder') {
|
||||||
|
$tree = $tree[$peice]['tree'];
|
||||||
|
} else {
|
||||||
|
$tree = $tree[$peice];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $tree;
|
||||||
|
}
|
||||||
|
|
||||||
|
function url_path() {
|
||||||
|
$url = parse_url($_SERVER['REQUEST_URI']);
|
||||||
|
$url = $url['path'];
|
||||||
|
return $url;
|
||||||
|
}
|
||||||
|
|
||||||
|
function url_params() {
|
||||||
|
$url = url_path();
|
||||||
|
$params = explode('/', trim($url, '/'));
|
||||||
|
return $params;
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean_sort($text) {
|
||||||
|
// Remove .md file extension
|
||||||
|
$text = str_replace('.md', '', $text);
|
||||||
|
|
||||||
|
// Remove sort placeholder
|
||||||
|
$parts = explode('_', $text);
|
||||||
|
if (isset($parts[0]) && is_numeric($parts[0])) {
|
||||||
|
unset($parts[0]);
|
||||||
|
}
|
||||||
|
$text = implode('_', $parts);
|
||||||
|
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean_name($text) {
|
||||||
|
$text = str_replace('_', ' ', $text);
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_nav($tree, $url_params = false) {
|
||||||
|
if (!is_array($url_params)) {
|
||||||
|
$url_params = url_params();
|
||||||
|
}
|
||||||
|
$url_path = url_path();
|
||||||
|
$html = '<ul class="nav nav-list">';
|
||||||
|
foreach($tree as $key => $val) {
|
||||||
|
// Active Tree Node
|
||||||
|
if (isset($url_params[0]) && $url_params[0] == $val['clean']) {
|
||||||
|
array_shift($url_params);
|
||||||
|
|
||||||
|
// Final Node
|
||||||
|
if ($url_path == $val['url']) {
|
||||||
|
$html .= '<li class="active">';
|
||||||
|
} else {
|
||||||
|
$html .= '<li class="open">';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$html .= '<li>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($val['type'] == 'folder') {
|
||||||
|
$html .= '<a href="#" class="aj-nav folder">'.$val['name'].'</a>';
|
||||||
|
$html .= build_nav($val['tree'], $url_params);
|
||||||
|
} else {
|
||||||
|
$html .= '<a href="'.$val['url'].'">'.$val['name'].'</a>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$html .= '</li>';
|
||||||
|
}
|
||||||
|
$html .= '</ul>';
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_tree($path = '.', $clean_path = '', $title = ''){
|
||||||
|
$tree = array();
|
||||||
|
$ignore = array('config.json', 'cgi-bin', '.', '..');
|
||||||
|
$dh = @opendir($path);
|
||||||
|
$index = 0;
|
||||||
|
|
||||||
|
// Loop through the directory
|
||||||
|
while(false !== ($file = readdir($dh))){
|
||||||
|
|
||||||
|
// Check that this file is not to be ignored
|
||||||
|
if(!in_array($file, $ignore)) {
|
||||||
|
$full_path = "$path/$file";
|
||||||
|
$clean_sort = clean_sort($file);
|
||||||
|
$url = $clean_path . '/' . $clean_sort;
|
||||||
|
$clean_name = clean_name($clean_sort);
|
||||||
|
|
||||||
|
// Title
|
||||||
|
if (empty($title)) {
|
||||||
|
$full_title = $clean_name;
|
||||||
|
} else {
|
||||||
|
$full_title = $title . ': ' . $clean_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is_dir("$path/$file")) {
|
||||||
|
// Directory
|
||||||
|
$tree[$clean_sort] = array(
|
||||||
|
'type' => 'folder',
|
||||||
|
'name' => $clean_name,
|
||||||
|
'title' => $full_title,
|
||||||
|
'path' => $full_path,
|
||||||
|
'clean' => $clean_sort,
|
||||||
|
'url' => $url,
|
||||||
|
'tree'=> get_tree($full_path, $url, $full_title)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// File
|
||||||
|
$tree[$clean_sort] = array(
|
||||||
|
'type' => 'file',
|
||||||
|
'name' => $clean_name,
|
||||||
|
'title' => $full_title,
|
||||||
|
'path' => $full_path,
|
||||||
|
'clean' => $clean_sort,
|
||||||
|
'url' => $url,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close the directory handle
|
||||||
|
closedir($dh);
|
||||||
|
|
||||||
|
return $tree;
|
||||||
|
}
|
||||||
|
?>
|
2932
libs/markdown.php
Executable file
2932
libs/markdown.php
Executable file
File diff suppressed because it is too large
Load Diff
161
libs/markdown_extended.php
Executable file
161
libs/markdown_extended.php
Executable file
@ -0,0 +1,161 @@
|
|||||||
|
<?php
|
||||||
|
require_once('markdown.php');
|
||||||
|
define( 'MARKDOWNEXTRAEXTENDED_VERSION', "0.3" );
|
||||||
|
|
||||||
|
function MarkdownExtended($text, $default_claases = array()){
|
||||||
|
$parser = new MarkdownExtraExtended_Parser($default_claases);
|
||||||
|
return $parser->transform($text);
|
||||||
|
}
|
||||||
|
|
||||||
|
class MarkdownExtraExtended_Parser extends MarkdownExtra_Parser {
|
||||||
|
# Tags that are always treated as block tags:
|
||||||
|
var $block_tags_re = 'figure|figcaption|p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend';
|
||||||
|
var $default_classes;
|
||||||
|
|
||||||
|
function MarkdownExtraExtended_Parser($default_classes = array()) {
|
||||||
|
$default_classes = $default_classes;
|
||||||
|
|
||||||
|
$this->block_gamut += array(
|
||||||
|
"doFencedFigures" => 7,
|
||||||
|
);
|
||||||
|
|
||||||
|
parent::MarkdownExtra_Parser();
|
||||||
|
}
|
||||||
|
|
||||||
|
function transform($text) {
|
||||||
|
$text = parent::transform($text);
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
function doHardBreaks($text) {
|
||||||
|
# Do hard breaks:
|
||||||
|
# EXTENDED: changed to allow breaks without two spaces and just one new line
|
||||||
|
# original code /* return preg_replace_callback('/ {2,}\n/', */
|
||||||
|
return preg_replace_callback('/ *\n/',
|
||||||
|
array(&$this, '_doHardBreaks_callback'), $text);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function doBlockQuotes($text) {
|
||||||
|
$text = preg_replace_callback('/
|
||||||
|
(?>^[ ]*>[ ]?
|
||||||
|
(?:\((.+?)\))?
|
||||||
|
[ ]*(.+\n(?:.+\n)*)
|
||||||
|
)+
|
||||||
|
/xm',
|
||||||
|
array(&$this, '_doBlockQuotes_callback'), $text);
|
||||||
|
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _doBlockQuotes_callback($matches) {
|
||||||
|
$cite = $matches[1];
|
||||||
|
$bq = '> ' . $matches[2];
|
||||||
|
# trim one level of quoting - trim whitespace-only lines
|
||||||
|
$bq = preg_replace('/^[ ]*>[ ]?|^[ ]+$/m', '', $bq);
|
||||||
|
$bq = $this->runBlockGamut($bq); # recurse
|
||||||
|
|
||||||
|
$bq = preg_replace('/^/m', " ", $bq);
|
||||||
|
# These leading spaces cause problem with <pre> content,
|
||||||
|
# so we need to fix that:
|
||||||
|
$bq = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',
|
||||||
|
array(&$this, '_doBlockQuotes_callback2'), $bq);
|
||||||
|
|
||||||
|
$res = "<blockquote";
|
||||||
|
$res .= empty($cite) ? ">" : " cite=\"$cite\">";
|
||||||
|
$res .= "\n$bq\n</blockquote>";
|
||||||
|
return "\n". $this->hashBlock($res)."\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
function doFencedCodeBlocks($text) {
|
||||||
|
$less_than_tab = $this->tab_width;
|
||||||
|
|
||||||
|
$text = preg_replace_callback('{
|
||||||
|
(?:\n|\A)
|
||||||
|
# 1: Opening marker
|
||||||
|
(
|
||||||
|
~{3,}|`{3,} # Marker: three tilde or more.
|
||||||
|
)
|
||||||
|
|
||||||
|
[ ]?(\w+)?(?:,[ ]?(\d+))?[ ]* \n # Whitespace and newline following marker.
|
||||||
|
|
||||||
|
# 3: Content
|
||||||
|
(
|
||||||
|
(?>
|
||||||
|
(?!\1 [ ]* \n) # Not a closing marker.
|
||||||
|
.*\n+
|
||||||
|
)+
|
||||||
|
)
|
||||||
|
|
||||||
|
# Closing marker.
|
||||||
|
\1 [ ]* \n
|
||||||
|
}xm',
|
||||||
|
array(&$this, '_doFencedCodeBlocks_callback'), $text);
|
||||||
|
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _doFencedCodeBlocks_callback($matches) {
|
||||||
|
$codeblock = $matches[4];
|
||||||
|
$codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
|
||||||
|
$codeblock = preg_replace_callback('/^\n+/',
|
||||||
|
array(&$this, '_doFencedCodeBlocks_newlines'), $codeblock);
|
||||||
|
//$codeblock = "<pre><code>$codeblock</code></pre>";
|
||||||
|
//$cb = "<pre><code";
|
||||||
|
$cb = empty($matches[3]) ? "<pre><code" : "<pre class=\"linenums:$matches[3]\"><code";
|
||||||
|
$cb .= empty($matches[2]) ? ">" : " class=\"language-$matches[2]\">";
|
||||||
|
$cb .= "$codeblock</code></pre>";
|
||||||
|
return "\n\n".$this->hashBlock($cb)."\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
function doFencedFigures($text){
|
||||||
|
$text = preg_replace_callback('{
|
||||||
|
(?:\n|\A)
|
||||||
|
# 1: Opening marker
|
||||||
|
(
|
||||||
|
={3,} # Marker: equal sign.
|
||||||
|
)
|
||||||
|
|
||||||
|
[ ]?(?:\[([^\]]+)\])?[ ]* \n # Whitespace and newline following marker.
|
||||||
|
|
||||||
|
# 3: Content
|
||||||
|
(
|
||||||
|
(?>
|
||||||
|
(?!\1 [ ]?(?:\[([^\]]+)\])?[ ]* \n) # Not a closing marker.
|
||||||
|
.*\n+
|
||||||
|
)+
|
||||||
|
)
|
||||||
|
|
||||||
|
# Closing marker.
|
||||||
|
\1 [ ]?(?:\[([^\]]+)\])?[ ]* \n
|
||||||
|
}xm', array(&$this, '_doFencedFigures_callback'), $text);
|
||||||
|
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _doFencedFigures_callback($matches) {
|
||||||
|
# get figcaption
|
||||||
|
$topcaption = empty($matches[2]) ? null : $this->runBlockGamut($matches[2]);
|
||||||
|
$bottomcaption = empty($matches[5]) ? null : $this->runBlockGamut($matches[5]);
|
||||||
|
$figure = $matches[3];
|
||||||
|
$figure = $this->runBlockGamut($figure); # recurse
|
||||||
|
|
||||||
|
$figure = preg_replace('/^/m', " ", $figure);
|
||||||
|
# These leading spaces cause problem with <pre> content,
|
||||||
|
# so we need to fix that - reuse blockqoute code to handle this:
|
||||||
|
$figure = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',
|
||||||
|
array(&$this, '_doBlockQuotes_callback2'), $figure);
|
||||||
|
|
||||||
|
$res = "<figure>";
|
||||||
|
if(!empty($topcaption)){
|
||||||
|
$res .= "\n<figcaption>$topcaption</figcaption>";
|
||||||
|
}
|
||||||
|
$res .= "\n$figure\n";
|
||||||
|
if(!empty($bottomcaption) && empty($topcaption)){
|
||||||
|
$res .= "<figcaption>$bottomcaption</figcaption>";
|
||||||
|
}
|
||||||
|
$res .= "</figure>";
|
||||||
|
return "\n". $this->hashBlock($res)."\n\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
@ -4,9 +4,7 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"grunt": "~0.4.1",
|
"grunt": "~0.4.1",
|
||||||
"grunt-php": "~0.1.1"
|
"grunt-php": "~0.1.1",
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"grunt-contrib-less": "~0.5.2"
|
"grunt-contrib-less": "~0.5.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user