Compare commits

...

224 Commits

Author SHA1 Message Date
Emanuil Rusev 6598f3860c
update readme 2020-08-09 17:12:21 +03:00
Emanuil Rusev 1e5080190c
update readme
we already say "warning" in bold and upper case — the warning emoji feels unnecessary
2020-08-09 17:06:19 +03:00
Emanuil Rusev 1610e4747c
Merge pull request #741 from GrahamCampbell/patch-1
Update .travis.yml
2020-02-18 12:38:52 +02:00
Emanuil Rusev 3159a9d3cd
Merge pull request #751 from jeanmonod/patch-1
Update GitHub flavored markdown url
2020-01-22 09:53:45 +02:00
Jeanmonod David dbee8ab4f2
Update GitHub flavored markdown url 2020-01-21 22:07:12 +01:00
Graham Campbell dba4125b59
Update .travis.yml 2019-12-20 00:05:10 +00:00
Aidan Woods bfaa76d370
Reflect travis breadth in README
Closes https://github.com/erusev/parsedown/issues/692
2019-04-07 16:36:22 +01:00
Aidan Woods 3825db53a2 Merge branch '1.8.x-beta' 2019-04-06 17:58:29 +01:00
Aidan Woods fe7a50eceb
New release due to mislabeled previous tag 2019-03-17 18:47:21 +00:00
Aidan Woods bce642f2d7
7.3 was released 2019-03-17 18:38:54 +00:00
Aidan Woods 7d4c06cb52
Bump version 2019-03-17 17:19:07 +00:00
Aidan Woods f7b66e6b20
Merge pull request #701 from aidantwoods/fix/spaces-in-class-names-1.8.x-beta
[1.8.x-beta] Fix spaces in class names
2019-03-17 17:10:10 +00:00
Aidan Woods 811bc32726
Fix test platforms 2019-03-17 17:04:25 +00:00
Aidan Woods 8fd5464c46
[1.8.x-beta] Fix spaces in class names 2019-03-17 17:01:52 +00:00
Aidan Woods 21c8c792de
Merge pull request #698 from cybernet/patch-1
Symfony Demo link update
2019-03-14 18:49:20 +00:00
cybernet 6ca29539e1
Symfony Demo link update 2019-03-12 20:49:21 +00:00
Emanuil Rusev a503c1a69b composer/composer#7990 2019-03-02 12:08:48 +02:00
Emanuil Rusev 819c68899d
Simplify installation instructions 2018-12-28 13:17:22 +02:00
Emanuil Rusev 4c2d79fc6a
More consistent code blocks in readme 2018-12-28 12:50:30 +02:00
Emanuil Rusev 48a2fb26fe
Add badges to readme 2018-12-28 12:47:13 +02:00
Emanuil Rusev 33b79d2446
More logo padding and no underline 2018-12-28 02:21:55 +02:00
Emanuil Rusev d6d2d96459
Add repo name as h1 2018-12-28 02:19:44 +02:00
Emanuil Rusev d5b6ab5198
Readme logo to be centered 2018-12-28 02:14:25 +02:00
Emanuil Rusev 15e8439c7f
Back to smaller padding in readme logo 2018-12-28 02:04:16 +02:00
Emanuil Rusev ff6148f9b9
Improve readme badges 2018-12-28 01:56:45 +02:00
Emanuil Rusev dfd8657bc5
h1 around logo in readme 2018-12-28 01:28:59 +02:00
Emanuil Rusev ee64646765
More padding for logo in readme 2018-12-28 01:21:51 +02:00
Emanuil Rusev c956090b55
Update readme logo 2018-12-28 01:07:49 +02:00
Emanuil Rusev 0be26550f3
Update readme logo 2018-12-28 00:55:48 +02:00
Emanuil Rusev 8e26a65a6f
More consistent letter case in readme 2018-12-28 00:41:14 +02:00
Emanuil Rusev 2a24a8583b
More consistent formatting in readme 2018-12-28 00:36:04 +02:00
Emanuil Rusev 1d55344e92
Simpler readme header 2018-12-27 23:59:37 +02:00
Emanuil Rusev 5dc8d1cc39
Simpler readme examples 2018-12-27 23:51:07 +02:00
Emanuil Rusev 33cf0f0b99
Centered header in readme 2018-12-27 23:46:53 +02:00
Emanuil Rusev dc1ff7d6c2
Remove horizontal rule from readme 2018-12-27 22:50:39 +02:00
Emanuil Rusev 0f0987571d
Bigger headings in readme 2018-12-27 22:32:54 +02:00
Emanuil Rusev 18eaa649b5
Add logo to readme 2018-12-27 22:23:17 +02:00
Aidan Woods e124572b60
Merge pull request #675 from andreybolonin/patch-1
add php 7.3
2018-11-16 07:45:32 +00:00
Andrey Bolonin 1686a34469
add php 7.3 to allow_failures 2018-11-16 09:34:17 +02:00
Aidan Woods 2bd7113c55
Merge pull request #676 from aidantwoods/fix/uninitialized-string-offset
Fix access to potentially uninitialised offset
2018-11-06 21:49:46 +00:00
Aidan Woods 29fce0ec37
Fix access to potentially uninitialised offset 2018-11-06 21:10:23 +00:00
Andrey Bolonin b0bbc275d4
add php 7.3 2018-10-31 15:48:28 +02:00
Aidan Woods 72f9ca92ae
Merge pull request #671 from aidantwoods/fix/line-ending-standardisation
Ensure line-breaks get standardised when using Parsedown via `line` method
2018-10-16 18:51:05 +01:00
Aidan Woods 89c3fa05d9
Ensure line-breaks get standardised when using via `line` method
As noted in https://github.com/erusev/parsedown/pull/624 there are
occasions where line break standardisation is assumed (e.g. where
`inlineCode` replaces line breaks with a space).

