From a0453c360d5cbf2fe21e662e29233355559ad816 Mon Sep 17 00:00:00 2001
From: Capi Etheriel <barraponto@gmail.com>
Date: Mon, 8 Apr 2013 16:15:49 -0300
Subject: Issue #1319492 by barraponto, fangel: Disable certain parts of Markdown

---
 markdown.module | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 79 insertions(+), 4 deletions(-)

diff --git a/markdown.module b/markdown.module
index 22f1263..e410915 100644
--- a/markdown.module
+++ b/markdown.module
@@ -24,6 +24,12 @@ function markdown_filter_info() {
     'description' => t('Allows content to be submitted using Markdown, a simple plain-text syntax that is filtered into valid XHTML.'),
     'process callback' => '_filter_markdown',
     'settings callback' => '_filter_markdown_settings',
+    'default settings' => array(
+      'headings' => 1,
+      'tables' => 1,
+      'lists' => 1,
+      'images' => 1,
+    ),
     'tips callback'  => '_filter_markdown_tips',
   );
 
@@ -34,7 +40,7 @@ function markdown_filter_info() {
  * Implements hook_libraries_info().
  */
 function markdown_libraries_info() {
-  $libraries['php-markdown'] = array(
+  $libraries['markdown'] = array(
     'name' => 'PHP Markdown Extra plugin',
     'vendor url' => 'http://michelf.ca/projects/php-markdown/',
     'download url' => 'http://littoral.michelf.ca/code/php-markdown/php-markdown-extra-1.2.5.zip',
@@ -132,22 +138,55 @@ And now some code:
  */
 function _filter_markdown($text, $format) {
   if (!empty($text)) {
-    libraries_load('php-markdown');
+    libraries_load('markdown');
     $text = Markdown($text);
   }
 
+  static $parsers;
+  if (empty($parsers[$format->format])) {
+    $parser_class = MARKDOWN_PARSER_CLASS;
+    $parsers[$format->format] = new $parser_class;
+  }
+
+  if (!empty($format->settings['headings'])) {
+    unset($parsers[$format->format]->block_gamut['doHeaders']);
+  }
+  if (!empty($format->settings['quotes'])) {
+    unset($parsers[$format->format]->block_gamut['doBlockQuotes']);
+  }
+  if (!empty($format->settings['snippets'])) {
+    unset($parsers[$format->format]->block_gamut['doCodeBlocks']);
+    unset($parsers[$format->format]->document_gamut['doFencedCodeBlocks']);
+    unset($parsers[$format->format]->block_gamut['doFencedCodeBlocks']);
+  }
+  if (!empty($format->settings['tables'])) {
+    unset($parsers[$format->format]->block_gamut['doTables']);
+  }
+  if (!empty($format->settings['lists'])) {
+    unset($parsers[$format->format]->block_gamut['doLists']);
+    unset($parsers[$format->format]->document_gamut['stripFootnotes']);
+    unset($parsers[$format->format]->document_gamut['appendFootnotes']);
+    unset($parsers[$format->format]->span_gamut['doFootnotes']);
+  }
+  if (!empty($format->settings['deflists'])) {
+    unset($parsers[$format->format]->block_gamut['doDefLists']);
+  }
+
+ $text = $parsers[$format->format]->transform($text);
   return $text;
 }
 
 /**
- * Filter settings callback. Just provides a version overview.
+ * Filter settings callback.
  */
 function _filter_markdown_settings($form, &$form_state, $filter, $format, $defaults) {
-  libraries_load('php-markdown');
+  libraries_load('markdown');
 
+  $filter->settings += $defaults;
   $settings['markdown_wrapper'] = array(
     '#type' => 'fieldset',
     '#title' => t('Markdown'),
+    '#parents' => array('filters', $filter->name, 'settings'),
   );
   $links = array(
     'Markdown PHP Version: <a href="http://michelf.com/projects/php-markdown/">' . MARKDOWN_VERSION . '</a>',
@@ -158,6 +197,42 @@ function _filter_markdown_settings($form, &$form_state, $filter, $format, $defau
     '#type' => 'item',
     '#markup' => theme('item_list', array('items' => $links)),
   );
+  $settings['markdown_wrapper']['headings'] = array(
+    '#type' => 'checkbox',
+    '#default_value' => !empty($filter->settings['headings']),
+    '#title' => t('Disable headings'),
+    '#description' => t('Disable if H1-H6 tags are disabled by HTML filter.'),
+  );
+  $settings['markdown_wrapper']['lists'] = array(
+    '#type' => 'checkbox',
+    '#default_value' => !empty($filter->settings['lists']),
+    '#title' => t('Disable lists'),
+    '#description' => t('Disable if UL, OL or LI tags are disabled by HTML filter. Note that MarkdownExtra footnotes will be disabled as well, since it depends on OLs.'),
+  );
+  $settings['markdown_wrapper']['tables'] = array(
+    '#type' => 'checkbox',
+    '#default_value' => !empty($filter->settings['tables']),
+    '#title' => t('Disable tables'),
+    '#description' => t('Disable if TABLE, TR or TD tags are disabled by HTML filter.'),
+  );
+  $settings['markdown_wrapper']['quotes'] = array(
+    '#type' => 'checkbox',
+    '#default_value' => !empty($filter->settings['quotes']),
+    '#title' => t('Disable blockquotes'),
+    '#description' => t('Disable if BLOCKQUOTE tags are disabled by HTML filter.'),
+  );
+  $settings['markdown_wrapper']['snippets'] = array(
+    '#type' => 'checkbox',
+    '#default_value' => !empty($filter->settings['snippets']),
+    '#title' => t('Disable code snippets'),
+    '#description' => t('Disable if PRE tags are disabled by HTML filter.'),
+  );
+  $settings['markdown_wrapper']['deflists'] = array(
+    '#type' => 'checkbox',
+    '#default_value' => !empty($filter->settings['deflists']),
+    '#title' => t('Disable definition lists'),
+    '#description' => t('Disable if DL, DT or DD tags are disabled by HTML filter.'),
+  );
 
   return $settings;
 }
-- 
1.8.2

