From 4489bdf0c4f727601163f1d1192c26a02131b160 Mon Sep 17 00:00:00 2001 From: leosw Date: Mon, 8 Apr 2019 21:06:36 +0200 Subject: [PATCH 01/17] Initial commit for poi model --- models/d.poi.php | 103 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 models/d.poi.php diff --git a/models/d.poi.php b/models/d.poi.php new file mode 100644 index 0000000..848c954 --- /dev/null +++ b/models/d.poi.php @@ -0,0 +1,103 @@ +populate($row); + return 1; + } + else { + return 0; + } + } + + /***** + ** Populate the object using its ID + *****/ + public function populate($row) { + + $this->$poi_id = $row['poi_id']; + $this->$locale_id = $row['locale_id']; + $this->$source_id = $row['source_id']; + $this->$version_id = $row['version_id']; + $this->$is_public = $row['is_public']; + $this->$permalink = $row['permalink']; + $this->$creation_date = $row['creation_date']; + $this->$name = $row['name']; + $this->$position = $row['position']; + $this->$type = $row['type']; + $this->$locale = $row['locale']; + $this->$source = $row['source']; + $this->$remote_source_id = $row['remote_source_id']; + $this->$author = $row['author']; + $this->$version = $row['version']; + $this->$update_date = $row['update_date']; + $this->$is_archive = $row['is_archive']; + $this->$alt_type = $row['alt_type']; + $this->$is_destroyed = $row['is_destroyed']; + $this->$alt_name = $row['alt_name']; + $this->$alt_position = $row['alt_position']; + $this->$parameters = $row['parameters']; + } + +} + +?> \ No newline at end of file From b234704b9991d11a9a8d2e1ede158d247b348a25 Mon Sep 17 00:00:00 2001 From: elec-log Date: Sun, 22 Mar 2020 14:50:47 +0400 Subject: [PATCH 02/17] Windows ENDL style --- .gitignore | 0 .htaccess | 0 README.md | 0 _ressources/database_drawing | 0 _ressources/logo.svg | 0 controllers/d.admin.php | 0 controllers/d.blog.php | 0 controllers/d.contact.php | 0 controllers/d.map.php | 0 controllers/d.users.php | 0 controllers/d.wiki.php | 0 includes/config.example.php | 0 includes/images.php | 0 includes/routes.php | 0 includes/session.php | 0 index.php | 0 models/d.blog.php | 0 models/d.users.php | 0 models/d.wiki.php | 0 third/Md/Markdown.inc.php | 0 third/Md/Markdown.php | 0 third/Md/MarkdownExtra.inc.php | 0 third/Md/MarkdownExtra.php | 0 third/Md/MarkdownInterface.inc.php | 0 third/Md/MarkdownInterface.php | 0 views/blocks/d.footer.html | 0 views/blocks/d.head.html | 0 views/blocks/d.nav.html | 0 views/css/d.blog.css | 0 views/css/d.index.css | 0 views/css/d.map.css | 0 views/css/d.user.css | 0 views/css/d.wiki.css | 0 views/d.admin.git-pull.html | 0 views/d.admin.html | 0 views/d.admin.logs.html | 0 views/d.blog.edit.html | 0 views/d.blog.list.html | 0 views/d.blog.list.rss | 0 views/d.blog.view.html | 0 views/d.contact.html | 0 views/d.index.html | 0 views/d.map.html | 0 views/d.user.login.html | 0 views/d.user.member_list.html | 0 views/d.user.password_lost.html | 0 views/d.user.profile.edit.html | 0 views/d.user.profile.html | 0 views/d.user.signin.html | 0 views/d.wiki.edit.html | 0 views/d.wiki.view.html | 0 views/fonts/FiraMono-Bold.eot | Bin views/fonts/FiraMono-Bold.otf | Bin views/fonts/FiraSans-Bold.ttf | Bin views/fonts/FiraSans-ExtraLight.eot | Bin views/fonts/FiraSans-ExtraLight.otf | Bin views/fonts/FiraSans-ExtraLight.ttf | Bin views/fonts/FiraSans-Light.eot | Bin views/fonts/FiraSans-Light.otf | Bin views/fonts/FiraSans-Light.ttf | Bin views/fonts/FiraSans-Medium.eot | Bin views/fonts/FiraSans-Medium.otf | Bin views/fonts/FiraSans-Medium.ttf | Bin views/fonts/FiraSans-Regular.eot | Bin views/fonts/FiraSans-Regular.otf | Bin views/fonts/FiraSans-Regular.ttf | Bin views/img/aside.jpg | Bin views/img/favicon.png | Bin views/img/header.svg | 0 views/img/header_rss.svg | 0 views/img/thumb1.jpg | Bin views/img/thumb2.jpg | Bin views/img/thumb3.jpg | Bin views/js/d.avatar.js | 0 views/js/d.captcha.js | 0 views/js/d.header.js | 0 views/js/d.map.js | 0 77 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 .gitignore mode change 100755 => 100644 .htaccess mode change 100755 => 100644 README.md mode change 100755 => 100644 _ressources/database_drawing mode change 100755 => 100644 _ressources/logo.svg mode change 100755 => 100644 controllers/d.admin.php mode change 100755 => 100644 controllers/d.blog.php mode change 100755 => 100644 controllers/d.contact.php mode change 100755 => 100644 controllers/d.map.php mode change 100755 => 100644 controllers/d.users.php mode change 100755 => 100644 controllers/d.wiki.php mode change 100755 => 100644 includes/config.example.php mode change 100755 => 100644 includes/images.php mode change 100755 => 100644 includes/routes.php mode change 100755 => 100644 includes/session.php mode change 100755 => 100644 index.php mode change 100755 => 100644 models/d.blog.php mode change 100755 => 100644 models/d.users.php mode change 100755 => 100644 models/d.wiki.php mode change 100755 => 100644 third/Md/Markdown.inc.php mode change 100755 => 100644 third/Md/Markdown.php mode change 100755 => 100644 third/Md/MarkdownExtra.inc.php mode change 100755 => 100644 third/Md/MarkdownExtra.php mode change 100755 => 100644 third/Md/MarkdownInterface.inc.php mode change 100755 => 100644 third/Md/MarkdownInterface.php mode change 100755 => 100644 views/blocks/d.footer.html mode change 100755 => 100644 views/blocks/d.head.html mode change 100755 => 100644 views/blocks/d.nav.html mode change 100755 => 100644 views/css/d.blog.css mode change 100755 => 100644 views/css/d.index.css mode change 100755 => 100644 views/css/d.map.css mode change 100755 => 100644 views/css/d.user.css mode change 100755 => 100644 views/css/d.wiki.css mode change 100755 => 100644 views/d.admin.git-pull.html mode change 100755 => 100644 views/d.admin.html mode change 100755 => 100644 views/d.admin.logs.html mode change 100755 => 100644 views/d.blog.edit.html mode change 100755 => 100644 views/d.blog.list.html mode change 100755 => 100644 views/d.blog.list.rss mode change 100755 => 100644 views/d.blog.view.html mode change 100755 => 100644 views/d.contact.html mode change 100755 => 100644 views/d.index.html mode change 100755 => 100644 views/d.map.html mode change 100755 => 100644 views/d.user.login.html mode change 100755 => 100644 views/d.user.member_list.html mode change 100755 => 100644 views/d.user.password_lost.html mode change 100755 => 100644 views/d.user.profile.edit.html mode change 100755 => 100644 views/d.user.profile.html mode change 100755 => 100644 views/d.user.signin.html mode change 100755 => 100644 views/d.wiki.edit.html mode change 100755 => 100644 views/d.wiki.view.html mode change 100755 => 100644 views/fonts/FiraMono-Bold.eot mode change 100755 => 100644 views/fonts/FiraMono-Bold.otf mode change 100755 => 100644 views/fonts/FiraSans-Bold.ttf mode change 100755 => 100644 views/fonts/FiraSans-ExtraLight.eot mode change 100755 => 100644 views/fonts/FiraSans-ExtraLight.otf mode change 100755 => 100644 views/fonts/FiraSans-ExtraLight.ttf mode change 100755 => 100644 views/fonts/FiraSans-Light.eot mode change 100755 => 100644 views/fonts/FiraSans-Light.otf mode change 100755 => 100644 views/fonts/FiraSans-Light.ttf mode change 100755 => 100644 views/fonts/FiraSans-Medium.eot mode change 100755 => 100644 views/fonts/FiraSans-Medium.otf mode change 100755 => 100644 views/fonts/FiraSans-Medium.ttf mode change 100755 => 100644 views/fonts/FiraSans-Regular.eot mode change 100755 => 100644 views/fonts/FiraSans-Regular.otf mode change 100755 => 100644 views/fonts/FiraSans-Regular.ttf mode change 100755 => 100644 views/img/aside.jpg mode change 100755 => 100644 views/img/favicon.png mode change 100755 => 100644 views/img/header.svg mode change 100755 => 100644 views/img/header_rss.svg mode change 100755 => 100644 views/img/thumb1.jpg mode change 100755 => 100644 views/img/thumb2.jpg mode change 100755 => 100644 views/img/thumb3.jpg mode change 100755 => 100644 views/js/d.avatar.js mode change 100755 => 100644 views/js/d.captcha.js mode change 100755 => 100644 views/js/d.header.js mode change 100755 => 100644 views/js/d.map.js diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/.htaccess b/.htaccess old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/_ressources/database_drawing b/_ressources/database_drawing old mode 100755 new mode 100644 diff --git a/_ressources/logo.svg b/_ressources/logo.svg old mode 100755 new mode 100644 diff --git a/controllers/d.admin.php b/controllers/d.admin.php old mode 100755 new mode 100644 diff --git a/controllers/d.blog.php b/controllers/d.blog.php old mode 100755 new mode 100644 diff --git a/controllers/d.contact.php b/controllers/d.contact.php old mode 100755 new mode 100644 diff --git a/controllers/d.map.php b/controllers/d.map.php old mode 100755 new mode 100644 diff --git a/controllers/d.users.php b/controllers/d.users.php old mode 100755 new mode 100644 diff --git a/controllers/d.wiki.php b/controllers/d.wiki.php old mode 100755 new mode 100644 diff --git a/includes/config.example.php b/includes/config.example.php old mode 100755 new mode 100644 diff --git a/includes/images.php b/includes/images.php old mode 100755 new mode 100644 diff --git a/includes/routes.php b/includes/routes.php old mode 100755 new mode 100644 diff --git a/includes/session.php b/includes/session.php old mode 100755 new mode 100644 diff --git a/index.php b/index.php old mode 100755 new mode 100644 diff --git a/models/d.blog.php b/models/d.blog.php old mode 100755 new mode 100644 diff --git a/models/d.users.php b/models/d.users.php old mode 100755 new mode 100644 diff --git a/models/d.wiki.php b/models/d.wiki.php old mode 100755 new mode 100644 diff --git a/third/Md/Markdown.inc.php b/third/Md/Markdown.inc.php old mode 100755 new mode 100644 diff --git a/third/Md/Markdown.php b/third/Md/Markdown.php old mode 100755 new mode 100644 diff --git a/third/Md/MarkdownExtra.inc.php b/third/Md/MarkdownExtra.inc.php old mode 100755 new mode 100644 diff --git a/third/Md/MarkdownExtra.php b/third/Md/MarkdownExtra.php old mode 100755 new mode 100644 diff --git a/third/Md/MarkdownInterface.inc.php b/third/Md/MarkdownInterface.inc.php old mode 100755 new mode 100644 diff --git a/third/Md/MarkdownInterface.php b/third/Md/MarkdownInterface.php old mode 100755 new mode 100644 diff --git a/views/blocks/d.footer.html b/views/blocks/d.footer.html old mode 100755 new mode 100644 diff --git a/views/blocks/d.head.html b/views/blocks/d.head.html old mode 100755 new mode 100644 diff --git a/views/blocks/d.nav.html b/views/blocks/d.nav.html old mode 100755 new mode 100644 diff --git a/views/css/d.blog.css b/views/css/d.blog.css old mode 100755 new mode 100644 diff --git a/views/css/d.index.css b/views/css/d.index.css old mode 100755 new mode 100644 diff --git a/views/css/d.map.css b/views/css/d.map.css old mode 100755 new mode 100644 diff --git a/views/css/d.user.css b/views/css/d.user.css old mode 100755 new mode 100644 diff --git a/views/css/d.wiki.css b/views/css/d.wiki.css old mode 100755 new mode 100644 diff --git a/views/d.admin.git-pull.html b/views/d.admin.git-pull.html old mode 100755 new mode 100644 diff --git a/views/d.admin.html b/views/d.admin.html old mode 100755 new mode 100644 diff --git a/views/d.admin.logs.html b/views/d.admin.logs.html old mode 100755 new mode 100644 diff --git a/views/d.blog.edit.html b/views/d.blog.edit.html old mode 100755 new mode 100644 diff --git a/views/d.blog.list.html b/views/d.blog.list.html old mode 100755 new mode 100644 diff --git a/views/d.blog.list.rss b/views/d.blog.list.rss old mode 100755 new mode 100644 diff --git a/views/d.blog.view.html b/views/d.blog.view.html old mode 100755 new mode 100644 diff --git a/views/d.contact.html b/views/d.contact.html old mode 100755 new mode 100644 diff --git a/views/d.index.html b/views/d.index.html old mode 100755 new mode 100644 diff --git a/views/d.map.html b/views/d.map.html old mode 100755 new mode 100644 diff --git a/views/d.user.login.html b/views/d.user.login.html old mode 100755 new mode 100644 diff --git a/views/d.user.member_list.html b/views/d.user.member_list.html old mode 100755 new mode 100644 diff --git a/views/d.user.password_lost.html b/views/d.user.password_lost.html old mode 100755 new mode 100644 diff --git a/views/d.user.profile.edit.html b/views/d.user.profile.edit.html old mode 100755 new mode 100644 diff --git a/views/d.user.profile.html b/views/d.user.profile.html old mode 100755 new mode 100644 diff --git a/views/d.user.signin.html b/views/d.user.signin.html old mode 100755 new mode 100644 diff --git a/views/d.wiki.edit.html b/views/d.wiki.edit.html old mode 100755 new mode 100644 diff --git a/views/d.wiki.view.html b/views/d.wiki.view.html old mode 100755 new mode 100644 diff --git a/views/fonts/FiraMono-Bold.eot b/views/fonts/FiraMono-Bold.eot old mode 100755 new mode 100644 diff --git a/views/fonts/FiraMono-Bold.otf b/views/fonts/FiraMono-Bold.otf old mode 100755 new mode 100644 diff --git a/views/fonts/FiraSans-Bold.ttf b/views/fonts/FiraSans-Bold.ttf old mode 100755 new mode 100644 diff --git a/views/fonts/FiraSans-ExtraLight.eot b/views/fonts/FiraSans-ExtraLight.eot old mode 100755 new mode 100644 diff --git a/views/fonts/FiraSans-ExtraLight.otf b/views/fonts/FiraSans-ExtraLight.otf old mode 100755 new mode 100644 diff --git a/views/fonts/FiraSans-ExtraLight.ttf b/views/fonts/FiraSans-ExtraLight.ttf old mode 100755 new mode 100644 diff --git a/views/fonts/FiraSans-Light.eot b/views/fonts/FiraSans-Light.eot old mode 100755 new mode 100644 diff --git a/views/fonts/FiraSans-Light.otf b/views/fonts/FiraSans-Light.otf old mode 100755 new mode 100644 diff --git a/views/fonts/FiraSans-Light.ttf b/views/fonts/FiraSans-Light.ttf old mode 100755 new mode 100644 diff --git a/views/fonts/FiraSans-Medium.eot b/views/fonts/FiraSans-Medium.eot old mode 100755 new mode 100644 diff --git a/views/fonts/FiraSans-Medium.otf b/views/fonts/FiraSans-Medium.otf old mode 100755 new mode 100644 diff --git a/views/fonts/FiraSans-Medium.ttf b/views/fonts/FiraSans-Medium.ttf old mode 100755 new mode 100644 diff --git a/views/fonts/FiraSans-Regular.eot b/views/fonts/FiraSans-Regular.eot old mode 100755 new mode 100644 diff --git a/views/fonts/FiraSans-Regular.otf b/views/fonts/FiraSans-Regular.otf old mode 100755 new mode 100644 diff --git a/views/fonts/FiraSans-Regular.ttf b/views/fonts/FiraSans-Regular.ttf old mode 100755 new mode 100644 diff --git a/views/img/aside.jpg b/views/img/aside.jpg old mode 100755 new mode 100644 diff --git a/views/img/favicon.png b/views/img/favicon.png old mode 100755 new mode 100644 diff --git a/views/img/header.svg b/views/img/header.svg old mode 100755 new mode 100644 diff --git a/views/img/header_rss.svg b/views/img/header_rss.svg old mode 100755 new mode 100644 diff --git a/views/img/thumb1.jpg b/views/img/thumb1.jpg old mode 100755 new mode 100644 diff --git a/views/img/thumb2.jpg b/views/img/thumb2.jpg old mode 100755 new mode 100644 diff --git a/views/img/thumb3.jpg b/views/img/thumb3.jpg old mode 100755 new mode 100644 diff --git a/views/js/d.avatar.js b/views/js/d.avatar.js old mode 100755 new mode 100644 diff --git a/views/js/d.captcha.js b/views/js/d.captcha.js old mode 100755 new mode 100644 diff --git a/views/js/d.header.js b/views/js/d.header.js old mode 100755 new mode 100644 diff --git a/views/js/d.map.js b/views/js/d.map.js old mode 100755 new mode 100644 From fb0f9fa664eb74ec781fc17153bee9bd619e9d7c Mon Sep 17 00:00:00 2001 From: leosw Date: Sun, 22 Mar 2020 15:04:03 +0400 Subject: [PATCH 03/17] Update Markdown PHP --- third/Md/Markdown.inc.php | 10 +- third/Md/Markdown.php | 1417 +++++++++++++---------- third/Md/MarkdownExtra.inc.php | 10 +- third/Md/MarkdownExtra.php | 1668 ++++++++++++++++------------ third/Md/MarkdownInterface.inc.php | 10 +- third/Md/MarkdownInterface.php | 60 +- 6 files changed, 1870 insertions(+), 1305 deletions(-) diff --git a/third/Md/Markdown.inc.php b/third/Md/Markdown.inc.php index 8c28109..e2bd380 100644 --- a/third/Md/Markdown.inc.php +++ b/third/Md/Markdown.inc.php @@ -1,10 +1,10 @@ -# -# Original Markdown -# Copyright (c) 2004-2006 John Gruber -# -# +/** + * Markdown - A text-to-HTML conversion tool for web writers + * + * @package php-markdown + * @author Michel Fortin + * @copyright 2004-2019 Michel Fortin + * @copyright (Original Markdown) 2004-2006 John Gruber + */ + namespace Michelf; - -# -# Markdown Parser Class -# - +/** + * Markdown Parser Class + */ class Markdown implements MarkdownInterface { + /** + * Define the package version + * @var string + */ + const MARKDOWNLIB_VERSION = "1.9.0"; - ### Version ### - - const MARKDOWNLIB_VERSION = "1.6.0"; - - ### Simple Function Interface ### - + /** + * Simple function interface - Initialize the parser and return the result + * of its transform method. This will work fine for derived classes too. + * + * @api + * + * @param string $text + * @return string + */ public static function defaultTransform($text) { - # - # Initialize the parser and return the result of its transform method. - # This will work fine for derived classes too. - # - # Take parser class on which this function was called. + // Take parser class on which this function was called. $parser_class = \get_called_class(); - # try to take parser from the static parser list + // Try to take parser from the static parser list static $parser_list; $parser =& $parser_list[$parser_class]; - # create the parser it not already set - if (!$parser) + // Create the parser it not already set + if (!$parser) { $parser = new $parser_class; + } - # Transform text using parser. + // Transform text using parser. return $parser->transform($text); } - ### Configuration Variables ### + /** + * Configuration variables + */ - # Change to ">" for HTML output. + /** + * Change to ">" for HTML output. + * @var string + */ public $empty_element_suffix = " />"; + + /** + * The width of indentation of the output markup + * @var int + */ public $tab_width = 4; - - # Change to `true` to disallow markup or entities. - public $no_markup = false; + + /** + * Change to `true` to disallow markup or entities. + * @var boolean + */ + public $no_markup = false; public $no_entities = false; - - # Predefined urls and titles for reference links and images. - public $predef_urls = array(); + + + /** + * Change to `true` to enable line breaks on \n without two trailling spaces + * @var boolean + */ + public $hard_wrap = false; + + /** + * Predefined URLs and titles for reference links and images. + * @var array + */ + public $predef_urls = array(); public $predef_titles = array(); - # Optional filter function for URLs + /** + * Optional filter function for URLs + * @var callable|null + */ public $url_filter_func = null; - # Optional header id="" generation callback function. + /** + * Optional header id="" generation callback function. + * @var callable|null + */ public $header_id_func = null; - - # Optional function for converting code block content to HTML + + /** + * Optional function for converting code block content to HTML + * @var callable|null + */ public $code_block_content_func = null; - # Class attribute to toggle "enhanced ordered list" behaviour - # setting this to true will allow ordered lists to start from the index - # number that is defined first. For example: - # 2. List item two - # 3. List item three - # - # becomes - #
    - #
  1. List item two
  2. - #
  3. List item three
  4. - #
+ /** + * Optional function for converting code span content to HTML. + * @var callable|null + */ + public $code_span_content_func = null; + + /** + * Class attribute to toggle "enhanced ordered list" behaviour + * setting this to true will allow ordered lists to start from the index + * number that is defined first. + * + * For example: + * 2. List item two + * 3. List item three + * + * Becomes: + *
    + *
  1. List item two
  2. + *
  3. List item three
  4. + *
+ * + * @var bool + */ public $enhanced_ordered_list = false; - ### Parser Implementation ### + /** + * Parser implementation + */ - # Regex to match balanced [brackets]. - # Needed to insert a maximum bracked depth while converting to PHP. + /** + * Regex to match balanced [brackets]. + * Needed to insert a maximum bracked depth while converting to PHP. + * @var int + */ protected $nested_brackets_depth = 6; protected $nested_brackets_re; - + protected $nested_url_parenthesis_depth = 4; protected $nested_url_parenthesis_re; - # Table of hash values for escaped characters: + /** + * Table of hash values for escaped characters: + * @var string + */ protected $escape_chars = '\`*_{}[]()>#+-.!'; protected $escape_chars_re; - + /** + * Constructor function. Initialize appropriate member variables. + * @return void + */ public function __construct() { - # - # Constructor function. Initialize appropriate member variables. - # $this->_initDetab(); $this->prepareItalicsAndBold(); - - $this->nested_brackets_re = + + $this->nested_brackets_re = str_repeat('(?>[^\[\]]+|\[', $this->nested_brackets_depth). str_repeat('\])*', $this->nested_brackets_depth); - - $this->nested_url_parenthesis_re = + + $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).']'; - - # Sort document, block, and span gamut in ascendent priority order. + + // Sort document, block, and span gamut in ascendent priority order. asort($this->document_gamut); asort($this->block_gamut); asort($this->span_gamut); } - # Internal hashes used during transformation. - protected $urls = array(); - protected $titles = array(); + /** + * Internal hashes used during transformation. + * @var array + */ + protected $urls = array(); + protected $titles = array(); protected $html_hashes = array(); - - # Status flag to avoid invalid nesting. + + /** + * Status flag to avoid invalid nesting. + * @var boolean + */ protected $in_anchor = false; - - + + /** + * Status flag to avoid invalid nesting. + * @var boolean + */ + protected $in_emphasis_processing = false; + + /** + * Called before the transformation process starts to setup parser states. + * @return void + */ protected function setup() { - # - # Called before the transformation process starts to setup parser - # states. - # - # Clear global hashes. - $this->urls = $this->predef_urls; - $this->titles = $this->predef_titles; + // Clear global hashes. + $this->urls = $this->predef_urls; + $this->titles = $this->predef_titles; $this->html_hashes = array(); - - $this->in_anchor = false; + $this->in_anchor = false; + $this->in_emphasis_processing = false; } - + + /** + * Called after the transformation process to clear any variable which may + * be taking up memory unnecessarly. + * @return void + */ protected function teardown() { - # - # Called after the transformation process to clear any variable - # which may be taking up memory unnecessarly. - # - $this->urls = array(); - $this->titles = array(); + $this->urls = array(); + $this->titles = array(); $this->html_hashes = array(); } - + /** + * Main function. Performs some preprocessing on the input text and pass + * it through the document gamut. + * + * @api + * + * @param string $text + * @return string + */ public function transform($text) { - # - # Main function. Performs some preprocessing on the input text - # and pass it through the document gamut. - # $this->setup(); - + # Remove UTF-8 BOM and marker character in input, if present. $text = preg_replace('{^\xEF\xBB\xBF|\x1A}', '', $text); @@ -186,28 +255,33 @@ class Markdown implements MarkdownInterface { foreach ($this->document_gamut as $method => $priority) { $text = $this->$method($text); } - + $this->teardown(); return $text . "\n"; } - + + /** + * Define the document gamut + * @var array + */ protected $document_gamut = array( - # Strip link definitions, store in hashes. + // Strip link definitions, store in hashes. "stripLinkDefinitions" => 20, - "runBasicBlockGamut" => 30, - ); - + ); + /** + * Strips link definitions from text, stores the URLs and titles in + * hash references + * @param string $text + * @return string + */ protected function stripLinkDefinitions($text) { - # - # Strips link definitions from text, stores the URLs and titles in - # hash references. - # + $less_than_tab = $this->tab_width - 1; - # Link defs are in the form: ^[id]: url "optional title" + // Link defs are in the form: ^[id]: url "optional title" $text = preg_replace_callback('{ ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1 [ ]* @@ -231,43 +305,58 @@ class Markdown implements MarkdownInterface { (?:\n+|\Z) }xm', array($this, '_stripLinkDefinitions_callback'), - $text); + $text + ); return $text; } + + /** + * The callback to strip link definitions + * @param array $matches + * @return string + */ protected 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 ''; # String that will replace the block + return ''; // String that will replace the block } - + /** + * Hashify HTML blocks + * @param string $text + * @return string + */ protected function hashHTMLBlocks($text) { - if ($this->no_markup) return $text; + if ($this->no_markup) { + return $text; + } $less_than_tab = $this->tab_width - 1; - # Hashify HTML blocks: - # We only want to do this for block-level HTML tags, such as headers, - # lists, and tables. That's because we still want to wrap

