| PHP Markdown Extra |
| ================== |
| |
| Version 1.2.3 - Wed 31 Dec 2008 |
| |
| by Michel Fortin |
| <http://www.michelf.com/> |
| |
| based on Markdown by John Gruber |
| <http://daringfireball.net/> |
| |
| |
| Introduction |
| ------------ |
| |
| This is a special version of PHP Markdown with extra features. See |
| <http://www.michelf.com/projects/php-markdown/extra/> for details. |
| |
| Markdown is a text-to-HTML conversion tool for web writers. Markdown |
| allows you to write using an easy-to-read, easy-to-write plain text |
| format, then convert it to structurally valid XHTML (or HTML). |
| |
| "Markdown" is two things: a plain text markup syntax, and a software |
| tool, written in Perl, that converts the plain text markup to HTML. |
| PHP Markdown is a port to PHP of the original Markdown program by |
| John Gruber. |
| |
| PHP Markdown can work as a plug-in for WordPress and bBlog, as a |
| modifier for the Smarty templating engine, or as a remplacement for |
| textile formatting in any software that support textile. |
| |
| Full documentation of Markdown's syntax is available on John's |
| Markdown page: <http://daringfireball.net/projects/markdown/> |
| |
| |
| Installation and Requirement |
| ---------------------------- |
| |
| PHP Markdown requires PHP version 4.0.5 or later. |
| |
| |
| ### WordPress ### |
| |
| PHP Markdown works with [WordPress][wp], version 1.2 or later. |
| |
| [wp]: http://wordpress.org/ |
| |
| 1. To use PHP Markdown with WordPress, place the "makrdown.php" file |
| in the "plugins" folder. This folder is located inside |
| "wp-content" at the root of your site: |
| |
| (site home)/wp-content/plugins/ |
| |
| 2. Activate the plugin with the administrative interface of |
| WordPress. In the "Plugins" section you will now find Markdown. |
| To activate the plugin, click on the "Activate" button on the |
| same line than Markdown. Your entries will now be formatted by |
| PHP Markdown. |
| |
| 3. To post Markdown content, you'll first have to disable the |
| "visual" editor in the User section of WordPress. |
| |
| You can configure PHP Markdown to not apply to the comments on your |
| WordPress weblog. See the "Configuration" section below. |
| |
| It is not possible at this time to apply a different set of |
| filters to different entries. All your entries will be formated by |
| PHP Markdown. This is a limitation of WordPress. If your old entries |
| are written in HTML (as opposed to another formatting syntax, like |
| Textile), they'll probably stay fine after installing Markdown. |
| |
| |
| ### bBlog ### |
| |
| PHP Markdown also works with [bBlog][bb]. |
| |
| [bb]: http://www.bblog.com/ |
| |
| To use PHP Markdown with bBlog, rename "markdown.php" to |
| "modifier.markdown.php" and place the file in the "bBlog_plugins" |
| folder. This folder is located inside the "bblog" directory of |
| your site, like this: |
| |
| (site home)/bblog/bBlog_plugins/modifier.markdown.php |
| |
| Select "Markdown" as the "Entry Modifier" when you post a new |
| entry. This setting will only apply to the entry you are editing. |
| |
| |
| ### Replacing Textile in TextPattern ### |
| |
| [TextPattern][tp] use [Textile][tx] to format your text. You can |
| replace Textile by Markdown in TextPattern without having to change |
| any code by using the *Texitle Compatibility Mode*. This may work |
| with other software that expect Textile too. |
| |
| [tx]: http://www.textism.com/tools/textile/ |
| [tp]: http://www.textpattern.com/ |
| |
| 1. Rename the "markdown.php" file to "classTextile.php". This will |
| make PHP Markdown behave as if it was the actual Textile parser. |
| |
| 2. Replace the "classTextile.php" file TextPattern installed in your |
| web directory. It can be found in the "lib" directory: |
| |
| (site home)/textpattern/lib/ |
| |
| Contrary to Textile, Markdown does not convert quotes to curly ones |
| and does not convert multiple hyphens (`--` and `---`) into en- and |
| em-dashes. If you use PHP Markdown in Textile Compatibility Mode, you |
| can solve this problem by installing the "smartypants.php" file from |
| [PHP SmartyPants][psp] beside the "classTextile.php" file. The Textile |
| Compatibility Mode function will use SmartyPants automatically without |
| further modification. |
| |
| [psp]: http://www.michelf.com/projects/php-smartypants/ |
| |
| |
| ### In Your Own Programs ### |
| |
| You can use PHP Markdown easily in your current PHP program. Simply |
| include the file and then call the Markdown function on the text you |
| want to convert: |
| |
| include_once "markdown.php"; |
| $my_html = Markdown($my_text); |
| |
| If you wish to use PHP Markdown with another text filter function |
| built to parse HTML, you should filter the text *after* the Markdown |
| function call. This is an example with [PHP SmartyPants][psp]: |
| |
| $my_html = SmartyPants(Markdown($my_text)); |
| |
| |
| ### With Smarty ### |
| |
| If your program use the [Smarty][sm] template engine, PHP Markdown |
| can now be used as a modifier for your templates. Rename "markdown.php" |
| to "modifier.markdown.php" and put it in your smarty plugins folder. |
| |
| [sm]: http://smarty.php.net/ |
| |
| If you are using MovableType 3.1 or later, the Smarty plugin folder is |
| located at `(MT CGI root)/php/extlib/smarty/plugins`. This will allow |
| Markdown to work on dynamic pages. |
| |
| |
| ### Updating Markdown in Other Programs ### |
| |
| Many web applications now ship with PHP Markdown, or have plugins to |
| perform the conversion to HTML. You can update PHP Markdown -- or |
| replace it with PHP Markdown Extra -- in many of these programs by |
| swapping the old "markdown.php" file for the new one. |
| |
| Here is a short non-exhaustive list of some programs and where they |
| hide the "markdown.php" file. |
| |
| | Program | Path to Markdown |
| | ------- | ---------------- |
| | [Pivot][] | `(site home)/pivot/includes/markdown/` |
| |
| If you're unsure if you can do this with your application, ask the |
| developer, or wait for the developer to update his application or |
| plugin with the new version of PHP Markdown. |
| |
| [Pivot]: http://pivotlog.net/ |
| |
| |
| Configuration |
| ------------- |
| |
| By default, PHP Markdown produces XHTML output for tags with empty |
| elements. E.g.: |
| |
| <br /> |
| |
| Markdown can be configured to produce HTML-style tags; e.g.: |
| |
| <br> |
| |
| To do this, you must edit the "MARKDOWN_EMPTY_ELEMENT_SUFFIX" |
| definition below the "Global default settings" header at the start of |
| the "markdown.php" file. |
| |
| |
| ### WordPress-Specific Settings ### |
| |
| By default, the Markdown plugin applies to both posts and comments on |
| your WordPress weblog. To deactivate one or the other, edit the |
| `MARKDOWN_WP_POSTS` or `MARKDOWN_WP_COMMENTS` definitions under the |
| "WordPress settings" header at the start of the "markdown.php" file. |
| |
| |
| Bugs |
| ---- |
| |
| To file bug reports please send email to: |
| <michel.fortin@michelf.com> |
| |
| Please include with your report: (1) the example input; (2) the output you |
| expected; (3) the output PHP Markdown actually produced. |
| |
| |
| Version History |
| --------------- |
| |
| Extra 1.2.3 (31 Dec 2008): |
| |
| * In WordPress pages featuring more than one post, footnote id prefixes are |
| now automatically applied with the current post ID to avoid clashes |
| between footnotes belonging to different posts. |
| |
| * Fix for a bug introduced in Extra 1.2 where block-level HTML tags where |
| not detected correctly, thus the addition of erroneous `<p>` tags and |
| interpretation of their content as Markdown-formatted instead of |
| HTML-formatted. |
| |
| |
| Extra 1.2.2 (21 Jun 2008): |
| |
| * Fixed a problem where abbreviation definitions, footnote |
| definitions and link references were stripped inside |
| fenced code blocks. |
| |
| * Fixed a bug where characters such as `"` in abbreviation |
| definitions weren't properly encoded to HTML entities. |
| |
| * Fixed a bug where double quotes `"` were not correctly encoded |
| as HTML entities when used inside a footnote reference id. |
| |
| |
| 1.0.1m (21 Jun 2008): |
| |
| * Lists can now have empty items. |
| |
| * Rewrote the emphasis and strong emphasis parser to fix some issues |
| with odly placed and overlong markers. |
| |
| |
| Extra 1.2.1 (27 May 2008): |
| |
| * Fixed a problem where Markdown headers and horizontal rules were |
| transformed into their HTML equivalent inside fenced code blocks. |
| |
| |
| Extra 1.2 (11 May 2008): |
| |
| * Added fenced code block syntax which don't require indentation |
| and can start and end with blank lines. A fenced code block |
| starts with a line of consecutive tilde (~) and ends on the |
| next line with the same number of consecutive tilde. Here's an |
| example: |
| |
| ~~~~~~~~~~~~ |
| Hello World! |
| ~~~~~~~~~~~~ |
| |
| * Rewrote parts of the HTML block parser to better accomodate |
| fenced code blocks. |
| |
| * Footnotes may now be referenced from within another footnote. |
| |
| * Added programatically-settable parser property `predef_attr` for |
| predefined attribute definitions. |
| |
| * Fixed an issue where an indented code block preceded by a blank |
| line containing some other whitespace would confuse the HTML |
| block parser into creating an HTML block when it should have |
| been code. |
| |
| |
| 1.0.1l (11 May 2008): |
| |
| * Now removing the UTF-8 BOM at the start of a document, if present. |
| |
| * Now accepting capitalized URI schemes (such as HTTP:) in automatic |
| links, such as `<HTTP://EXAMPLE.COM/>`. |
| |
| * Fixed a problem where `<hr@example.com>` was seen as a horizontal |
| rule instead of an automatic link. |
| |
| * Fixed an issue where some characters in Markdown-generated HTML |
| attributes weren't properly escaped with entities. |
| |
| * Fix for code blocks as first element of a list item. Previously, |
| this didn't create any code block for item 2: |
| |
| * Item 1 (regular paragraph) |
| |
| * Item 2 (code block) |
| |
| * A code block starting on the second line of a document wasn't seen |
| as a code block. This has been fixed. |
| |
| * Added programatically-settable parser properties `predef_urls` and |
| `predef_titles` for predefined URLs and titles for reference-style |
| links. To use this, your PHP code must call the parser this way: |
| |
| $parser = new Markdwon_Parser; |
| $parser->predef_urls = array('linkref' => 'http://example.com'); |
| $html = $parser->transform($text); |
| |
| You can then use the URL as a normal link reference: |
| |
| [my link][linkref] |
| [my link][linkRef] |
| |
| Reference names in the parser properties *must* be lowercase. |
| Reference names in the Markdown source may have any case. |
| |
| * Added `setup` and `teardown` methods which can be used by subclassers |
| as hook points to arrange the state of some parser variables before and |
| after parsing. |
| |
| |
| Extra 1.1.7 (26 Sep 2007): |
| |
| 1.0.1k (26 Sep 2007): |
| |
| * Fixed a problem introduced in 1.0.1i where three or more identical |
| uppercase letters, as well as a few other symbols, would trigger |
| a horizontal line. |
| |
| |
| Extra 1.1.6 (4 Sep 2007): |
| |
| 1.0.1j (4 Sep 2007): |
| |
| * Fixed a problem introduced in 1.0.1i where the closing `code` and |
| `pre` tags at the end of a code block were appearing in the wrong |
| order. |
| |
| * Overriding configuration settings by defining constants from an |
| external before markdown.php is included is now possible without |
| producing a PHP warning. |
| |
| |
| Extra 1.1.5 (31 Aug 2007): |
| |
| 1.0.1i (31 Aug 2007): |
| |
| * Fixed a problem where an escaped backslash before a code span |
| would prevent the code span from being created. This should now |
| work as expected: |
| |
| Litteral backslash: \\`code span` |
| |
| * Overall speed improvements, especially with long documents. |
| |
| |
| Extra 1.1.4 (3 Aug 2007): |
| |
| 1.0.1h (3 Aug 2007): |
| |
| * Added two properties (`no_markup` and `no_entities`) to the parser |
| allowing HTML tags and entities to be disabled. |
| |
| * Fix for a problem introduced in 1.0.1g where posting comments in |
| WordPress would trigger PHP warnings and cause some markup to be |
| incorrectly filtered by the kses filter in WordPress. |
| |
| |
| Extra 1.1.3 (3 Jul 2007): |
| |
| * Fixed a performance problem when parsing some invalid HTML as an HTML |
| block which was resulting in too much recusion and a segmentation fault |
| for long documents. |
| |
| * The markdown="" attribute now accepts unquoted values. |
| |
| * Fixed an issue where underscore-emphasis didn't work when applied on the |
| first or the last word of an element having the markdown="1" or |
| markdown="span" attribute set unless there was some surrounding whitespace. |
| This didn't work: |
| |
| <p markdown="1">_Hello_ _world_</p> |
| |
| Now it does produce emphasis as expected. |
| |
| * Fixed an issue preventing footnotes from working when the parser's |
| footnote id prefix variable (fn_id_prefix) is not empty. |
| |
| * Fixed a performance problem where the regular expression for strong |
| emphasis introduced in version 1.1 could sometime be long to process, |
| give slightly wrong results, and in some circumstances could remove |
| entirely the content for a whole paragraph. |
| |
| * Fixed an issue were abbreviations tags could be incorrectly added |
| inside URLs and title of links. |
| |
| * Placing footnote markers inside a link, resulting in two nested links, is |
| no longer allowed. |
| |
| |
| 1.0.1g (3 Jul 2007): |
| |
| * Fix for PHP 5 compiled without the mbstring module. Previous fix to |
| calculate the length of UTF-8 strings in `detab` when `mb_strlen` is |
| not available was only working with PHP 4. |
| |
| * Fixed a problem with WordPress 2.x where full-content posts in RSS feeds |
| were not processed correctly by Markdown. |
| |
| * Now supports URLs containing literal parentheses for inline links |
| and images, such as: |
| |
| [WIMP](http://en.wikipedia.org/wiki/WIMP_(computing)) |
| |
| Such parentheses may be arbitrarily nested, but must be |
| balanced. Unbalenced parentheses are allowed however when the URL |
| when escaped or when the URL is enclosed in angle brakets `<>`. |
| |
| * Fixed a performance problem where the regular expression for strong |
| emphasis introduced in version 1.0.1d could sometime be long to process, |
| give slightly wrong results, and in some circumstances could remove |
| entirely the content for a whole paragraph. |
| |
| * Some change in version 1.0.1d made possible the incorrect nesting of |
| anchors within each other. This is now fixed. |
| |
| * Fixed a rare issue where certain MD5 hashes in the content could |
| be changed to their corresponding text. For instance, this: |
| |
| The MD5 value for "+" is "26b17225b626fb9238849fd60eabdf60". |
| |
| was incorrectly changed to this in previous versions of PHP Markdown: |
| |
| <p>The MD5 value for "+" is "+".</p> |
| |
| * Now convert escaped characters to their numeric character |
| references equivalent. |
| |
| This fix an integration issue with SmartyPants and backslash escapes. |
| Since Markdown and SmartyPants have some escapable characters in common, |
| it was sometime necessary to escape them twice. Previously, two |
| backslashes were sometime required to prevent Markdown from "eating" the |
| backslash before SmartyPants sees it: |
| |
| Here are two hyphens: \\-- |
| |
| Now, only one backslash will do: |
| |
| Here are two hyphens: \-- |
| |
| |
| Extra 1.1.2 (7 Feb 2007) |
| |
| * Fixed an issue where headers preceded too closely by a paragraph |
| (with no blank line separating them) where put inside the paragraph. |
| |
| * Added the missing TextileRestricted method that was added to regular |
| PHP Markdown since 1.0.1d but which I forgot to add to Extra. |
| |
| |
| 1.0.1f (7 Feb 2007): |
| |
| * Fixed an issue with WordPress where manually-entered excerpts, but |
| not the auto-generated ones, would contain nested paragraphs. |
| |
| * Fixed an issue introduced in 1.0.1d where headers and blockquotes |
| preceded too closely by a paragraph (not separated by a blank line) |
| where incorrectly put inside the paragraph. |
| |
| * Fixed an issue introduced in 1.0.1d in the tokenizeHTML method where |
| two consecutive code spans would be merged into one when together they |
| form a valid tag in a multiline paragraph. |
| |
| * Fixed an long-prevailing issue where blank lines in code blocks would |
| be doubled when the code block is in a list item. |
| |
| This was due to the list processing functions relying on artificially |
| doubled blank lines to correctly determine when list items should |
| contain block-level content. The list item processing model was thus |
| changed to avoid the need for double blank lines. |
| |
| * Fixed an issue with `<% asp-style %>` instructions used as inline |
| content where the opening `<` was encoded as `<`. |
| |
| * Fixed a parse error occuring when PHP is configured to accept |
| ASP-style delimiters as boundaries for PHP scripts. |
| |
| * Fixed a bug introduced in 1.0.1d where underscores in automatic links |
| got swapped with emphasis tags. |
| |
| |
| Extra 1.1.1 (28 Dec 2006) |
| |
| * Fixed a problem where whitespace at the end of the line of an atx-style |
| header would cause tailing `#` to appear as part of the header's content. |
| This was caused by a small error in the regex that handles the definition |
| for the id attribute in PHP Markdown Extra. |
| |
| * Fixed a problem where empty abbreviations definitions would eat the |
| following line as its definition. |
| |
| * Fixed an issue with calling the Markdown parser repetitivly with text |
| containing footnotes. The footnote hashes were not reinitialized properly. |
| |
| |
| 1.0.1e (28 Dec 2006) |
| |
| * Added support for internationalized domain names for email addresses in |
| automatic link. Improved the speed at which email addresses are converted |
| to entities. Thanks to Milian Wolff for his optimisations. |
| |
| * Made deterministic the conversion to entities of email addresses in |
| automatic links. This means that a given email address will always be |
| encoded the same way. |
| |
| * PHP Markdown will now use its own function to calculate the length of an |
| UTF-8 string in `detab` when `mb_strlen` is not available instead of |
| giving a fatal error. |
| |
| |
| Extra 1.1 (1 Dec 2006) |
| |
| * Added a syntax for footnotes. |
| |
| * Added an experimental syntax to define abbreviations. |
| |
| |
| 1.0.1d (1 Dec 2006) |
| |
| * Fixed a bug where inline images always had an empty title attribute. The |
| title attribute is now present only when explicitly defined. |
| |
| * Link references definitions can now have an empty title, previously if the |
| title was defined but left empty the link definition was ignored. This can |
| be useful if you want an empty title attribute in images to hide the |
| tooltip in Internet Explorer. |
| |
| * Made `detab` aware of UTF-8 characters. UTF-8 multi-byte sequences are now |
| correctly mapped to one character instead of the number of bytes. |
| |
| * Fixed a small bug with WordPress where WordPress' default filter `wpautop` |
| was not properly deactivated on comment text, resulting in hard line breaks |
| where Markdown do not prescribes them. |
| |
| * Added a `TextileRestrited` method to the textile compatibility mode. There |
| is no restriction however, as Markdown does not have a restricted mode at |
| this point. This should make PHP Markdown work again in the latest |
| versions of TextPattern. |
| |
| * Converted PHP Markdown to a object-oriented design. |
| |
| * Changed span and block gamut methods so that they loop over a |
| customizable list of methods. This makes subclassing the parser a more |
| interesting option for creating syntax extensions. |
| |
| * Also added a "document" gamut loop which can be used to hook document-level |
| methods (like for striping link definitions). |
| |
| * Changed all methods which were inserting HTML code so that they now return |
| a hashed representation of the code. New methods `hashSpan` and `hashBlock` |
| are used to hash respectivly span- and block-level generated content. This |
| has a couple of significant effects: |
| |
| 1. It prevents invalid nesting of Markdown-generated elements which |
| could occur occuring with constructs like `*something [link*][1]`. |
| 2. It prevents problems occuring with deeply nested lists on which |
| paragraphs were ill-formed. |
| 3. It removes the need to call `hashHTMLBlocks` twice during the the |
| block gamut. |
| |
| Hashes are turned back to HTML prior output. |
| |
| * Made the block-level HTML parser smarter using a specially-crafted regular |
| expression capable of handling nested tags. |
| |
| * Solved backtick issues in tag attributes by rewriting the HTML tokenizer to |
| be aware of code spans. All these lines should work correctly now: |
| |
| <span attr='`ticks`'>bar</span> |
| <span attr='``double ticks``'>bar</span> |
| `<test a="` content of attribute `">` |
| |
| * Changed the parsing of HTML comments to match simply from `<!--` to `-->` |
| instead using of the more complicated SGML-style rule with paired `--`. |
| This is how most browsers parse comments and how XML defines them too. |
| |
| * `<address>` has been added to the list of block-level elements and is now |
| treated as an HTML block instead of being wrapped within paragraph tags. |
| |
| * Now only trim trailing newlines from code blocks, instead of trimming |
| all trailing whitespace characters. |
| |
| * Fixed bug where this: |
| |
| [text](http://m.com "title" ) |
| |
| wasn't working as expected, because the parser wasn't allowing for spaces |
| before the closing paren. |
| |
| * Filthy hack to support markdown='1' in div tags. |
| |
| * _DoAutoLinks() now supports the 'dict://' URL scheme. |
| |
| * PHP- and ASP-style processor instructions are now protected as |
| raw HTML blocks. |
| |
| <? ... ?> |
| <% ... %> |
| |
| * Fix for escaped backticks still triggering code spans: |
| |
| There are two raw backticks here: \` and here: \`, not a code span |
| |
| |
| Extra 1.0 - 5 September 2005 |
| |
| * Added support for setting the id attributes for headers like this: |
| |
| Header 1 {#header1} |
| ======== |
| |
| ## Header 2 ## {#header2} |
| |
| This only work only for headers for now. |
| |
| * Tables will now work correctly as the first element of a definition |
| list. For example, this input: |
| |
| Term |
| |
| : Header | Header |
| ------- | ------- |
| Cell | Cell |
| |
| used to produce no definition list and a table where the first |
| header was named ": Header". This is now fixed. |
| |
| * Fix for a problem where a paragraph following a table was not |
| placed between `<p>` tags. |
| |
| |
| Extra 1.0b4 - 1 August 2005 |
| |
| * Fixed some issues where whitespace around HTML blocks were trigging |
| empty paragraph tags. |
| |
| * Fixed an HTML block parsing issue that would cause a block element |
| following a code span or block with unmatched opening bracket to be |
| placed inside a paragraph. |
| |
| * Removed some PHP notices that could appear when parsing definition |
| lists and tables with PHP notice reporting flag set. |
| |
| |
| Extra 1.0b3 - 29 July 2005 |
| |
| * Definition lists now require a blank line before each term. Solves |
| an ambiguity where the last line of lazy-indented definitions could |
| be mistaken by PHP Markdown as a new term in the list. |
| |
| * Definition lists now support multiple terms per definition. |
| |
| * Some special tags were replaced in the output by their md5 hash |
| key. Things such as this now work as expected: |
| |
| ## Header <?php echo $number ?> ## |
| |
| |
| Extra 1.0b2 - 26 July 2005 |
| |
| * Definition lists can now take two or more definitions for one term. |
| This should have been the case before, but a bug prevented this |
| from working right. |
| |
| * Fixed a problem where single column table with a pipe only at the |
| end where not parsed as table. Here is such a table: |
| |
| | header |
| | ------ |
| | cell |
| |
| * Fixed problems with empty cells in the first column of a table with |
| no leading pipe, like this one: |
| |
| header | header |
| ------ | ------ |
| | cell |
| |
| * Code spans containing pipes did not within a table. This is now |
| fixed by parsing code spans before splitting rows into cells. |
| |
| * Added the pipe character to the backlash escape character lists. |
| |
| Extra 1.0b1 (25 Jun 2005) |
| |
| * First public release of PHP Markdown Extra. |
| |
| |
| Copyright and License |
| --------------------- |
| |
| Copyright (c) 2004-2005 Michel Fortin |
| <http://www.michelf.com/> |
| All rights reserved. |
| |
| Based on Markdown |
| Copyright (c) 2003-2005 John Gruber |
| <http://daringfireball.net/> |
| All rights reserved. |
| |
| Redistribution and use in source and binary forms, with or without |
| modification, are permitted provided that the following conditions are |
| met: |
| |
| * Redistributions of source code must retain the above copyright |
| notice, this list of conditions and the following disclaimer. |
| |
| * Redistributions in binary form must reproduce the above copyright |
| notice, this list of conditions and the following disclaimer in the |
| documentation and/or other materials provided with the |
| distribution. |
| |
| * Neither the name "Markdown" nor the names of its contributors may |
| be used to endorse or promote products derived from this software |
| without specific prior written permission. |
| |
| This software is provided by the copyright holders and contributors "as |
| is" and any express or implied warranties, including, but not limited |
| to, the implied warranties of merchantability and fitness for a |
| particular purpose are disclaimed. In no event shall the copyright owner |
| or contributors be liable for any direct, indirect, incidental, special, |
| exemplary, or consequential damages (including, but not limited to, |
| procurement of substitute goods or services; loss of use, data, or |
| profits; or business interruption) however caused and on any theory of |
| liability, whether in contract, strict liability, or tort (including |
| negligence or otherwise) arising in any way out of the use of this |
| software, even if advised of the possibility of such damage. |