*/ /******************************************************************** * Drupal Hooks ********************************************************************/ /** * Implementation of hook_filter(). */ function textile_filter($op, $delta = 0, $format = -1, $text = '') { switch ($op) { case 'list': return array(t("Textile")); case 'description': return t('Allows content to be submitted using Textile, a simple, plain text syntax that is filtered into valid XHTML.'); case 'process': if (variable_get("textile_tags_$format", 0)) { return preg_replace_callback('{\[textile\](.*?)(\[/textile\]|$)}is', '_textile_process', $text); } else { return _textile_process(array(NULL, $text)); } case 'settings': $form = array(); $form['textile_settings'] = array( '#type' => 'fieldset', '#title' => t('Textile filter'), '#collapsible' => TRUE ); $form['textile_settings']["textile_tags_$format"] = array( '#type' => 'checkbox', '#title' => t('Use tags'), '#default_value' => variable_get("textile_tags_$format", 0), '#description' => t('If enabled, only text between [textile] and optional [/textile] tags will be processed. Otherwise, all text will be processed as Textile markup.') ); return $form; default: return $text; } } /** * Implementation of hook_filter_tips(). */ function textile_filter_tips($delta, $format, $long = FALSE) { if ($long) { return t('
CSS attributes can be applied to blocks (paragraphs, headers,
etc.). CSS classes are specifed with "(class)";
CSS IDs are specified with "(#id)"; both can be
specified with "(class#id)". An arbtirary
CSS style can be applied by using
"{style}". Finally, language attributes are
applied using "[language]".
Additionally, alignment and indentation shorthands are provided. To
left-align, right-align, center, and justify text, use
"<", ">", "=", and
"<>", respectively. "(" left-indents
a block 1em for each occurrence, and ")" right-indents
similarly.
Tables have additional options. "^", "-",
and "~" specify top, middle, and bottom vertical
alignment. The "_" attribute on a cell indicates that
it is a table header.
The examples below illustrate these attributes.
| textile input | output | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Headingshx. (where x is 1 - 6)
|
|||||||||||||
| h1. Heading | Heading |
||||||||||||
| h2(class). Heading with class | Heading with class |
||||||||||||
Paragraphs |
|||||||||||||
| p=. Centered text | Centered text |
||||||||||||
| p())(#id). Indented text with ID |
Indented text with ID |
||||||||||||
Block quotes |
|||||||||||||
| bq(class#id). Quote with class and ID |
Quote with class and ID |
||||||||||||
| bq[en]. English quote |
English quote
|
||||||||||||
Ordered lists |
|||||||||||||
|
{color: blue}# Attributes specified # before the first item # affect the whole list |
|
||||||||||||
Unordered lists |
|||||||||||||
|
* Lists can have ## subitems or ## sublists * too |
|
||||||||||||
Footnotesfnx. (where x is 1 - 100)
|
|||||||||||||
| fn17. Footnote | 17 Footnote |
||||||||||||
Tables |
|||||||||||||
|
|_. A|_. B|_. C| (dark). |very|simple|table| |<. left|=. center|>. right| |^{height:3em}. top|-. middle|~. bottom| |
|
||||||||||||
The class, ID, style, and language attributes described above also apply to the span phrase modifier as shown below.
| textile input | output |
|---|---|
| _emphasis_ | emphasis |
| __italic__ | italic |
| *strong* | strong |
| **bold** | bold |
| ??citation?? | citation |
| -delete text- | |
| +inserted text+ | inserted text |
| ^superscript^ | superscript |
| ~subscript~ | subscript |
| @code@ | code |
| %(class)span% | span |
| %{color:red;}span% | span |
| ==no textile== | no textile |
| "link text":url | link text |
| "link text(title)":url | link text |
| !imageurl! | |
| !imageurl(alt text)! | |
| !imageurl!:url | |
| ABC(Always Be Closing) | ABC |
| Footnote reference[17] | Footnote reference17 |
The Textile module allows users to enter content using Textile, a simple, plain text syntax that is filtered into valid XHTML. The filter tips page provides syntax descriptions and examples.
'); } } /** * Implementation of hook_enable() * * Run a check for the library and set an error message if not present. */ function hook_enable() { if ($error = _textile_lib_check()) { drupal_set_message($error, 'error'); } } /******************************************************************** * Module Functions ********************************************************************/ /** * Performs the appropriate Textile filtering on the provided text. * * @param $matches * Thearray specifying the text to be filtered at
* index 1.
*
* @return
* A string containing the filtered text.
*
* @private
*/
function _textile_process($matches) {
static $textile = NULL;
if ($textile === NULL) {
$path = drupal_get_path('module', 'textile');
include_once($path . '/classTextile.php');
$textile = new Textile();
//$textile->hu is the string that preceeds all relative URLs.
//So I copied the part of url() implementation in common.inc
//not tested in real non-Apache webserver yet
$textile->hu = base_path().((strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') === FALSE) ? 'index.php' : '').((bool)variable_get('clean_url', '0') ? '' : '?q=');
}
//should there be any encoding declaration of some sort? Can't find how to do it though
return $textile->TextileThis($matches[1]);
}
/**
* Checking that the classTextile.php library is installed, and if not return an error string.
*/
function _textile_lib_check() {
$path = drupal_get_path('module', 'textile');
if (!file_exists($path .'/classTextile.php')) {
return t('The classTextile.php library is missing. Drupal cannot use textile markup without this library. Please check the textile module INSTALL documentation for information on how to download this.', array('@url' => 'http://cvs.drupal.org/viewcvs/*checkout*/drupal/contributions/modules/textile/INSTALL.txt'));
}
}