Closes #624
2018-10-16 18:41:42 +01:00
Aidan Woods 69163d6e88
Merge pull request #670 from tillkruss/patch-1
Add "tel:" to whitelist
2018-10-14 21:48:40 +01:00
Till Krüss 3a0c964291
Add "tel:" to whitelist 2018-10-02 16:38:21 -07:00
Aidan Woods 1829106e60
Merge pull request #668 from itshoro/block-heading-min
remove redundant header level cap
2018-09-19 21:28:02 +01:00
horodev 464f5f9329 removed min function as it is redundant in the context 2018-09-19 17:36:40 +02:00
Aidan Woods c26a2ee4bf
Bump beta version 2018-06-11 19:15:32 +01:00
Aidan Woods ba3b60d6e4
Merge pull request #641 from aidantwoods/fix/api-stability-complete-function-removal
Restore existence of protected API methods
2018-06-08 14:38:42 +01:00
Aidan Woods 0b1e6b8c86
Restore existence of protected API methods 2018-06-07 19:47:09 +01:00
Aidan Woods 1f69f7e697
Bump version 2018-05-08 22:46:15 +01:00
Aidan Woods c83af0a7d5
Merge pull request #628 from aidantwoods/fix/revert-rawHtml-breaks-insertion
Preserve plain-text in AST to avoid blinding extensions to it
2018-05-08 22:41:44 +01:00
Aidan Woods 4686daf8c2
Preserve plain-text in AST to avoid blinding extensions to it 2018-05-08 22:32:57 +01:00
Aidan Woods c9e7183cfa
Merge pull request #627 from aidantwoods/fix/hidden-blocks
Intepret special "hidden" key as an empty element
2018-05-08 22:07:51 +01:00
Aidan Woods 9eed1104e7
Intepret special "hidden" key as an empty element 2018-05-08 21:54:30 +01:00
Aidan Woods fd95703da5
Version bump 2018-05-07 14:26:12 +01:00
Aidan Woods 8d172a2994
Merge pull request #614 from aidantwoods/enhancement/performance-tweaks
General and performance tweaks
2018-05-07 11:18:21 +01:00
Aidan Woods dfab7240a4
Merge pull request #621 from paukenba/master
Tilde characters may be escaped
2018-04-24 17:39:09 +01:00
Attila Vachter 113c6d2b21 Tilde characters may be escaped 2018-04-23 15:09:30 +02:00
Aidan Woods a9764ec90f
Remove complex string interpolation expressions 2018-04-14 15:27:06 +01:00
Aidan Woods 0a842fb5b1
Merge pull request #615 from aidantwoods/fix/old-handler-compat
Compatability fixes
2018-04-12 22:29:29 +01:00
Aidan Woods 7f4318dbdb
PHP 5.3 == 💩 2018-04-12 22:22:53 +01:00
Aidan Woods 3e70819a20
Readability improvements, thanks @PhrozenByte 2018-04-12 22:16:25 +01:00
Aidan Woods 2bf7ca41a0
Add compat for extensions using old `markup` key. 2018-04-12 21:25:50 +01:00
Aidan Woods b75fd409ff
Must unset text key so that our destination is preferred as content 2018-04-12 21:10:09 +01:00
Aidan Woods 88a3f31dd7
Rewrite as one statement 2018-04-12 19:33:01 +01:00
Aidan Woods 726d4ef44a
Sanity checks before starting regex engine 2018-04-09 18:09:45 +01:00
Aidan Woods 450a74fedf
More expensive statement last 2018-04-09 18:09:45 +01:00
Aidan Woods 7e15d99d90
Remove regex from block rule 2018-04-09 18:09:44 +01:00
Aidan Woods d2dd736e1b
Remove regex from fenced code block
Also remove unused function
2018-04-09 18:09:44 +01:00
Aidan Woods e74a5bd7ed
In theory PHP stores the length of strings, so looking this up should be quick 2018-04-09 18:09:44 +01:00
Aidan Woods b53aa74a72
Use standard library function 2018-04-09 18:09:44 +01:00
Aidan Woods 3ea08140b6
Remove use of array 2018-04-09 18:09:44 +01:00
Aidan Woods c45e41950f
Use standard library over while loop 2018-04-09 18:09:44 +01:00
Aidan Woods 2faba6fef5
Remove unneeded complete function 2018-04-09 18:09:44 +01:00
Aidan Woods b42add3762
Make some regexes possesive 2018-04-09 18:09:43 +01:00
Aidan Woods 107223d3a0
Avoid recomputation 2018-04-09 18:09:43 +01:00
Aidan Woods d4f1ac465c
String interpolation is slightly faster than concat 2018-04-09 18:09:43 +01:00
Aidan Woods d6e306d620
Optimise commonly used regexes to fail fast 2018-04-09 18:09:04 +01:00
Aidan Woods dc5cf8770b
The AST has high complexity here (and so traversal is hard anyway)
We gain quite a bit of a speed boost by working with text here
since this is a very common function
2018-04-09 18:09:04 +01:00
Aidan Woods 70f5c02d47
Use non-nestable values as keys for O(1) lookup 2018-04-09 18:09:04 +01:00
Aidan Woods 90ad738933
General readability 2018-04-09 18:09:04 +01:00
Aidan Woods f2327023c1
No need to unset if not set 2018-04-09 18:09:04 +01:00
Aidan Woods 6f13f97674
Use mutating loop instead of array_map 2018-04-09 18:08:58 +01:00
Aidan Woods 8091e5586a
Merge pull request #612 from aidantwoods/fix/table-columns
Table header should not be allowed to contain new lines
2018-04-09 16:53:07 +01:00
Aidan Woods cb33daf0e6
Assert table header does not contain new lines 2018-04-09 16:38:03 +01:00
Aidan Woods c440c91af5
Add failing test case 2018-04-09 16:32:36 +01:00
Aidan Woods 3514881e14
Merge pull request #611 from aidantwoods/enhancement/paragraph-block-semantics
Paragraph block semantics
2018-04-09 16:30:33 +01:00
Aidan Woods 043c55e4c6
Give paragraph block semantics for overloading 2018-04-09 15:12:17 +01:00
Aidan Woods e4cd13350b
Remove setLiteralBreaks 2018-04-09 15:11:45 +01:00
Aidan Woods ae8067e862
Swap undefined type for type === 'Paragraph' for ease of reading
The way in which we use this assumes that it is a paragraph, for example
appending text into the handler argument — so there is no loss of
generality here, we're simply being explicit.
2018-04-09 14:48:48 +01:00
Aidan Woods 5353ebb524
Avoid needing two arrays
We only need to collect elements, we can discard finished blocks
2018-04-09 14:48:39 +01:00
Aidan Woods 39df7d4f8e
Swap 'hidden' blocks for empty elements 2018-04-09 14:46:24 +01:00
Aidan Woods 50f15add44
Merge pull request #610 from aidantwoods/fix/lost-line-breaks
Fix lost line breaks
2018-04-09 14:19:38 +01:00
Aidan Woods 3f5b0ee781
Count number of interrupts 2018-04-09 14:13:10 +01:00
Aidan Woods 9a021b2130
Add failing test cases 2018-04-09 14:11:49 +01:00
Aidan Woods 43d25a74fe
Fix function name 2018-04-08 18:40:50 +01:00
Aidan Woods 1d68e5506c
Merge pull request #608 from aidantwoods/fix/recursion
Add seperate depth-first function instead of replacing recursive method
2018-04-08 18:02:17 +01:00
Aidan Woods 86940be224
Use mutating loop instead of creating new array 2018-04-08 17:49:36 +01:00
Aidan Woods cdaf86b039
Add seperate depth-first function instead of replacing recursive method 2018-04-08 17:39:24 +01:00
Aidan Woods 1d65fb858a
Restore file permission to that of 1.7.1 2018-04-08 14:30:23 +01:00
Aidan Woods 600db7e4de
Bump version const to 1.8.0-beta-1 2018-04-08 02:46:30 +01:00
Aidan Woods 1be2a01de8
Merge pull request #607 from aidantwoods/update/readme-install-instructions
Update readme install instructions
2018-04-07 16:59:49 +01:00
Aidan Woods f50ba3d803
Merge pull request #606 from erusev/revert-605-fix/this-php5.3-compat
Replace fix in "Explicitly capture $this for PHP 5.3"
2018-04-06 21:00:52 +01:00
Aidan Woods 387ef63888
Replace array reduce with foreach loop for PHP 5.3 compat 2018-04-06 20:55:27 +01:00
Aidan Woods 68be90348c
Revert "Explicitly capture $this for PHP 5.3" 2018-04-06 20:50:34 +01:00
Aidan Woods 48b9f71bdc
Merge pull request #605 from aidantwoods/fix/this-php5.3-compat
Explicitly capture $this for PHP 5.3
2018-04-06 20:44:32 +01:00
Aidan Woods 0039cd00f8
Explicitly capture $this for PHP 5.3 2018-04-06 20:40:25 +01:00
Aidan Woods c6b717cc35
Merge pull request #604 from aidantwoods/fix/autobreak
Ensure autobreak false is honoured over empty name
2018-04-06 20:00:32 +01:00
Aidan Woods 8f3f61883d
Merge pull request #603 from aidantwoods/fix/recursion
Apply depth first
2018-04-06 19:57:55 +01:00
Aidan Woods 4c9ea94d0c
Apply depth first to avoid risk of segfault if closure creates subelements 2018-04-06 19:52:25 +01:00
Aidan Woods 32e69de014
Ensure autobreak false is honoured over empty name 2018-04-06 19:51:27 +01:00
Aidan Woods 201299ddc2
Merge pull request #602 from aidantwoods/enhancement/text-elements
Split some of `text` into `textElements`
2018-04-06 19:50:24 +01:00
Aidan Woods 557db7c179
Split some of `text` into `textElements`
`process` is no longer needed
2018-04-06 18:11:27 +01:00
Aidan Woods 0c0ed38290
Don't encourage downloading from master 2018-04-06 16:13:29 +01:00
Carsten Brandt 798bda682e Update README.md
updated installation instructions. fixes #242
2018-04-06 16:09:36 +01:00
Aidan Woods 9b7b7348b4
Merge pull request #598 from aidantwoods/enhancement/set-literal-breaks
Add literalBreaks support
2018-04-06 15:06:45 +01:00
Aidan Woods 96581dbe16
Merge pull request #600 from aidantwoods/fix/code-block-closer
Fix fenced code block closer length rules
2018-04-05 18:46:49 +01:00
Aidan Woods 06b810cd4a
Fix fenced code block closer to match CommonMark rules 2018-04-05 16:55:14 +01:00
Aidan Woods 38ea813b0e
Add failing test case 2018-04-05 16:54:35 +01:00
Aidan Woods 24e48e91c8
Add literalBreaks support
Line breaks will be converted to <br />
2018-04-05 01:01:52 +01:00
Aidan Woods e33f1a48c8
Merge pull request #596 from aidantwoods/enhancement/test-on-php72
Test on PHP 7.2
2018-04-02 19:56:02 +01:00
Aidan Woods 1c8f6bc253
Merge pull request #594 from aidantwoods/enhancement/ast-recursion-helper
Add recursive helper for AST
2018-04-02 19:53:58 +01:00
Aidan Woods ed3e967fb6
Update README 2018-04-02 19:52:26 +01:00
Aidan Woods 3b3d13489b
Test on PHP 7.2 2018-04-02 19:51:07 +01:00
Aidan Woods 498c88c4eb
Merge pull request #589 from NathanBaulch/hashtag
Support #hashtag per CommonMark and GFM specs
2018-04-02 17:25:28 +01:00
Aidan Woods 772c919b05
Fix bug where empty atx headings would not be recognised (CommonMark)
Fixes #595
2018-04-02 17:18:01 +01:00
Aidan Woods cf6d23de55
Rename hashtags enabled to strict mode
We can use this to seperate any intentional spec deviations from
spec behaviour so users can pick between compatability and spec
implementations
2018-04-02 17:18:01 +01:00
Nathan Baulch d0279cdd3b
Enable #hashtag support via setting 2018-04-02 17:18:01 +01:00
Nathan Baulch 8a90586218
Support #hashtag per CommonMark and GFM specs 2018-04-02 17:18:00 +01:00
Aidan Woods 390fa0da1b
This is probably faster than duplicating the closure 2018-04-01 17:55:32 +01:00
Aidan Woods 9026b1abdb
Add recursive helper for AST, use this for implementation of calling handler
recursively
2018-04-01 17:10:49 +01:00
Aidan Woods 68736f8800
Merge pull request #593 from aidantwoods/enhancement/process
Decouple manipulating final AST from `text` method
2018-04-01 16:37:44 +01:00
Aidan Woods 535110c57e
Add `process` method so extensions may process final AST without
copying implementation of `text`
2018-03-31 23:23:12 +01:00
Aidan Woods ce073c9baa
Merge pull request #576 from aidantwoods/enhancement/moar-ast
Produce AST prior to render
2018-03-31 23:11:45 +01:00
Aidan Woods e4d6c8f911 Add support for recursive handlers 2018-03-31 22:01:38 +01:00
Aidan Woods cbe2e74d52
Merge pull request #592 from aidantwoods/fix/html-comment
Fix HTML comment endings
2018-03-30 19:28:40 +01:00
Aidan Woods aa90dd481a
Match CommonMark spec on HTML comments:
Start condition: line begins with the string `<!--`.
End condition: line contains the string `-->`.
2018-03-30 19:22:50 +01:00
Aidan Woods 20e592359f
Add failing test case 2018-03-30 19:22:13 +01:00
Aidan Woods 9f1f5de387
Add recursive handle methods to generate entire AST for traversal 2018-03-28 20:59:56 +01:00
Aidan Woods 40b9da7837
Merge pull request #587 from aidantwoods/fix/ol-interrupt
Fix ordered list interrupt
2018-03-28 15:43:44 +01:00
Aidan Woods a9c21447ce
Only interrupt paragraph if starting with 1 2018-03-28 15:38:11 +01:00
Aidan Woods a3e02c1d0e
Add failing test case 2018-03-28 15:37:47 +01:00
Aidan Woods 40e797031e
Old handler compatability layer 2018-03-28 03:42:38 +01:00
Aidan Woods 448b72a149
Merge pull request #586 from aidantwoods/fix/blockquote-adjacent
Fix merging of adjacent blockquotes
2018-03-28 03:31:36 +01:00
Aidan Woods 92e426e0e8
Fix merging of adjacent blockquotes 2018-03-28 03:27:09 +01:00
Aidan Woods 07216480db
Change test to comply with CommonMark 2018-03-28 03:26:45 +01:00
Aidan Woods caea783006
Add failing test case 2018-03-28 03:24:01 +01:00
Aidan Woods d849d64611
Merge pull request #584 from aidantwoods/fix/tables
Permit 1 column tables with less delimiters
2018-03-27 23:18:41 +01:00
Aidan Woods 00e51ee424
Permit 1 column tables with less delimiters 2018-03-27 23:12:51 +01:00
Aidan Woods 0550c3eaf9
Merge pull request #583 from aidantwoods/fix/atx-headings
Fix trimming of internal #'s in ATX headers
2018-03-27 22:10:39 +01:00
Aidan Woods 790aed42ab
Fix trimming of internal #'s 2018-03-27 22:04:11 +01:00
Aidan Woods 1c52cb6b5e
Add failing test cases 2018-03-27 22:01:32 +01:00
Aidan Woods ae13290221
Merge pull request #574 from aidantwoods/fix/remove-legacy-escaping
Remove legacy escaping
2018-03-27 13:18:30 +01:00
Aidan Woods e16162e288
Merge pull request #582 from aidantwoods/fix/formatting
Formatting adjustments
2018-03-27 12:12:01 +01:00
Aidan Woods 244ea0aaa6
Remove some whitespace 2018-03-27 12:11:00 +01:00
Aidan Woods 2f291e0b2f
Merge pull request #439 from aidantwoods/patch-4
Improve CommonMark mixed-marker list compliance
2018-03-27 11:31:34 +01:00
Aidan Woods d2a73f9179
Trim whitespace 2018-03-27 11:23:04 +01:00
Aidan Woods f594d4c18b
Add more tests for CommonMark compliance 2018-03-27 11:20:04 +01:00
Aidan Woods 21cdd8a0b3
Merge branch 'master' into patch-4 2018-03-27 11:13:06 +01:00
Aidan Woods a52d386250
Merge pull request #579 from aidantwoods/enhancement/gitignore
Add .gitignore for repo specific paths
2018-03-26 19:06:10 +01:00
Aidan Woods dd9f4036ee
Add .gitignore to export ignore in .gitattribtutes 2018-03-26 18:47:33 +01:00
Aidan Woods e7fbbf537b
Add repo specific paths to .gitignore 2018-03-26 18:45:34 +01:00
Aidan Woods cac63f6fcb
Merge pull request #578 from aidantwoods/fix/setext-heading-spaces
Fix setext heading space handling
2018-03-25 23:08:31 +01:00
Aidan Woods f71bec00f4
Fix space handling in setext headings 2018-03-25 22:50:42 +01:00
Aidan Woods 913e04782f
Add failing test cases to be fixed 2018-03-25 22:50:16 +01:00
Aidan Woods 1fa6b038af
PHP 5.3 compat 2018-03-25 20:00:31 +01:00
Aidan Woods e59fbd736d
Remove 'markup' key exception for outputting via AST 2018-03-25 20:00:31 +01:00
Aidan Woods 8c14c5c239
Use rawHtml to provide conditional escaping for markup 2018-03-25 20:00:30 +01:00
Aidan Woods 0205a4cbe6
Use rawHtml to provide conditional escaping on special chars 2018-03-25 19:59:11 +01:00
Aidan Woods 011465bca6
Use rawHtml to provide conditional escaping for specialChars 2018-03-25 19:59:11 +01:00
Aidan Woods adcba80502
Implement unmarked text via AST 2018-03-25 19:59:11 +01:00
Aidan Woods 65d7bc5013
Special casing for elements with no name 2018-03-25 19:59:11 +01:00
Aidan Woods 1a47e74be1
Quotes are permitted in escaped body 2018-03-25 19:59:05 +01:00
Aidan Woods 56cc41803a
Merge pull request #514 from Daniel-KM/fix/consistency_follow
Added tests for consistency when a markdown follows a markup without blank line
2018-03-25 19:53:21 +01:00
Aidan Woods d86d839677
Merge branch 'master' into fix/consistency_follow 2018-03-25 19:37:04 +01:00
Aidan Woods d5ded2b935
Decouple handler argument from structure keys 2018-03-21 16:02:57 +00:00
Aidan Woods 098f24d189
Seperate handler delegation from AST
This also splits 'text' into 'text', 'elements', and
'element' to hopefully better communicate structure
2018-03-21 02:32:01 +00:00
Aidan Woods eb55e426b9
Initial refactor to use AST 2018-03-21 02:18:34 +00:00
Aidan Woods ced6187ca5
Merge pull request #575 from cebe/patch-3
Added inline example to README
2018-03-20 16:33:53 +00:00
Carsten Brandt 972648ff64
Added inline example to README
see https://github.com/erusev/parsedown/issues/562
2018-03-20 16:56:40 +01:00
Aidan Woods 77dc0a090a
Merge pull request #569 from aidantwoods/feature/unsafe-html
Add unsafeHtml option for extensions to use on trusted input
2018-03-18 21:58:48 +00:00
Aidan Woods 88dc949890
Refactor based on suggestion by @PhrozenByte 2018-03-18 20:17:12 +00:00
Aidan Woods 624a08b7eb
Update commment 2018-03-15 19:55:33 +00:00
Aidan Woods 3fc54bc966
Allow extension to "vouch" for raw HTML they produce
Rename "unsafeHtml" to "rawHtml"
2018-03-15 19:46:03 +00:00
Aidan Woods ef7ed7b66c
Still grab the text if safe mode enabled, but output it escaped 2018-03-15 11:09:55 +00:00
Aidan Woods e4c5be026d
Further attempt to dissuade this feature's use 2018-03-15 11:00:03 +00:00
Aidan Woods e6444bb57e
Add unsafeHtml option for extensions to use on trusted input 2018-03-15 10:48:38 +00:00
Aidan Woods a3265e7c6f
Merge pull request #511 from aidantwoods/feature/null-name-element
Allow element to have no name
2018-03-15 09:41:16 +00:00
Aidan Woods aac00ac742
Merge pull request #566 from aidantwoods/fix/email-autolink
Email autolink shouldn't be started by HTML tags
2018-03-10 00:06:59 +00:00
Aidan Woods 6830c3339f
Readability
Thanks @PhrozenByte for the suggestion :)
2018-03-09 17:38:41 +00:00
Aidan Woods 19f1bb9353
Disable backtracking where the regex doesn't need it 2018-03-09 17:06:14 +00:00
Aidan Woods 721b885dd3
Fix #565 by validating email as defined in commonmark spec 2018-03-09 17:05:42 +00:00
Aidan Woods f70d96479a
Add test case for email surrounded by tags 2018-03-09 16:48:32 +00:00
Aidan Woods 72d30d33bc
allow element to have no name 2018-03-01 01:17:32 +00:00
Daniel Berthereau c05ef0c12a Merge branch 'aidantwoods-htmlblocks' into fix/consistency_follow 2017-06-23 00:00:00 +02:00
Daniel Berthereau 47e4163a68 Merge branch 'htmlblocks' of https://github.com/aidantwoods/parsedown into aidantwoods-htmlblocks 2017-06-23 00:00:00 +02:00
Aidan Woods c05bff047a
correct test to match CommonMark specified input for output 2017-06-22 00:03:12 +01:00
Aidan Woods 6a4afac0d0
remove ability for htmlblock to allow paragraph after if it closes on the same line 2017-06-22 00:02:03 +01:00
Daniel Berthereau 129f807e32 Inverted checks of consistency for markdown following markups. 2017-06-22 00:00:00 +02:00
Daniel Berthereau be963a6531 Added tests for consistency when a markdown follows a markup without blank line. 2017-06-19 00:00:00 +02:00
Aidan Woods 1d0af35f10
update test to result generated by CommonMark reference parser 2017-03-29 18:26:07 +01:00
Aidan Woods d7956e3ade
blockmarkup ends on interrupt by newline (CommonMark compliance) 2017-03-29 18:25:56 +01:00
Aidan Woods 67e454e300 Merge pull request #2 from PhrozenByte/aidantwoods/patch-4
Use the list marker width to determine whether a list item is continued
2016-10-14 08:29:11 +01:00
Daniel Rudolf a3836b1853
Handle subsequent list items which aren't indented sufficiently
Subsequent list items which aren't indented sufficiently are treated as part of the original list, see CommonMark spec example [#256](http://spec.commonmark.org/0.26/#example-256).
2016-10-13 20:44:02 +02:00
Daniel Rudolf a9e1163c85
Fix code formatting 2016-10-13 19:52:38 +02:00
Daniel Rudolf 7b1529fff0
Use the list marker width to determine whether a list item is continued
This basically represents [list item parsing](http://spec.commonmark.org/0.26/#list-items), rule 1 of the CommonMark specs.
2016-10-13 19:51:32 +02:00
Daniel Rudolf 1d61f90bf9
Support list items starting with indented code 2016-10-13 19:47:06 +02:00
Daniel Rudolf 4b3b7df710
Support list items starting with a blank line
According to the CommonMark specs ([list items](http://spec.commonmark.org/0.26/#list-items), rule 3), list items starting with a blank line basically behave like as if the \n doesn't exist. Also see example [#241](http://spec.commonmark.org/0.26/#example-241).
2016-10-13 19:46:29 +02:00
Daniel Rudolf 30ff5c6e75
Remove unused $placeholder variable 2016-10-13 19:31:35 +02:00
Daniel Rudolf bdf537e9d5
Fix ordered list start argument
See CommonMark spec examples [#226](http://spec.commonmark.org/0.26/#example-226) to #229
2016-10-13 19:30:50 +02:00
Daniel Rudolf 81025cd468
Revert "Break less previously passed CommonMarkWeak tests"
This reverts commit 2db3199510.
2016-10-13 19:25:43 +02:00
Daniel Rudolf e691034861
Revert "Prevent failure with data set 77 in CommonMarkWeak"
This reverts commit 0a43799da4.
2016-10-13 19:25:37 +02:00
Daniel Rudolf eb853da92a
Revert "Prevent breaking remaining previously compliant CommonMarkWeak tests"
This reverts commit 6973302ca8.
2016-10-13 19:25:30 +02:00
Aidan Woods 6973302ca8 Prevent breaking remaining previously compliant CommonMarkWeak tests 2016-10-13 15:55:13 +01:00
Aidan Woods 0a43799da4 Prevent failure with data set 77 in CommonMarkWeak 2016-10-13 14:29:52 +01:00
Aidan Woods 2db3199510 Break less previously passed CommonMarkWeak tests 2016-10-12 18:10:44 +01:00
Aidan Woods 8965c7864f More appropriate tests for these changes 2016-10-11 20:55:59 +01:00
Aidan Woods d26b33c20f Add `)` as an ordered list marker
Also added marker check to ordered list case when deciding to continue the current list
2016-10-11 19:18:43 +01:00
Aidan Woods d9679141fa Update test to comply with CommonMark 2016-10-11 13:50:47 +01:00
Aidan Woods 0bd61a73ed Check that the current line is a list before starting a new one 2016-10-11 13:48:38 +01:00
Aidan Woods 06c4344a71 Contextual limits on indentation stripping 2016-10-11 13:38:47 +01:00
Aidan Woods c4d4a6800d (beginning to) improve commonmark compliance:lists
These changes aren't fit for merge, nor do they work correctly (yet)
2016-10-11 12:05:33 +01:00
48 changed files with 1289 additions and 527 deletions

1
.gitattributes vendored
View File

@ -1,5 +1,6 @@
# Ignore all tests for archive
/test export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/.travis.yml export-ignore
/phpunit.xml.dist export-ignore

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
composer.lock
vendor/

View File

@ -1,24 +1,25 @@
language: php
dist: trusty
sudo: false
matrix:
include:
- php: 5.3
dist: precise
- php: 5.4
dist: trusty
- php: 5.5
dist: trusty
- php: 5.6
dist: xenial
- php: 7.0
dist: xenial
- php: 7.1
- php: nightly
- php: hhvm
- php: hhvm-nightly
fast_finish: true
allow_failures:
- php: nightly
- php: hhvm-nightly
dist: bionic
- php: 7.2
dist: bionic
- php: 7.3
dist: bionic
- php: 7.4
dist: bionic
install:
- composer install --prefer-dist --no-interaction --no-progress

File diff suppressed because it is too large Load Diff

View File

@ -1,49 +1,61 @@
> I also make [Caret](https://caret.io?ref=parsedown) - a Markdown editor for Mac and PC.
<!-- ![Parsedown](https://i.imgur.com/yE8afYV.png) -->
## Parsedown
<p align="center"><img alt="Parsedown" src="https://i.imgur.com/fKVY6Kz.png" width="240" /></p>
[![Build Status](https://img.shields.io/travis/erusev/parsedown/master.svg?style=flat-square)](https://travis-ci.org/erusev/parsedown)
<!--[![Total Downloads](http://img.shields.io/packagist/dt/erusev/parsedown.svg?style=flat-square)](https://packagist.org/packages/erusev/parsedown)-->
<h1>Parsedown</h1>
Better Markdown Parser in PHP
[![Build Status](https://travis-ci.org/erusev/parsedown.svg)](https://travis-ci.org/erusev/parsedown)
[![Total Downloads](https://poser.pugx.org/erusev/parsedown/d/total.svg)](https://packagist.org/packages/erusev/parsedown)
[![Version](https://poser.pugx.org/erusev/parsedown/v/stable.svg)](https://packagist.org/packages/erusev/parsedown)
[![License](https://poser.pugx.org/erusev/parsedown/license.svg)](https://packagist.org/packages/erusev/parsedown)
[Demo](http://parsedown.org/demo) |
[Benchmarks](http://parsedown.org/speed) |
[Tests](http://parsedown.org/tests/) |
[Documentation](https://github.com/erusev/parsedown/wiki/)
Better Markdown Parser in PHP - <a href="http://parsedown.org/demo">Demo</a>.
### Features
## Features
* One File
* No Dependencies
* Super Fast
* [Super Fast](http://parsedown.org/speed)
* Extensible
* [GitHub flavored](https://help.github.com/articles/github-flavored-markdown)
* Tested in 5.3 to 7.1 and in HHVM
* [GitHub flavored](https://github.github.com/gfm)
* [Tested](http://parsedown.org/tests/) in 5.3 to 7.3
* [Markdown Extra extension](https://github.com/erusev/parsedown-extra)
### Installation
## Installation
Include `Parsedown.php` or install [the composer package](https://packagist.org/packages/erusev/parsedown).
Install the [composer package]:
### Example
composer require erusev/parsedown
``` php
Or download the [latest release] and include `Parsedown.php`
[composer package]: https://packagist.org/packages/erusev/parsedown "The Parsedown package on packagist.org"
[latest release]: https://github.com/erusev/parsedown/releases/latest "The latest release of Parsedown"
## Example
```php
$Parsedown = new Parsedown();
echo $Parsedown->text('Hello _Parsedown_!'); # prints: <p>Hello <em>Parsedown</em>!</p>
```
You can also parse inline markdown only:
```php
echo $Parsedown->line('Hello _Parsedown_!'); # prints: Hello <em>Parsedown</em>!
```
More examples in [the wiki](https://github.com/erusev/parsedown/wiki/) and in [this video tutorial](http://youtu.be/wYZBY8DEikI).
### Security
## Security
Parsedown is capable of escaping user-input within the HTML that it generates. Additionally Parsedown will apply sanitisation to additional scripting vectors (such as scripting link destinations) that are introduced by the markdown syntax itself.
To tell Parsedown that it is processing untrusted user-input, use the following:
```php
$parsedown = new Parsedown;
$parsedown->setSafeMode(true);
$Parsedown->setSafeMode(true);
```
If instead, you wish to allow HTML within untrusted user-input, but still want output to be free from XSS it is recommended that you make use of a HTML sanitiser that allows HTML tags to be whitelisted, like [HTML Purifier](http://htmlpurifier.org/).
@ -54,18 +66,19 @@ In both cases you should strongly consider employing defence-in-depth measures,
Safe mode does not necessarily yield safe results when using extensions to Parsedown. Extensions should be evaluated on their own to determine their specific safety against XSS.
### Escaping HTML
> ⚠️  **WARNING:** This method isn't safe from XSS!
## Escaping HTML
> **WARNING:** This method isn't safe from XSS!
If you wish to escape HTML **in trusted input**, you can use the following:
```php
$parsedown = new Parsedown;
$parsedown->setMarkupEscaped(true);
$Parsedown->setMarkupEscaped(true);
```
Beware that this still allows users to insert unsafe scripting vectors, such as links like `[xss](javascript:alert%281%29)`.
### Questions
## Questions
**How does Parsedown work?**
@ -79,8 +92,12 @@ It passes most of the CommonMark tests. Most of the tests that don't pass deal w
**Who uses it?**
[Laravel Framework](https://laravel.com/), [Bolt CMS](http://bolt.cm/), [Grav CMS](http://getgrav.org/), [Herbie CMS](http://www.getherbie.org/), [Kirby CMS](http://getkirby.com/), [October CMS](http://octobercms.com/), [Pico CMS](http://picocms.org), [Statamic CMS](http://www.statamic.com/), [phpDocumentor](http://www.phpdoc.org/), [RaspberryPi.org](http://www.raspberrypi.org/), [Symfony demo](https://github.com/symfony/symfony-demo) and [more](https://packagist.org/packages/erusev/parsedown/dependents).
[Laravel Framework](https://laravel.com/), [Bolt CMS](http://bolt.cm/), [Grav CMS](http://getgrav.org/), [Herbie CMS](http://www.getherbie.org/), [Kirby CMS](http://getkirby.com/), [October CMS](http://octobercms.com/), [Pico CMS](http://picocms.org), [Statamic CMS](http://www.statamic.com/), [phpDocumentor](http://www.phpdoc.org/), [RaspberryPi.org](http://www.raspberrypi.org/), [Symfony Demo](https://github.com/symfony/demo) and [more](https://packagist.org/packages/erusev/parsedown/dependents).
**How can I help?**
Use it, star it, share it and if you feel generous, [donate](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=528P3NZQMP8N2).
**What else should I know?**
I also make [Nota](https://nota.md/) — a writing app designed for Markdown files :)

43
test/ParsedownTest.php Normal file → Executable file
View File

@ -1,4 +1,5 @@
<?php
require 'SampleExtensions.php';
use PHPUnit\Framework\TestCase;
@ -12,7 +13,8 @@ class ParsedownTest extends TestCase
parent::__construct($name, $data, $dataName);
}
private $dirs, $Parsedown;
private $dirs;
protected $Parsedown;
/**
* @return array
@ -49,12 +51,47 @@ class ParsedownTest extends TestCase
$expectedMarkup = str_replace("\r", "\n", $expectedMarkup);
$this->Parsedown->setSafeMode(substr($test, 0, 3) === 'xss');
$this->Parsedown->setStrictMode(substr($test, 0, 6) === 'strict');
$actualMarkup = $this->Parsedown->text($markdown);
$this->assertEquals($expectedMarkup, $actualMarkup);
}
function testRawHtml()
{
$markdown = "```php\nfoobar\n```";
$expectedMarkup = '<pre><code class="language-php"><p>foobar</p></code></pre>';
$expectedSafeMarkup = '<pre><code class="language-php">&lt;p&gt;foobar&lt;/p&gt;</code></pre>';
$unsafeExtension = new UnsafeExtension;
$actualMarkup = $unsafeExtension->text($markdown);
$this->assertEquals($expectedMarkup, $actualMarkup);
$unsafeExtension->setSafeMode(true);
$actualSafeMarkup = $unsafeExtension->text($markdown);
$this->assertEquals($expectedSafeMarkup, $actualSafeMarkup);
}
function testTrustDelegatedRawHtml()
{
$markdown = "```php\nfoobar\n```";
$expectedMarkup = '<pre><code class="language-php"><p>foobar</p></code></pre>';
$expectedSafeMarkup = $expectedMarkup;
$unsafeExtension = new TrustDelegatedExtension;
$actualMarkup = $unsafeExtension->text($markdown);
$this->assertEquals($expectedMarkup, $actualMarkup);
$unsafeExtension->setSafeMode(true);
$actualSafeMarkup = $unsafeExtension->text($markdown);
$this->assertEquals($expectedSafeMarkup, $actualSafeMarkup);
}
function data()
{
$data = array();
@ -123,12 +160,12 @@ MARKDOWN_WITH_MARKUP;
<p>&lt;div&gt;<em>content</em>&lt;/div&gt;</p>
<p>sparse:</p>
<p>&lt;div&gt;
&lt;div class=&quot;inner&quot;&gt;
&lt;div class="inner"&gt;
<em>content</em>
&lt;/div&gt;
&lt;/div&gt;</p>
<p>paragraph</p>
<p>&lt;style type=&quot;text/css&quot;&gt;
<p>&lt;style type="text/css"&gt;
p {
color: red;
}

40
test/SampleExtensions.php Normal file
View File

@ -0,0 +1,40 @@
<?php
class UnsafeExtension extends Parsedown
{
protected function blockFencedCodeComplete($Block)
{
$text = $Block['element']['element']['text'];
unset($Block['element']['element']['text']);
// WARNING: There is almost always a better way of doing things!
//
// This example is one of them, unsafe behaviour is NOT needed here.
// Only use this if you trust the input and have no idea what
// the output HTML will look like (e.g. using an external parser).
$Block['element']['element']['rawHtml'] = "<p>$text</p>";
return $Block;
}
}
class TrustDelegatedExtension extends Parsedown
{
protected function blockFencedCodeComplete($Block)
{
$text = $Block['element']['element']['text'];
unset($Block['element']['element']['text']);
// WARNING: There is almost always a better way of doing things!
//
// This behaviour is NOT needed in the demonstrated case.
// Only use this if you are sure that the result being added into
// rawHtml is safe.
// (e.g. using an external parser with escaping capabilities).
$Block['element']['element']['rawHtml'] = "<p>$text</p>";
$Block['element']['element']['allowRawHtmlInSafeMode'] = true;
return $Block;
}
}

View File

@ -6,4 +6,8 @@
<h6>h6</h6>
<p>####### not a heading</p>
<h1>closed h1</h1>
<p>#</p>
<h1></h1>
<h2></h2>
<h1># of levels</h1>
<h1># of levels #</h1>
<h1>heading</h1>

View File

@ -14,4 +14,12 @@
# closed h1 #
#
#
##
# # of levels
# # of levels # #
#heading

View File

@ -5,4 +5,9 @@ echo $message;</code></pre>
<hr />
<pre><code>&gt; not a quote
- not a list item
[not a reference]: http://foo.com</code></pre>
[not a reference]: http://foo.com</code></pre>
<hr />
<pre><code>foo
bar</code></pre>

View File

@ -7,4 +7,11 @@
> not a quote
- not a list item
[not a reference]: http://foo.com
[not a reference]: http://foo.com
---
foo
bar

View File

@ -1,12 +1,40 @@
<ul>
<li>li
<li>li<ul>
<li>li<ul>
<li>li</li>
<li>li</li>
</ul>
</li>
<li>li</li>
</ul>
</li>
<li>li</li>
</ul>
<hr />
<ul>
<li>li
<li>level 1<ul>
<li>level 2<ul>
<li>level 3<ul>
<li>level 4<ul>
<li>level 5</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr />
<ul>
<li>li</li>
<li>li</li>
</ul></li>
<li>li</li>
</ul></li>
<li>li</li>
<li>a</li>
<li>b</li>
<li>c</li>
<li>d</li>
<li>e</li>
<li>f</li>
<li>g</li>
<li>h</li>
<li>i</li>
</ul>

View File

@ -3,4 +3,24 @@
- li
- li
- li
- li
- li
---
- level 1
- level 2
- level 3
- level 4
- level 5
---
- a
- b
- c
- d
- e
- f
- g
- h
- i

View File

@ -1 +1,2 @@
<p>my email is <a href="mailto:me@example.com">me@example.com</a></p>
<p>my email is <a href="mailto:me@example.com">me@example.com</a></p>
<p>html tags shouldn't start an email autolink <strong>first.last@example.com</strong></p>

View File

@ -1 +1,3 @@
my email is <me@example.com>
my email is <me@example.com>
html tags shouldn't start an email autolink <strong>first.last@example.com</strong>

View File

@ -8,4 +8,11 @@ echo $message;</code></pre>
<pre><code class="language-html+php">&lt;?php
echo "Hello World";
?&gt;
&lt;a href="http://auraphp.com" &gt;Aura Project&lt;/a&gt;</code></pre>
&lt;a href="http://auraphp.com" &gt;Aura Project&lt;/a&gt;</code></pre>
<pre><code>the following isn't quite enough to close
```
still a fenced code block</code></pre>
<pre><code>foo
bar</code></pre>

View File

@ -22,4 +22,17 @@ echo 'language identifier with non words';
echo "Hello World";
?>
<a href="http://auraphp.com" >Aura Project</a>
```
````
the following isn't quite enough to close
```
still a fenced code block
````
```
foo
bar
```

View File

@ -2,4 +2,10 @@
<p>paragraph</p>
<!--
multiline -->
<p>paragraph</p>
<p>paragraph</p>
<!-- sss -->abc
<ul>
<li>abcd</li>
<li>bbbb</li>
<li>cccc</li>
</ul>

View File

@ -5,4 +5,10 @@ paragraph
<!--
multiline -->
paragraph
paragraph
<!-- sss -->abc
* abcd
* bbbb
* cccc

View File

@ -1,6 +1,8 @@
<blockquote>
<p>quote
the rest of it</p>
</blockquote>
<blockquote>
<p>another paragraph
the rest of it</p>
</blockquote>

View File

@ -0,0 +1,3 @@
<div>Markup</div>
_No markdown_ without blank line for **strict** compliance with CommonMark.
<p><strong>Markdown</strong></p>

View File

@ -0,0 +1,4 @@
<div>Markup</div>
_No markdown_ without blank line for **strict** compliance with CommonMark.
**Markdown**

View File

@ -0,0 +1,4 @@
<div>One markup on
two lines</div>
_No markdown_
<p><strong>Markdown</strong></p>

View File

@ -0,0 +1,5 @@
<div>One markup on
two lines</div>
_No markdown_
**Markdown**

View File

@ -0,0 +1,3 @@
<div><p>Stripped markup</p></div>
_No markdown_
<p><strong>Markdown</strong></p>

View File

@ -0,0 +1,4 @@
<div><p>Stripped markup</p></div>
_No markdown_
**Markdown**

View File

@ -0,0 +1,3 @@
<div>First markup</div><p>and second markup on the same line.</p>
_No markdown_
<p><strong>Markdown</strong></p>

View File

@ -0,0 +1,4 @@
<div>First markup</div><p>and second markup on the same line.</p>
_No markdown_
**Markdown**

View File

@ -0,0 +1,4 @@
<div>First markup</div><p>and partial markup
on two lines.</p>
_No markdown_
<p><strong>Markdown</strong></p>

View File

@ -0,0 +1,5 @@
<div>First markup</div><p>and partial markup
on two lines.</p>
_No markdown_
**Markdown**

View File

@ -0,0 +1,4 @@
<div><p>Stripped markup
on two lines</p></div>
_No markdown_
<p><strong>Markdown</strong></p>

View File

@ -0,0 +1,5 @@
<div><p>Stripped markup
on two lines</p></div>
_No markdown_
**Markdown**

View File

@ -10,4 +10,7 @@
<p>large numbers:</p>
<ol start="123">
<li>one</li>
</ol>
</ol>
<p>foo 1. the following should not start a list
100.<br />
200. </p>

View File

@ -8,4 +8,8 @@ repeating numbers:
large numbers:
123. one
123. one
foo 1. the following should not start a list
100.
200.

View File

@ -1,12 +1,18 @@
<hr>
paragraph
<hr/>
paragraph
<hr />
paragraph
<hr class="foo" id="bar" />
paragraph
<hr class="foo" id="bar"/>
paragraph
<hr class="foo" id="bar" >
paragraph

View File

@ -0,0 +1,12 @@
<h1>trailing space</h1>
<h2>trailing space</h2>
<h1>leading and trailing space</h1>
<h2>leading and trailing space</h2>
<h1>1 leading space</h1>
<h2>1 leading space</h2>
<h1>3 leading spaces</h1>
<h2>3 leading spaces</h2>
<p>too many leading spaces
==</p>
<p>too many leading spaces
--</p>

View File

@ -0,0 +1,29 @@
trailing space
==
trailing space
--
leading and trailing space
==
leading and trailing space
--
1 leading space
==
1 leading space
--
3 leading spaces
==
3 leading spaces
--
too many leading spaces
==
too many leading spaces
--

View File

@ -8,4 +8,19 @@
<p>no space after <code>&gt;</code>:</p>
<blockquote>
<p>quote</p>
</blockquote>
<hr />
<blockquote>
<blockquote>
<blockquote>
<p>Info 1 text</p>
</blockquote>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<blockquote>
<p>Info 2 text</p>
</blockquote>
</blockquote>
</blockquote>

View File

@ -4,4 +4,10 @@ indented:
> quote
no space after `>`:
>quote
>quote
---
>>> Info 1 text
>>> Info 2 text

View File

@ -34,4 +34,42 @@
<td>cell 2.2</td>
</tr>
</tbody>
</table>
</table>
<hr />
<table>
<thead>
<tr>
<th style="text-align: left;">header 1</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">cell 1.1</td>
</tr>
<tr>
<td style="text-align: left;">cell 2.1</td>
</tr>
</tbody>
</table>
<hr />
<table>
<thead>
<tr>
<th>header 1</th>
</tr>
</thead>
<tbody>
<tr>
<td>cell 1.1</td>
</tr>
<tr>
<td>cell 2.1</td>
</tr>
</tbody>
</table>
<hr />
<p>Not a table, we haven't ended the paragraph:
header 1 | header 2
-------- | --------
cell 1.1 | cell 1.2
cell 2.1 | cell 2.2</p>

View File

@ -8,4 +8,26 @@ cell 2.1 | cell 2.2
header 1 | header 2
:------- | --------
cell 1.1 | cell 1.2
cell 2.1 | cell 2.2
---
header 1
:-------
cell 1.1
cell 2.1
---
header 1
-------|
cell 1.1
cell 2.1
---
Not a table, we haven't ended the paragraph:
header 1 | header 2
-------- | --------
cell 1.1 | cell 1.2
cell 2.1 | cell 2.2

View File

@ -1,8 +1,6 @@
<div>
line 1
line 2
line 3
line 4
<p>line 2
line 3</p>
<p>line 4</p>
</div>

View File

@ -0,0 +1,13 @@
<h1>h1</h1>
<h2>h2</h2>
<h3>h3</h3>
<h4>h4</h4>
<h5>h5</h5>
<h6>h6</h6>
<p>####### not a heading</p>
<p>#not a heading</p>
<h1>closed h1</h1>
<h1></h1>
<h2></h2>
<h1># of levels</h1>
<h1># of levels #</h1>

View File

@ -0,0 +1,25 @@
# h1
## h2
### h3
#### h4
##### h5
###### h6
####### not a heading
#not a heading
# closed h1 #
#
##
# # of levels
# # of levels # #

View File

@ -1,3 +1,4 @@
<p><del>strikethrough</del></p>
<p>here's <del>one</del> followed by <del>another one</del></p>
<p>~~ this ~~ is not one neither is ~this~</p>
<p>~~ this ~~ is not one neither is ~this~</p>
<p>escaped ~~this~~</p>

View File

@ -2,4 +2,6 @@
here's ~~one~~ followed by ~~another one~~
~~ this ~~ is not one neither is ~this~
~~ this ~~ is not one neither is ~this~
escaped \~\~this\~\~

View File

@ -2,9 +2,21 @@
<li>li</li>
<li>li</li>
</ul>
<p>mixed markers:</p>
<p>mixed unordered markers:</p>
<ul>
<li>li</li>
</ul>
<ul>
<li>li</li>
</ul>
<ul>
<li>li</li>
</ul>
</ul>
<p>mixed ordered markers:</p>
<ol>
<li>starting at 1, list one</li>
<li>number 2, list one</li>
</ol>
<ol start="3">
<li>starting at 3, list two</li>
</ol>

View File

@ -1,8 +1,14 @@
- li
- li
mixed markers:
mixed unordered markers:
* li
+ li
- li
- li
mixed ordered markers:
1. starting at 1, list one
2. number 2, list one
3) starting at 3, list two