s around - # "paragraphs" that are wrapped in non-block-level tags, such as anchors, - # phrase emphasis, and spans. The list of tags we're looking for is - # hard-coded: - # - # * List "a" is made of tags which can be both inline or block-level. - # These will be treated block-level when the start tag is alone on - # its line, otherwise they're not matched here and will be taken as - # inline later. - # * List "b" is made of tags which are always block-level; - # + /** + * Hashify HTML blocks: + * + * We only want to do this for block-level HTML tags, such as headers, + * lists, and tables. That's because we still want to wrap

s around + * "paragraphs" that are wrapped in non-block-level tags, such as + * anchors, phrase emphasis, and spans. The list of tags we're looking + * for is hard-coded: + * + * * List "a" is made of tags which can be both inline or block-level. + * These will be treated block-level when the start tag is alone on + * its line, otherwise they're not matched here and will be taken as + * inline later. + * * List "b" is made of tags which are always block-level; + */ $block_tags_a_re = 'ins|del'; $block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'. 'script|noscript|style|form|fieldset|iframe|math|svg|'. 'article|section|nav|aside|hgroup|header|footer|'. 'figure'; - # Regular expression for the content of a block tag. + // Regular expression for the content of a block tag. $nested_tags_level = 4; $attr = ' (?> # optional tag attributes @@ -281,7 +370,7 @@ class Markdown implements MarkdownInterface { | \'[^\']*\' # text inside single quotes (tolerate ">") )* - )? + )? '; $content = str_repeat(' @@ -293,29 +382,32 @@ class Markdown implements MarkdownInterface { (?> /> | - >', $nested_tags_level). # end of opening tag - '.*?'. # last level nested tag content + >', $nested_tags_level). // end of opening tag + '.*?'. // last level nested tag content str_repeat(' # closing nested tag ) - | + | <(?!/\2\s*> # other tags with a different name ) )*', $nested_tags_level); $content2 = str_replace('\2', '\3', $content); - # First, look for nested blocks, e.g.: - #

- #
- # tags for inner block must be indented. - #
- #
- # - # The outermost tags must start at the left margin for this to match, and - # the inner nested divs must be indented. - # We need to do this before the next, more liberal match, because the next - # match will start at the first `
` and stop at the first `
`. + /** + * First, look for nested blocks, e.g.: + *
+ *
+ * tags for inner block must be indented. + *
+ *
+ * + * The outermost tags must start at the left margin for this to match, + * and the inner nested divs must be indented. + * We need to do this before the next, more liberal match, because the + * next match will start at the first `
` and stop at the + * first `
`. + */ $text = preg_replace_callback('{(?> (?> (?<=\n) # Starting on its own line @@ -324,9 +416,9 @@ class Markdown implements MarkdownInterface { ) ( # save in $1 - # Match from `\n` to `\n`, handling nested tags + # Match from `\n` to `\n`, handling nested tags # in between. - + [ ]{0,'.$less_than_tab.'} <('.$block_tags_b_re.')# start tag = $2 '.$attr.'> # attributes followed by > and \n @@ -344,28 +436,28 @@ class Markdown implements MarkdownInterface { # the matching end tag [ ]* # trailing spaces/tabs (?=\n+|\Z) # followed by a newline or end of document - - | # Special case just for
. It was easier to make a special + + | # Special case just for
. 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 (hashBlock($text); return "\n\n$key\n\n"; } - - + + /** + * Called whenever a tag must be hashed when a function insert an atomic + * element in the text stream. Passing $text to through this function gives + * a unique text-token which will be reverted back when calling unhash. + * + * The $boundary argument specify what character should be used to surround + * the token. By convension, "B" is used for block elements that needs not + * to be wrapped into paragraph tags at the end, ":" is used for elements + * that are word separators and "X" is used in the general case. + * + * @param string $text + * @param string $boundary + * @return string + */ protected function hashPart($text, $boundary = 'X') { - # - # Called whenever a tag must be hashed when a function insert an atomic - # element in the text stream. Passing $text to through this function gives - # a unique text-token which will be reverted back when calling unhash. - # - # The $boundary argument specify what character should be used to surround - # the token. By convension, "B" is used for block elements that needs not - # to be wrapped into paragraph tags at the end, ":" is used for elements - # that are word separators and "X" is used in the general case. - # - # Swap back any tag hash found in $text so we do not have to `unhash` - # multiple times at the end. + // Swap back any tag hash found in $text so we do not have to `unhash` + // multiple times at the end. $text = $this->unhash($text); - - # Then hash the block. + + // Then hash the block. static $i = 0; $key = "$boundary\x1A" . ++$i . $boundary; $this->html_hashes[$key] = $text; - return $key; # String that will replace the tag. + return $key; // String that will replace the tag. } - + /** + * Shortcut function for hashPart with block-level boundaries. + * @param string $text + * @return string + */ protected function hashBlock($text) { - # - # Shortcut function for hashPart with block-level boundaries. - # return $this->hashPart($text, 'B'); } - + /** + * Define the block gamut - these are all the transformations that form + * block-level tags like paragraphs, headers, and list items. + * @var array + */ protected $block_gamut = array( - # - # These are all the transformations that form block-level - # tags like paragraphs, headers, and list items. - # "doHeaders" => 10, "doHorizontalRules" => 20, - "doLists" => 40, "doCodeBlocks" => 50, "doBlockQuotes" => 60, - ); + ); + /** + * Run block gamut tranformations. + * + * We need to escape raw HTML in Markdown source before doing anything + * else. This need to be done for each block, and not only at the + * begining in the Markdown function since hashed blocks can be part of + * list items and could have been indented. Indented blocks would have + * been seen as a code block in a previous pass of hashHTMLBlocks. + * + * @param string $text + * @return string + */ protected function runBlockGamut($text) { - # - # Run block gamut tranformations. - # - # We need to escape raw HTML in Markdown source before doing anything - # else. This need to be done for each block, and not only at the - # begining in the Markdown function since hashed blocks can be part of - # list items and could have been indented. Indented blocks would have - # been seen as a code block in a previous pass of hashHTMLBlocks. $text = $this->hashHTMLBlocks($text); - return $this->runBasicBlockGamut($text); } - + + /** + * Run block gamut tranformations, without hashing HTML blocks. This is + * useful when HTML blocks are known to be already hashed, like in the first + * whole-document pass. + * + * @param string $text + * @return string + */ protected function runBasicBlockGamut($text) { - # - # Run block gamut tranformations, without hashing HTML blocks. This is - # useful when HTML blocks are known to be already hashed, like in the first - # whole-document pass. - # + foreach ($this->block_gamut as $method => $priority) { $text = $this->$method($text); } - - # Finally form paragraph and restore hashed blocks. + + // Finally form paragraph and restore hashed blocks. $text = $this->formParagraphs($text); return $text; } - - + + /** + * Convert horizontal rules + * @param string $text + * @return string + */ protected function doHorizontalRules($text) { - # Do Horizontal Rules: return preg_replace( '{ ^[ ]{0,3} # Leading space @@ -477,67 +589,82 @@ class Markdown implements MarkdownInterface { [ ]* # Tailing spaces $ # End of line. }mx', - "\n".$this->hashBlock("empty_element_suffix")."\n", - $text); + "\n".$this->hashBlock("empty_element_suffix")."\n", + $text + ); } - + /** + * These are all the transformations that occur *within* block-level + * tags like paragraphs, headers, and list items. + * @var array + */ protected $span_gamut = array( - # - # These are all the transformations that occur *within* block-level - # tags like paragraphs, headers, and list items. - # - # Process character escapes, code spans, and inline HTML - # in one shot. + // Process character escapes, code spans, and inline HTML + // in one shot. "parseSpan" => -30, - - # Process anchor and image tags. Images must come first, - # because ![foo][f] looks like an anchor. + // Process anchor and image tags. Images must come first, + // because ![foo][f] looks like an anchor. "doImages" => 10, "doAnchors" => 20, - - # Make links out of things like `` - # Must come after doAnchors, because you can use < and > - # delimiters in inline links like [this](). + // Make links out of things like `` + // Must come after doAnchors, because you can use < and > + // delimiters in inline links like [this](). "doAutoLinks" => 30, "encodeAmpsAndAngles" => 40, - "doItalicsAndBold" => 50, "doHardBreaks" => 60, - ); + ); + /** + * Run span gamut transformations + * @param string $text + * @return string + */ protected function runSpanGamut($text) { - # - # Run span gamut tranformations. - # foreach ($this->span_gamut as $method => $priority) { $text = $this->$method($text); } return $text; } - - + + /** + * Do hard breaks + * @param string $text + * @return string + */ protected function doHardBreaks($text) { - # Do hard breaks: - return preg_replace_callback('/ {2,}\n/', - array($this, '_doHardBreaks_callback'), $text); + if ($this->hard_wrap) { + return preg_replace_callback('/ *\n/', + array($this, '_doHardBreaks_callback'), $text); + } else { + return preg_replace_callback('/ {2,}\n/', + array($this, '_doHardBreaks_callback'), $text); + } } + + /** + * Trigger part hashing for the hard break (callback method) + * @param array $matches + * @return string + */ protected function _doHardBreaks_callback($matches) { return $this->hashPart("empty_element_suffix\n"); } - + /** + * Turn Markdown link shortcuts into XHTML tags. + * @param string $text + * @return string + */ protected function doAnchors($text) { - # - # Turn Markdown link shortcuts into XHTML tags. - # - if ($this->in_anchor) return $text; + if ($this->in_anchor) { + return $text; + } $this->in_anchor = true; - - # - # First, handle reference-style links: [link text] [id] - # + + // First, handle reference-style links: [link text] [id] $text = preg_replace_callback('{ ( # wrap whole match in $1 \[ @@ -554,9 +681,7 @@ class Markdown implements MarkdownInterface { }xs', array($this, '_doAnchors_reference_callback'), $text); - # - # Next, inline-style links: [link text](url "optional title") - # + // Next, inline-style links: [link text](url "optional title") $text = preg_replace_callback('{ ( # wrap whole match in $1 \[ @@ -581,11 +706,9 @@ class Markdown implements MarkdownInterface { }xs', array($this, '_doAnchors_inline_callback'), $text); - # - # Last, handle reference-style shortcuts: [link text] - # These must come last in case you've also got [link text][1] - # or [link text](/foo) - # + // Last, handle reference-style shortcuts: [link text] + // These must come last in case you've also got [link text][1] + // or [link text](/foo) $text = preg_replace_callback('{ ( # wrap whole match in $1 \[ @@ -598,50 +721,61 @@ class Markdown implements MarkdownInterface { $this->in_anchor = false; return $text; } + + /** + * Callback method to parse referenced anchors + * @param string $matches + * @return string + */ protected function _doAnchors_reference_callback($matches) { $whole_match = $matches[1]; $link_text = $matches[2]; $link_id =& $matches[3]; if ($link_id == "") { - # for shortcut links like [this][] or [this]. + // for shortcut links like [this][] or [this]. $link_id = $link_text; } - - # lower-case and turn embedded newlines into spaces + + // lower-case and turn embedded newlines into spaces $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->encodeURLAttribute($url); - + $result = "titles[$link_id] ) ) { $title = $this->titles[$link_id]; $title = $this->encodeAttribute($title); $result .= " title=\"$title\""; } - + $link_text = $this->runSpanGamut($link_text); $result .= ">$link_text"; $result = $this->hashPart($result); - } - else { + } else { $result = $whole_match; } return $result; } + + /** + * Callback method to parse inline anchors + * @param string $matches + * @return string + */ protected function _doAnchors_inline_callback($matches) { - $whole_match = $matches[1]; $link_text = $this->runSpanGamut($matches[2]); - $url = $matches[3] == '' ? $matches[4] : $matches[3]; + $url = $matches[3] === '' ? $matches[4] : $matches[3]; $title =& $matches[7]; - // if the URL was of the form it got caught by the HTML - // tag parser and hashed. Need to reverse the process before using the URL. + // If the URL was of the form it got caught by the HTML + // tag parser and hashed. Need to reverse the process before using + // the URL. $unhashed = $this->unhash($url); - if ($unhashed != $url) + if ($unhashed !== $url) $url = preg_replace('/^<(.*)>$/', '\1', $unhashed); $url = $this->encodeURLAttribute($url); @@ -651,21 +785,20 @@ class Markdown implements MarkdownInterface { $title = $this->encodeAttribute($title); $result .= " title=\"$title\""; } - + $link_text = $this->runSpanGamut($link_text); $result .= ">$link_text"; return $this->hashPart($result); } - + /** + * Turn Markdown image shortcuts into tags. + * @param string $text + * @return string + */ protected function doImages($text) { - # - # Turn Markdown image shortcuts into tags. - # - # - # First, handle reference-style labeled images: ![alt text][id] - # + // First, handle reference-style labeled images: ![alt text][id] $text = preg_replace_callback('{ ( # wrap whole match in $1 !\[ @@ -680,13 +813,11 @@ class Markdown implements MarkdownInterface { \] ) - }xs', + }xs', array($this, '_doImages_reference_callback'), $text); - # - # Next, handle inline images: ![alt text](url "optional title") - # Don't forget: encode * and _ - # + // Next, handle inline images: ![alt text](url "optional title") + // Don't forget: encode * and _ $text = preg_replace_callback('{ ( # wrap whole match in $1 !\[ @@ -714,13 +845,19 @@ class Markdown implements MarkdownInterface { return $text; } + + /** + * Callback to parse references image tags + * @param array $matches + * @return string + */ protected 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); # for shortcut links like ![this][]. + $link_id = strtolower($alt_text); // for shortcut links like ![this][]. } $alt_text = $this->encodeAttribute($alt_text); @@ -734,14 +871,19 @@ class Markdown implements MarkdownInterface { } $result .= $this->empty_element_suffix; $result = $this->hashPart($result); - } - else { - # If there's no such link ID, leave intact: + } else { + // If there's no such link ID, leave intact: $result = $whole_match; } return $result; } + + /** + * Callback to parse inline image tags + * @param array $matches + * @return string + */ protected function _doImages_inline_callback($matches) { $whole_match = $matches[1]; $alt_text = $matches[2]; @@ -753,32 +895,38 @@ class Markdown implements MarkdownInterface { $result = "\"$alt_text\"";encodeAttribute($title); - $result .= " title=\"$title\""; # $title already quoted + $result .= " title=\"$title\""; // $title already quoted } $result .= $this->empty_element_suffix; return $this->hashPart($result); } - + /** + * Parse Markdown heading elements to HTML + * @param string $text + * @return string + */ protected function doHeaders($text) { - # Setext-style headers: - # Header 1 - # ======== - # - # Header 2 - # -------- - # + /** + * Setext-style headers: + * Header 1 + * ======== + * + * Header 2 + * -------- + */ $text = preg_replace_callback('{ ^(.+?)[ ]*\n(=+|-+)[ ]*\n+ }mx', array($this, '_doHeaders_callback_setext'), $text); - # atx-style headers: - # # Header 1 - # ## Header 2 - # ## Header 2 with closing hashes ## - # ... - # ###### Header 6 - # + /** + * atx-style headers: + * # Header 1 + * ## Header 2 + * ## Header 2 with closing hashes ## + * ... + * ###### Header 6 + */ $text = preg_replace_callback('{ ^(\#{1,6}) # $1 = string of #\'s [ ]* @@ -792,22 +940,33 @@ class Markdown implements MarkdownInterface { return $text; } + /** + * Setext header parsing callback + * @param array $matches + * @return string + */ protected function _doHeaders_callback_setext($matches) { - # Terrible hack to check we haven't found an empty list item. - if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1])) + // Terrible hack to check we haven't found an empty list item. + if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1])) { return $matches[0]; - - $level = $matches[2]{0} == '=' ? 1 : 2; + } - # id attribute generation + $level = $matches[2][0] == '=' ? 1 : 2; + + // ID attribute generation $idAtt = $this->_generateIdFromHeaderValue($matches[1]); $block = "".$this->runSpanGamut($matches[1]).""; return "\n" . $this->hashBlock($block) . "\n\n"; } - protected function _doHeaders_callback_atx($matches) { - # id attribute generation + /** + * ATX header parsing callback + * @param array $matches + * @return string + */ + protected function _doHeaders_callback_atx($matches) { + // ID attribute generation $idAtt = $this->_generateIdFromHeaderValue($matches[2]); $level = strlen($matches[1]); @@ -815,30 +974,37 @@ class Markdown implements MarkdownInterface { return "\n" . $this->hashBlock($block) . "\n\n"; } + /** + * If a header_id_func property is set, we can use it to automatically + * generate an id attribute. + * + * This method returns a string in the form id="foo", or an empty string + * otherwise. + * @param string $headerValue + * @return string + */ protected function _generateIdFromHeaderValue($headerValue) { - - # if a header_id_func property is set, we can use it to automatically - # generate an id attribute. - # - # This method returns a string in the form id="foo", or an empty string - # otherwise. if (!is_callable($this->header_id_func)) { return ""; } + $idValue = call_user_func($this->header_id_func, $headerValue); - if (!$idValue) return ""; + if (!$idValue) { + return ""; + } return ' id="' . $this->encodeAttribute($idValue) . '"'; - } + /** + * Form HTML ordered (numbered) and unordered (bulleted) lists. + * @param string $text + * @return string + */ protected function doLists($text) { - # - # Form HTML ordered (numbered) and unordered (bulleted) lists. - # $less_than_tab = $this->tab_width - 1; - # Re-usable patterns to match list item bullets and number markers: + // Re-usable patterns to match list item bullets and number markers: $marker_ul_re = '[*+-]'; $marker_ol_re = '\d+[\.]'; @@ -848,7 +1014,7 @@ class Markdown implements MarkdownInterface { ); foreach ($markers_relist as $marker_re => $other_marker_re) { - # Re-usable pattern to match any entirel ul or ol list: + // Re-usable pattern to match any entirel ul or ol list: $whole_list_re = ' ( # $1 = whole list ( # $2 @@ -875,18 +1041,17 @@ class Markdown implements MarkdownInterface { ) ) '; // mx - - # We use a different prefix before nested lists than top-level lists. - # See extended comment in _ProcessListItems(). - + + // We use a different prefix before nested lists than top-level lists. + //See extended comment in _ProcessListItems(). + if ($this->list_level) { $text = preg_replace_callback('{ ^ '.$whole_list_re.' }mx', array($this, '_doLists_callback'), $text); - } - else { + } else { $text = preg_replace_callback('{ (?:(?<=\n)\n|\A\n?) # Must eat the newline '.$whole_list_re.' @@ -897,8 +1062,14 @@ class Markdown implements MarkdownInterface { return $text; } + + /** + * List parsing callback + * @param array $matches + * @return string + */ protected function _doLists_callback($matches) { - # Re-usable patterns to match list item bullets and number markers: + // Re-usable patterns to match list item bullets and number markers: $marker_ul_re = '[*+-]'; $marker_ol_re = '\d+[\.]'; $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)"; @@ -914,7 +1085,7 @@ class Markdown implements MarkdownInterface { $ol_start = 1; if ($this->enhanced_ordered_list) { - # Get the start number for ordered list. + // Get the start number for ordered list. if ($list_type == 'ol') { $ol_start_array = array(); $ol_start_check = preg_match("/$marker_ol_start_re/", $matches[4], $ol_start_array); @@ -932,37 +1103,45 @@ class Markdown implements MarkdownInterface { return "\n". $result ."\n\n"; } + /** + * Nesting tracker for list levels + * @var integer + */ protected $list_level = 0; + /** + * Process the contents of a single ordered or unordered list, splitting it + * into individual list items. + * @param string $list_str + * @param string $marker_any_re + * @return string + */ protected function processListItems($list_str, $marker_any_re) { - # - # Process the contents of a single ordered or unordered list, splitting it - # into individual list items. - # - # The $this->list_level global keeps track of when we're inside a list. - # Each time we enter a list, we increment it; when we leave a list, - # we decrement. If it's zero, we're not in a list anymore. - # - # We do this because when we're not inside a list, we want to treat - # something like this: - # - # I recommend upgrading to version - # 8. Oops, now this line is treated - # as a sub-list. - # - # As a single paragraph, despite the fact that the second line starts - # with a digit-period-space sequence. - # - # Whereas when we're inside a list (or sub-list), that line will be - # treated as the start of a sub-list. What a kludge, huh? This is - # an aspect of Markdown's syntax that's hard to parse perfectly - # without resorting to mind-reading. Perhaps the solution is to - # change the syntax rules such that sub-lists must start with a - # starting cardinal number; e.g. "1." or "a.". - + /** + * The $this->list_level global keeps track of when we're inside a list. + * Each time we enter a list, we increment it; when we leave a list, + * we decrement. If it's zero, we're not in a list anymore. + * + * We do this because when we're not inside a list, we want to treat + * something like this: + * + * I recommend upgrading to version + * 8. Oops, now this line is treated + * as a sub-list. + * + * As a single paragraph, despite the fact that the second line starts + * with a digit-period-space sequence. + * + * Whereas when we're inside a list (or sub-list), that line will be + * treated as the start of a sub-list. What a kludge, huh? This is + * an aspect of Markdown's syntax that's hard to parse perfectly + * without resorting to mind-reading. Perhaps the solution is to + * change the syntax rules such that sub-lists must start with a + * starting cardinal number; e.g. "1." or "a.". + */ $this->list_level++; - # trim trailing blank lines: + // Trim trailing blank lines: $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str); $list_str = preg_replace_callback('{ @@ -980,6 +1159,12 @@ class Markdown implements MarkdownInterface { $this->list_level--; return $list_str; } + + /** + * List item parsing callback + * @param array $matches + * @return string + */ protected function _processListItems_callback($matches) { $item = $matches[4]; $leading_line =& $matches[1]; @@ -987,28 +1172,27 @@ class Markdown implements MarkdownInterface { $marker_space = $matches[3]; $tailing_blank_line =& $matches[5]; - if ($leading_line || $tailing_blank_line || + if ($leading_line || $tailing_blank_line || preg_match('/\n{2,}/', $item)) { - # Replace marker with the appropriate whitespace indentation + // Replace marker with the appropriate whitespace indentation $item = $leading_space . str_repeat(' ', strlen($marker_space)) . $item; $item = $this->runBlockGamut($this->outdent($item)."\n"); - } - else { - # Recursion for sub-lists: + } else { + // Recursion for sub-lists: $item = $this->doLists($this->outdent($item)); - $item = preg_replace('/\n+$/', '', $item); - $item = $this->runSpanGamut($item); + $item = $this->formParagraphs($item, false); } return "
  • " . $item . "
  • \n"; } - + /** + * Process Markdown `
    ` blocks.
    +	 * @param  string $text
    +	 * @return string
    +	 */
     	protected function doCodeBlocks($text) {
    -	#
    -	#	Process Markdown `
    ` blocks.
    -	#
     		$text = preg_replace_callback('{
     				(?:\n\n|\A\n?)
     				(	            # $1 = the code block -- one or more lines, starting with a space/tab
    @@ -1023,11 +1207,17 @@ class Markdown implements MarkdownInterface {
     
     		return $text;
     	}
    +
    +	/**
    +	 * Code block parsing callback
    +	 * @param  array $matches
    +	 * @return string
    +	 */
     	protected function _doCodeBlocks_callback($matches) {
     		$codeblock = $matches[1];
     
     		$codeblock = $this->outdent($codeblock);
    -		if ($this->code_block_content_func) {
    +		if (is_callable($this->code_block_content_func)) {
     			$codeblock = call_user_func($this->code_block_content_func, $codeblock, "");
     		} else {
     			$codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
    @@ -1037,96 +1227,126 @@ class Markdown implements MarkdownInterface {
     		$codeblock = preg_replace('/\A\n+|\n+\z/', '', $codeblock);
     
     		$codeblock = "
    $codeblock\n
    "; - return "\n\n".$this->hashBlock($codeblock)."\n\n"; + return "\n\n" . $this->hashBlock($codeblock) . "\n\n"; } - + /** + * Create a code span markup for $code. Called from handleSpanToken. + * @param string $code + * @return string + */ protected function makeCodeSpan($code) { - # - # Create a code span markup for $code. Called from handleSpanToken. - # - $code = htmlspecialchars(trim($code), ENT_NOQUOTES); + if (is_callable($this->code_span_content_func)) { + $code = call_user_func($this->code_span_content_func, $code); + } else { + $code = htmlspecialchars(trim($code), ENT_NOQUOTES); + } return $this->hashPart("$code"); } - + /** + * Define the emphasis operators with their regex matches + * @var array + */ protected $em_relist = array( '' => '(?:(? '(? '(? '(?:(? '(? '(? '(?:(? '(? '(?em_relist as $em => $em_re) { foreach ($this->strong_relist as $strong => $strong_re) { - # Construct list of allowed token expressions. + // Construct list of allowed token expressions. $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; - - # Construct master expression from list. - $token_re = '{('. implode('|', $token_relist) .')}'; + + // Construct master expression from list. + $token_re = '{(' . implode('|', $token_relist) . ')}'; $this->em_strong_prepared_relist["$em$strong"] = $token_re; } } } - + + /** + * Convert Markdown italics (emphasis) and bold (strong) to HTML + * @param string $text + * @return string + */ protected function doItalicsAndBold($text) { + if ($this->in_emphasis_processing) { + return $text; // avoid reentrency + } + $this->in_emphasis_processing = true; + $token_stack = array(''); $text_stack = array(''); $em = ''; $strong = ''; $tree_char_em = false; - + while (1) { - # - # Get prepared regular expression for seraching emphasis tokens - # in current context. - # + // Get prepared regular expression for seraching emphasis tokens + // in current context. $token_re = $this->em_strong_prepared_relist["$em$strong"]; - - # - # Each loop iteration search for the next emphasis token. - # Each token is then passed to handleSpanToken. - # + + // Each loop iteration search for the next emphasis token. + // Each token is then passed to handleSpanToken. $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)) { - # Reached end of text span: empty stack without emitting. - # any more emphasis. + // Reached end of text span: empty stack without emitting. + // any more emphasis. 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) { - # Reached closing marker while inside a three-char emphasis. + // Reached closing marker while inside a three-char emphasis. if ($token_len == 3) { - # Three-char closing marker, close em and strong. + // Three-char closing marker, close em and strong. array_shift($token_stack); $span = array_shift($text_stack); $span = $this->runSpanGamut($span); @@ -1135,21 +1355,21 @@ class Markdown implements MarkdownInterface { $em = ''; $strong = ''; } else { - # Other closing marker: close one em or strong and - # change current token state to match the other - $token_stack[0] = str_repeat($token{0}, 3-$token_len); + // Other closing marker: close one em or strong and + // change current token state to match the other + $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"; $text_stack[0] = $this->hashPart($span); - $$tag = ''; # $$tag stands for $em or $strong + $$tag = ''; // $$tag stands for $em or $strong } $tree_char_em = false; } else if ($token_len == 3) { if ($em) { - # Reached closing marker for both em and strong. - # Closing strong marker: + // Reached closing marker for both em and strong. + // Closing strong marker: for ($i = 0; $i < 2; ++$i) { $shifted_token = array_shift($token_stack); $tag = strlen($shifted_token) == 2 ? "strong" : "em"; @@ -1157,12 +1377,12 @@ class Markdown implements MarkdownInterface { $span = $this->runSpanGamut($span); $span = "<$tag>$span"; $text_stack[0] .= $this->hashPart($span); - $$tag = ''; # $$tag stands for $em or $strong + $$tag = ''; // $$tag stands for $em or $strong } } else { - # Reached opening three-char emphasis marker. Push on token - # stack; will be handled by the special condition above. - $em = $token{0}; + // Reached opening three-char emphasis marker. Push on token + // stack; will be handled by the special condition above. + $em = $token[0]; $strong = "$em$em"; array_unshift($token_stack, $token); array_unshift($text_stack, ''); @@ -1170,12 +1390,13 @@ class Markdown implements MarkdownInterface { } } else if ($token_len == 2) { if ($strong) { - # Unwind any dangling emphasis marker: + // Unwind any dangling emphasis marker: if (strlen($token_stack[0]) == 1) { $text_stack[1] .= array_shift($token_stack); $text_stack[0] .= array_shift($text_stack); + $em = ''; } - # Closing strong marker: + // Closing strong marker: array_shift($token_stack); $span = array_shift($text_stack); $span = $this->runSpanGamut($span); @@ -1188,10 +1409,10 @@ class Markdown implements MarkdownInterface { $strong = $token; } } else { - # Here $token_len == 1 + // Here $token_len == 1 if ($em) { if (strlen($token_stack[0]) == 1) { - # Closing emphasis marker: + // Closing emphasis marker: array_shift($token_stack); $span = array_shift($text_stack); $span = $this->runSpanGamut($span); @@ -1208,10 +1429,15 @@ class Markdown implements MarkdownInterface { } } } + $this->in_emphasis_processing = false; return $text_stack[0]; } - + /** + * Parse Markdown blockquotes to HTML + * @param string $text + * @return string + */ protected function doBlockQuotes($text) { $text = preg_replace_callback('/ ( # Wrap whole match in $1 @@ -1227,51 +1453,64 @@ class Markdown implements MarkdownInterface { return $text; } + + /** + * Blockquote parsing callback + * @param array $matches + * @return string + */ protected function _doBlockQuotes_callback($matches) { $bq = $matches[1]; - # trim one level of quoting - trim whitespace-only lines + // trim one level of quoting - trim whitespace-only lines $bq = preg_replace('/^[ ]*>[ ]?|^[ ]+$/m', '', $bq); - $bq = $this->runBlockGamut($bq); # recurse + $bq = $this->runBlockGamut($bq); // recurse $bq = preg_replace('/^/m', " ", $bq); - # These leading spaces cause problem with
     content, 
    -		# so we need to fix that:
    -		$bq = preg_replace_callback('{(\s*
    .+?
    )}sx', + // These leading spaces cause problem with
     content,
    +		// so we need to fix that:
    +		$bq = preg_replace_callback('{(\s*
    .+?
    )}sx', array($this, '_doBlockQuotes_callback2'), $bq); - return "\n". $this->hashBlock("
    \n$bq\n
    ")."\n\n"; + return "\n" . $this->hashBlock("
    \n$bq\n
    ") . "\n\n"; } + + /** + * Blockquote parsing callback + * @param array $matches + * @return string + */ protected function _doBlockQuotes_callback2($matches) { $pre = $matches[1]; $pre = preg_replace('/^ /m', '', $pre); return $pre; } - - protected function formParagraphs($text) { - # - # Params: - # $text - string to process with html

    tags - # - # Strip leading and trailing lines: + /** + * Parse paragraphs + * + * @param string $text String to process in paragraphs + * @param boolean $wrap_in_p Whether paragraphs should be wrapped in

    tags + * @return string + */ + protected function formParagraphs($text, $wrap_in_p = true) { + // Strip leading and trailing lines: $text = preg_replace('/\A\n+|\n+\z/', '', $text); $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY); - # - # Wrap

    tags and unhashify HTML blocks - # + // Wrap

    tags and unhashify HTML blocks foreach ($grafs as $key => $value) { if (!preg_match('/^B\x1A[0-9]+B$/', $value)) { - # Is a paragraph. + // Is a paragraph. $value = $this->runSpanGamut($value); - $value = preg_replace('/^([ ]*)/', "

    ", $value); - $value .= "

    "; + if ($wrap_in_p) { + $value = preg_replace('/^([ ]*)/', "

    ", $value); + $value .= "

    "; + } $grafs[$key] = $this->unhash($value); - } - else { - # Is a block. - # Modify elements of @grafs in-place... + } else { + // Is a block. + // Modify elements of @grafs in-place... $graf = $value; $block = $this->html_hashes[$graf]; $graf = $block; @@ -1296,11 +1535,11 @@ class Markdown implements MarkdownInterface { // { // list(, $div_open, , $div_content, $div_close) = $matches; // -// # We can't call Markdown(), because that resets the hash; -// # that initialization code should be pulled into its own sub, though. +// // We can't call Markdown(), because that resets the hash; +// // that initialization code should be pulled into its own sub, though. // $div_content = $this->hashHTMLBlocks($div_content); -// -// # Run document gamut methods on the content. +// +// // Run document gamut methods on the content. // foreach ($this->document_gamut as $method => $priority) { // $div_content = $this->$method($div_content); // } @@ -1317,71 +1556,78 @@ class Markdown implements MarkdownInterface { return implode("\n\n", $grafs); } - + /** + * Encode text for a double-quoted HTML attribute. This function + * is *not* suitable for attributes enclosed in single quotes. + * @param string $text + * @return string + */ protected function encodeAttribute($text) { - # - # Encode text for a double-quoted HTML attribute. This function - # is *not* suitable for attributes enclosed in single quotes. - # $text = $this->encodeAmpsAndAngles($text); $text = str_replace('"', '"', $text); return $text; } - + /** + * Encode text for a double-quoted HTML attribute containing a URL, + * applying the URL filter if set. Also generates the textual + * representation for the URL (removing mailto: or tel:) storing it in $text. + * This function is *not* suitable for attributes enclosed in single quotes. + * + * @param string $url + * @param string $text Passed by reference + * @return string URL + */ protected function encodeURLAttribute($url, &$text = null) { - # - # Encode text for a double-quoted HTML attribute containing a URL, - # applying the URL filter if set. Also generates the textual - # representation for the URL (removing mailto: or tel:) storing it in $text. - # This function is *not* suitable for attributes enclosed in single quotes. - # - if ($this->url_filter_func) + if (is_callable($this->url_filter_func)) { $url = call_user_func($this->url_filter_func, $url); + } - if (preg_match('{^mailto:}i', $url)) + if (preg_match('{^mailto:}i', $url)) { $url = $this->encodeEntityObfuscatedAttribute($url, $text, 7); - else if (preg_match('{^tel:}i', $url)) - { + } else if (preg_match('{^tel:}i', $url)) { $url = $this->encodeAttribute($url); $text = substr($url, 4); - } - else - { + } else { $url = $this->encodeAttribute($url); $text = $url; } return $url; } - - + + /** + * Smart processing for ampersands and angle brackets that need to + * be encoded. Valid character entities are left alone unless the + * no-entities mode is set. + * @param string $text + * @return string + */ protected function encodeAmpsAndAngles($text) { - # - # Smart processing for ampersands and angle brackets that need to - # be encoded. Valid character entities are left alone unless the - # no-entities mode is set. - # if ($this->no_entities) { $text = str_replace('&', '&', $text); } else { - # Ampersand-encoding based entirely on Nat Irons's Amputator - # MT plugin: - $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/', + // Ampersand-encoding based entirely on Nat Irons's Amputator + // MT plugin: + $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/', '&', $text); } - # Encode remaining <'s + // Encode remaining <'s $text = str_replace('<', '<', $text); return $text; } - + /** + * Parse Markdown automatic links to anchor HTML tags + * @param string $text + * @return string + */ protected function doAutoLinks($text) { $text = preg_replace_callback('{<((https?|ftp|dict|tel):[^\'">\s]+)>}i', array($this, '_doAutoLinks_url_callback'), $text); - # Email addresses: + // Email addresses: $text = preg_replace_callback('{ < (?:mailto:)? @@ -1404,11 +1650,23 @@ class Markdown implements MarkdownInterface { return $text; } + + /** + * Parse URL callback + * @param array $matches + * @return string + */ protected function _doAutoLinks_url_callback($matches) { $url = $this->encodeURLAttribute($matches[1], $text); $link = "$text"; return $this->hashPart($link); } + + /** + * Parse email address callback + * @param array $matches + * @return string + */ protected function _doAutoLinks_email_callback($matches) { $addr = $matches[1]; $url = $this->encodeURLAttribute("mailto:$addr", $text); @@ -1416,42 +1674,52 @@ class Markdown implements MarkdownInterface { return $this->hashPart($link); } - + /** + * Input: some text to obfuscate, e.g. "mailto:foo@example.com" + * + * Output: the same text but with most characters encoded as either a + * decimal or hex entity, in the hopes of foiling most address + * harvesting spam bots. E.g.: + * + * mailto:foo + * @example.co + * m + * + * Note: the additional output $tail is assigned the same value as the + * ouput, minus the number of characters specified by $head_length. + * + * Based by a filter by Matthew Wickline, posted to BBEdit-Talk. + * With some optimizations by Milian Wolff. Forced encoding of HTML + * attribute special characters by Allan Odgaard. + * + * @param string $text + * @param string $tail Passed by reference + * @param integer $head_length + * @return string + */ protected function encodeEntityObfuscatedAttribute($text, &$tail = null, $head_length = 0) { - # - # Input: some text to obfuscate, e.g. "mailto:foo@example.com" - # - # Output: the same text but with most characters encoded as either a - # decimal or hex entity, in the hopes of foiling most address - # harvesting spam bots. E.g.: - # - # mailto:foo - # @example.co - # m - # - # Note: the additional output $tail is assigned the same value as the - # ouput, minus the number of characters specified by $head_length. - # - # Based by a filter by Matthew Wickline, posted to BBEdit-Talk. - # With some optimizations by Milian Wolff. Forced encoding of HTML - # attribute special characters by Allan Odgaard. - # - if ($text == "") return $tail = ""; + if ($text == "") { + return $tail = ""; + } $chars = preg_split('/(? $char) { $ord = ord($char); - # Ignore non-ascii chars. + // Ignore non-ascii chars. if ($ord < 128) { - $r = ($seed * (1 + $key)) % 100; # Pseudo-random function. - # roughly 10% raw, 45% hex, 45% dec - # '@' *must* be encoded. I insist. - # '"' and '>' have to be encoded inside the attribute - if ($r > 90 && strpos('@"&>', $char) === false) /* do nothing */; - else if ($r < 45) $chars[$key] = '&#x'.dechex($ord).';'; - else $chars[$key] = '&#'.$ord.';'; + $r = ($seed * (1 + $key)) % 100; // Pseudo-random function. + // roughly 10% raw, 45% hex, 45% dec + // '@' *must* be encoded. I insist. + // '"' and '>' have to be encoded inside the attribute + if ($r > 90 && strpos('@"&>', $char) === false) { + /* do nothing */ + } else if ($r < 45) { + $chars[$key] = '&#x'.dechex($ord).';'; + } else { + $chars[$key] = '&#'.$ord.';'; + } } } @@ -1461,14 +1729,15 @@ class Markdown implements MarkdownInterface { return $text; } - + /** + * Take the string $str and parse it into tokens, hashing embeded HTML, + * escaped characters and handling code spans. + * @param string $str + * @return string + */ protected function parseSpan($str) { - # - # Take the string $str and parse it into tokens, hashing embeded HTML, - # escaped characters and handling code spans. - # $output = ''; - + $span_re = '{ ( \\\\'.$this->escape_chars_re.' @@ -1496,121 +1765,145 @@ class Markdown implements MarkdownInterface { }xs'; while (1) { - # - # Each loop iteration seach for either the next tag, the next - # openning code span marker, or the next escaped character. - # Each token is then passed to handleSpanToken. - # + // Each loop iteration seach for either the next tag, the next + // openning code span marker, or the next escaped character. + // Each token is then passed to handleSpanToken. $parts = preg_split($span_re, $str, 2, PREG_SPLIT_DELIM_CAPTURE); - - # Create token from text preceding tag. + + // Create token from text preceding tag. if ($parts[0] != "") { $output .= $parts[0]; } - - # Check if we reach the end. + + // Check if we reach the end. if (isset($parts[1])) { $output .= $this->handleSpanToken($parts[1], $parts[2]); $str = $parts[2]; - } - else { + } else { break; } } - + return $output; } - - + + /** + * Handle $token provided by parseSpan by determining its nature and + * returning the corresponding value that should replace it. + * @param string $token + * @param string $str Passed by reference + * @return string + */ protected function handleSpanToken($token, &$str) { - # - # Handle $token provided by parseSpan by determining its nature and - # returning the corresponding value that should replace it. - # - switch ($token{0}) { + switch ($token[0]) { case "\\": - return $this->hashPart("&#". ord($token{1}). ";"); + return $this->hashPart("&#". ord($token[1]). ";"); case "`": - # Search for end marker in remaining text. - if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm', + // Search for end marker in remaining text. + if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm', $str, $matches)) { $str = $matches[2]; $codespan = $this->makeCodeSpan($matches[1]); return $this->hashPart($codespan); } - return $token; // return as text since no ending marker found. + return $token; // Return as text since no ending marker found. default: return $this->hashPart($token); } } - + /** + * Remove one level of line-leading tabs or spaces + * @param string $text + * @return string + */ protected function outdent($text) { - # - # Remove one level of line-leading tabs or spaces - # - return preg_replace('/^(\t|[ ]{1,'.$this->tab_width.'})/m', '', $text); + return preg_replace('/^(\t|[ ]{1,' . $this->tab_width . '})/m', '', $text); } - # String length function for detab. `_initDetab` will create a function to - # hanlde UTF-8 if the default function does not exist. + /** + * String length function for detab. `_initDetab` will create a function to + * handle UTF-8 if the default function does not exist. + * @var string + */ protected $utf8_strlen = 'mb_strlen'; - + + /** + * Replace tabs with the appropriate amount of spaces. + * + * For each line we separate the line in blocks delemited by tab characters. + * Then we reconstruct every line by adding the appropriate number of space + * between each blocks. + * + * @param string $text + * @return string + */ protected function detab($text) { - # - # Replace tabs with the appropriate amount of space. - # - # For each line we separate the line in blocks delemited by - # tab characters. Then we reconstruct every line by adding the - # appropriate number of space between each blocks. - $text = preg_replace_callback('/^.*\t.*$/m', array($this, '_detab_callback'), $text); return $text; } + + /** + * Replace tabs callback + * @param string $matches + * @return string + */ protected function _detab_callback($matches) { $line = $matches[0]; - $strlen = $this->utf8_strlen; # strlen function for UTF-8. - - # Split in blocks. + $strlen = $this->utf8_strlen; // strlen function for UTF-8. + + // Split in blocks. $blocks = explode("\t", $line); - # Add each blocks to the line. + // Add each blocks to the line. $line = $blocks[0]; - unset($blocks[0]); # Do not add first block twice. + unset($blocks[0]); // Do not add first block twice. foreach ($blocks as $block) { - # Calculate amount of space, insert spaces, insert block. - $amount = $this->tab_width - + // Calculate amount of space, insert spaces, insert block. + $amount = $this->tab_width - $strlen($line, 'UTF-8') % $this->tab_width; $line .= str_repeat(" ", $amount) . $block; } return $line; } + + /** + * Check for the availability of the function in the `utf8_strlen` property + * (initially `mb_strlen`). If the function is not available, create a + * function that will loosely count the number of UTF-8 characters with a + * regular expression. + * @return void + */ protected function _initDetab() { - # - # Check for the availability of the function in the `utf8_strlen` property - # (initially `mb_strlen`). If the function is not available, create a - # function that will loosely count the number of UTF-8 characters with a - # regular expression. - # - 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);'); + + if (function_exists($this->utf8_strlen)) { + return; + } + + $this->utf8_strlen = function($text) { + return preg_match_all('/[\x00-\xBF]|[\xC0-\xFF][\x80-\xBF]*/', $text, $m); + }; } - + /** + * Swap back in all the tags hashed by _HashHTMLBlocks. + * @param string $text + * @return string + */ protected function unhash($text) { - # - # Swap back in all the tags hashed by _HashHTMLBlocks. - # - return preg_replace_callback('/(.)\x1A[0-9]+\1/', + return preg_replace_callback('/(.)\x1A[0-9]+\1/', array($this, '_unhash_callback'), $text); } + + /** + * Unhashing callback + * @param array $matches + * @return string + */ protected function _unhash_callback($matches) { return $this->html_hashes[$matches[0]]; } - } diff --git a/third/Md/MarkdownExtra.inc.php b/third/Md/MarkdownExtra.inc.php index e11b1ef..d09bd7a 100644 --- a/third/Md/MarkdownExtra.inc.php +++ b/third/Md/MarkdownExtra.inc.php @@ -1,10 +1,10 @@ -# -# Original Markdown -# Copyright (c) 2004-2006 John Gruber -# -# +/** + * Markdown Extra - A text-to-HTML conversion tool for web writers + * + * @package php-markdown + * @author Michel Fortin + * @copyright 2004-2019 Michel Fortin + * @copyright (Original Markdown) 2004-2006 John Gruber + */ + namespace Michelf; - -# -# Markdown Extra Parser Class -# - +/** + * Markdown Extra Parser Class + */ class MarkdownExtra extends \Michelf\Markdown { + /** + * Configuration variables + */ - ### Configuration Variables ### - - # Prefix for footnote ids. + /** + * Prefix for footnote ids. + * @var string + */ public $fn_id_prefix = ""; - - # Optional title attribute for footnote links and backlinks. + + /** + * Optional title attribute for footnote links. + * @var string + */ public $fn_link_title = ""; - public $fn_backlink_title = ""; - - # Optional class attribute for footnote links and backlinks. - public $fn_link_class = "footnote-ref"; + + /** + * Optional class attribute for footnote links and backlinks. + * @var string + */ + public $fn_link_class = "footnote-ref"; public $fn_backlink_class = "footnote-backref"; - # Content to be displayed within footnote backlinks. The default is '↩'; - # the U+FE0E on the end is a Unicode variant selector used to prevent iOS - # from displaying the arrow character as an emoji. + /** + * Content to be displayed within footnote backlinks. The default is '↩'; + * the U+FE0E on the end is a Unicode variant selector used to prevent iOS + * from displaying the arrow character as an emoji. + * Optionally use '^^' and '%%' to refer to the footnote number and + * reference number respectively. {@see parseFootnotePlaceholders()} + * @var string + */ public $fn_backlink_html = '↩︎'; - # Class name for table cell alignment (%% replaced left/center/right) - # For instance: 'go-%%' becomes 'go-left' or 'go-right' or 'go-center' - # If empty, the align attribute is used instead of a class name. + /** + * Optional title and aria-label attributes for footnote backlinks for + * added accessibility (to ensure backlink uniqueness). + * Use '^^' and '%%' to refer to the footnote number and reference number + * respectively. {@see parseFootnotePlaceholders()} + * @var string + */ + public $fn_backlink_title = ""; + public $fn_backlink_label = ""; + + /** + * Class name for table cell alignment (%% replaced left/center/right) + * For instance: 'go-%%' becomes 'go-left' or 'go-right' or 'go-center' + * If empty, the align attribute is used instead of a class name. + * @var string + */ public $table_align_class_tmpl = ''; - # Optional class prefix for fenced code block. + /** + * Optional class prefix for fenced code block. + * @var string + */ public $code_class_prefix = ""; - # Class attribute for code blocks goes on the `code` tag; - # setting this to true will put attributes on the `pre` tag instead. + + /** + * Class attribute for code blocks goes on the `code` tag; + * setting this to true will put attributes on the `pre` tag instead. + * @var boolean + */ public $code_attr_on_pre = false; - # Predefined abbreviations. + /** + * Predefined abbreviations. + * @var array + */ public $predef_abbr = array(); - ### Parser Implementation ### + /** + * Only convert atx-style headers if there's a space between the header and # + * @var boolean + */ + public $hashtag_protection = false; + /** + * Determines whether footnotes should be appended to the end of the document. + * If true, footnote html can be retrieved from $this->footnotes_assembled. + * @var boolean + */ + public $omit_footnotes = false; + + + /** + * After parsing, the HTML for the list of footnotes appears here. + * This is available only if $omit_footnotes == true. + * + * Note: when placing the content of `footnotes_assembled` on the page, + * consider adding the attribute `role="doc-endnotes"` to the `div` or + * `section` that will enclose the list of footnotes so they are + * reachable to accessibility tools the same way they would be with the + * default HTML output. + * @var null|string + */ + public $footnotes_assembled = null; + + /** + * Parser implementation + */ + + /** + * Constructor function. Initialize the parser object. + * @return void + */ public function __construct() { - # - # Constructor function. Initialize the parser object. - # - # Add extra escapable characters before parent constructor - # initialize the table. + // Add extra escapable characters before parent constructor + // initialize the table. $this->escape_chars .= ':|'; - - # Insert extra document, block, and span transformations. - # Parent constructor will do the sorting. + + // Insert extra document, block, and span transformations. + // Parent constructor will do the sorting. $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, - ); - + ); + $this->enhanced_ordered_list = true; parent::__construct(); } - - - # Extra variables used during extra transformations. + + + /** + * Extra variables used during extra transformations. + * @var array + */ protected $footnotes = array(); protected $footnotes_ordered = array(); protected $footnotes_ref_count = array(); protected $footnotes_numbers = array(); protected $abbr_desciptions = array(); + /** @var string */ protected $abbr_word_re = ''; - - # Give the current footnote number. + + /** + * Give the current footnote number. + * @var integer + */ protected $footnote_counter = 1; - - + + /** + * Ref attribute for links + * @var array + */ + protected $ref_attr = array(); + + /** + * Setting up Extra-specific variables. + */ protected function setup() { - # - # Setting up Extra-specific variables. - # parent::setup(); - + $this->footnotes = array(); $this->footnotes_ordered = array(); $this->footnotes_ref_count = array(); @@ -109,7 +184,8 @@ class MarkdownExtra extends \Michelf\Markdown { $this->abbr_desciptions = array(); $this->abbr_word_re = ''; $this->footnote_counter = 1; - + $this->footnotes_assembled = null; + foreach ($this->predef_abbr as $abbr_word => $abbr_desc) { if ($this->abbr_word_re) $this->abbr_word_re .= '|'; @@ -117,52 +193,72 @@ class MarkdownExtra extends \Michelf\Markdown { $this->abbr_desciptions[$abbr_word] = trim($abbr_desc); } } - + + /** + * Clearing Extra-specific variables. + */ protected function teardown() { - # - # Clearing Extra-specific variables. - # $this->footnotes = array(); $this->footnotes_ordered = array(); $this->footnotes_ref_count = array(); $this->footnotes_numbers = array(); $this->abbr_desciptions = array(); $this->abbr_word_re = ''; - + + if ( ! $this->omit_footnotes ) + $this->footnotes_assembled = null; + parent::teardown(); } - - - ### Extra Attribute Parser ### - # Expression to use to catch attributes (includes the braces) + + /** + * Extra attribute parser + */ + + /** + * Expression to use to catch attributes (includes the braces) + * @var string + */ protected $id_class_attr_catch_re = '\{((?>[ ]*[#.a-z][-_:a-zA-Z0-9=]+){1,})[ ]*\}'; - # Expression to use when parsing in a context when no capture is desired + + /** + * Expression to use when parsing in a context when no capture is desired + * @var string + */ protected $id_class_attr_nocatch_re = '\{(?>[ ]*[#.a-z][-_:a-zA-Z0-9=]+){1,}[ ]*\}'; + /** + * Parse attributes caught by the $this->id_class_attr_catch_re expression + * and return the HTML-formatted list of attributes. + * + * Currently supported attributes are .class and #id. + * + * In addition, this method also supports supplying a default Id value, + * which will be used to populate the id attribute in case it was not + * overridden. + * @param string $tag_name + * @param string $attr + * @param mixed $defaultIdValue + * @param array $classes + * @return string + */ protected function doExtraAttributes($tag_name, $attr, $defaultIdValue = null, $classes = array()) { - # - # Parse attributes caught by the $this->id_class_attr_catch_re expression - # and return the HTML-formatted list of attributes. - # - # Currently supported attributes are .class and #id. - # - # In addition, this method also supports supplying a default Id value, - # which will be used to populate the id attribute in case it was not - # overridden. - if (empty($attr) && !$defaultIdValue && empty($classes)) return ""; - - # Split on components + if (empty($attr) && !$defaultIdValue && empty($classes)) { + return ""; + } + + // Split on components preg_match_all('/[#.a-z][-_:a-zA-Z0-9=]+/', $attr, $matches); $elements = $matches[0]; - # handle classes and ids (only first id taken into account) + // Handle classes and IDs (only first ID taken into account) $attributes = array(); $id = false; foreach ($elements as $element) { - if ($element{0} == '.') { + if ($element[0] === '.') { $classes[] = substr($element, 1); - } else if ($element{0} == '#') { + } else if ($element[0] === '#') { if ($id === false) $id = substr($element, 1); } else if (strpos($element, '=') > 0) { $parts = explode('=', $element, 2); @@ -170,9 +266,11 @@ class MarkdownExtra extends \Michelf\Markdown { } } - if (!$id) $id = $defaultIdValue; + if ($id === false || $id === '') { + $id = $defaultIdValue; + } - # compose attributes as string + // Compose attributes as string $attr_str = ""; if (!empty($id)) { $attr_str .= ' id="'.$this->encodeAttribute($id) .'"'; @@ -186,15 +284,16 @@ class MarkdownExtra extends \Michelf\Markdown { return $attr_str; } - + /** + * Strips link definitions from text, stores the URLs and titles in + * hash references. + * @param string $text + * @return string + */ protected function stripLinkDefinitions($text) { - # - # Strips link definitions from text, stores the URLs and titles in - # hash references. - # $less_than_tab = $this->tab_width - 1; - # Link defs are in the form: ^[id]: url "optional title" + // Link defs are in the form: ^[id]: url "optional title" $text = preg_replace_callback('{ ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1 [ ]* @@ -222,109 +321,141 @@ class MarkdownExtra extends \Michelf\Markdown { $text); return $text; } + + /** + * Strip link definition callback + * @param array $matches + * @return string + */ protected 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]; $this->ref_attr[$link_id] = $this->doExtraAttributes("", $dummy =& $matches[5]); - return ''; # String that will replace the block + return ''; // String that will replace the block } - ### HTML Block Parser ### - - # Tags that are always treated as block tags: + /** + * HTML block parser + */ + + /** + * Tags that are always treated as block tags + * @var string + */ protected $block_tags_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend|article|section|nav|aside|hgroup|header|footer|figcaption|figure'; - - # Tags treated as block tags only if the opening tag is alone on its line: + + /** + * Tags treated as block tags only if the opening tag is alone on its line + * @var string + */ protected $context_block_tags_re = 'script|noscript|style|ins|del|iframe|object|source|track|param|math|svg|canvas|audio|video'; - - # Tags where markdown="1" default to span mode: + + /** + * Tags where markdown="1" default to span mode: + * @var string + */ protected $contain_span_tags_re = 'p|h[1-6]|li|dd|dt|td|th|legend|address'; - - # Tags which must not have their contents modified, no matter where - # they appear: + + /** + * Tags which must not have their contents modified, no matter where + * they appear + * @var string + */ protected $clean_tags_re = 'script|style|math|svg'; - - # Tags that do not need to be closed. + + /** + * Tags that do not need to be closed. + * @var string + */ protected $auto_close_tags_re = 'hr|img|param|source|track'; - + /** + * Hashify HTML Blocks and "clean tags". + * + * We only want to do this for block-level HTML tags, such as headers, + * lists, and tables. That's because we still want to wrap

    s around + * "paragraphs" that are wrapped in non-block-level tags, such as anchors, + * phrase emphasis, and spans. The list of tags we're looking for is + * hard-coded. + * + * This works by calling _HashHTMLBlocks_InMarkdown, which then calls + * _HashHTMLBlocks_InHTML when it encounter block tags. When the markdown="1" + * attribute is found within a tag, _HashHTMLBlocks_InHTML calls back + * _HashHTMLBlocks_InMarkdown to handle the Markdown syntax within the tag. + * These two functions are calling each other. It's recursive! + * @param string $text + * @return string + */ protected function hashHTMLBlocks($text) { - # - # Hashify HTML Blocks and "clean tags". - # - # We only want to do this for block-level HTML tags, such as headers, - # lists, and tables. That's because we still want to wrap

    s around - # "paragraphs" that are wrapped in non-block-level tags, such as anchors, - # phrase emphasis, and spans. The list of tags we're looking for is - # hard-coded. - # - # This works by calling _HashHTMLBlocks_InMarkdown, which then calls - # _HashHTMLBlocks_InHTML when it encounter block tags. When the markdown="1" - # attribute is found within a tag, _HashHTMLBlocks_InHTML calls back - # _HashHTMLBlocks_InMarkdown to handle the Markdown syntax within the tag. - # These two functions are calling each other. It's recursive! - # - if ($this->no_markup) return $text; + if ($this->no_markup) { + return $text; + } - # - # Call the HTML-in-Markdown hasher. - # + // Call the HTML-in-Markdown hasher. list($text, ) = $this->_hashHTMLBlocks_inMarkdown($text); - + return $text; } + + /** + * Parse markdown text, calling _HashHTMLBlocks_InHTML for block tags. + * + * * $indent is the number of space to be ignored when checking for code + * blocks. This is important because if we don't take the indent into + * account, something like this (which looks right) won't work as expected: + * + *

    + *
    + * Hello World. <-- Is this a Markdown code block or text? + *
    <-- Is this a Markdown code block or a real tag? + *
    + * + * If you don't like this, just don't indent the tag on which + * you apply the markdown="1" attribute. + * + * * If $enclosing_tag_re is not empty, stops at the first unmatched closing + * tag with that name. Nested tags supported. + * + * * If $span is true, text inside must treated as span. So any double + * newline will be replaced by a single newline so that it does not create + * paragraphs. + * + * Returns an array of that form: ( processed text , remaining text ) + * + * @param string $text + * @param integer $indent + * @param string $enclosing_tag_re + * @param boolean $span + * @return array + */ protected function _hashHTMLBlocks_inMarkdown($text, $indent = 0, $enclosing_tag_re = '', $span = false) { - # - # Parse markdown text, calling _HashHTMLBlocks_InHTML for block tags. - # - # * $indent is the number of space to be ignored when checking for code - # blocks. This is important because if we don't take the indent into - # account, something like this (which looks right) won't work as expected: - # - #
    - #
    - # Hello World. <-- Is this a Markdown code block or text? - #
    <-- Is this a Markdown code block or a real tag? - #
    - # - # If you don't like this, just don't indent the tag on which - # you apply the markdown="1" attribute. - # - # * If $enclosing_tag_re is not empty, stops at the first unmatched closing - # tag with that name. Nested tags supported. - # - # * If $span is true, text inside must treated as span. So any double - # newline will be replaced by a single newline so that it does not create - # paragraphs. - # - # Returns an array of that form: ( processed text , remaining text ) - # + if ($text === '') return array('', ''); - # Regex to check for the presense of newlines around a block tag. + // Regex to check for the presense of newlines around a block tag. $newline_before_re = '/(?:^\n?|\n\n)*$/'; - $newline_after_re = + $newline_after_re = '{ ^ # Start of text following the tag. (?>[ ]*)? # Optional comment. [ ]*\n # Must be followed by newline. }xs'; - - # Regex to match any tag. + + // Regex to match any tag. $block_tag_re = '{ ( # $2: Capture whole tag. # Tag name. - '.$this->block_tags_re.' | - '.$this->context_block_tags_re.' | - '.$this->clean_tags_re.' | - (?!\s)'.$enclosing_tag_re.' + ' . $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. @@ -341,25 +472,25 @@ class MarkdownExtra extends \Michelf\Markdown { <\?.*?\?> | <%.*?%> # Processing instruction | # CData Block - '. ( !$span ? ' # If not in span. + ' . ( !$span ? ' # If not in span. | # Indented code block (?: ^[ ]*\n | ^ | \n[ ]*\n ) - [ ]{'.($indent+4).'}[^\n]* \n + [ ]{' . ($indent + 4) . '}[^\n]* \n (?> - (?: [ ]{'.($indent+4).'}[^\n]* | [ ]* ) \n + (?: [ ]{' . ($indent + 4) . '}[^\n]* | [ ]* ) \n )* | # Fenced code block marker (?<= ^ | \n ) - [ ]{0,'.($indent+3).'}(?:~{3,}|`{3,}) + [ ]{0,' . ($indent + 3) . '}(?:~{3,}|`{3,}) [ ]* (?: \.?[-_:a-zA-Z0-9]+ )? # standalone class name [ ]* - (?: '.$this->id_class_attr_nocatch_re.' )? # extra attributes + (?: ' . $this->id_class_attr_nocatch_re . ' )? # extra attributes [ ]* (?= \n ) - ' : '' ). ' # End (if not is span). + ' : '' ) . ' # End (if not is span). | # Code span marker # Note, this regex needs to go after backtick fenced @@ -369,185 +500,172 @@ class MarkdownExtra extends \Michelf\Markdown { ) }xs'; - - $depth = 0; # Current depth inside the tag tree. - $parsed = ""; # Parsed text that will be returned. - # - # Loop through every tag until we find the closing tag of the parent - # or loop until reaching the end of text if no parent tag specified. - # + $depth = 0; // Current depth inside the tag tree. + $parsed = ""; // Parsed text that will be returned. + + // Loop through every tag until we find the closing tag of the parent + // or loop until reaching the end of text if no parent tag specified. do { - # - # Split the text using the first $tag_match pattern found. - # Text before pattern will be first in the array, text after - # pattern will be at the end, and between will be any catches made - # by the pattern. - # - $parts = preg_split($block_tag_re, $text, 2, + // Split the text using the first $tag_match pattern found. + // Text before pattern will be first in the array, text after + // pattern will be at the end, and between will be any catches made + // by the pattern. + $parts = preg_split($block_tag_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE); - - # If in Markdown span mode, add a empty-string span-level hash - # after each newline to prevent triggering any block element. + + // If in Markdown span mode, add a empty-string span-level hash + // after each newline to prevent triggering any block element. if ($span) { $void = $this->hashPart("", ':'); - $newline = "$void\n"; + $newline = "\n$void"; $parts[0] = $void . str_replace("\n", $newline, $parts[0]) . $void; } - - $parsed .= $parts[0]; # Text before current tag. - - # If end of $text has been reached. Stop loop. + + $parsed .= $parts[0]; // Text before current tag. + + // If end of $text has been reached. Stop loop. if (count($parts) < 3) { $text = ""; break; } - - $tag = $parts[1]; # Tag to handle. - $text = $parts[2]; # Remaining text after current tag. - $tag_re = preg_quote($tag); # For use in a regular expression. - - # - # Check for: Fenced code block marker. - # Note: need to recheck the whole tag to disambiguate backtick - # fences from code spans - # - if (preg_match('{^\n?([ ]{0,'.($indent+3).'})(~{3,}|`{3,})[ ]*(?:\.?[-_:a-zA-Z0-9]+)?[ ]*(?:'.$this->id_class_attr_nocatch_re.')?[ ]*\n?$}', $tag, $capture)) { - # Fenced code block marker: find matching end marker. - $fence_indent = strlen($capture[1]); # use captured indent in re - $fence_re = $capture[2]; # use captured fence in re - if (preg_match('{^(?>.*\n)*?[ ]{'.($fence_indent).'}'.$fence_re.'[ ]*(?:\n|$)}', $text, - $matches)) + + $tag = $parts[1]; // Tag to handle. + $text = $parts[2]; // Remaining text after current tag. + + // Check for: Fenced code block marker. + // Note: need to recheck the whole tag to disambiguate backtick + // fences from code spans + if (preg_match('{^\n?([ ]{0,' . ($indent + 3) . '})(~{3,}|`{3,})[ ]*(?:\.?[-_:a-zA-Z0-9]+)?[ ]*(?:' . $this->id_class_attr_nocatch_re . ')?[ ]*\n?$}', $tag, $capture)) { + // Fenced code block marker: find matching end marker. + $fence_indent = strlen($capture[1]); // use captured indent in re + $fence_re = $capture[2]; // use captured fence in re + if (preg_match('{^(?>.*\n)*?[ ]{' . ($fence_indent) . '}' . $fence_re . '[ ]*(?:\n|$)}', $text, + $matches)) { - # End marker found: pass text unchanged until marker. + // End marker found: pass text unchanged until marker. $parsed .= $tag . $matches[0]; $text = substr($text, strlen($matches[0])); } else { - # No end marker: just skip it. + // No end marker: just skip it. $parsed .= $tag; } } - # - # Check for: Indented code block. - # - else if ($tag{0} == "\n" || $tag{0} == " ") { - # Indented code block: pass it unchanged, will be handled - # later. + // Check for: Indented code block. + else if ($tag[0] === "\n" || $tag[0] === " ") { + // Indented code block: pass it unchanged, will be handled + // later. $parsed .= $tag; } - # - # Check for: Code span marker - # Note: need to check this after backtick fenced code blocks - # - else if ($tag{0} == "`") { - # Find corresponding end marker. + // Check for: Code span marker + // Note: need to check this after backtick fenced code blocks + else if ($tag[0] === "`") { + // Find corresponding end marker. $tag_re = preg_quote($tag); - if (preg_match('{^(?>.+?|\n(?!\n))*?(?.+?|\n(?!\n))*?(?block_tags_re.')\b}', $tag) || - ( preg_match('{^<(?:'.$this->context_block_tags_re.')\b}', $tag) && + // Check for: Opening Block level tag or + // Opening Context Block tag (like ins and del) + // used as a block tag (tag is alone on it's line). + 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) ) ) { - # Need to parse tag and following text using the HTML parser. - list($block_text, $text) = + // Need to parse tag and following text using the HTML parser. + list($block_text, $text) = $this->_hashHTMLBlocks_inHTML($tag . $text, "hashBlock", true); - - # Make sure it stays outside of any paragraph by adding newlines. + + // Make sure it stays outside of any paragraph by adding newlines. $parsed .= "\n\n$block_text\n\n"; } - # - # Check for: Clean tag (like script, math) - # HTML Comments, processing instructions. - # - else if (preg_match('{^<(?:'.$this->clean_tags_re.')\b}', $tag) || - $tag{1} == '!' || $tag{1} == '?') + // Check for: Clean tag (like script, math) + // HTML Comments, processing instructions. + else if (preg_match('{^<(?:' . $this->clean_tags_re . ')\b}', $tag) || + $tag[1] === '!' || $tag[1] === '?') { - # Need to parse tag and following text using the HTML parser. - # (don't check for markdown attribute) - list($block_text, $text) = + // Need to parse tag and following text using the HTML parser. + // (don't check for markdown attribute) + list($block_text, $text) = $this->_hashHTMLBlocks_inHTML($tag . $text, "hashClean", false); - + $parsed .= $block_text; } - # - # Check for: Tag with same name as enclosing tag. - # + // Check for: Tag with same name as enclosing tag. else if ($enclosing_tag_re !== '' && - # Same name as enclosing tag. - preg_match('{^= 0); - + return array($parsed, $text); } + + /** + * Parse HTML, calling _HashHTMLBlocks_InMarkdown for block tags. + * + * * Calls $hash_method to convert any blocks. + * * Stops when the first opening tag closes. + * * $md_attr indicate if the use of the `markdown="1"` attribute is allowed. + * (it is not inside clean tags) + * + * Returns an array of that form: ( processed text , remaining text ) + * @param string $text + * @param string $hash_method + * @param bool $md_attr Handle `markdown="1"` attribute + * @return array + */ protected function _hashHTMLBlocks_inHTML($text, $hash_method, $md_attr) { - # - # Parse HTML, calling _HashHTMLBlocks_InMarkdown for block tags. - # - # * Calls $hash_method to convert any blocks. - # * Stops when the first opening tag closes. - # * $md_attr indicate if the use of the `markdown="1"` attribute is allowed. - # (it is not inside clean tags) - # - # Returns an array of that form: ( processed text , remaining text ) - # if ($text === '') return array('', ''); - - # Regex to match `markdown` attribute inside of a tag. + + // Regex to match `markdown` attribute inside of a tag. $markdown_attr_re = ' { \s* # Eat whitespace before the `markdown` attribute markdown \s*=\s* (?> - (["\']) # $1: quote delimiter + (["\']) # $1: quote delimiter (.*?) # $2: attribute value - \1 # matching delimiter + \1 # matching delimiter | ([^\s>]*) # $3: unquoted attribute value ) () # $4: make $3 always defined (avoid warnings) }xs'; - - # Regex to match any tag. + + // Regex to match any tag. $tag_re = '{ ( # $2: Capture whole tag. # CData Block ) }xs'; - - $original_text = $text; # Save original text in case of faliure. - - $depth = 0; # Current depth inside the tag tree. - $block_text = ""; # Temporary text holder for current text. - $parsed = ""; # Parsed text that will be returned. - # - # Get the name of the starting tag. - # (This pattern makes $base_tag_name_re safe without quoting.) - # + $original_text = $text; // Save original text in case of faliure. + + $depth = 0; // Current depth inside the tag tree. + $block_text = ""; // Temporary text holder for current text. + $parsed = ""; // Parsed text that will be returned. + $base_tag_name_re = ''; + + // Get the name of the starting tag. + // (This pattern makes $base_tag_name_re safe without quoting.) if (preg_match('/^<([\w:$]*)\b/', $text, $matches)) $base_tag_name_re = $matches[1]; - # - # Loop through every tag until we find the corresponding closing tag. - # + // Loop through every tag until we find the corresponding closing tag. do { - # - # Split the text using the first $tag_match pattern found. - # Text before pattern will be first in the array, text after - # pattern will be at the end, and between will be any catches made - # by the pattern. - # + // Split the text using the first $tag_match pattern found. + // Text before pattern will be first in the array, text after + // pattern will be at the end, and between will be any catches made + // by the pattern. $parts = preg_split($tag_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE); - + if (count($parts) < 3) { - # - # End of $text reached with unbalenced tag(s). - # In that case, we return original text unchanged and pass the - # first character as filtered to prevent an infinite loop in the - # parent function. - # - return array($original_text{0}, substr($original_text, 1)); + // End of $text reached with unbalenced tag(s). + // In that case, we return original text unchanged and pass the + // first character as filtered to prevent an infinite loop in the + // parent function. + return array($original_text[0], substr($original_text, 1)); } - - $block_text .= $parts[0]; # Text before current tag. - $tag = $parts[1]; # Tag to handle. - $text = $parts[2]; # Remaining text after current tag. - - # - # Check for: Auto-close tag (like
    ) - # Comments and Processing Instructions. - # - if (preg_match('{^auto_close_tags_re.')\b}', $tag) || - $tag{1} == '!' || $tag{1} == '?') + + $block_text .= $parts[0]; // Text before current tag. + $tag = $parts[1]; // Tag to handle. + $text = $parts[2]; // Remaining text after current tag. + + // Check for: Auto-close tag (like
    ) + // Comments and Processing Instructions. + if (preg_match('{^auto_close_tags_re . ')\b}', $tag) || + $tag[1] === '!' || $tag[1] === '?') { - # Just add the tag to the block as if it was text. + // Just add the tag to the block as if it was text. $block_text .= $tag; } else { - # - # Increase/decrease nested tag count. Only do so if - # the tag's name match base tag's. - # - if (preg_match('{^mode = $attr_m[2] . $attr_m[3]; - $span_mode = $this->mode == 'span' || $this->mode != 'block' && - preg_match('{^<(?:'.$this->contain_span_tags_re.')\b}', $tag); - - # Calculate indent before tag. + + // Check if text inside this tag must be parsed in span mode. + $mode = $attr_m[2] . $attr_m[3]; + $span_mode = $mode === 'span' || ($mode !== 'block' && + preg_match('{^<(?:' . $this->contain_span_tags_re . ')\b}', $tag)); + + // Calculate indent before tag. if (preg_match('/(?:^|\n)( *?)(?! ).*?$/', $block_text, $matches)) { $strlen = $this->utf8_strlen; $indent = $strlen($matches[1], 'UTF-8'); } else { $indent = 0; } - - # End preceding block with this tag. + + // End preceding block with this tag. $block_text .= $tag; $parsed .= $this->$hash_method($block_text); - - # Get enclosing tag name for the ParseMarkdown function. - # (This pattern makes $tag_name_re safe without quoting.) + + // Get enclosing tag name for the ParseMarkdown function. + // (This pattern makes $tag_name_re safe without quoting.) preg_match('/^<([\w:$]*)\b/', $tag, $matches); $tag_name_re = $matches[1]; - - # Parse the content using the HTML-in-Markdown parser. + + // Parse the content using the HTML-in-Markdown parser. list ($block_text, $text) - = $this->_hashHTMLBlocks_inMarkdown($text, $indent, + = $this->_hashHTMLBlocks_inMarkdown($text, $indent, $tag_name_re, $span_mode); - - # Outdent markdown text. + + // Outdent markdown text. if ($indent > 0) { - $block_text = preg_replace("/^[ ]{1,$indent}/m", "", + $block_text = preg_replace("/^[ ]{1,$indent}/m", "", $block_text); } - - # Append tag content to parsed text. - if (!$span_mode) $parsed .= "\n\n$block_text\n\n"; - else $parsed .= "$block_text"; - - # Start over with a new block. + + // Append tag content to parsed text. + if (!$span_mode) { + $parsed .= "\n\n$block_text\n\n"; + } else { + $parsed .= (string) $block_text; + } + + // Start over with a new block. $block_text = ""; } else $block_text .= $tag; } - + } while ($depth > 0); - - # - # Hash last block text that wasn't processed inside the loop. - # + + // Hash last block text that wasn't processed inside the loop. $parsed .= $this->$hash_method($block_text); - + return array($parsed, $text); } - + /** + * Called whenever a tag must be hashed when a function inserts a "clean" tag + * in $text, it passes through this function and is automaticaly escaped, + * blocking invalid nested overlap. + * @param string $text + * @return string + */ protected function hashClean($text) { - # - # Called whenever a tag must be hashed when a function inserts a "clean" tag - # in $text, it passes through this function and is automaticaly escaped, - # blocking invalid nested overlap. - # return $this->hashPart($text, 'C'); } - + /** + * Turn Markdown link shortcuts into XHTML tags. + * @param string $text + * @return string + */ protected function doAnchors($text) { - # - # Turn Markdown link shortcuts into XHTML tags. - # - if ($this->in_anchor) return $text; + if ($this->in_anchor) { + return $text; + } $this->in_anchor = true; - - # - # First, handle reference-style links: [link text] [id] - # + + // First, handle reference-style links: [link text] [id] $text = preg_replace_callback('{ ( # wrap whole match in $1 \[ - ('.$this->nested_brackets_re.') # link text = $2 + (' . $this->nested_brackets_re . ') # link text = $2 \] [ ]? # one optional space @@ -729,20 +840,18 @@ class MarkdownExtra extends \Michelf\Markdown { }xs', array($this, '_doAnchors_reference_callback'), $text); - # - # Next, inline-style links: [link text](url "optional title") - # + // Next, inline-style links: [link text](url "optional title") $text = preg_replace_callback('{ ( # wrap whole match in $1 \[ - ('.$this->nested_brackets_re.') # link text = $2 + (' . $this->nested_brackets_re . ') # link text = $2 \] \( # literal paren [ \n]* (?: <(.+?)> # href = $3 | - ('.$this->nested_url_parenthesis_re.') # href = $4 + (' . $this->nested_url_parenthesis_re . ') # href = $4 ) [ \n]* ( # $5 @@ -752,16 +861,14 @@ class MarkdownExtra extends \Michelf\Markdown { [ \n]* # ignore any spaces/tabs between closing quote and ) )? # title is optional \) - (?:[ ]? '.$this->id_class_attr_catch_re.' )? # $8 = id/class attributes + (?:[ ]? ' . $this->id_class_attr_catch_re . ' )? # $8 = id/class attributes ) }xs', array($this, '_doAnchors_inline_callback'), $text); - # - # Last, handle reference-style shortcuts: [link text] - # These must come last in case you've also got [link text][1] - # or [link text](/foo) - # + // Last, handle reference-style shortcuts: [link text] + // These must come last in case you've also got [link text][1] + // or [link text](/foo) $text = preg_replace_callback('{ ( # wrap whole match in $1 \[ @@ -774,24 +881,30 @@ class MarkdownExtra extends \Michelf\Markdown { $this->in_anchor = false; return $text; } + + /** + * Callback for reference anchors + * @param array $matches + * @return string + */ protected function _doAnchors_reference_callback($matches) { $whole_match = $matches[1]; $link_text = $matches[2]; $link_id =& $matches[3]; if ($link_id == "") { - # for shortcut links like [this][] or [this]. + // for shortcut links like [this][] or [this]. $link_id = $link_text; } - - # lower-case and turn embedded newlines into spaces + + // lower-case and turn embedded newlines into spaces $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->encodeURLAttribute($url); - + $result = "titles[$link_id] ) ) { $title = $this->titles[$link_id]; @@ -800,7 +913,7 @@ class MarkdownExtra extends \Michelf\Markdown { } if (isset($this->ref_attr[$link_id])) $result .= $this->ref_attr[$link_id]; - + $link_text = $this->runSpanGamut($link_text); $result .= ">$link_text"; $result = $this->hashPart($result); @@ -810,17 +923,22 @@ class MarkdownExtra extends \Michelf\Markdown { } return $result; } + + /** + * Callback for inline anchors + * @param array $matches + * @return string + */ protected function _doAnchors_inline_callback($matches) { - $whole_match = $matches[1]; $link_text = $this->runSpanGamut($matches[2]); - $url = $matches[3] == '' ? $matches[4] : $matches[3]; + $url = $matches[3] === '' ? $matches[4] : $matches[3]; $title =& $matches[7]; $attr = $this->doExtraAttributes("a", $dummy =& $matches[8]); // if the URL was of the form it got caught by the HTML // tag parser and hashed. Need to reverse the process before using the URL. $unhashed = $this->unhash($url); - if ($unhashed != $url) + if ($unhashed !== $url) $url = preg_replace('/^<(.*)>$/', '\1', $unhashed); $url = $this->encodeURLAttribute($url); @@ -831,25 +949,24 @@ class MarkdownExtra extends \Michelf\Markdown { $result .= " title=\"$title\""; } $result .= $attr; - + $link_text = $this->runSpanGamut($link_text); $result .= ">$link_text"; return $this->hashPart($result); } - + /** + * Turn Markdown image shortcuts into tags. + * @param string $text + * @return string + */ protected function doImages($text) { - # - # Turn Markdown image shortcuts into tags. - # - # - # First, handle reference-style labeled images: ![alt text][id] - # + // First, handle reference-style labeled images: ![alt text][id] $text = preg_replace_callback('{ ( # wrap whole match in $1 !\[ - ('.$this->nested_brackets_re.') # alt text = $2 + (' . $this->nested_brackets_re . ') # alt text = $2 \] [ ]? # one optional space @@ -860,17 +977,15 @@ class MarkdownExtra extends \Michelf\Markdown { \] ) - }xs', + }xs', array($this, '_doImages_reference_callback'), $text); - # - # Next, handle inline images: ![alt text](url "optional title") - # Don't forget: encode * and _ - # + // Next, handle inline images: ![alt text](url "optional title") + // Don't forget: encode * and _ $text = preg_replace_callback('{ ( # wrap whole match in $1 !\[ - ('.$this->nested_brackets_re.') # alt text = $2 + (' . $this->nested_brackets_re . ') # alt text = $2 \] \s? # One optional whitespace character \( # literal paren @@ -878,7 +993,7 @@ class MarkdownExtra extends \Michelf\Markdown { (?: <(\S*)> # src url = $3 | - ('.$this->nested_url_parenthesis_re.') # src url = $4 + (' . $this->nested_url_parenthesis_re . ') # src url = $4 ) [ \n]* ( # $5 @@ -888,20 +1003,26 @@ class MarkdownExtra extends \Michelf\Markdown { [ \n]* )? # title is optional \) - (?:[ ]? '.$this->id_class_attr_catch_re.' )? # $8 = id/class attributes + (?:[ ]? ' . $this->id_class_attr_catch_re . ' )? # $8 = id/class attributes ) }xs', array($this, '_doImages_inline_callback'), $text); return $text; } + + /** + * Callback for referenced images + * @param array $matches + * @return string + */ protected 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); # for shortcut links like ![this][]. + if ($link_id === "") { + $link_id = strtolower($alt_text); // for shortcut links like ![this][]. } $alt_text = $this->encodeAttribute($alt_text); @@ -913,22 +1034,28 @@ class MarkdownExtra extends \Michelf\Markdown { $title = $this->encodeAttribute($title); $result .= " title=\"$title\""; } - if (isset($this->ref_attr[$link_id])) + if (isset($this->ref_attr[$link_id])) { $result .= $this->ref_attr[$link_id]; + } $result .= $this->empty_element_suffix; $result = $this->hashPart($result); } else { - # If there's no such link ID, leave intact: + // If there's no such link ID, leave intact: $result = $whole_match; } return $result; } + + /** + * Callback for inline images + * @param array $matches + * @return string + */ protected function _doImages_inline_callback($matches) { - $whole_match = $matches[1]; $alt_text = $matches[2]; - $url = $matches[3] == '' ? $matches[4] : $matches[3]; + $url = $matches[3] === '' ? $matches[4] : $matches[3]; $title =& $matches[7]; $attr = $this->doExtraAttributes("img", $dummy =& $matches[8]); @@ -937,7 +1064,7 @@ class MarkdownExtra extends \Michelf\Markdown { $result = "\"$alt_text\"";encodeAttribute($title); - $result .= " title=\"$title\""; # $title already quoted + $result .= " title=\"$title\""; // $title already quoted } $result .= $attr; $result .= $this->empty_element_suffix; @@ -945,40 +1072,41 @@ class MarkdownExtra extends \Michelf\Markdown { return $this->hashPart($result); } - + /** + * Process markdown headers. Redefined to add ID and class attribute support. + * @param string $text + * @return string + */ protected function doHeaders($text) { - # - # Redefined to add id and class attribute support. - # - # Setext-style headers: - # Header 1 {#header1} - # ======== - # - # Header 2 {#header2 .class1 .class2} - # -------- - # + // Setext-style headers: + // Header 1 {#header1} + // ======== + // + // Header 2 {#header2 .class1 .class2} + // -------- + // $text = preg_replace_callback( '{ (^.+?) # $1: Header text - (?:[ ]+ '.$this->id_class_attr_catch_re.' )? # $3 = id/class attributes + (?:[ ]+ ' . $this->id_class_attr_catch_re . ' )? # $3 = id/class attributes [ ]*\n(=+|-+)[ ]*\n+ # $3: Header footer }mx', array($this, '_doHeaders_callback_setext'), $text); - # atx-style headers: - # # Header 1 {#header1} - # ## Header 2 {#header2} - # ## Header 2 with closing hashes ## {#header3.class1.class2} - # ... - # ###### Header 6 {.class2} - # + // atx-style headers: + // # Header 1 {#header1} + // ## Header 2 {#header2} + // ## Header 2 with closing hashes ## {#header3.class1.class2} + // ... + // ###### Header 6 {.class2} + // $text = preg_replace_callback('{ ^(\#{1,6}) # $1 = string of #\'s - [ ]* + [ ]'.($this->hashtag_protection ? '+' : '*').' (.+?) # $2 = Header text [ ]* \#* # optional closing #\'s (not counted) - (?:[ ]+ '.$this->id_class_attr_catch_re.' )? # $3 = id/class attributes + (?:[ ]+ ' . $this->id_class_attr_catch_re . ' )? # $3 = id/class attributes [ ]* \n+ }xm', @@ -986,51 +1114,63 @@ class MarkdownExtra extends \Michelf\Markdown { return $text; } - protected function _doHeaders_callback_setext($matches) { - if ($matches[3] == '-' && preg_match('{^- }', $matches[1])) - return $matches[0]; - $level = $matches[3]{0} == '=' ? 1 : 2; + /** + * Callback for setext headers + * @param array $matches + * @return string + */ + protected function _doHeaders_callback_setext($matches) { + if ($matches[3] === '-' && preg_match('{^- }', $matches[1])) { + return $matches[0]; + } + + $level = $matches[3][0] === '=' ? 1 : 2; $defaultId = is_callable($this->header_id_func) ? call_user_func($this->header_id_func, $matches[1]) : null; $attr = $this->doExtraAttributes("h$level", $dummy =& $matches[2], $defaultId); - $block = "".$this->runSpanGamut($matches[1]).""; + $block = "" . $this->runSpanGamut($matches[1]) . ""; return "\n" . $this->hashBlock($block) . "\n\n"; } + + /** + * Callback for atx headers + * @param array $matches + * @return string + */ protected function _doHeaders_callback_atx($matches) { $level = strlen($matches[1]); $defaultId = is_callable($this->header_id_func) ? call_user_func($this->header_id_func, $matches[2]) : null; $attr = $this->doExtraAttributes("h$level", $dummy =& $matches[3], $defaultId); - $block = "".$this->runSpanGamut($matches[2]).""; + $block = "" . $this->runSpanGamut($matches[2]) . ""; return "\n" . $this->hashBlock($block) . "\n\n"; } - + /** + * Form HTML tables. + * @param string $text + * @return string + */ protected function doTables($text) { - # - # Form HTML tables. - # $less_than_tab = $this->tab_width - 1; - # - # Find tables with leading pipe. - # - # | Header 1 | Header 2 - # | -------- | -------- - # | Cell 1 | Cell 2 - # | Cell 3 | Cell 4 - # + // Find tables with leading pipe. + // + // | Header 1 | Header 2 + // | -------- | -------- + // | Cell 1 | Cell 2 + // | Cell 3 | Cell 4 $text = preg_replace_callback(' { ^ # Start of a line - [ ]{0,'.$less_than_tab.'} # Allowed whitespace. + [ ]{0,' . $less_than_tab . '} # Allowed whitespace. [|] # Optional leading pipe (present) (.+) \n # $1: Header row (at least one pipe) - - [ ]{0,'.$less_than_tab.'} # Allowed whitespace. + + [ ]{0,' . $less_than_tab . '} # Allowed whitespace. [|] ([ ]*[-:]+[-| :]*) \n # $2: Header underline - + ( # $3: Cells (?> [ ]* # Allowed whitespace. @@ -1040,24 +1180,22 @@ class MarkdownExtra extends \Michelf\Markdown { (?=\n|\Z) # Stop at final double newline. }xm', array($this, '_doTable_leadingPipe_callback'), $text); - - # - # Find tables without leading pipe. - # - # Header 1 | Header 2 - # -------- | -------- - # Cell 1 | Cell 2 - # Cell 3 | Cell 4 - # + + // Find tables without leading pipe. + // + // Header 1 | Header 2 + // -------- | -------- + // Cell 1 | Cell 2 + // Cell 3 | Cell 4 $text = preg_replace_callback(' { ^ # Start of a line - [ ]{0,'.$less_than_tab.'} # Allowed whitespace. + [ ]{0,' . $less_than_tab . '} # Allowed whitespace. (\S.*[|].*) \n # $1: Header row (at least one pipe) - - [ ]{0,'.$less_than_tab.'} # Allowed whitespace. + + [ ]{0,' . $less_than_tab . '} # Allowed whitespace. ([-:]+[ ]*[|][-| :]*) \n # $2: Header underline - + ( # $3: Cells (?> .* [|] .* \n # Row content @@ -1069,35 +1207,52 @@ class MarkdownExtra extends \Michelf\Markdown { return $text; } + + /** + * Callback for removing the leading pipe for each row + * @param array $matches + * @return string + */ protected function _doTable_leadingPipe_callback($matches) { $head = $matches[1]; $underline = $matches[2]; $content = $matches[3]; - - # Remove leading pipe for each row. + $content = preg_replace('/^ *[|]/m', '', $content); - + return $this->_doTable_callback(array($matches[0], $head, $underline, $content)); } - protected function _doTable_makeAlignAttr($alignname) - { - if (empty($this->table_align_class_tmpl)) + + /** + * Make the align attribute in a table + * @param string $alignname + * @return string + */ + protected function _doTable_makeAlignAttr($alignname) { + if (empty($this->table_align_class_tmpl)) { return " align=\"$alignname\""; + } $classname = str_replace('%%', $alignname, $this->table_align_class_tmpl); return " class=\"$classname\""; } + + /** + * Calback for processing tables + * @param array $matches + * @return string + */ protected function _doTable_callback($matches) { $head = $matches[1]; $underline = $matches[2]; $content = $matches[3]; - # Remove any tailing pipes for each line. + // Remove any tailing pipes for each line. $head = preg_replace('/[|] *$/m', '', $head); $underline = preg_replace('/[|] *$/m', '', $underline); $content = preg_replace('/[|] *$/m', '', $content); - - # Reading alignement from header underline. + + // Reading alignement from header underline. $separators = preg_split('/ *[|] */', $underline); foreach ($separators as $n => $s) { if (preg_match('/^ *-+: *$/', $s)) @@ -1109,62 +1264,65 @@ class MarkdownExtra extends \Michelf\Markdown { else $attr[$n] = ''; } - - # Parsing span elements, including code spans, character escapes, - # and inline HTML tags, so that pipes inside those gets ignored. + + // Parsing span elements, including code spans, character escapes, + // and inline HTML tags, so that pipes inside those gets ignored. $head = $this->parseSpan($head); $headers = preg_split('/ *[|] */', $head); $col_count = count($headers); $attr = array_pad($attr, $col_count, ''); - - # Write column headers. + + // Write column headers. $text = "\n"; $text .= "\n"; $text .= "\n"; - foreach ($headers as $n => $header) - $text .= " ".$this->runSpanGamut(trim($header))."\n"; + foreach ($headers as $n => $header) { + $text .= " " . $this->runSpanGamut(trim($header)) . "\n"; + } $text .= "\n"; $text .= "\n"; - - # Split content by row. + + // Split content by row. $rows = explode("\n", trim($content, "\n")); - + $text .= "\n"; foreach ($rows as $row) { - # Parsing span elements, including code spans, character escapes, - # and inline HTML tags, so that pipes inside those gets ignored. + // Parsing span elements, including code spans, character escapes, + // and inline HTML tags, so that pipes inside those gets ignored. $row = $this->parseSpan($row); - - # Split row by cell. + + // Split row by cell. $row_cells = preg_split('/ *[|] */', $row, $col_count); $row_cells = array_pad($row_cells, $col_count, ''); - + $text .= "\n"; - foreach ($row_cells as $n => $cell) - $text .= " ".$this->runSpanGamut(trim($cell))."\n"; + foreach ($row_cells as $n => $cell) { + $text .= " " . $this->runSpanGamut(trim($cell)) . "\n"; + } $text .= "\n"; } $text .= "\n"; $text .= "
    "; - + return $this->hashBlock($text) . "\n"; } - + /** + * Form HTML definition lists. + * @param string $text + * @return string + */ protected function doDefLists($text) { - # - # Form HTML definition lists. - # $less_than_tab = $this->tab_width - 1; - # Re-usable pattern to match any entire dl list: + // Re-usable pattern to match any entire dl list: $whole_list_re = '(?> ( # $1 = whole list ( # $2 - [ ]{0,'.$less_than_tab.'} + [ ]{0,' . $less_than_tab . '} ((?>.*\S.*\n)+) # $3 = defined term \n? - [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition + [ ]{0,' . $less_than_tab . '}:[ ]+ # colon starting definition ) (?s:.+?) ( # $4 @@ -1173,13 +1331,13 @@ class MarkdownExtra extends \Michelf\Markdown { \n{2,} (?=\S) (?! # Negative lookahead for another term - [ ]{0,'.$less_than_tab.'} + [ ]{0,' . $less_than_tab . '} (?: \S.*\n )+? # defined term \n? - [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition + [ ]{0,' . $less_than_tab . '}:[ ]+ # colon starting definition ) (?! # Negative lookahead for another definition - [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition + [ ]{0,' . $less_than_tab . '}:[ ]+ # colon starting definition ) ) ) @@ -1187,67 +1345,81 @@ class MarkdownExtra extends \Michelf\Markdown { $text = preg_replace_callback('{ (?>\A\n?|(?<=\n\n)) - '.$whole_list_re.' + ' . $whole_list_re . ' }mx', array($this, '_doDefLists_callback'), $text); return $text; } + + /** + * Callback for processing definition lists + * @param array $matches + * @return string + */ protected function _doDefLists_callback($matches) { - # Re-usable patterns to match list item bullets and number markers: + // Re-usable patterns to match list item bullets and number markers: $list = $matches[1]; - - # Turn double returns into triple returns, so that we can make a - # paragraph for the last item in a list, if necessary: + + // Turn double returns into triple returns, so that we can make a + // paragraph for the last item in a list, if necessary: $result = trim($this->processDefListItems($list)); $result = "
    \n" . $result . "\n
    "; return $this->hashBlock($result) . "\n\n"; } - + /** + * Process the contents of a single definition list, splitting it + * into individual term and definition list items. + * @param string $list_str + * @return string + */ protected function processDefListItems($list_str) { - # - # Process the contents of a single definition list, splitting it - # into individual term and definition list items. - # + $less_than_tab = $this->tab_width - 1; - - # trim trailing blank lines: + + // Trim trailing blank lines: $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str); - # Process definition terms. + // Process definition terms. $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. + (?>\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); - # Process actual definitions. + // Process actual definitions. $list_str = preg_replace_callback('{ - \n(\n+)? # leading line = $1 - ( # marker space = $2 - [ ]{0,'.$less_than_tab.'} # whitespace before colon - \:[ ]+ # definition mark (colon) + \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.'} \:[ ] | + ((?s:.+?)) # definition text = $3 + (?= \n+ # stop at next definition mark, + (?: # next term or end of text + [ ]{0,' . $less_than_tab . '} \:[ ] |
    | \z - ) - ) + ) + ) }xm', array($this, '_processDefListItems_callback_dd'), $list_str); return $list_str; } + + /** + * Callback for
    elements in definition lists + * @param array $matches + * @return string + */ protected function _processDefListItems_callback_dt($matches) { $terms = explode("\n", trim($matches[1])); $text = ''; @@ -1257,13 +1429,19 @@ class MarkdownExtra extends \Michelf\Markdown { } return $text . "\n"; } + + /** + * Callback for
    elements in definition lists + * @param array $matches + * @return string + */ protected function _processDefListItems_callback_dd($matches) { $leading_line = $matches[1]; $marker_space = $matches[2]; $def = $matches[3]; if ($leading_line || preg_match('/\n{2,}/', $def)) { - # Replace marker with the appropriate whitespace indentation + // Replace marker with the appropriate whitespace indentation $def = str_repeat(' ', strlen($marker_space)) . $def; $def = $this->runBlockGamut($this->outdent($def . "\n\n")); $def = "\n". $def ."\n"; @@ -1276,17 +1454,18 @@ class MarkdownExtra extends \Michelf\Markdown { return "\n
    " . $def . "
    \n"; } - + /** + * Adding the fenced code block syntax to regular Markdown: + * + * ~~~ + * Code block + * ~~~ + * + * @param string $text + * @return string + */ protected function doFencedCodeBlocks($text) { - # - # Adding the fenced code block syntax to regular Markdown: - # - # ~~~ - # Code block - # ~~~ - # - $less_than_tab = $this->tab_width; - + $text = preg_replace_callback('{ (?:\n|\A) # 1: Opening marker @@ -1299,10 +1478,10 @@ class MarkdownExtra extends \Michelf\Markdown { )? [ ]* (?: - '.$this->id_class_attr_catch_re.' # 3: Extra attributes + ' . $this->id_class_attr_catch_re . ' # 3: Extra attributes )? [ ]* \n # Whitespace and newline following marker. - + # 4: Content ( (?> @@ -1310,7 +1489,7 @@ class MarkdownExtra extends \Michelf\Markdown { .*\n+ )+ ) - + # Closing marker. \1 [ ]* (?= \n ) }xm', @@ -1318,6 +1497,12 @@ class MarkdownExtra extends \Michelf\Markdown { return $text; } + + /** + * Callback to process fenced code blocks + * @param array $matches + * @return string + */ protected function _doFencedCodeBlocks_callback($matches) { $classname =& $matches[2]; $attrs =& $matches[3]; @@ -1333,204 +1518,256 @@ class MarkdownExtra extends \Michelf\Markdown { array($this, '_doFencedCodeBlocks_newlines'), $codeblock); $classes = array(); - if ($classname != "") { - if ($classname{0} == '.') + if ($classname !== "") { + if ($classname[0] === '.') { $classname = substr($classname, 1); - $classes[] = $this->code_class_prefix.$classname; + } + $classes[] = $this->code_class_prefix . $classname; } $attr_str = $this->doExtraAttributes($this->code_attr_on_pre ? "pre" : "code", $attrs, null, $classes); $pre_attr_str = $this->code_attr_on_pre ? $attr_str : ''; $code_attr_str = $this->code_attr_on_pre ? '' : $attr_str; $codeblock = "$codeblock
    "; - + return "\n\n".$this->hashBlock($codeblock)."\n\n"; } + + /** + * Replace new lines in fenced code blocks + * @param array $matches + * @return string + */ protected function _doFencedCodeBlocks_newlines($matches) { - return str_repeat("empty_element_suffix", + return str_repeat("empty_element_suffix", strlen($matches[0])); } - - # - # Redefining emphasis markers so that emphasis by underscore does not - # work in the middle of a word. - # + /** + * Redefining emphasis markers so that emphasis by underscore does not + * work in the middle of a word. + * @var array + */ protected $em_relist = array( '' => '(?:(? '(? '(? '(?:(? '(? '(? '(?:(? '(? '(? tags - # - # Strip leading and trailing lines: + /** + * Parse text into paragraphs + * @param string $text String to process in paragraphs + * @param boolean $wrap_in_p Whether paragraphs should be wrapped in

    tags + * @return string HTML output + */ + protected function formParagraphs($text, $wrap_in_p = true) { + // Strip leading and trailing lines: $text = preg_replace('/\A\n+|\n+\z/', '', $text); - + $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY); - # - # Wrap

    tags and unhashify HTML blocks - # + // Wrap

    tags and unhashify HTML blocks foreach ($grafs as $key => $value) { $value = trim($this->runSpanGamut($value)); - - # Check if this should be enclosed in a paragraph. - # Clean tag hashes & block tag hashes are left alone. - $is_p = !preg_match('/^B\x1A[0-9]+B|^C\x1A[0-9]+C$/', $value); - + + // Check if this should be enclosed in a paragraph. + // Clean tag hashes & block tag hashes are left alone. + $is_p = $wrap_in_p && !preg_match('/^B\x1A[0-9]+B|^C\x1A[0-9]+C$/', $value); + if ($is_p) { $value = "

    $value

    "; } $grafs[$key] = $value; } - - # Join grafs in one text, then unhash HTML tags. + + // Join grafs in one text, then unhash HTML tags. $text = implode("\n\n", $grafs); - - # Finish by removing any tag hashes still present in $text. + + // Finish by removing any tag hashes still present in $text. $text = $this->unhash($text); - + return $text; } - - - ### Footnotes - + + + /** + * Footnotes - Strips link definitions from text, stores the URLs and + * titles in hash references. + * @param string $text + * @return string + */ protected function stripFootnotes($text) { - # - # Strips link definitions from text, stores the URLs and titles in - # hash references. - # $less_than_tab = $this->tab_width - 1; - # Link defs are in the form: [^id]: url "optional title" + // Link defs are in the form: [^id]: url "optional title" $text = preg_replace_callback('{ - ^[ ]{0,'.$less_than_tab.'}\[\^(.+?)\][ ]?: # note_id = $1 + ^[ ]{0,' . $less_than_tab . '}\[\^(.+?)\][ ]?: # note_id = $1 [ ]* \n? # maybe *one* newline ( # text = $2 (no blank lines allowed) - (?: + (?: .+ # actual text | - \n # newlines but + \n # newlines but (?!\[.+?\][ ]?:\s)# negative lookahead for footnote or link definition marker. - (?!\n+[ ]{0,3}\S)# ensure line is not blank and followed + (?!\n+[ ]{0,3}\S)# ensure line is not blank and followed # by non-indented content )* - ) + ) }xm', array($this, '_stripFootnotes_callback'), $text); return $text; } + + /** + * Callback for stripping footnotes + * @param array $matches + * @return string + */ protected function _stripFootnotes_callback($matches) { $note_id = $this->fn_id_prefix . $matches[1]; $this->footnotes[$note_id] = $this->outdent($matches[2]); - return ''; # String that will replace the block + return ''; // String that will replace the block } - + /** + * Replace footnote references in $text [^id] with a special text-token + * which will be replaced by the actual footnote marker in appendFootnotes. + * @param string $text + * @return string + */ protected function doFootnotes($text) { - # - # Replace footnote references in $text [^id] with a special text-token - # which will be replaced by the actual footnote marker in appendFootnotes. - # if (!$this->in_anchor) { $text = preg_replace('{\[\^(.+?)\]}', "F\x1Afn:\\1\x1A:", $text); } return $text; } - + /** + * Append footnote list to text + * @param string $text + * @return string + */ protected function appendFootnotes($text) { - # - # Append footnote list to text. - # - $text = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}', + $text = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}', array($this, '_appendFootnotes_callback'), $text); - - if (!empty($this->footnotes_ordered)) { - $text .= "\n\n"; - $text .= "
    \n"; - $text .= "empty_element_suffix ."\n"; - $text .= "
      \n\n"; - $attr = ""; - if ($this->fn_backlink_class != "") { - $class = $this->fn_backlink_class; - $class = $this->encodeAttribute($class); - $attr .= " class=\"$class\""; + if ( ! empty( $this->footnotes_ordered ) ) { + $this->_doFootnotes(); + if ( ! $this->omit_footnotes ) { + $text .= "\n\n"; + $text .= "
      \n"; + $text .= "empty_element_suffix . "\n"; + $text .= $this->footnotes_assembled; + $text .= "
      "; } - if ($this->fn_backlink_title != "") { - $title = $this->fn_backlink_title; - $title = $this->encodeAttribute($title); - $attr .= " title=\"$title\""; - } - $backlink_text = $this->fn_backlink_html; - $num = 0; - - while (!empty($this->footnotes_ordered)) { - $footnote = reset($this->footnotes_ordered); - $note_id = key($this->footnotes_ordered); - unset($this->footnotes_ordered[$note_id]); - $ref_count = $this->footnotes_ref_count[$note_id]; - unset($this->footnotes_ref_count[$note_id]); - unset($this->footnotes[$note_id]); - - $footnote .= "\n"; # Need to append newline before parsing. - $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); + } + return $text; + } - # Prepare backlink, multiple backlinks if multiple references - $backlink = "$backlink_text"; - for ($ref_num = 2; $ref_num <= $ref_count; ++$ref_num) { - $backlink .= " $backlink_text"; + + /** + * Generates the HTML for footnotes. Called by appendFootnotes, even if + * footnotes are not being appended. + * @return void + */ + protected function _doFootnotes() { + $attr = array(); + if ($this->fn_backlink_class !== "") { + $class = $this->fn_backlink_class; + $class = $this->encodeAttribute($class); + $attr['class'] = " class=\"$class\""; + } + $attr['role'] = " role=\"doc-backlink\""; + $num = 0; + + $text = "
        \n\n"; + while (!empty($this->footnotes_ordered)) { + $footnote = reset($this->footnotes_ordered); + $note_id = key($this->footnotes_ordered); + unset($this->footnotes_ordered[$note_id]); + $ref_count = $this->footnotes_ref_count[$note_id]; + unset($this->footnotes_ref_count[$note_id]); + unset($this->footnotes[$note_id]); + + $footnote .= "\n"; // Need to append newline before parsing. + $footnote = $this->runBlockGamut("$footnote\n"); + $footnote = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}', + array($this, '_appendFootnotes_callback'), $footnote); + + $num++; + $note_id = $this->encodeAttribute($note_id); + + // Prepare backlink, multiple backlinks if multiple references + // Do not create empty backlinks if the html is blank + $backlink = ""; + if (!empty($this->fn_backlink_html)) { + for ($ref_num = 1; $ref_num <= $ref_count; ++$ref_num) { + if (!empty($this->fn_backlink_title)) { + $attr['title'] = ' title="' . $this->encodeAttribute($this->fn_backlink_title) . '"'; + } + if (!empty($this->fn_backlink_label)) { + $attr['label'] = ' aria-label="' . $this->encodeAttribute($this->fn_backlink_label) . '"'; + } + $parsed_attr = $this->parseFootnotePlaceholders( + implode('', $attr), + $num, + $ref_num + ); + $backlink_text = $this->parseFootnotePlaceholders( + $this->fn_backlink_html, + $num, + $ref_num + ); + $ref_count_mark = $ref_num > 1 ? $ref_num : ''; + $backlink .= " $backlink_text"; } - # Add backlink to last paragraph; create new paragraph if needed. + $backlink = trim($backlink); + } + + // Add backlink to last paragraph; create new paragraph if needed. + if (!empty($backlink)) { if (preg_match('{

        $}', $footnote)) { $footnote = substr($footnote, 0, -4) . " $backlink

        "; } else { $footnote .= "\n\n

        $backlink

        "; } - - $text .= "
      1. \n"; - $text .= $footnote . "\n"; - $text .= "
      2. \n\n"; } - - $text .= "
      \n"; - $text .= "
    "; + + $text .= "
  • \n"; + $text .= $footnote . "\n"; + $text .= "
  • \n\n"; } - return $text; + $text .= "\n"; + + $this->footnotes_assembled = $text; } + + /** + * Callback for appending footnotes + * @param array $matches + * @return string + */ protected function _appendFootnotes_callback($matches) { $node_id = $this->fn_id_prefix . $matches[1]; - - # Create footnote marker only if it has a corresponding footnote *and* - # the footnote hasn't been used by another marker. + + // Create footnote marker only if it has a corresponding footnote *and* + // the footnote hasn't been used by another marker. if (isset($this->footnotes[$node_id])) { $num =& $this->footnotes_numbers[$node_id]; if (!isset($num)) { - # Transfer footnote content to the ordered list and give it its - # number + // Transfer footnote content to the ordered list and give it its + // number $this->footnotes_ordered[$node_id] = $this->footnotes[$node_id]; $this->footnotes_ref_count[$node_id] = 1; $num = $this->footnote_counter++; @@ -1540,86 +1777,117 @@ class MarkdownExtra extends \Michelf\Markdown { } $attr = ""; - if ($this->fn_link_class != "") { + if ($this->fn_link_class !== "") { $class = $this->fn_link_class; $class = $this->encodeAttribute($class); $attr .= " class=\"$class\""; } - if ($this->fn_link_title != "") { + if ($this->fn_link_title !== "") { $title = $this->fn_link_title; $title = $this->encodeAttribute($title); $attr .= " title=\"$title\""; } - + $attr .= " role=\"doc-noteref\""; + $attr = str_replace("%%", $num, $attr); $node_id = $this->encodeAttribute($node_id); - + return "". "$num". ""; } - - return "[^".$matches[1]."]"; + + return "[^" . $matches[1] . "]"; } - - - ### Abbreviations ### - + + /** + * Build footnote label by evaluating any placeholders. + * - ^^ footnote number + * - %% footnote reference number (Nth reference to footnote number) + * @param string $label + * @param int $footnote_number + * @param int $reference_number + * @return string + */ + protected function parseFootnotePlaceholders($label, $footnote_number, $reference_number) { + return str_replace( + array('^^', '%%'), + array($footnote_number, $reference_number), + $label + ); + } + + + /** + * Abbreviations - strips abbreviations from text, stores titles in hash + * references. + * @param string $text + * @return string + */ protected function stripAbbreviations($text) { - # - # Strips abbreviations from text, stores titles in hash references. - # $less_than_tab = $this->tab_width - 1; - # Link defs are in the form: [id]*: url "optional title" + // Link defs are in the form: [id]*: url "optional title" $text = preg_replace_callback('{ - ^[ ]{0,'.$less_than_tab.'}\*\[(.+?)\][ ]?: # abbr_id = $1 - (.*) # text = $2 (no blank lines allowed) + ^[ ]{0,' . $less_than_tab . '}\*\[(.+?)\][ ]?: # abbr_id = $1 + (.*) # text = $2 (no blank lines allowed) }xm', array($this, '_stripAbbreviations_callback'), $text); return $text; } + + /** + * Callback for stripping abbreviations + * @param array $matches + * @return string + */ protected function _stripAbbreviations_callback($matches) { $abbr_word = $matches[1]; $abbr_desc = $matches[2]; - if ($this->abbr_word_re) + 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 ''; # String that will replace the block + return ''; // String that will replace the block } - - + + /** + * Find defined abbreviations in text and wrap them in elements. + * @param string $text + * @return string + */ protected function doAbbreviations($text) { - # - # Find defined abbreviations in text and wrap them in elements. - # if ($this->abbr_word_re) { - // cannot use the /x modifier because abbr_word_re may + // cannot use the /x modifier because abbr_word_re may // contain significant spaces: - $text = preg_replace_callback('{'. - '(?abbr_word_re.')'. - '(?![\w\x1A])'. - '}', + $text = preg_replace_callback('{' . + '(?abbr_word_re . ')' . + '(?![\w\x1A])' . + '}', array($this, '_doAbbreviations_callback'), $text); } return $text; } + + /** + * Callback for processing abbreviations + * @param array $matches + * @return string + */ protected 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"); - } else { - $desc = $this->encodeAttribute($desc); - return $this->hashPart("$abbr"); } - } else { - return $matches[0]; + $desc = $this->encodeAttribute($desc); + return $this->hashPart("$abbr"); } + return $matches[0]; } } diff --git a/third/Md/MarkdownInterface.inc.php b/third/Md/MarkdownInterface.inc.php index a023ed4..c4e9ac7 100644 --- a/third/Md/MarkdownInterface.inc.php +++ b/third/Md/MarkdownInterface.inc.php @@ -1,9 +1,9 @@ -# -# Original Markdown -# Copyright (c) 2004-2006 John Gruber -# -# +/** + * Markdown - A text-to-HTML conversion tool for web writers + * + * @package php-markdown + * @author Michel Fortin + * @copyright 2004-2019 Michel Fortin + * @copyright (Original Markdown) 2004-2006 John Gruber + */ + namespace Michelf; - -# -# Markdown Parser Interface -# - +/** + * Markdown Parser Interface + */ interface MarkdownInterface { + /** + * Initialize the parser and return the result of its transform method. + * This will work fine for derived classes too. + * + * @api + * + * @param string $text + * @return string + */ + public static function defaultTransform($text); - # - # Initialize the parser and return the result of its transform method. - # This will work fine for derived classes too. - # - public static function defaultTransform($text); - - # - # Main function. Performs some preprocessing on the input text - # and pass it through the document gamut. - # - public function transform($text); - + /** + * Main function. Performs some preprocessing on the input text + * and pass it through the document gamut. + * + * @api + * + * @param string $text + * @return string + */ + public function transform($text); } From 37e016267613c0978dc1c5e3558e77f985b73672 Mon Sep 17 00:00:00 2001 From: "U-P231-ELECTROLL\\gener" Date: Sat, 16 May 2020 11:43:43 +0400 Subject: [PATCH 04/17] Carto en local pour dev sur Crozet et modifs suite au passage sous windows --- .gitignore | 1 + .htaccess | 0 README.md | 0 _ressources/database_drawing | 0 _ressources/db_model.dbm | 0 _ressources/logo.svg | 0 _ressources/sql_skeleton.sql | 9 +++------ controllers/d.admin.php | 2 +- controllers/d.blog.php | 0 controllers/d.contact.php | 0 controllers/d.map.php | 0 controllers/d.users.php | 0 controllers/d.wiki.php | 0 includes/config.example.php | 0 includes/images.php | 0 includes/routes.php | 0 includes/session.php | 0 index.php | 0 models/d.blog.php | 0 models/d.locales.php | 0 models/d.poi.php | 0 models/d.users.php | 0 models/d.wiki.php | 0 third/Md/Markdown.inc.php | 0 third/Md/Markdown.php | 0 third/Md/MarkdownExtra.inc.php | 0 third/Md/MarkdownExtra.php | 0 third/Md/MarkdownInterface.inc.php | 0 third/Md/MarkdownInterface.php | 0 views/blocks/d.footer.html | 0 views/blocks/d.head.html | 0 views/blocks/d.nav.html | 0 views/css/d.blog.css | 0 views/css/d.index.css | 0 views/css/d.map.css | 0 views/css/d.user.css | 0 views/css/d.wiki.css | 0 views/d.admin.git-pull.html | 0 views/d.admin.html | 0 views/d.admin.logs.html | 0 views/d.blog.edit.html | 0 views/d.blog.list.html | 0 views/d.blog.list.rss | 0 views/d.blog.view.html | 0 views/d.contact.html | 0 views/d.index.html | 0 views/d.map.html | 0 views/d.user.login.html | 0 views/d.user.member_list.html | 0 views/d.user.password_lost.html | 0 views/d.user.profile.edit.html | 0 views/d.user.profile.html | 0 views/d.user.signin.html | 0 views/d.wiki.edit.html | 0 views/d.wiki.view.html | 0 views/fonts/FiraMono-Bold.eot | Bin views/fonts/FiraMono-Bold.otf | Bin views/fonts/FiraSans-Bold.ttf | Bin views/fonts/FiraSans-ExtraLight.eot | Bin views/fonts/FiraSans-ExtraLight.otf | Bin views/fonts/FiraSans-ExtraLight.ttf | Bin views/fonts/FiraSans-Light.eot | Bin views/fonts/FiraSans-Light.otf | Bin views/fonts/FiraSans-Light.ttf | Bin views/fonts/FiraSans-Medium.eot | Bin views/fonts/FiraSans-Medium.otf | Bin views/fonts/FiraSans-Medium.ttf | Bin views/fonts/FiraSans-Regular.eot | Bin views/fonts/FiraSans-Regular.otf | Bin views/fonts/FiraSans-Regular.ttf | Bin views/img/aside.jpg | Bin views/img/favicon.png | Bin views/img/header.svg | 0 views/img/header_rss.svg | 0 views/img/thumb1.jpg | Bin views/img/thumb2.jpg | Bin views/img/thumb3.jpg | Bin views/js/d.avatar.js | 0 views/js/d.captcha.js | 0 views/js/d.header.js | 0 views/js/d.map.js | 12 +++++++----- views/third/fontawesome-free-5.4.1-web/css/all.css | 0 .../fontawesome-free-5.4.1-web/css/all.min.css | 0 .../webfonts/fa-brands-400.eot | Bin .../webfonts/fa-brands-400.svg | 0 .../webfonts/fa-brands-400.ttf | Bin .../webfonts/fa-brands-400.woff | Bin .../webfonts/fa-brands-400.woff2 | Bin .../webfonts/fa-regular-400.eot | Bin .../webfonts/fa-regular-400.svg | 0 .../webfonts/fa-regular-400.ttf | Bin .../webfonts/fa-regular-400.woff | Bin .../webfonts/fa-regular-400.woff2 | Bin .../webfonts/fa-solid-900.eot | Bin .../webfonts/fa-solid-900.svg | 0 .../webfonts/fa-solid-900.ttf | Bin .../webfonts/fa-solid-900.woff | Bin .../webfonts/fa-solid-900.woff2 | Bin views/third/jquery-3.3.1.min.js | 0 views/third/leaflet-easybutton/easy-button.css | 0 views/third/leaflet-easybutton/easy-button.js | 0 .../third/leaflet-fullscreen/Leaflet.fullscreen.js | 0 .../leaflet-fullscreen/Leaflet.fullscreen.min.js | 0 views/third/leaflet-fullscreen/fullscreen.png | Bin views/third/leaflet-fullscreen/fullscreen@2x.png | Bin .../third/leaflet-fullscreen/leaflet.fullscreen.css | 0 views/third/leaflet/images/layers-2x.png | Bin views/third/leaflet/images/layers.png | Bin views/third/leaflet/images/marker-icon-2x.png | Bin views/third/leaflet/images/marker-icon.png | Bin views/third/leaflet/images/marker-shadow.png | Bin views/third/leaflet/leaflet.css | 0 views/third/leaflet/leaflet.js | 0 113 files changed, 12 insertions(+), 12 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .htaccess mode change 100644 => 100755 README.md mode change 100644 => 100755 _ressources/database_drawing mode change 100644 => 100755 _ressources/db_model.dbm mode change 100644 => 100755 _ressources/logo.svg mode change 100644 => 100755 _ressources/sql_skeleton.sql mode change 100644 => 100755 controllers/d.admin.php mode change 100644 => 100755 controllers/d.blog.php mode change 100644 => 100755 controllers/d.contact.php mode change 100644 => 100755 controllers/d.map.php mode change 100644 => 100755 controllers/d.users.php mode change 100644 => 100755 controllers/d.wiki.php mode change 100644 => 100755 includes/config.example.php mode change 100644 => 100755 includes/images.php mode change 100644 => 100755 includes/routes.php mode change 100644 => 100755 includes/session.php mode change 100644 => 100755 index.php mode change 100644 => 100755 models/d.blog.php mode change 100644 => 100755 models/d.locales.php mode change 100644 => 100755 models/d.poi.php mode change 100644 => 100755 models/d.users.php mode change 100644 => 100755 models/d.wiki.php mode change 100644 => 100755 third/Md/Markdown.inc.php mode change 100644 => 100755 third/Md/Markdown.php mode change 100644 => 100755 third/Md/MarkdownExtra.inc.php mode change 100644 => 100755 third/Md/MarkdownExtra.php mode change 100644 => 100755 third/Md/MarkdownInterface.inc.php mode change 100644 => 100755 third/Md/MarkdownInterface.php mode change 100644 => 100755 views/blocks/d.footer.html mode change 100644 => 100755 views/blocks/d.head.html mode change 100644 => 100755 views/blocks/d.nav.html mode change 100644 => 100755 views/css/d.blog.css mode change 100644 => 100755 views/css/d.index.css mode change 100644 => 100755 views/css/d.map.css mode change 100644 => 100755 views/css/d.user.css mode change 100644 => 100755 views/css/d.wiki.css mode change 100644 => 100755 views/d.admin.git-pull.html mode change 100644 => 100755 views/d.admin.html mode change 100644 => 100755 views/d.admin.logs.html mode change 100644 => 100755 views/d.blog.edit.html mode change 100644 => 100755 views/d.blog.list.html mode change 100644 => 100755 views/d.blog.list.rss mode change 100644 => 100755 views/d.blog.view.html mode change 100644 => 100755 views/d.contact.html mode change 100644 => 100755 views/d.index.html mode change 100644 => 100755 views/d.map.html mode change 100644 => 100755 views/d.user.login.html mode change 100644 => 100755 views/d.user.member_list.html mode change 100644 => 100755 views/d.user.password_lost.html mode change 100644 => 100755 views/d.user.profile.edit.html mode change 100644 => 100755 views/d.user.profile.html mode change 100644 => 100755 views/d.user.signin.html mode change 100644 => 100755 views/d.wiki.edit.html mode change 100644 => 100755 views/d.wiki.view.html mode change 100644 => 100755 views/fonts/FiraMono-Bold.eot mode change 100644 => 100755 views/fonts/FiraMono-Bold.otf mode change 100644 => 100755 views/fonts/FiraSans-Bold.ttf mode change 100644 => 100755 views/fonts/FiraSans-ExtraLight.eot mode change 100644 => 100755 views/fonts/FiraSans-ExtraLight.otf mode change 100644 => 100755 views/fonts/FiraSans-ExtraLight.ttf mode change 100644 => 100755 views/fonts/FiraSans-Light.eot mode change 100644 => 100755 views/fonts/FiraSans-Light.otf mode change 100644 => 100755 views/fonts/FiraSans-Light.ttf mode change 100644 => 100755 views/fonts/FiraSans-Medium.eot mode change 100644 => 100755 views/fonts/FiraSans-Medium.otf mode change 100644 => 100755 views/fonts/FiraSans-Medium.ttf mode change 100644 => 100755 views/fonts/FiraSans-Regular.eot mode change 100644 => 100755 views/fonts/FiraSans-Regular.otf mode change 100644 => 100755 views/fonts/FiraSans-Regular.ttf mode change 100644 => 100755 views/img/aside.jpg mode change 100644 => 100755 views/img/favicon.png mode change 100644 => 100755 views/img/header.svg mode change 100644 => 100755 views/img/header_rss.svg mode change 100644 => 100755 views/img/thumb1.jpg mode change 100644 => 100755 views/img/thumb2.jpg mode change 100644 => 100755 views/img/thumb3.jpg mode change 100644 => 100755 views/js/d.avatar.js mode change 100644 => 100755 views/js/d.captcha.js mode change 100644 => 100755 views/js/d.header.js mode change 100644 => 100755 views/js/d.map.js mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/css/all.css mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/css/all.min.css mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.eot mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.svg mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.ttf mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.woff mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.woff2 mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.eot mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.svg mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.ttf mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.woff mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.woff2 mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.eot mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.svg mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.ttf mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.woff mode change 100644 => 100755 views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.woff2 mode change 100644 => 100755 views/third/jquery-3.3.1.min.js mode change 100644 => 100755 views/third/leaflet-easybutton/easy-button.css mode change 100644 => 100755 views/third/leaflet-easybutton/easy-button.js mode change 100644 => 100755 views/third/leaflet-fullscreen/Leaflet.fullscreen.js mode change 100644 => 100755 views/third/leaflet-fullscreen/Leaflet.fullscreen.min.js mode change 100644 => 100755 views/third/leaflet-fullscreen/fullscreen.png mode change 100644 => 100755 views/third/leaflet-fullscreen/fullscreen@2x.png mode change 100644 => 100755 views/third/leaflet-fullscreen/leaflet.fullscreen.css mode change 100644 => 100755 views/third/leaflet/images/layers-2x.png mode change 100644 => 100755 views/third/leaflet/images/layers.png mode change 100644 => 100755 views/third/leaflet/images/marker-icon-2x.png mode change 100644 => 100755 views/third/leaflet/images/marker-icon.png mode change 100644 => 100755 views/third/leaflet/images/marker-shadow.png mode change 100644 => 100755 views/third/leaflet/leaflet.css mode change 100644 => 100755 views/third/leaflet/leaflet.js diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index e9815b0..49c715f --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ /includes/config.php /medias/* +/_maps *.sublime-project *.sublime-workspace *.log \ No newline at end of file diff --git a/.htaccess b/.htaccess old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/_ressources/database_drawing b/_ressources/database_drawing old mode 100644 new mode 100755 diff --git a/_ressources/db_model.dbm b/_ressources/db_model.dbm old mode 100644 new mode 100755 diff --git a/_ressources/logo.svg b/_ressources/logo.svg old mode 100644 new mode 100755 diff --git a/_ressources/sql_skeleton.sql b/_ressources/sql_skeleton.sql old mode 100644 new mode 100755 index 17262c7..628654c --- a/_ressources/sql_skeleton.sql +++ b/_ressources/sql_skeleton.sql @@ -6,10 +6,7 @@ -- object: kabano | type: ROLE -- -- DROP ROLE IF EXISTS kabano; -CREATE ROLE kabano WITH - INHERIT - LOGIN - ENCRYPTED PASSWORD '********'; + -- ddl-end -- @@ -42,7 +39,7 @@ SET search_path TO pg_catalog,public,topology; -- DROP EXTENSION IF EXISTS postgis CASCADE; CREATE EXTENSION postgis WITH SCHEMA public - VERSION '2.5.1'; + VERSION '3.0.1'; -- ddl-end -- COMMENT ON EXTENSION postgis IS 'PostGIS geometry, geography, and raster spatial types and functions'; -- ddl-end -- @@ -51,7 +48,7 @@ COMMENT ON EXTENSION postgis IS 'PostGIS geometry, geography, and raster spatial -- DROP EXTENSION IF EXISTS postgis_topology CASCADE; CREATE EXTENSION postgis_topology WITH SCHEMA topology - VERSION '2.5.1'; + VERSION '3.0.1'; -- ddl-end -- COMMENT ON EXTENSION postgis_topology IS 'PostGIS topology spatial types and functions'; -- ddl-end -- diff --git a/controllers/d.admin.php b/controllers/d.admin.php old mode 100644 new mode 100755 index eb5df90..6a6ebce --- a/controllers/d.admin.php +++ b/controllers/d.admin.php @@ -34,7 +34,7 @@ if(isset($controller->splitted_url[1]) && $user->rankIsHigher("moderator")) { } chdir($config['logs_folder']); - exec("tail -n 200 ".$files_list[$filenb+2]." | tac", $output); + //exec("tail -n 200 ".$files_list[$filenb+2]." | tac", $output); include ($config['views_folder']."d.admin.logs.html"); } diff --git a/controllers/d.blog.php b/controllers/d.blog.php old mode 100644 new mode 100755 diff --git a/controllers/d.contact.php b/controllers/d.contact.php old mode 100644 new mode 100755 diff --git a/controllers/d.map.php b/controllers/d.map.php old mode 100644 new mode 100755 diff --git a/controllers/d.users.php b/controllers/d.users.php old mode 100644 new mode 100755 diff --git a/controllers/d.wiki.php b/controllers/d.wiki.php old mode 100644 new mode 100755 diff --git a/includes/config.example.php b/includes/config.example.php old mode 100644 new mode 100755 diff --git a/includes/images.php b/includes/images.php old mode 100644 new mode 100755 diff --git a/includes/routes.php b/includes/routes.php old mode 100644 new mode 100755 diff --git a/includes/session.php b/includes/session.php old mode 100644 new mode 100755 diff --git a/index.php b/index.php old mode 100644 new mode 100755 diff --git a/models/d.blog.php b/models/d.blog.php old mode 100644 new mode 100755 diff --git a/models/d.locales.php b/models/d.locales.php old mode 100644 new mode 100755 diff --git a/models/d.poi.php b/models/d.poi.php old mode 100644 new mode 100755 diff --git a/models/d.users.php b/models/d.users.php old mode 100644 new mode 100755 diff --git a/models/d.wiki.php b/models/d.wiki.php old mode 100644 new mode 100755 diff --git a/third/Md/Markdown.inc.php b/third/Md/Markdown.inc.php old mode 100644 new mode 100755 diff --git a/third/Md/Markdown.php b/third/Md/Markdown.php old mode 100644 new mode 100755 diff --git a/third/Md/MarkdownExtra.inc.php b/third/Md/MarkdownExtra.inc.php old mode 100644 new mode 100755 diff --git a/third/Md/MarkdownExtra.php b/third/Md/MarkdownExtra.php old mode 100644 new mode 100755 diff --git a/third/Md/MarkdownInterface.inc.php b/third/Md/MarkdownInterface.inc.php old mode 100644 new mode 100755 diff --git a/third/Md/MarkdownInterface.php b/third/Md/MarkdownInterface.php old mode 100644 new mode 100755 diff --git a/views/blocks/d.footer.html b/views/blocks/d.footer.html old mode 100644 new mode 100755 diff --git a/views/blocks/d.head.html b/views/blocks/d.head.html old mode 100644 new mode 100755 diff --git a/views/blocks/d.nav.html b/views/blocks/d.nav.html old mode 100644 new mode 100755 diff --git a/views/css/d.blog.css b/views/css/d.blog.css old mode 100644 new mode 100755 diff --git a/views/css/d.index.css b/views/css/d.index.css old mode 100644 new mode 100755 diff --git a/views/css/d.map.css b/views/css/d.map.css old mode 100644 new mode 100755 diff --git a/views/css/d.user.css b/views/css/d.user.css old mode 100644 new mode 100755 diff --git a/views/css/d.wiki.css b/views/css/d.wiki.css old mode 100644 new mode 100755 diff --git a/views/d.admin.git-pull.html b/views/d.admin.git-pull.html old mode 100644 new mode 100755 diff --git a/views/d.admin.html b/views/d.admin.html old mode 100644 new mode 100755 diff --git a/views/d.admin.logs.html b/views/d.admin.logs.html old mode 100644 new mode 100755 diff --git a/views/d.blog.edit.html b/views/d.blog.edit.html old mode 100644 new mode 100755 diff --git a/views/d.blog.list.html b/views/d.blog.list.html old mode 100644 new mode 100755 diff --git a/views/d.blog.list.rss b/views/d.blog.list.rss old mode 100644 new mode 100755 diff --git a/views/d.blog.view.html b/views/d.blog.view.html old mode 100644 new mode 100755 diff --git a/views/d.contact.html b/views/d.contact.html old mode 100644 new mode 100755 diff --git a/views/d.index.html b/views/d.index.html old mode 100644 new mode 100755 diff --git a/views/d.map.html b/views/d.map.html old mode 100644 new mode 100755 diff --git a/views/d.user.login.html b/views/d.user.login.html old mode 100644 new mode 100755 diff --git a/views/d.user.member_list.html b/views/d.user.member_list.html old mode 100644 new mode 100755 diff --git a/views/d.user.password_lost.html b/views/d.user.password_lost.html old mode 100644 new mode 100755 diff --git a/views/d.user.profile.edit.html b/views/d.user.profile.edit.html old mode 100644 new mode 100755 diff --git a/views/d.user.profile.html b/views/d.user.profile.html old mode 100644 new mode 100755 diff --git a/views/d.user.signin.html b/views/d.user.signin.html old mode 100644 new mode 100755 diff --git a/views/d.wiki.edit.html b/views/d.wiki.edit.html old mode 100644 new mode 100755 diff --git a/views/d.wiki.view.html b/views/d.wiki.view.html old mode 100644 new mode 100755 diff --git a/views/fonts/FiraMono-Bold.eot b/views/fonts/FiraMono-Bold.eot old mode 100644 new mode 100755 diff --git a/views/fonts/FiraMono-Bold.otf b/views/fonts/FiraMono-Bold.otf old mode 100644 new mode 100755 diff --git a/views/fonts/FiraSans-Bold.ttf b/views/fonts/FiraSans-Bold.ttf old mode 100644 new mode 100755 diff --git a/views/fonts/FiraSans-ExtraLight.eot b/views/fonts/FiraSans-ExtraLight.eot old mode 100644 new mode 100755 diff --git a/views/fonts/FiraSans-ExtraLight.otf b/views/fonts/FiraSans-ExtraLight.otf old mode 100644 new mode 100755 diff --git a/views/fonts/FiraSans-ExtraLight.ttf b/views/fonts/FiraSans-ExtraLight.ttf old mode 100644 new mode 100755 diff --git a/views/fonts/FiraSans-Light.eot b/views/fonts/FiraSans-Light.eot old mode 100644 new mode 100755 diff --git a/views/fonts/FiraSans-Light.otf b/views/fonts/FiraSans-Light.otf old mode 100644 new mode 100755 diff --git a/views/fonts/FiraSans-Light.ttf b/views/fonts/FiraSans-Light.ttf old mode 100644 new mode 100755 diff --git a/views/fonts/FiraSans-Medium.eot b/views/fonts/FiraSans-Medium.eot old mode 100644 new mode 100755 diff --git a/views/fonts/FiraSans-Medium.otf b/views/fonts/FiraSans-Medium.otf old mode 100644 new mode 100755 diff --git a/views/fonts/FiraSans-Medium.ttf b/views/fonts/FiraSans-Medium.ttf old mode 100644 new mode 100755 diff --git a/views/fonts/FiraSans-Regular.eot b/views/fonts/FiraSans-Regular.eot old mode 100644 new mode 100755 diff --git a/views/fonts/FiraSans-Regular.otf b/views/fonts/FiraSans-Regular.otf old mode 100644 new mode 100755 diff --git a/views/fonts/FiraSans-Regular.ttf b/views/fonts/FiraSans-Regular.ttf old mode 100644 new mode 100755 diff --git a/views/img/aside.jpg b/views/img/aside.jpg old mode 100644 new mode 100755 diff --git a/views/img/favicon.png b/views/img/favicon.png old mode 100644 new mode 100755 diff --git a/views/img/header.svg b/views/img/header.svg old mode 100644 new mode 100755 diff --git a/views/img/header_rss.svg b/views/img/header_rss.svg old mode 100644 new mode 100755 diff --git a/views/img/thumb1.jpg b/views/img/thumb1.jpg old mode 100644 new mode 100755 diff --git a/views/img/thumb2.jpg b/views/img/thumb2.jpg old mode 100644 new mode 100755 diff --git a/views/img/thumb3.jpg b/views/img/thumb3.jpg old mode 100644 new mode 100755 diff --git a/views/js/d.avatar.js b/views/js/d.avatar.js old mode 100644 new mode 100755 diff --git a/views/js/d.captcha.js b/views/js/d.captcha.js old mode 100644 new mode 100755 diff --git a/views/js/d.header.js b/views/js/d.header.js old mode 100644 new mode 100755 diff --git a/views/js/d.map.js b/views/js/d.map.js old mode 100644 new mode 100755 index 01d0b31..9c96ae3 --- a/views/js/d.map.js +++ b/views/js/d.map.js @@ -2,20 +2,22 @@ var mymap; $( document ).ready(function() { // Differents layers for the map - var osmfr = L.tileLayer('//{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {maxZoom: 20, attribution: 'Maps © OpenSreetMap France, Data © OpenStreetMap contributors'}); - var wikimedia = L.tileLayer('//maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png', {maxZoom: 18, attribution: 'Maps © Wikimedia, Data © OpenStreetMap contributors'}); + var osmfr = L.tileLayer('//{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {tms: true, maxZoom: 20, attribution: 'Maps © OpenSreetMap France, Data © OpenStreetMap contributors'}); + var wikimedia = L.tileLayer('//maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png', {tms: true, maxZoom: 18, attribution: 'Maps © Wikimedia, Data © OpenStreetMap contributors'}); + var crozet = L.tileLayer('/_maps/osm_cro/{z}/{x}/{y}.png', {tms: true, maxZoom: 18, attribution: 'For dev purpose only'}); // Base layers var baseLayers = { "OSM France": osmfr, "OSM Wikimedia": wikimedia, + "Crozet": crozet, }; mymap = L.map('mapid', { zoomControl: false, - layers: [wikimedia], - }).setView([47.018, 3.142], 6); - $("#map-credits").html(wikimedia.getAttribution()); + layers: [crozet], + }).setView([-46.407, 51.766], 12); + $("#map-credits").html(crozet.getAttribution()); L.control.scale({ position: "bottomleft", diff --git a/views/third/fontawesome-free-5.4.1-web/css/all.css b/views/third/fontawesome-free-5.4.1-web/css/all.css old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/css/all.min.css b/views/third/fontawesome-free-5.4.1-web/css/all.min.css old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.eot b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.eot old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.svg b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.svg old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.ttf b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.ttf old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.woff b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.woff old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.woff2 b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-brands-400.woff2 old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.eot b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.eot old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.svg b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.svg old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.ttf b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.ttf old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.woff b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.woff old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.woff2 b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-regular-400.woff2 old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.eot b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.eot old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.svg b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.svg old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.ttf b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.ttf old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.woff b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.woff old mode 100644 new mode 100755 diff --git a/views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.woff2 b/views/third/fontawesome-free-5.4.1-web/webfonts/fa-solid-900.woff2 old mode 100644 new mode 100755 diff --git a/views/third/jquery-3.3.1.min.js b/views/third/jquery-3.3.1.min.js old mode 100644 new mode 100755 diff --git a/views/third/leaflet-easybutton/easy-button.css b/views/third/leaflet-easybutton/easy-button.css old mode 100644 new mode 100755 diff --git a/views/third/leaflet-easybutton/easy-button.js b/views/third/leaflet-easybutton/easy-button.js old mode 100644 new mode 100755 diff --git a/views/third/leaflet-fullscreen/Leaflet.fullscreen.js b/views/third/leaflet-fullscreen/Leaflet.fullscreen.js old mode 100644 new mode 100755 diff --git a/views/third/leaflet-fullscreen/Leaflet.fullscreen.min.js b/views/third/leaflet-fullscreen/Leaflet.fullscreen.min.js old mode 100644 new mode 100755 diff --git a/views/third/leaflet-fullscreen/fullscreen.png b/views/third/leaflet-fullscreen/fullscreen.png old mode 100644 new mode 100755 diff --git a/views/third/leaflet-fullscreen/fullscreen@2x.png b/views/third/leaflet-fullscreen/fullscreen@2x.png old mode 100644 new mode 100755 diff --git a/views/third/leaflet-fullscreen/leaflet.fullscreen.css b/views/third/leaflet-fullscreen/leaflet.fullscreen.css old mode 100644 new mode 100755 diff --git a/views/third/leaflet/images/layers-2x.png b/views/third/leaflet/images/layers-2x.png old mode 100644 new mode 100755 diff --git a/views/third/leaflet/images/layers.png b/views/third/leaflet/images/layers.png old mode 100644 new mode 100755 diff --git a/views/third/leaflet/images/marker-icon-2x.png b/views/third/leaflet/images/marker-icon-2x.png old mode 100644 new mode 100755 diff --git a/views/third/leaflet/images/marker-icon.png b/views/third/leaflet/images/marker-icon.png old mode 100644 new mode 100755 diff --git a/views/third/leaflet/images/marker-shadow.png b/views/third/leaflet/images/marker-shadow.png old mode 100644 new mode 100755 diff --git a/views/third/leaflet/leaflet.css b/views/third/leaflet/leaflet.css old mode 100644 new mode 100755 diff --git a/views/third/leaflet/leaflet.js b/views/third/leaflet/leaflet.js old mode 100644 new mode 100755 From 9c0c5b5a95a65b6089fbf05a2421f681ed8ef5cc Mon Sep 17 00:00:00 2001 From: "U-P231-ELECTROLL\\gener" Date: Sat, 16 May 2020 12:05:04 +0400 Subject: [PATCH 05/17] Fix height min height of all pages --- views/css/d.index.css | 5 ++++- views/d.index.html | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/views/css/d.index.css b/views/css/d.index.css index 5363cde..0268230 100755 --- a/views/css/d.index.css +++ b/views/css/d.index.css @@ -238,11 +238,14 @@ section { background: white; margin: auto; width: 820px; - min-height: calc(100% - 94px); + min-height: calc(100% - 98px); z-index: 10; padding: 15px; text-align: justify; } +section#index { + min-height: calc(100% - 98px - 320px); +} section h1 { font-weight: 300; diff --git a/views/d.index.html b/views/d.index.html index a1b724f..eacd338 100755 --- a/views/d.index.html +++ b/views/d.index.html @@ -16,7 +16,7 @@ --> -
    +

    Cabanes et bivouac en montagne.

    Kabano est une plateforme collaborative sur laquelle vous pouvez récupérer toutes les informations nécessaires relatives aux hébergements en montagne. Ces informations ont été ajoutées par vous, pour vous, c'est pourquoi il est primordial de ne pas cesser d'ajouter des commentaires, cabanes, refuges ou emplacements de bivouac. Attention toutefois, ces données ne sont en aucun cas garanties et des précautions dues à l'environnement montagnard sont à prendre.


    From 7beb1f25ad64a29a81ec48eac05b388ed60f0ce3 Mon Sep 17 00:00:00 2001 From: leosw Date: Sat, 16 May 2020 13:07:17 +0400 Subject: [PATCH 06/17] First method to insert a new poi --- models/d.poi.php | 72 ++++++++++++++++++++++++++++++++++++++++++++++- models/d.wiki.php | 2 +- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/models/d.poi.php b/models/d.poi.php index 848c954..3dcb7cb 100755 --- a/models/d.poi.php +++ b/models/d.poi.php @@ -73,7 +73,6 @@ class Poi ** Populate the object using its ID *****/ public function populate($row) { - $this->$poi_id = $row['poi_id']; $this->$locale_id = $row['locale_id']; $this->$source_id = $row['source_id']; @@ -98,6 +97,77 @@ class Poi $this->$parameters = $row['parameters']; } + /***** + ** Create a new poi, all field required except alt_*, *_id + *****/ + public function insert() { + global $config; + global $user; + + $con = pg_connect("host=".$config['SQL_host']." dbname=".$config['SQL_db']." user=".$config['SQL_user']." password=".$config['SQL_pass']) + or die ("Could not connect to server\n"); + + // Because it is the first insert. + $this->alt_type = $this->type; + $this->alt_name = $this->name; + $this->alt_position = $this->position; + + $query = "INSERT INTO pois (is_public, permalink, creation_date, name, position, type) VALUES + (TRUE, $1, $2, $3, $4, $5) RETURNING id"; + + pg_prepare($con, "prepare1", $query) + or die ("Cannot prepare statement\n"); + $result = pg_execute($con, "prepare1", array($this->permalink, date('r'), $this->name, $this->position, $this->type)) + or die ("Cannot execute statement\n"); + + $this->poi_id = pg_fetch_assoc($result)['id']; + + $query = "INSERT INTO poi_locales (locale, poi_id) VALUES + ($1, $2) RETURNING id"; + + pg_prepare($con, "prepare2", $query) + or die ("Cannot prepare statement\n"); + $result = pg_execute($con, "prepare2", array($this->locale, $this->poi_id)) + or die ("Cannot execute statement\n"); + + $this->locale_id = pg_fetch_assoc($result)['id']; + + $query = "INSERT INTO poi_sources (source, remote_source_id, author, locale_id) VALUES + ($1, $2, $3, $4) RETURNING id"; + + pg_prepare($con, "prepare3", $query) + or die ("Cannot prepare statement\n"); + $result = pg_execute($con, "prepare3", array($this->source, $this->remote_source_id, $this->author, $this->locale_id)) + or die ("Cannot execute statement\n"); + + $this->source_id = pg_fetch_assoc($result)['id']; + + $query = "INSERT INTO poi_versions (version, update_date, is_archive, alt_type, is_destroyed, alt_name, alt_position, parameters, source_id) VALUES + ('0', $1, FALSE, $2, $3, $4, $5, $6, $7) RETURNING id"; + + pg_prepare($con, "prepare4", $query) + or die ("Cannot prepare statement\n"); + $result = pg_execute($con, "prepare4", array(date('r'), $this->alt_type, $this->is_destroyed, $this->alt_name, $this->alt_position, $this->parameters, $this->source_id)) + or die ("Cannot execute statement\n"); + + $this->version_id = pg_fetch_assoc($result)['id']; + + $query = "INSERT INTO poi_contributors (poi, contributor) VALUES + ($1, $2)"; + + pg_prepare($con, "prepare5", $query) + or die ("Cannot prepare statement\n"); + $result = pg_execute($con, "prepare5", array($this->source_id, $user->id)) + or die ("Cannot execute statement\n"); + + pg_close($con); + + error_log( + date('r')." \t".$user->name." (".$user->id.") \tINSERT \tCreate new poi '".$this->permalink."'\r\n", + 3, + $config['logs_folder'].'wiki.log'); + } + } ?> \ No newline at end of file diff --git a/models/d.wiki.php b/models/d.wiki.php index d16f790..e26e419 100755 --- a/models/d.wiki.php +++ b/models/d.wiki.php @@ -182,7 +182,7 @@ class WikiPage } /***** - ** Create a page by archiving the current one and inserting a new one ID + ** Create a new page, fails if permalink already exists *****/ public function insert() { global $config; From 529a26135105ce32fcd75779ccc51fafbe779796 Mon Sep 17 00:00:00 2001 From: leosw Date: Sat, 16 May 2020 13:52:43 +0400 Subject: [PATCH 07/17] Community portal page creation --- includes/routes.php | 7 ++++-- views/css/d.index.css | 36 ++++++++++++++++++++++++++++ views/d.community.html | 53 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 2 deletions(-) create mode 100755 views/d.community.html diff --git a/includes/routes.php b/includes/routes.php index f6340fc..812eca3 100755 --- a/includes/routes.php +++ b/includes/routes.php @@ -20,12 +20,15 @@ $controller->prefix = "d."; $notfound = 0; $session = 1; +if($controller->splitted_url[0]=="") $controller->splitted_url[0]="index"; + // Routing to the correct page from the correct link switch ($controller->splitted_url[0]) { - case "index": case "" : + case "index": + case "community" : $controller->name=""; - $view->name="index"; + $view->name=$controller->splitted_url[0]; break; case "user" : $controller->name="users"; diff --git a/views/css/d.index.css b/views/css/d.index.css index 0268230..467f05e 100755 --- a/views/css/d.index.css +++ b/views/css/d.index.css @@ -346,4 +346,40 @@ footer a:hover { section .thumb { margin: 0 10px; border: 1px solid #aaa; +} + +/*********************************/ +/** Community portal page **/ +/*********************************/ + +.action { + clear: both; + margin: 50px auto 0 auto; + width: 90%; + background: #efefef; + border: 1px solid #ccc; + border-bottom: 3px solid #ccc; +} +.action p { + margin: 0; +} + +.action .title { + background: #ccc; + cursor: pointer; + font-weight: 500; + font-size: 1.1em; +} +.action .title a, .action .title p { + padding: 15px 10px; + margin: 0; + color: inherit; + display: block; +} + +.action .description { + display: none; +} +.action .description p { + padding: 10px 20px; } \ No newline at end of file diff --git a/views/d.community.html b/views/d.community.html new file mode 100755 index 0000000..ac89755 --- /dev/null +++ b/views/d.community.html @@ -0,0 +1,53 @@ + + + + + + + + + +
    +

    Contribuer au projet Kabano.

    +

    Étant un projet collaboratif, Kabano se repose sur vos contributions pour diffuser des informations au plus proche de la réalité. En participant au projet Kabano, vous acceptez de placer vos collaborations sous nos licences libres.

    +
    + + + +
    +
    +

    Ajouter un commentaire sur un hébergement

    +
    +
    +

    Rendez-vous sur la page hébergement où vous souhaitez laisser un commentaire, puis ajoutez un commentaire en bas de page.

    +
    +
    + +
    +
    +

    Faire une demande de travaux

    +
    +
    +

    Cette fonctionnalité n'est pas encore disponible.

    +
    +
    + +
    + + + + + + + From 6ec5f4996d4dfb028469bb69a8c134006239bad2 Mon Sep 17 00:00:00 2001 From: leosw Date: Sat, 16 May 2020 14:12:45 +0400 Subject: [PATCH 08/17] Community portal page improved --- views/css/d.index.css | 1 + views/d.community.html | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/views/css/d.index.css b/views/css/d.index.css index 467f05e..e0589e4 100755 --- a/views/css/d.index.css +++ b/views/css/d.index.css @@ -138,6 +138,7 @@ header .icon { } header .icon.avatar { + margin: -4px 0; padding: 0; height: 28px; } diff --git a/views/d.community.html b/views/d.community.html index ac89755..b962594 100755 --- a/views/d.community.html +++ b/views/d.community.html @@ -9,12 +9,12 @@

    Contribuer au projet Kabano.

    -

    Étant un projet collaboratif, Kabano se repose sur vos contributions pour diffuser des informations au plus proche de la réalité. En participant au projet Kabano, vous acceptez de placer vos collaborations sous nos licences libres.

    +

    Étant un projet collaboratif, Kabano se repose sur vos contributions pour diffuser des informations au plus proche de la réalité. En participant au projet Kabano, vous acceptez de placer vos collaborations sous nos licences libres.


    @@ -32,7 +32,7 @@

    Faire une demande de travaux

    -

    Cette fonctionnalité n'est pas encore disponible.

    +

    Cette fonctionnalité n'est pas encore disponible, mais n'hésitez pas à laisser un commentaire pour faire savoir le besoin d'entretien.

    From 4fe1200ef37ef8204ce321899575c7fa3952b7b9 Mon Sep 17 00:00:00 2001 From: leosw Date: Sat, 16 May 2020 17:32:59 +0400 Subject: [PATCH 09/17] Add icons in community page --- views/css/d.index.css | 15 ++++++++++++--- views/d.community.html | 6 +++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/views/css/d.index.css b/views/css/d.index.css index e0589e4..3735e79 100755 --- a/views/css/d.index.css +++ b/views/css/d.index.css @@ -358,8 +358,6 @@ section .thumb { margin: 50px auto 0 auto; width: 90%; background: #efefef; - border: 1px solid #ccc; - border-bottom: 3px solid #ccc; } .action p { margin: 0; @@ -372,14 +370,25 @@ section .thumb { font-size: 1.1em; } .action .title a, .action .title p { - padding: 15px 10px; + padding: 15px 10px 15px 71px; margin: 0; color: inherit; display: block; } +.action .title i { + float: left; + width: 56px; + line-height: 56px; + text-align: center; + font-size: 30px; + background: #333; + color: #ccc; +} .action .description { display: none; + border: solid #ccc; + border-width: 0px 1px 3px 1px; } .action .description p { padding: 10px 20px; diff --git a/views/d.community.html b/views/d.community.html index b962594..2788bae 100755 --- a/views/d.community.html +++ b/views/d.community.html @@ -13,13 +13,13 @@
    -
    -
    +

    Ajouter un commentaire sur un hébergement

    @@ -28,7 +28,7 @@
    -
    +

    Faire une demande de travaux

    From 660488e5b6997b1920366dd778710defde3872f5 Mon Sep 17 00:00:00 2001 From: leosw Date: Sat, 16 May 2020 20:42:19 +0400 Subject: [PATCH 10/17] First draft of poi edit page --- controllers/d.poi.php | 164 ++++++++++++++++++++++++++++++++ includes/routes.php | 1 + views/css/d.index.css | 2 + views/css/d.map.css | 38 ++++---- views/css/d.poi.css | 207 +++++++++++++++++++++++++++++++++++++++++ views/d.community.html | 20 +++- views/d.poi.edit.html | 34 +++++++ views/js/d.map.js | 4 +- views/js/d.poi_map.js | 52 +++++++++++ 9 files changed, 497 insertions(+), 25 deletions(-) create mode 100755 controllers/d.poi.php create mode 100755 views/css/d.poi.css create mode 100755 views/d.poi.edit.html create mode 100755 views/js/d.poi_map.js diff --git a/controllers/d.poi.php b/controllers/d.poi.php new file mode 100755 index 0000000..9637960 --- /dev/null +++ b/controllers/d.poi.php @@ -0,0 +1,164 @@ +splitted_url[1]) OR $controller->splitted_url[1]=="" OR is_numeric($controller->splitted_url[1])) { +// $head['title'] = "Blog"; + +// // Get the correct page number +// if (!isset($controller->splitted_url[1]) OR $controller->splitted_url[1]=="") { +// $page = 0; +// } else { +// $page = $controller->splitted_url[1] - 1; +// } + +// $controller->splitted_url[1] = "list"; +// $list = "html"; +// $articles_per_pages = 5; +// } + +switch ($controller->splitted_url[1]) { + case "new": + if($user->rankIsHigher("registered")) { + if(isset($_POST['submit'])) { + $blogArticle->content = $_POST['content']; + $blogArticle->locale = $_POST['locale']; + $blogArticle->name = $_POST['name']; + $blogArticle->is_commentable = isset($_POST['is_commentable'])?'t':'f'; + $blogArticle->author = $user->id; + if(!$blogArticle->checkPermalink($_POST['permalink'],1)) { + $blogArticle->permalink = $_POST['permalink']; + $blogArticle->insert(); + header('Location: '.$config['rel_root_folder']."blog/".$blogArticle->permalink); + } + else { + $head['title'] = $blogArticle->name; + $error = "permalink"; + } + } + else { + $head['title'] = "Nouvel hébergement"; + } + + $locales = new Kabano\Locales(); + $locales->getAll(); + + $head['third'] = "leaflet/leaflet.js;leaflet-fullscreen/Leaflet.fullscreen.min.js;leaflet-easybutton/easy-button.js"; + $head['css'] .= ";../third/leaflet/leaflet.css;../third/leaflet-fullscreen/leaflet.fullscreen.css;../third/leaflet-easybutton/easy-button.css"; + $head['js'] = "d.poi_map.js"; + + $new = 1; + include ($config['views_folder']."d.poi.edit.html"); + break; + } + else { + $notfound = 1; + } + default: + // // If the page exists + // if ($blogArticle->checkPermalink($controller->splitted_url[1],$user->rankIsHigher("premium"))) { + // if (isset($controller->splitted_url[2]) && $controller->splitted_url[2] == "delete" && $user->rankIsHigher("moderator")) { + // $blogArticle->delete(); + // header('Location: '.$config['rel_root_folder']."blog/".$blogArticle->permalink); + // } + // else if (isset($controller->splitted_url[2]) && $controller->splitted_url[2] == "restore" && $user->rankIsHigher("moderator")) { + // $blogArticle->restore(); + // header('Location: '.$config['rel_root_folder']."blog/".$blogArticle->permalink); + // } + // else if (isset($controller->splitted_url[2]) && $controller->splitted_url[2] == "edit" && $user->rankIsHigher("moderator")) { + // if(isset($_POST['submit'])) { + // $blogArticle->content = $_POST['content']; + // $blogArticle->locale = $_POST['locale']; + // $blogArticle->name = $_POST['name']; + // $blogArticle->is_commentable = isset($_POST['is_commentable'])?'t':'f'; + // $blogArticle->author = $user->id; + // $blogArticle->update(); + // header('Location: '.$config['rel_root_folder']."blog/".$blogArticle->permalink); + // } + // else { + // $locales = new Kabano\Locales(); + // $locales->getAll(); + + // $head['title'] = $blogArticle->name; + // include ($config['views_folder']."d.blog.edit.html"); + // } + // } + // else { + // // Manage history of an article + // if($user->rankIsHigher("premium")) { + // $blogHistory = new Kabano\BlogArticles(); + // $blogHistory->getHistory($controller->splitted_url[1]); + // } + // if (isset($controller->splitted_url[2]) && is_numeric($controller->splitted_url[2])) + // $blogArticle->checkPermalink($controller->splitted_url[1],$user->rankIsHigher("premium"),$controller->splitted_url[2]); + + // // Manage comment creation + // if (isset($controller->splitted_url[2]) && $controller->splitted_url[2]=="new_comment") { + // if (isset($_POST['submit']) && $user->rankIsHigher("registered")) { + // $blogComment = new Kabano\BlogComment(); + // $blogComment->locale = $user->locale; + // $blogComment->author = $user->id; + // $blogComment->content = $blogArticle->content_id; + // $blogComment->comment = $_POST['comment']; + // $blogComment->insert(); + // } + // } + + // // Manage comment deletion + // if (isset($controller->splitted_url[2]) && $controller->splitted_url[2]=="delete_comment") { + // if (isset($controller->splitted_url[3]) && is_numeric($controller->splitted_url[3])) { + // $blogComment = new Kabano\BlogComment(); + // if($blogComment->checkId($controller->splitted_url[3])) + // if ($user->rankIsHigher("moderator") || $user->id == $blogComment->author) + // $blogComment->delete(); + // } + // } + + // // Manage comment restoration + // if (isset($controller->splitted_url[2]) && $controller->splitted_url[2]=="restore_comment") { + // if (isset($controller->splitted_url[3]) && is_numeric($controller->splitted_url[3])) { + // $blogComment = new Kabano\BlogComment(); + // if($blogComment->checkId($controller->splitted_url[3])) + // if ($user->rankIsHigher("moderator") || $user->id == $blogComment->author) + // $blogComment->restore(); + // } + // } + + // $blogArticle->md2html(); + + // // Manage comments + // if ($blogArticle->is_commentable == "t") { + // $blogArticles_comments = new Kabano\BlogComments(); + // $blogArticles_comments->listComments($blogArticle->content_id, ($user->rankIsHigher("premium"))); + + // $i = 0; + // foreach ($blogArticles_comments->objs as $comment) { + // $comment->md2html(); + // $comment->author_obj = new Kabano\User(); + // $comment->author_obj->checkId($comment->author); + // } + // } + + + // $tempUser = new Kabano\User(); + // $tempUser->checkId($blogArticle->author); + // $blogArticle->author_name = $tempUser->name; + // unset($tempUser); + + // $head['title'] = $blogArticle->name; + // include ($config['views_folder']."d.blog.view.html"); + // } + // } + // else { + // $notfound = 1; + // } + // break; +} + +?> \ No newline at end of file diff --git a/includes/routes.php b/includes/routes.php index 812eca3..65a325b 100755 --- a/includes/routes.php +++ b/includes/routes.php @@ -38,6 +38,7 @@ switch ($controller->splitted_url[0]) case "wiki" : case "blog" : case "map" : + case "poi" : case "admin" : $controller->name=$controller->splitted_url[0]; $view->name=""; diff --git a/views/css/d.index.css b/views/css/d.index.css index 3735e79..a8ce0b1 100755 --- a/views/css/d.index.css +++ b/views/css/d.index.css @@ -279,6 +279,8 @@ footer { color: #c1c1c1; text-align: left; } +footer { +} footer #footernav { float: right; diff --git a/views/css/d.map.css b/views/css/d.map.css index 661e869..af019e8 100755 --- a/views/css/d.map.css +++ b/views/css/d.map.css @@ -33,7 +33,7 @@ footer { } .leaflet-bottom.leaflet-left { - margin-bottom: 60px !important; + margin-bottom: 60px; } .leaflet-fullscreen-on .leaflet-bottom.leaflet-left { margin-bottom: 15px !important; @@ -41,7 +41,7 @@ footer { } .leaflet-bottom.leaflet-right { - margin-bottom: 60px !important; + margin-bottom: 60px; } .leaflet-fullscreen-on .leaflet-bottom.leaflet-right { margin-bottom: 15px !important; @@ -127,6 +127,23 @@ footer { background: #212121 !important; } +/* Scale */ + +.leaflet-control-scale-line { + height: 30px !important; + top: 2px !important; + position: relative !important; + background: #212121 !important; + color: #c1c1c1 !important; + text-align: center !important; + border: none !important; + font-size: 12px !important; + line-height: 30px !important; +} +.leaflet-control-scale { + opacity: 0.8 !important; +} + /* Credit / Legend */ .leaflet-control button { @@ -162,21 +179,4 @@ footer { .leaflet-fullscreen-on .easy-button-container { display: none; -} - -/* Scale */ - -.leaflet-control-scale-line { - height: 30px !important; - top: 2px !important; - position: relative !important; - background: #212121 !important; - color: #c1c1c1 !important; - text-align: center !important; - border: none !important; - font-size: 12px !important; - line-height: 30px !important; -} -.leaflet-control-scale { - opacity: 0.8 !important; } \ No newline at end of file diff --git a/views/css/d.poi.css b/views/css/d.poi.css new file mode 100755 index 0000000..b6687c0 --- /dev/null +++ b/views/css/d.poi.css @@ -0,0 +1,207 @@ +/*********************************/ +/** Common **/ +/*********************************/ + +html, body { + height: 100%; +} + +#sticky { + position: relative; + min-height: 0; + top: 65%; + z-index: 10; +} + +@keyframes fadeinfadeout { + 0% {color: #444;} + 50% {color: #999;} + 100% {color: #444;} +} +#slide-icon { + position: absolute; + left: 400px; + top: -35px; + color: #000; + font-size: 60px; + color: #555; + animation-name: fadeinfadeout; + animation-duration: 2s; + animation-iteration-count: infinite; +} + +#mapid { + position: fixed; + height: 100%; + width: 100%; + top: 0; +} + +/*********************************/ +/** Editor page **/ +/*********************************/ + +form.form input, form.form textarea, #locale { + background: #ddd; + border-bottom: 2px solid #ccc; + display: block; + padding: 10px; +} + +form.form textarea { + font-size: 14px; + margin: 10px 0 10px 0px; + width: calc(100% - 20px); +} +form.form input { + width: 58%; + margin: 10px 0 10px 0px; + font-size: 18px; +} +#locale { + width: 38%; + float: right; + font-size: 17px; +} + +form.form input[type=submit] { + width: auto; + margin: auto; + border-bottom: 2px solid blue; +} + + +/***************************************** + Controls of the map +*****************************************/ + +/* General */ + +.leaflet-control-container { + position: absolute !important; + width: 850px !important; + height: 100%; + left: calc(50% - 425px) !important; + font-family: "Fira Sans", "Open Sans",Helvetica,Arial,sans-serif !important; +} +.leaflet-fullscreen-on .leaflet-control-container { + position: absolute !important; + width: 100% !important; + left: 0 !important; +} + +.leaflet-bottom.leaflet-left { + bottom: 35% !important; + margin-bottom: -50px !important; +} +.leaflet-fullscreen-on .leaflet-bottom.leaflet-left { + margin-bottom: 15px !important; + margin-left: 15px !important; + bottom: 0 !important; +} + +.leaflet-bottom.leaflet-right { + bottom: 35% !important; + margin-bottom: -50px !important; +} +.leaflet-fullscreen-on .leaflet-bottom.leaflet-right { + margin-bottom: 15px !important; + margin-right: 15px !important; + bottom: 0 !important; +} + +.leaflet-control { + clear: none !important; + padding: 0 !important; + border-radius: 0 !important; + box-shadow: none !important; + color: #c1c1c1 !important; +} +.leaflet-right .leaflet-control { + margin: 0 0 0 15px !important; +} +.leaflet-left .leaflet-control { + margin: 0 15px 0 0 !important; +} + +.leaflet-control a, .leaflet-control button { + display: inline-block !important; + float: none !important; + border: none !important; + background-color: #212121 !important; + border-radius: 0 !important; + color: #c1c1c1 !important; + border-right: 1px #3e3e3e solid !important; +} +.leaflet-control a:last-child, .leaflet-control button:last-child { + border-right: none !important; +} + +/* Zoom */ + +.leaflet-control-zoom-in, .leaflet-control-zoom-out { + font-size: 10px !important; +} +.leaflet-disabled { + background-color: rgba(33, 33, 33, 0.8) !important; + opacity: 0.8 !important; +} + +/* Fullscreen */ + +.leaflet-control-fullscreen a { + background: #212121 !important; +} +.leaflet-control-fullscreen a:before { + content: "\f065"; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + background: none !important; +} +.leaflet-fullscreen-on .leaflet-control-fullscreen a:before { + content: "\f066"; + font-family: "Font Awesome 5 Free"; + font-weight: 900; +} + +/* Baselayers */ + +.leaflet-control-layers a { + background: #212121 !important; + width: 26px !important; + height: 26px !important; + line-height: 26px !important; + text-align: center !important; + border-right: none !important; +} +.leaflet-control-layers a:before { + content: "\f5fd"; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + background: none !important; +} +.leaflet-control-layers-expanded a { + display: none !important; +} +.leaflet-control-layers-list { + padding: 3px 8px !important; + color: white !important; + background: #212121 !important; +} + +/* Scale */ + +.leaflet-control-scale-line { + height: 30px !important; + top: 2px !important; + position: relative !important; + background: #212121 !important; + color: #c1c1c1 !important; + text-align: center !important; + border: none !important; + font-size: 12px !important; + line-height: 30px !important; +} +.leaflet-control-scale { + opacity: 0.8 !important; +} \ No newline at end of file diff --git a/views/d.community.html b/views/d.community.html index 2788bae..972e78e 100755 --- a/views/d.community.html +++ b/views/d.community.html @@ -13,25 +13,34 @@
    + rankIsHigher("registered")) { ?> + +
    +

    Ajouter un hébergement de montagne

    +
    +
    +

    Vous devez être connecté pour pouvoir ajouter un hébergement. Ça nous permet de laisser les robots à la porte.

    +
    +
    -
    +

    Ajouter un commentaire sur un hébergement

    -
    +

    Rendez-vous sur la page hébergement où vous souhaitez laisser un commentaire, puis ajoutez un commentaire en bas de page.

    -
    +

    Faire une demande de travaux

    -
    +

    Cette fonctionnalité n'est pas encore disponible, mais n'hésitez pas à laisser un commentaire pour faire savoir le besoin d'entretien.

    @@ -44,6 +53,9 @@ $( "#js_open_1" ).click(function() { }); $( "#js_open_2" ).click(function() { $( "#js_openned_2" ).show(400); +}); +$( "#js_open_3" ).click(function() { + $( "#js_openned_3" ).show(400); }); diff --git a/views/d.poi.edit.html b/views/d.poi.edit.html new file mode 100755 index 0000000..86ba1fe --- /dev/null +++ b/views/d.poi.edit.html @@ -0,0 +1,34 @@ + + + + + + + + + +
    + +
    +
    + +
    +

    + + +

    + + + + +
    +
    + + +
    + + \ No newline at end of file diff --git a/views/js/d.map.js b/views/js/d.map.js index 9c96ae3..eee4988 100755 --- a/views/js/d.map.js +++ b/views/js/d.map.js @@ -4,7 +4,7 @@ $( document ).ready(function() { // Differents layers for the map var osmfr = L.tileLayer('//{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {tms: true, maxZoom: 20, attribution: 'Maps © OpenSreetMap France, Data © OpenStreetMap contributors'}); var wikimedia = L.tileLayer('//maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png', {tms: true, maxZoom: 18, attribution: 'Maps © Wikimedia, Data © OpenStreetMap contributors'}); - var crozet = L.tileLayer('/_maps/osm_cro/{z}/{x}/{y}.png', {tms: true, maxZoom: 18, attribution: 'For dev purpose only'}); + var crozet = L.tileLayer('/_maps/sat_cro/{z}/{x}/{y}.png', {tms: true, maxZoom: 18, attribution: 'For dev purpose only'}); // Base layers var baseLayers = { @@ -16,7 +16,7 @@ $( document ).ready(function() { mymap = L.map('mapid', { zoomControl: false, layers: [crozet], - }).setView([-46.407, 51.766], 12); + }).setView([-46.407, 51.766], 13); $("#map-credits").html(crozet.getAttribution()); L.control.scale({ diff --git a/views/js/d.poi_map.js b/views/js/d.poi_map.js new file mode 100755 index 0000000..dd05747 --- /dev/null +++ b/views/js/d.poi_map.js @@ -0,0 +1,52 @@ +var mymap; + +$( document ).ready(function() { + // Differents layers for the map + var osmfr = L.tileLayer('//{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {tms: true, maxZoom: 20, attribution: 'Maps © OpenSreetMap France, Data © OpenStreetMap contributors'}); + var wikimedia = L.tileLayer('//maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png', {tms: true, maxZoom: 18, attribution: 'Maps © Wikimedia, Data © OpenStreetMap contributors'}); + var crozet = L.tileLayer('/_maps/sat_cro/{z}/{x}/{y}.png', {tms: true, maxZoom: 18, attribution: 'For dev purpose only'}); + + // Base layers + var baseLayers = { + "OSM France": osmfr, + "OSM Wikimedia": wikimedia, + "Crozet": crozet, + }; + + mymap = L.map('mapid', { + zoomControl: false, + layers: [crozet], + }).setView([-46.407, 51.766], 13); + $("#map-credits").html(crozet.getAttribution()); + + L.control.scale({ + position: "bottomleft", + imperial: false + }).addTo(mymap); + + L.control.fullscreen({ + position: "bottomleft" + }).addTo(mymap); + + L.control.zoom({ + zoomOutText: "", + zoomInText: "", + position: "bottomleft" + }).addTo(mymap); + + L.control.layers(baseLayers,null,{ + position: "bottomright" + }).addTo(mymap); + + mymap.removeControl(mymap.attributionControl); + + $(".close-link").click(function() { + $("footer").show(); + $("#footer-credits").hide(); + $("#footer-legend").hide(); + }); + + mymap.on('baselayerchange', function(e) { + $("#map-credits").html(e.layer.getAttribution()); + }); +}); From 5242999ba0318238fa8bdc0ebaf48141faeba594 Mon Sep 17 00:00:00 2001 From: leosw Date: Sat, 16 May 2020 22:20:36 +0400 Subject: [PATCH 11/17] Add type selector in poi editor --- models/d.poi.php | 10 ++++ models/d.users.php | 1 + views/css/d.poi.css | 18 ++++++ views/d.poi.edit.html | 10 +++- views/img/alpine_hut.svg | 29 +++++++++ views/img/basic_hut.svg | 27 +++++++++ views/img/bivouac.svg | 27 +++++++++ views/img/campsite.svg | 110 +++++++++++++++++++++++++++++++++++ views/img/halt.svg | 30 ++++++++++ views/img/wilderness_hut.svg | 28 +++++++++ 10 files changed, 289 insertions(+), 1 deletion(-) create mode 100755 views/img/alpine_hut.svg create mode 100755 views/img/basic_hut.svg create mode 100755 views/img/bivouac.svg create mode 100755 views/img/campsite.svg create mode 100755 views/img/halt.svg create mode 100755 views/img/wilderness_hut.svg diff --git a/models/d.poi.php b/models/d.poi.php index 3dcb7cb..d1ed5b2 100755 --- a/models/d.poi.php +++ b/models/d.poi.php @@ -12,6 +12,16 @@ namespace Kabano; require_once($config['third_folder']."Md/MarkdownExtra.inc.php"); +// This array is related to the defined SQL enum, do not touch. +$poi_types = array( + "basic_hut" => array("Abri sommaire", "Abri", "#ef2929", "basic_hut"), + "wilderness_hut" => array("Cabane non gardée", "Cabane", "#ef2929", "wilderness_hut"), + "alpine_hut" => array("Refuge gardé", "Refuge", "#ef2929", "alpine_hut"), + "halt" => array("Gîte d'étape", "Gîte", "#4e9a06", "halt"), + "bivouac" => array("Zone de bivouac", "Bivouac", "#ef2929", "bivouac"), + "campsite" => array("Camping", "Camping", "#4e9a06", "campsite") +); + class Poi { public $poi_id = NULL; diff --git a/models/d.users.php b/models/d.users.php index b03573d..d6d361d 100755 --- a/models/d.users.php +++ b/models/d.users.php @@ -12,6 +12,7 @@ namespace Kabano; require_once($config['models_folder']."d.locales.php"); +// This array is related to the defined SQL enum, do not touch. $ranks = array( "administrator" => array(1000,"Administrateur", "red", "administrator"), "moderator" => array(800,"Modérateur", "orangered", "moderator"), diff --git a/views/css/d.poi.css b/views/css/d.poi.css index b6687c0..81dfc74 100755 --- a/views/css/d.poi.css +++ b/views/css/d.poi.css @@ -70,6 +70,24 @@ form.form input[type=submit] { border-bottom: 2px solid blue; } +#type_selector { + display: flex; + flex-direction: row; +} +form.form input[type=radio] { + display: none; +} +form.form input[type=radio]+label { + flex: 1; + text-align: center; + padding: 10px 5px; + vertical-align: middle; + border-bottom: 2px solid transparent; +} +form.form input[type=radio]:checked+label { + background: #ddd; + border-bottom: 2px solid #ccc; +} /***************************************** Controls of the map diff --git a/views/d.poi.edit.html b/views/d.poi.edit.html index 86ba1fe..bba422f 100755 --- a/views/d.poi.edit.html +++ b/views/d.poi.edit.html @@ -13,6 +13,14 @@
    +
    +
    + + + + +
    +

    - +
    diff --git a/views/img/alpine_hut.svg b/views/img/alpine_hut.svg new file mode 100755 index 0000000..d4cf615 --- /dev/null +++ b/views/img/alpine_hut.svg @@ -0,0 +1,29 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/views/img/basic_hut.svg b/views/img/basic_hut.svg new file mode 100755 index 0000000..33728e6 --- /dev/null +++ b/views/img/basic_hut.svg @@ -0,0 +1,27 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/views/img/bivouac.svg b/views/img/bivouac.svg new file mode 100755 index 0000000..de2b38c --- /dev/null +++ b/views/img/bivouac.svg @@ -0,0 +1,27 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/views/img/campsite.svg b/views/img/campsite.svg new file mode 100755 index 0000000..e35c518 --- /dev/null +++ b/views/img/campsite.svg @@ -0,0 +1,110 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/views/img/halt.svg b/views/img/halt.svg new file mode 100755 index 0000000..34f1660 --- /dev/null +++ b/views/img/halt.svg @@ -0,0 +1,30 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/views/img/wilderness_hut.svg b/views/img/wilderness_hut.svg new file mode 100755 index 0000000..61ac32e --- /dev/null +++ b/views/img/wilderness_hut.svg @@ -0,0 +1,28 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + \ No newline at end of file From ea33a110d793e4d307d2bfb87e8c82ff19f9173d Mon Sep 17 00:00:00 2001 From: leosw Date: Sat, 16 May 2020 22:41:24 +0400 Subject: [PATCH 12/17] Add auto scroll on poi editor page --- views/css/d.poi.css | 1 + views/d.poi.edit.html | 6 ++++++ views/js/d.map.js | 2 +- views/js/d.poi_map.js | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/views/css/d.poi.css b/views/css/d.poi.css index 81dfc74..332c417 100755 --- a/views/css/d.poi.css +++ b/views/css/d.poi.css @@ -28,6 +28,7 @@ html, body { animation-name: fadeinfadeout; animation-duration: 2s; animation-iteration-count: infinite; + cursor: pointer; } #mapid { diff --git a/views/d.poi.edit.html b/views/d.poi.edit.html index bba422f..ad4f3ba 100755 --- a/views/d.poi.edit.html +++ b/views/d.poi.edit.html @@ -36,6 +36,12 @@
    + +
    diff --git a/views/js/d.map.js b/views/js/d.map.js index eee4988..8744913 100755 --- a/views/js/d.map.js +++ b/views/js/d.map.js @@ -4,7 +4,7 @@ $( document ).ready(function() { // Differents layers for the map var osmfr = L.tileLayer('//{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {tms: true, maxZoom: 20, attribution: 'Maps © OpenSreetMap France, Data © OpenStreetMap contributors'}); var wikimedia = L.tileLayer('//maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png', {tms: true, maxZoom: 18, attribution: 'Maps © Wikimedia, Data © OpenStreetMap contributors'}); - var crozet = L.tileLayer('/_maps/sat_cro/{z}/{x}/{y}.png', {tms: true, maxZoom: 18, attribution: 'For dev purpose only'}); + var crozet = L.tileLayer('/_maps/sat_cro/{z}/{x}/{y}.png', {tms: true, maxZoom: 17, attribution: 'For dev purpose only'}); // Base layers var baseLayers = { diff --git a/views/js/d.poi_map.js b/views/js/d.poi_map.js index dd05747..c7f6447 100755 --- a/views/js/d.poi_map.js +++ b/views/js/d.poi_map.js @@ -4,7 +4,7 @@ $( document ).ready(function() { // Differents layers for the map var osmfr = L.tileLayer('//{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {tms: true, maxZoom: 20, attribution: 'Maps © OpenSreetMap France, Data © OpenStreetMap contributors'}); var wikimedia = L.tileLayer('//maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png', {tms: true, maxZoom: 18, attribution: 'Maps © Wikimedia, Data © OpenStreetMap contributors'}); - var crozet = L.tileLayer('/_maps/sat_cro/{z}/{x}/{y}.png', {tms: true, maxZoom: 18, attribution: 'For dev purpose only'}); + var crozet = L.tileLayer('/_maps/sat_cro/{z}/{x}/{y}.png', {tms: true, maxZoom: 17, attribution: 'For dev purpose only'}); // Base layers var baseLayers = { From 91c9517dac3d57b6e5a975f7e570f15cd73dfee1 Mon Sep 17 00:00:00 2001 From: leosw Date: Sun, 17 May 2020 19:30:23 +0400 Subject: [PATCH 13/17] Add cursor in poi editor --- controllers/d.poi.php | 2 ++ views/css/d.poi.css | 44 +++++++++++++++++++++++++++---------------- views/d.poi.edit.html | 29 +++++++++++++++++++++++++--- views/js/d.poi_map.js | 21 ++++++++++++++------- 4 files changed, 70 insertions(+), 26 deletions(-) diff --git a/controllers/d.poi.php b/controllers/d.poi.php index 9637960..dff1bfa 100755 --- a/controllers/d.poi.php +++ b/controllers/d.poi.php @@ -53,6 +53,8 @@ switch ($controller->splitted_url[1]) { $head['css'] .= ";../third/leaflet/leaflet.css;../third/leaflet-fullscreen/leaflet.fullscreen.css;../third/leaflet-easybutton/easy-button.css"; $head['js'] = "d.poi_map.js"; + $poi->lat = ""; $poi->lon = ""; $poi->alt = ""; + $new = 1; include ($config['views_folder']."d.poi.edit.html"); break; diff --git a/views/css/d.poi.css b/views/css/d.poi.css index 332c417..4aee9ad 100755 --- a/views/css/d.poi.css +++ b/views/css/d.poi.css @@ -42,19 +42,14 @@ html, body { /** Editor page **/ /*********************************/ -form.form input, form.form textarea, #locale { +form.form input, form.form textarea, form.form input[type=radio]:checked+label, #locale { background: #ddd; border-bottom: 2px solid #ccc; display: block; padding: 10px; } -form.form textarea { - font-size: 14px; - margin: 10px 0 10px 0px; - width: calc(100% - 20px); -} -form.form input { +form.form h1 input { width: 58%; margin: 10px 0 10px 0px; font-size: 18px; @@ -65,29 +60,46 @@ form.form input { font-size: 17px; } -form.form input[type=submit] { - width: auto; - margin: auto; - border-bottom: 2px solid blue; +#permalink { + width: 808px; + margin: 10px 0 0 0px; + padding: 6px; + font-size: 11px; + font-style: italic; + color: #555; + } -#type_selector { +.flex_line { display: flex; flex-direction: row; } + +.flex_line input[type=text] { + flex: 1; + margin: 10px 5px 0 5px; +} + +form.form input[type=submit] { + width: auto; + margin: 10px auto; + border-bottom: 2px solid blue; +} + form.form input[type=radio] { display: none; } form.form input[type=radio]+label { + font-size: 13px; flex: 1; text-align: center; - padding: 10px 5px; + padding: 10px; vertical-align: middle; border-bottom: 2px solid transparent; } -form.form input[type=radio]:checked+label { - background: #ddd; - border-bottom: 2px solid #ccc; +form.form input[type=radio]+label img { + width: 32px; + height: 32px; } /***************************************** diff --git a/views/d.poi.edit.html b/views/d.poi.edit.html index ad4f3ba..19fd445 100755 --- a/views/d.poi.edit.html +++ b/views/d.poi.edit.html @@ -14,7 +14,7 @@

    -
    +
    @@ -27,10 +27,17 @@ - + + + + - +
    + + + +
    @@ -39,6 +46,22 @@ diff --git a/views/js/d.poi_map.js b/views/js/d.poi_map.js index c7f6447..01b23e9 100755 --- a/views/js/d.poi_map.js +++ b/views/js/d.poi_map.js @@ -1,4 +1,5 @@ var mymap; +var poi_layer; $( document ).ready(function() { // Differents layers for the map @@ -40,13 +41,19 @@ $( document ).ready(function() { mymap.removeControl(mymap.attributionControl); - $(".close-link").click(function() { - $("footer").show(); - $("#footer-credits").hide(); - $("#footer-legend").hide(); - }); - mymap.on('baselayerchange', function(e) { $("#map-credits").html(e.layer.getAttribution()); }); -}); + + poi_layer = L.marker([-46.407, 51.766], {draggable: true}).addTo(mymap); + + mymap.on('click', function(e){ + poi_layer.setLatLng(e.latlng); + $("#lat").val(e.latlng.lat); + $("#lon").val(e.latlng.lng); + }) + poi_layer.on('move', function(e){ + $("#lat").val(e.latlng.lat); + $("#lon").val(e.latlng.lng); + }) +}); \ No newline at end of file From 5034763a183c1db0a473060bbf12de43b9d3596b Mon Sep 17 00:00:00 2001 From: leosw Date: Mon, 18 May 2020 09:34:26 +0400 Subject: [PATCH 14/17] Add icon changing on type changing in poi editor --- .gitignore | 1 + views/d.poi.edit.html | 2 +- views/js/d.poi_map.js | 11 +++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 49c715f..b2722fb 100755 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /includes/config.php /medias/* /_maps +_ressources/dump.sql *.sublime-project *.sublime-workspace *.log \ No newline at end of file diff --git a/views/d.poi.edit.html b/views/d.poi.edit.html index 19fd445..40a2ef8 100755 --- a/views/d.poi.edit.html +++ b/views/d.poi.edit.html @@ -14,7 +14,7 @@

    -
    +
    diff --git a/views/js/d.poi_map.js b/views/js/d.poi_map.js index 01b23e9..7812d52 100755 --- a/views/js/d.poi_map.js +++ b/views/js/d.poi_map.js @@ -56,4 +56,15 @@ $( document ).ready(function() { $("#lat").val(e.latlng.lat); $("#lon").val(e.latlng.lng); }) + + var poiicon = L.icon({ + iconSize: [24, 24], + iconAnchor: [12, 12] + }); + + $("#type_selector label").click(function(e) { + console.log(e); + poiicon.options.iconUrl = e.currentTarget.firstChild.currentSrc; + poi_layer.setIcon(poiicon); + }) }); \ No newline at end of file From 4679eaa82a34238a863a0d10f9fdbc13a739a251 Mon Sep 17 00:00:00 2001 From: leosw Date: Mon, 18 May 2020 09:58:23 +0400 Subject: [PATCH 15/17] Remove permalink and add tooltip --- views/css/d.poi.css | 10 ---------- views/d.poi.edit.html | 19 ------------------- views/js/d.poi_map.js | 6 ++++-- 3 files changed, 4 insertions(+), 31 deletions(-) diff --git a/views/css/d.poi.css b/views/css/d.poi.css index 4aee9ad..bafb218 100755 --- a/views/css/d.poi.css +++ b/views/css/d.poi.css @@ -60,16 +60,6 @@ form.form h1 input { font-size: 17px; } -#permalink { - width: 808px; - margin: 10px 0 0 0px; - padding: 6px; - font-size: 11px; - font-style: italic; - color: #555; - -} - .flex_line { display: flex; flex-direction: row; diff --git a/views/d.poi.edit.html b/views/d.poi.edit.html index 40a2ef8..71d3049 100755 --- a/views/d.poi.edit.html +++ b/views/d.poi.edit.html @@ -29,9 +29,6 @@ - - -
    @@ -46,22 +43,6 @@ diff --git a/views/js/d.poi_map.js b/views/js/d.poi_map.js index 7812d52..e65bf95 100755 --- a/views/js/d.poi_map.js +++ b/views/js/d.poi_map.js @@ -46,13 +46,16 @@ $( document ).ready(function() { }); poi_layer = L.marker([-46.407, 51.766], {draggable: true}).addTo(mymap); + poi_layer.bindTooltip("Glissez moi au bon endroit.", {permanent: true, direction: 'top'}).openTooltip(); mymap.on('click', function(e){ + poi_layer.unbindTooltip(); poi_layer.setLatLng(e.latlng); $("#lat").val(e.latlng.lat); $("#lon").val(e.latlng.lng); }) poi_layer.on('move', function(e){ + poi_layer.unbindTooltip(); $("#lat").val(e.latlng.lat); $("#lon").val(e.latlng.lng); }) @@ -61,9 +64,8 @@ $( document ).ready(function() { iconSize: [24, 24], iconAnchor: [12, 12] }); - $("#type_selector label").click(function(e) { - console.log(e); + poi_layer.unbindTooltip(); poiicon.options.iconUrl = e.currentTarget.firstChild.currentSrc; poi_layer.setIcon(poiicon); }) From 1589a33aaf0fcaea7a3cf9673fef08728f08a689 Mon Sep 17 00:00:00 2001 From: leosw Date: Mon, 18 May 2020 10:16:09 +0400 Subject: [PATCH 16/17] Re-organizing the poi editor form --- views/css/d.poi.css | 11 +++++++---- views/d.poi.edit.html | 21 ++++++++++----------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/views/css/d.poi.css b/views/css/d.poi.css index bafb218..7e3da08 100755 --- a/views/css/d.poi.css +++ b/views/css/d.poi.css @@ -50,13 +50,16 @@ form.form input, form.form textarea, form.form input[type=radio]:checked+label, } form.form h1 input { - width: 58%; - margin: 10px 0 10px 0px; + flex: 2 !important; font-size: 18px; } +form.form h1 { + padding: 10px 0; + margin: 0 0 10px 0; +} #locale { - width: 38%; - float: right; + flex: 1; + margin: 10px 5px 0 5px; font-size: 17px; } diff --git a/views/d.poi.edit.html b/views/d.poi.edit.html index 71d3049..cc3b072 100755 --- a/views/d.poi.edit.html +++ b/views/d.poi.edit.html @@ -13,7 +13,15 @@
    -
    +

    + + +

    +
    @@ -21,22 +29,13 @@
    -

    - - -

    -
    - +
    From 08f54104485684a02fd598a572efb170cdd070f0 Mon Sep 17 00:00:00 2001 From: leosw Date: Mon, 18 May 2020 11:40:07 +0400 Subject: [PATCH 17/17] Special maps for Crozet --- controllers/d.poi.php | 28 +++++++--------------------- views/d.poi.edit.html | 8 ++++++-- views/js/d.map.js | 19 +++++++++++-------- views/js/d.poi_map.js | 19 +++++++++++-------- 4 files changed, 35 insertions(+), 39 deletions(-) diff --git a/controllers/d.poi.php b/controllers/d.poi.php index dff1bfa..b088fc1 100755 --- a/controllers/d.poi.php +++ b/controllers/d.poi.php @@ -7,31 +7,17 @@ $head['css'] = "d.index.css;d.poi.css"; $poi = new Kabano\Poi(); -// In case we are in the list of articles, we set url to switch with according parameters -// if (!isset($controller->splitted_url[1]) OR $controller->splitted_url[1]=="" OR is_numeric($controller->splitted_url[1])) { -// $head['title'] = "Blog"; - -// // Get the correct page number -// if (!isset($controller->splitted_url[1]) OR $controller->splitted_url[1]=="") { -// $page = 0; -// } else { -// $page = $controller->splitted_url[1] - 1; -// } - -// $controller->splitted_url[1] = "list"; -// $list = "html"; -// $articles_per_pages = 5; -// } - switch ($controller->splitted_url[1]) { case "new": if($user->rankIsHigher("registered")) { if(isset($_POST['submit'])) { - $blogArticle->content = $_POST['content']; - $blogArticle->locale = $_POST['locale']; - $blogArticle->name = $_POST['name']; - $blogArticle->is_commentable = isset($_POST['is_commentable'])?'t':'f'; - $blogArticle->author = $user->id; + $poi->name = $_POST['name']; + $poi->locale = $_POST['locale']; + $poi->poi_type = $_POST['poi_type']; + $poi->lat = $_POST['lat']; + $poi->lon = $_POST['lon']; + $poi->alt = $_POST['alt']; + $poi->author = $user->id; if(!$blogArticle->checkPermalink($_POST['permalink'],1)) { $blogArticle->permalink = $_POST['permalink']; $blogArticle->insert(); diff --git a/views/d.poi.edit.html b/views/d.poi.edit.html index cc3b072..04523b8 100755 --- a/views/d.poi.edit.html +++ b/views/d.poi.edit.html @@ -12,8 +12,12 @@
    -
    -

    + + + + +