2018-12-14 05:41:57 +01:00
this [ "wp" ] = this [ "wp" ] || { } ; this [ "wp" ] [ "blocks" ] =
/******/ ( function ( modules ) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = { } ;
/******/
/******/ // The require function
/******/ function _ _webpack _require _ _ ( moduleId ) {
/******/
/******/ // Check if module is in cache
/******/ if ( installedModules [ moduleId ] ) {
/******/ return installedModules [ moduleId ] . exports ;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules [ moduleId ] = {
/******/ i : moduleId ,
/******/ l : false ,
/******/ exports : { }
/******/ } ;
/******/
/******/ // Execute the module function
/******/ modules [ moduleId ] . call ( module . exports , module , module . exports , _ _webpack _require _ _ ) ;
/******/
/******/ // Flag the module as loaded
/******/ module . l = true ;
/******/
/******/ // Return the exports of the module
/******/ return module . exports ;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ _ _webpack _require _ _ . m = modules ;
/******/
/******/ // expose the module cache
/******/ _ _webpack _require _ _ . c = installedModules ;
/******/
/******/ // define getter function for harmony exports
/******/ _ _webpack _require _ _ . d = function ( exports , name , getter ) {
/******/ if ( ! _ _webpack _require _ _ . o ( exports , name ) ) {
/******/ Object . defineProperty ( exports , name , { enumerable : true , get : getter } ) ;
/******/ }
/******/ } ;
/******/
/******/ // define __esModule on exports
/******/ _ _webpack _require _ _ . r = function ( exports ) {
/******/ if ( typeof Symbol !== 'undefined' && Symbol . toStringTag ) {
/******/ Object . defineProperty ( exports , Symbol . toStringTag , { value : 'Module' } ) ;
/******/ }
/******/ Object . defineProperty ( exports , '__esModule' , { value : true } ) ;
/******/ } ;
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ _ _webpack _require _ _ . t = function ( value , mode ) {
/******/ if ( mode & 1 ) value = _ _webpack _require _ _ ( value ) ;
/******/ if ( mode & 8 ) return value ;
/******/ if ( ( mode & 4 ) && typeof value === 'object' && value && value . _ _esModule ) return value ;
/******/ var ns = Object . create ( null ) ;
/******/ _ _webpack _require _ _ . r ( ns ) ;
/******/ Object . defineProperty ( ns , 'default' , { enumerable : true , value : value } ) ;
/******/ if ( mode & 2 && typeof value != 'string' ) for ( var key in value ) _ _webpack _require _ _ . d ( ns , key , function ( key ) { return value [ key ] ; } . bind ( null , key ) ) ;
/******/ return ns ;
/******/ } ;
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ _ _webpack _require _ _ . n = function ( module ) {
/******/ var getter = module && module . _ _esModule ?
/******/ function getDefault ( ) { return module [ 'default' ] ; } :
/******/ function getModuleExports ( ) { return module ; } ;
/******/ _ _webpack _require _ _ . d ( getter , 'a' , getter ) ;
/******/ return getter ;
/******/ } ;
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ _ _webpack _require _ _ . o = function ( object , property ) { return Object . prototype . hasOwnProperty . call ( object , property ) ; } ;
/******/
/******/ // __webpack_public_path__
/******/ _ _webpack _require _ _ . p = "" ;
/******/
/******/
/******/ // Load entry module and return exports
2019-03-21 13:48:00 +01:00
/******/ return _ _webpack _require _ _ ( _ _webpack _require _ _ . s = 362 ) ;
2018-12-14 05:41:57 +01:00
/******/ } )
/************************************************************************/
/******/ ( {
2018-12-18 04:14:52 +01:00
/***/ 0 :
/***/ ( function ( module , exports ) {
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
( function ( ) { module . exports = this [ "wp" ] [ "element" ] ; } ( ) ) ;
2018-12-14 05:41:57 +01:00
/***/ } ) ,
2018-12-18 04:14:52 +01:00
/***/ 1 :
/***/ ( function ( module , exports ) {
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
( function ( ) { module . exports = this [ "wp" ] [ "i18n" ] ; } ( ) ) ;
2018-12-14 05:41:57 +01:00
/***/ } ) ,
2018-12-18 04:14:52 +01:00
/***/ 10 :
Block Editor: Update `@wordpress` dependencies to match Gutenberg 4.5.1.
- Update the annotations, api-fetch, block-library, blocks, components, compose, core-data, data, date, dom, edit-post, editor, element, format-library, html-entities, i18n, jest-console, jest-preset-default, keycodes, list-reusable-blocks, notices, nux, plugins, rich-text, scripts, token-lists, url, viewport packages.
- Upgrades React from 16.5.2 to 16.6.3.
- Adds a missing `wp-date` dependency to the editor script.
- Updates changed dependencies in `script-loader.php`.
- Fixes undefined notices in some blocks.
- Removes incorrect `gutenberg` textdomain.
Merges [43891], [43903], and [43919] to trunk.
Props atimmer, aduth, youknowriad, danielbachhuber.
See #45145.
Built from https://develop.svn.wordpress.org/trunk@44262
git-svn-id: http://core.svn.wordpress.org/trunk@44092 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-17 16:37:00 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
2018-12-18 04:14:52 +01:00
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return _classCallCheck ; } ) ;
Block Editor: Update `@wordpress` dependencies to match Gutenberg 4.5.1.
- Update the annotations, api-fetch, block-library, blocks, components, compose, core-data, data, date, dom, edit-post, editor, element, format-library, html-entities, i18n, jest-console, jest-preset-default, keycodes, list-reusable-blocks, notices, nux, plugins, rich-text, scripts, token-lists, url, viewport packages.
- Upgrades React from 16.5.2 to 16.6.3.
- Adds a missing `wp-date` dependency to the editor script.
- Updates changed dependencies in `script-loader.php`.
- Fixes undefined notices in some blocks.
- Removes incorrect `gutenberg` textdomain.
Merges [43891], [43903], and [43919] to trunk.
Props atimmer, aduth, youknowriad, danielbachhuber.
See #45145.
Built from https://develop.svn.wordpress.org/trunk@44262
git-svn-id: http://core.svn.wordpress.org/trunk@44092 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-17 16:37:00 +01:00
function _classCallCheck ( instance , Constructor ) {
if ( ! ( instance instanceof Constructor ) ) {
throw new TypeError ( "Cannot call a class as a function" ) ;
}
}
/***/ } ) ,
2019-03-21 13:48:00 +01:00
/***/ 134 :
2018-12-18 04:14:52 +01:00
/***/ ( function ( module , exports ) {
Block Editor: Update `@wordpress` dependencies to match Gutenberg 4.5.1.
- Update the annotations, api-fetch, block-library, blocks, components, compose, core-data, data, date, dom, edit-post, editor, element, format-library, html-entities, i18n, jest-console, jest-preset-default, keycodes, list-reusable-blocks, notices, nux, plugins, rich-text, scripts, token-lists, url, viewport packages.
- Upgrades React from 16.5.2 to 16.6.3.
- Adds a missing `wp-date` dependency to the editor script.
- Updates changed dependencies in `script-loader.php`.
- Fixes undefined notices in some blocks.
- Removes incorrect `gutenberg` textdomain.
Merges [43891], [43903], and [43919] to trunk.
Props atimmer, aduth, youknowriad, danielbachhuber.
See #45145.
Built from https://develop.svn.wordpress.org/trunk@44262
git-svn-id: http://core.svn.wordpress.org/trunk@44092 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-17 16:37:00 +01:00
2018-12-18 04:14:52 +01:00
( function ( ) { module . exports = this [ "wp" ] [ "shortcode" ] ; } ( ) ) ;
Block Editor: Update `@wordpress` dependencies to match Gutenberg 4.5.1.
- Update the annotations, api-fetch, block-library, blocks, components, compose, core-data, data, date, dom, edit-post, editor, element, format-library, html-entities, i18n, jest-console, jest-preset-default, keycodes, list-reusable-blocks, notices, nux, plugins, rich-text, scripts, token-lists, url, viewport packages.
- Upgrades React from 16.5.2 to 16.6.3.
- Adds a missing `wp-date` dependency to the editor script.
- Updates changed dependencies in `script-loader.php`.
- Fixes undefined notices in some blocks.
- Removes incorrect `gutenberg` textdomain.
Merges [43891], [43903], and [43919] to trunk.
Props atimmer, aduth, youknowriad, danielbachhuber.
See #45145.
Built from https://develop.svn.wordpress.org/trunk@44262
git-svn-id: http://core.svn.wordpress.org/trunk@44092 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-17 16:37:00 +01:00
/***/ } ) ,
2018-12-18 04:14:52 +01:00
/***/ 15 :
2018-12-14 05:41:57 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
2018-12-18 04:14:52 +01:00
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return _defineProperty ; } ) ;
2018-12-14 05:41:57 +01:00
function _defineProperty ( obj , key , value ) {
if ( key in obj ) {
Object . defineProperty ( obj , key , {
value : value ,
enumerable : true ,
configurable : true ,
writable : true
} ) ;
} else {
obj [ key ] = value ;
}
return obj ;
}
/***/ } ) ,
2019-03-21 13:48:00 +01:00
/***/ 17 :
2018-12-14 05:41:57 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
2019-03-07 10:09:59 +01:00
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js
function _arrayWithoutHoles ( arr ) {
if ( Array . isArray ( arr ) ) {
for ( var i = 0 , arr2 = new Array ( arr . length ) ; i < arr . length ; i ++ ) {
arr2 [ i ] = arr [ i ] ;
2018-12-14 05:41:57 +01:00
}
2019-03-07 10:09:59 +01:00
return arr2 ;
}
}
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js
2019-03-21 13:48:00 +01:00
var iterableToArray = _ _webpack _require _ _ ( 34 ) ;
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js
function _nonIterableSpread ( ) {
throw new TypeError ( "Invalid attempt to spread non-iterable instance" ) ;
}
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return _toConsumableArray ; } ) ;
function _toConsumableArray ( arr ) {
return _arrayWithoutHoles ( arr ) || Object ( iterableToArray [ "a" /* default */ ] ) ( arr ) || _nonIterableSpread ( ) ;
2018-12-14 05:41:57 +01:00
}
/***/ } ) ,
2019-03-21 13:48:00 +01:00
/***/ 19 :
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return _extends ; } ) ;
function _extends ( ) {
_extends = Object . assign || function ( target ) {
for ( var i = 1 ; i < arguments . length ; i ++ ) {
var source = arguments [ i ] ;
for ( var key in source ) {
if ( Object . prototype . hasOwnProperty . call ( source , key ) ) {
target [ key ] = source [ key ] ;
}
}
}
return target ;
} ;
return _extends . apply ( this , arguments ) ;
}
/***/ } ) ,
/***/ 2 :
/***/ ( function ( module , exports ) {
( function ( ) { module . exports = this [ "lodash" ] ; } ( ) ) ;
/***/ } ) ,
/***/ 205 :
2018-12-18 04:14:52 +01:00
/***/ ( function ( module , exports ) {
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
( function ( ) { module . exports = this [ "wp" ] [ "blockSerializationDefaultParser" ] ; } ( ) ) ;
2018-12-14 05:41:57 +01:00
/***/ } ) ,
2019-03-21 13:48:00 +01:00
/***/ 206 :
2018-12-18 04:14:52 +01:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var _ _WEBPACK _AMD _DEFINE _RESULT _ _ ; ; /*! showdown v 1.9.0 - 10-11-2018 */
( function ( ) {
/ * *
* Created by Tivie on 13 - 07 - 2015.
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function getDefaultOpts ( simple ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var defaultOptions = {
omitExtraWLInCodeBlocks : {
defaultValue : false ,
describe : 'Omit the default extra whiteline added to code blocks' ,
type : 'boolean'
} ,
noHeaderId : {
defaultValue : false ,
describe : 'Turn on/off generated header id' ,
type : 'boolean'
} ,
prefixHeaderId : {
defaultValue : false ,
describe : 'Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic \'section-\' prefix' ,
type : 'string'
} ,
rawPrefixHeaderId : {
defaultValue : false ,
describe : 'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the " char is used in the prefix)' ,
type : 'boolean'
} ,
ghCompatibleHeaderId : {
defaultValue : false ,
describe : 'Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)' ,
type : 'boolean'
} ,
rawHeaderId : {
defaultValue : false ,
describe : 'Remove only spaces, \' and " from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids' ,
type : 'boolean'
} ,
headerLevelStart : {
defaultValue : false ,
describe : 'The header blocks level start' ,
type : 'integer'
} ,
parseImgDimensions : {
defaultValue : false ,
describe : 'Turn on/off image dimension parsing' ,
type : 'boolean'
} ,
simplifiedAutoLink : {
defaultValue : false ,
describe : 'Turn on/off GFM autolink style' ,
type : 'boolean'
} ,
excludeTrailingPunctuationFromURLs : {
defaultValue : false ,
describe : 'Excludes trailing punctuation from links generated with autoLinking' ,
type : 'boolean'
} ,
literalMidWordUnderscores : {
defaultValue : false ,
describe : 'Parse midword underscores as literal underscores' ,
type : 'boolean'
} ,
literalMidWordAsterisks : {
defaultValue : false ,
describe : 'Parse midword asterisks as literal asterisks' ,
type : 'boolean'
} ,
strikethrough : {
defaultValue : false ,
describe : 'Turn on/off strikethrough support' ,
type : 'boolean'
} ,
tables : {
defaultValue : false ,
describe : 'Turn on/off tables support' ,
type : 'boolean'
} ,
tablesHeaderId : {
defaultValue : false ,
describe : 'Add an id to table headers' ,
type : 'boolean'
} ,
ghCodeBlocks : {
defaultValue : true ,
describe : 'Turn on/off GFM fenced code blocks support' ,
type : 'boolean'
} ,
tasklists : {
defaultValue : false ,
describe : 'Turn on/off GFM tasklist support' ,
type : 'boolean'
} ,
smoothLivePreview : {
defaultValue : false ,
describe : 'Prevents weird effects in live previews due to incomplete input' ,
type : 'boolean'
} ,
smartIndentationFix : {
defaultValue : false ,
description : 'Tries to smartly fix indentation in es6 strings' ,
type : 'boolean'
} ,
disableForced4SpacesIndentedSublists : {
defaultValue : false ,
description : 'Disables the requirement of indenting nested sublists by 4 spaces' ,
type : 'boolean'
} ,
simpleLineBreaks : {
defaultValue : false ,
description : 'Parses simple line breaks as <br> (GFM Style)' ,
type : 'boolean'
} ,
requireSpaceBeforeHeadingText : {
defaultValue : false ,
description : 'Makes adding a space between `#` and the header text mandatory (GFM Style)' ,
type : 'boolean'
} ,
ghMentions : {
defaultValue : false ,
description : 'Enables github @mentions' ,
type : 'boolean'
} ,
ghMentionsLink : {
defaultValue : 'https://github.com/{u}' ,
description : 'Changes the link generated by @mentions. Only applies if ghMentions option is enabled.' ,
type : 'string'
} ,
encodeEmails : {
defaultValue : true ,
description : 'Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities' ,
type : 'boolean'
} ,
openLinksInNewWindow : {
defaultValue : false ,
description : 'Open all links in new windows' ,
type : 'boolean'
} ,
backslashEscapesHTMLTags : {
defaultValue : false ,
description : 'Support for HTML Tag escaping. ex: \<div>foo\</div>' ,
type : 'boolean'
} ,
emoji : {
defaultValue : false ,
description : 'Enable emoji support. Ex: `this is a :smile: emoji`' ,
type : 'boolean'
} ,
underline : {
defaultValue : false ,
description : 'Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `<em>` and `<strong>`' ,
type : 'boolean'
} ,
completeHTMLDocument : {
defaultValue : false ,
description : 'Outputs a complete html document, including `<html>`, `<head>` and `<body>` tags' ,
type : 'boolean'
} ,
metadata : {
defaultValue : false ,
description : 'Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).' ,
type : 'boolean'
} ,
splitAdjacentBlockquotes : {
defaultValue : false ,
description : 'Split adjacent blockquote blocks' ,
type : 'boolean'
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
} ;
if ( simple === false ) {
return JSON . parse ( JSON . stringify ( defaultOptions ) ) ;
}
var ret = { } ;
for ( var opt in defaultOptions ) {
if ( defaultOptions . hasOwnProperty ( opt ) ) {
ret [ opt ] = defaultOptions [ opt ] . defaultValue ;
2018-12-14 05:41:57 +01:00
}
}
2018-12-18 04:14:52 +01:00
return ret ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
function allOptionsOn ( ) {
'use strict' ;
var options = getDefaultOpts ( true ) ,
ret = { } ;
for ( var opt in options ) {
if ( options . hasOwnProperty ( opt ) ) {
ret [ opt ] = true ;
2018-12-14 05:41:57 +01:00
}
}
2018-12-18 04:14:52 +01:00
return ret ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
/ * *
* Created by Tivie on 06 - 01 - 2015.
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// Private properties
var showdown = { } ,
parsers = { } ,
extensions = { } ,
globalOptions = getDefaultOpts ( true ) ,
setFlavor = 'vanilla' ,
flavor = {
github : {
omitExtraWLInCodeBlocks : true ,
simplifiedAutoLink : true ,
excludeTrailingPunctuationFromURLs : true ,
literalMidWordUnderscores : true ,
strikethrough : true ,
tables : true ,
tablesHeaderId : true ,
ghCodeBlocks : true ,
tasklists : true ,
disableForced4SpacesIndentedSublists : true ,
simpleLineBreaks : true ,
requireSpaceBeforeHeadingText : true ,
ghCompatibleHeaderId : true ,
ghMentions : true ,
backslashEscapesHTMLTags : true ,
emoji : true ,
splitAdjacentBlockquotes : true
} ,
original : {
noHeaderId : true ,
ghCodeBlocks : false
} ,
ghost : {
omitExtraWLInCodeBlocks : true ,
parseImgDimensions : true ,
simplifiedAutoLink : true ,
excludeTrailingPunctuationFromURLs : true ,
literalMidWordUnderscores : true ,
strikethrough : true ,
tables : true ,
tablesHeaderId : true ,
ghCodeBlocks : true ,
tasklists : true ,
smoothLivePreview : true ,
simpleLineBreaks : true ,
requireSpaceBeforeHeadingText : true ,
ghMentions : false ,
encodeEmails : true
} ,
vanilla : getDefaultOpts ( true ) ,
allOn : allOptionsOn ( )
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* helper namespace
* @ type { { } }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . helper = { } ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* TODO LEGACY SUPPORT CODE
* @ type { { } }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . extensions = { } ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Set a global option
* @ static
* @ param { string } key
* @ param { * } value
* @ returns { showdown }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . setOption = function ( key , value ) {
'use strict' ;
globalOptions [ key ] = value ;
return this ;
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Get a global option
* @ static
* @ param { string } key
* @ returns { * }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . getOption = function ( key ) {
'use strict' ;
return globalOptions [ key ] ;
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Get the global options
* @ static
* @ returns { { } }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . getOptions = function ( ) {
'use strict' ;
return globalOptions ;
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Reset global options to the default values
* @ static
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . resetOptions = function ( ) {
'use strict' ;
globalOptions = getDefaultOpts ( true ) ;
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Set the flavor showdown should use as default
* @ param { string } name
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . setFlavor = function ( name ) {
'use strict' ;
if ( ! flavor . hasOwnProperty ( name ) ) {
throw Error ( name + ' flavor was not found' ) ;
}
showdown . resetOptions ( ) ;
var preset = flavor [ name ] ;
setFlavor = name ;
for ( var option in preset ) {
if ( preset . hasOwnProperty ( option ) ) {
globalOptions [ option ] = preset [ option ] ;
}
}
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Get the currently set flavor
* @ returns { string }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . getFlavor = function ( ) {
'use strict' ;
return setFlavor ;
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Get the options of a specified flavor . Returns undefined if the flavor was not found
* @ param { string } name Name of the flavor
* @ returns { { } | undefined }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . getFlavorOptions = function ( name ) {
'use strict' ;
if ( flavor . hasOwnProperty ( name ) ) {
return flavor [ name ] ;
}
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Get the default options
* @ static
* @ param { boolean } [ simple = true ]
* @ returns { { } }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . getDefaultOptions = function ( simple ) {
'use strict' ;
return getDefaultOpts ( simple ) ;
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Get or set a subParser
2018-12-14 05:41:57 +01:00
*
2018-12-18 04:14:52 +01:00
* subParser ( name ) - Get a registered subParser
* subParser ( name , func ) - Register a subParser
* @ static
* @ param { string } name
* @ param { function } [ func ]
* @ returns { * }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . subParser = function ( name , func ) {
'use strict' ;
if ( showdown . helper . isString ( name ) ) {
if ( typeof func !== 'undefined' ) {
parsers [ name ] = func ;
} else {
if ( parsers . hasOwnProperty ( name ) ) {
return parsers [ name ] ;
} else {
throw Error ( 'SubParser named ' + name + ' not registered!' ) ;
}
2018-12-14 05:41:57 +01:00
}
}
2018-12-18 04:14:52 +01:00
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Gets or registers an extension
* @ static
* @ param { string } name
* @ param { object | function = } ext
* @ returns { * }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . extension = function ( name , ext ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! showdown . helper . isString ( name ) ) {
throw Error ( 'Extension \'name\' must be a string' ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
name = showdown . helper . stdExtName ( name ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// Getter
if ( showdown . helper . isUndefined ( ext ) ) {
if ( ! extensions . hasOwnProperty ( name ) ) {
throw Error ( 'Extension named ' + name + ' is not registered!' ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return extensions [ name ] ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// Setter
} else {
// Expand extension if it's wrapped in a function
if ( typeof ext === 'function' ) {
ext = ext ( ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
// Ensure extension is an array
if ( ! showdown . helper . isArray ( ext ) ) {
ext = [ ext ] ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var validExtension = validate ( ext , name ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( validExtension . valid ) {
extensions [ name ] = ext ;
} else {
throw Error ( validExtension . error ) ;
}
}
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Gets all extensions registered
* @ returns { { } }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . getAllExtensions = function ( ) {
'use strict' ;
return extensions ;
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Remove an extension
* @ param { string } name
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . removeExtension = function ( name ) {
'use strict' ;
delete extensions [ name ] ;
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Removes all extensions
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . resetExtensions = function ( ) {
'use strict' ;
extensions = { } ;
} ;
2018-12-17 05:52:00 +01:00
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Validate extension
* @ param { array } extension
* @ param { string } name
* @ returns { { valid : boolean , error : string } }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
function validate ( extension , name ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var errMsg = ( name ) ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension' ,
ret = {
valid : true ,
error : ''
} ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! showdown . helper . isArray ( extension ) ) {
extension = [ extension ] ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( var i = 0 ; i < extension . length ; ++ i ) {
var baseMsg = errMsg + ' sub-extension ' + i + ': ' ,
ext = extension [ i ] ;
if ( typeof ext !== 'object' ) {
ret . valid = false ;
ret . error = baseMsg + 'must be an object, but ' + typeof ext + ' given' ;
return ret ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
if ( ! showdown . helper . isString ( ext . type ) ) {
ret . valid = false ;
ret . error = baseMsg + 'property "type" must be a string, but ' + typeof ext . type + ' given' ;
return ret ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
var type = ext . type = ext . type . toLowerCase ( ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// normalize extension type
if ( type === 'language' ) {
type = ext . type = 'lang' ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( type === 'html' ) {
type = ext . type = 'output' ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( type !== 'lang' && type !== 'output' && type !== 'listener' ) {
ret . valid = false ;
ret . error = baseMsg + 'type ' + type + ' is not recognized. Valid values: "lang/language", "output/html" or "listener"' ;
return ret ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( type === 'listener' ) {
if ( showdown . helper . isUndefined ( ext . listeners ) ) {
ret . valid = false ;
ret . error = baseMsg + '. Extensions of type "listener" must have a property called "listeners"' ;
return ret ;
}
} else {
if ( showdown . helper . isUndefined ( ext . filter ) && showdown . helper . isUndefined ( ext . regex ) ) {
ret . valid = false ;
ret . error = baseMsg + type + ' extensions must define either a "regex" property or a "filter" method' ;
return ret ;
}
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ext . listeners ) {
if ( typeof ext . listeners !== 'object' ) {
ret . valid = false ;
ret . error = baseMsg + '"listeners" property must be an object but ' + typeof ext . listeners + ' given' ;
return ret ;
}
for ( var ln in ext . listeners ) {
if ( ext . listeners . hasOwnProperty ( ln ) ) {
if ( typeof ext . listeners [ ln ] !== 'function' ) {
ret . valid = false ;
ret . error = baseMsg + '"listeners" property must be an hash of [event name]: [callback]. listeners.' + ln +
' must be a function but ' + typeof ext . listeners [ ln ] + ' given' ;
return ret ;
}
}
}
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ext . filter ) {
if ( typeof ext . filter !== 'function' ) {
ret . valid = false ;
ret . error = baseMsg + '"filter" must be a function, but ' + typeof ext . filter + ' given' ;
return ret ;
}
} else if ( ext . regex ) {
if ( showdown . helper . isString ( ext . regex ) ) {
ext . regex = new RegExp ( ext . regex , 'g' ) ;
}
if ( ! ( ext . regex instanceof RegExp ) ) {
ret . valid = false ;
ret . error = baseMsg + '"regex" property must either be a string or a RegExp object, but ' + typeof ext . regex + ' given' ;
return ret ;
}
if ( showdown . helper . isUndefined ( ext . replace ) ) {
ret . valid = false ;
ret . error = baseMsg + '"regex" extensions must implement a replace string or function' ;
return ret ;
}
2018-12-14 05:41:57 +01:00
}
}
2018-12-18 04:14:52 +01:00
return ret ;
}
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Validate extension
* @ param { object } ext
* @ returns { boolean }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . validateExtension = function ( ext ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var validateExtension = validate ( ext , null ) ;
if ( ! validateExtension . valid ) {
console . warn ( validateExtension . error ) ;
return false ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return true ;
2018-12-14 05:41:57 +01:00
} ;
2018-12-18 04:14:52 +01:00
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* showdownjs helper functions
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
if ( ! showdown . hasOwnProperty ( 'helper' ) ) {
showdown . helper = { } ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Check if var is string
* @ static
* @ param { string } a
* @ returns { boolean }
* /
showdown . helper . isString = function ( a ) {
'use strict' ;
return ( typeof a === 'string' || a instanceof String ) ;
} ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Check if var is a function
* @ static
* @ param { * } a
* @ returns { boolean }
* /
showdown . helper . isFunction = function ( a ) {
'use strict' ;
var getType = { } ;
return a && getType . toString . call ( a ) === '[object Function]' ;
} ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* isArray helper function
* @ static
* @ param { * } a
* @ returns { boolean }
* /
showdown . helper . isArray = function ( a ) {
'use strict' ;
return Array . isArray ( a ) ;
2018-12-14 05:41:57 +01:00
} ;
2018-12-18 04:14:52 +01:00
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Check if value is undefined
* @ static
* @ param { * } value The value to check .
* @ returns { boolean } Returns ` true ` if ` value ` is ` undefined ` , else ` false ` .
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . helper . isUndefined = function ( value ) {
'use strict' ;
return typeof value === 'undefined' ;
} ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* ForEach helper function
* Iterates over Arrays and Objects ( own properties only )
* @ static
* @ param { * } obj
* @ param { function } callback Accepts 3 params : 1. value , 2. key , 3. the original array / object
* /
showdown . helper . forEach = function ( obj , callback ) {
'use strict' ;
// check if obj is defined
if ( showdown . helper . isUndefined ( obj ) ) {
throw new Error ( 'obj param is required' ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( showdown . helper . isUndefined ( callback ) ) {
throw new Error ( 'callback param is required' ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
if ( ! showdown . helper . isFunction ( callback ) ) {
throw new Error ( 'callback param must be a function/closure' ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( typeof obj . forEach === 'function' ) {
obj . forEach ( callback ) ;
} else if ( showdown . helper . isArray ( obj ) ) {
for ( var i = 0 ; i < obj . length ; i ++ ) {
callback ( obj [ i ] , i , obj ) ;
}
} else if ( typeof ( obj ) === 'object' ) {
for ( var prop in obj ) {
if ( obj . hasOwnProperty ( prop ) ) {
callback ( obj [ prop ] , prop , obj ) ;
}
}
} else {
throw new Error ( 'obj does not seem to be an array or an iterable object' ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Standardidize extension name
* @ static
* @ param { string } s extension name
* @ returns { string }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . helper . stdExtName = function ( s ) {
'use strict' ;
return s . replace ( /[_?*+\/\\.^-]/g , '' ) . replace ( /\s/g , '' ) . toLowerCase ( ) ;
} ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function escapeCharactersCallback ( wholeMatch , m1 ) {
'use strict' ;
var charCodeToEscape = m1 . charCodeAt ( 0 ) ;
return '¨E' + charCodeToEscape + 'E' ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Callback used to escape characters when passing through String . replace
* @ static
* @ param { string } wholeMatch
* @ param { string } m1
* @ returns { string }
* /
showdown . helper . escapeCharactersCallback = escapeCharactersCallback ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Escape characters in a string
* @ static
* @ param { string } text
* @ param { string } charsToEscape
* @ param { boolean } afterBackslash
* @ returns { XML | string | void | * }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . helper . escapeCharacters = function ( text , charsToEscape , afterBackslash ) {
'use strict' ;
// First we have to escape the escape characters so that
// we can build a character class out of them
var regexString = '([' + charsToEscape . replace ( /([\[\]\\])/g , '\\$1' ) + '])' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( afterBackslash ) {
regexString = '\\\\' + regexString ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var regex = new RegExp ( regexString , 'g' ) ;
text = text . replace ( regex , escapeCharactersCallback ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return text ;
} ;
2018-12-17 05:52:00 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Unescape HTML entities
* @ param txt
* @ returns { string }
* /
showdown . helper . unescapeHTMLEntities = function ( txt ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return txt
. replace ( /"/g , '"' )
. replace ( /</g , '<' )
. replace ( />/g , '>' )
. replace ( /&/g , '&' ) ;
} ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var rgxFindMatchPos = function ( str , left , right , flags ) {
'use strict' ;
var f = flags || '' ,
g = f . indexOf ( 'g' ) > - 1 ,
x = new RegExp ( left + '|' + right , 'g' + f . replace ( /g/g , '' ) ) ,
l = new RegExp ( left , f . replace ( /g/g , '' ) ) ,
pos = [ ] ,
t , s , m , start , end ;
do {
t = 0 ;
while ( ( m = x . exec ( str ) ) ) {
if ( l . test ( m [ 0 ] ) ) {
if ( ! ( t ++ ) ) {
s = x . lastIndex ;
start = s - m [ 0 ] . length ;
}
} else if ( t ) {
if ( ! -- t ) {
end = m . index + m [ 0 ] . length ;
var obj = {
left : { start : start , end : s } ,
match : { start : s , end : m . index } ,
right : { start : m . index , end : end } ,
wholeMatch : { start : start , end : end }
} ;
pos . push ( obj ) ;
if ( ! g ) {
return pos ;
}
}
}
}
} while ( t && ( x . lastIndex = s ) ) ;
return pos ;
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* matchRecursiveRegExp
2018-12-14 05:41:57 +01:00
*
2018-12-18 04:14:52 +01:00
* ( c ) 2007 Steven Levithan < stevenlevithan . com >
* MIT License
2018-12-14 05:41:57 +01:00
*
2018-12-18 04:14:52 +01:00
* Accepts a string to search , a left and right format delimiter
* as regex patterns , and optional regex flags . Returns an array
* of matches , allowing nested instances of left / right delimiters .
* Use the "g" flag to return all matches , otherwise only the
* first is returned . Be careful to ensure that the left and
* right format delimiters produce mutually exclusive matches .
* Backreferences are not supported within the right delimiter
* due to how it is internally combined with the left delimiter .
* When matching strings whose format delimiters are unbalanced
* to the left or right , the output is intentionally as a
* conventional regex library with recursion support would
* produce , e . g . "<<x>" and "<x>>" both produce [ "x" ] when using
* "<" and ">" as the delimiters ( both strings contain a single ,
* balanced instance of "<x>" ) .
*
* examples :
* matchRecursiveRegExp ( "test" , "\\(" , "\\)" )
* returns : [ ]
* matchRecursiveRegExp ( "<t<<e>><s>>t<>" , "<" , ">" , "g" )
* returns : [ "t<<e>><s>" , "" ]
* matchRecursiveRegExp ( "<div id=\"x\">test</div>" , "<div\\b[^>]*>" , "</div>" , "gi" )
* returns : [ "test" ]
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . helper . matchRecursiveRegExp = function ( str , left , right , flags ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var matchPos = rgxFindMatchPos ( str , left , right , flags ) ,
results = [ ] ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( var i = 0 ; i < matchPos . length ; ++ i ) {
results . push ( [
str . slice ( matchPos [ i ] . wholeMatch . start , matchPos [ i ] . wholeMatch . end ) ,
str . slice ( matchPos [ i ] . match . start , matchPos [ i ] . match . end ) ,
str . slice ( matchPos [ i ] . left . start , matchPos [ i ] . left . end ) ,
str . slice ( matchPos [ i ] . right . start , matchPos [ i ] . right . end )
] ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return results ;
} ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
*
* @ param { string } str
* @ param { string | function } replacement
* @ param { string } left
* @ param { string } right
* @ param { string } flags
* @ returns { string }
* /
showdown . helper . replaceRecursiveRegExp = function ( str , replacement , left , right , flags ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! showdown . helper . isFunction ( replacement ) ) {
var repStr = replacement ;
replacement = function ( ) {
return repStr ;
} ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
var matchPos = rgxFindMatchPos ( str , left , right , flags ) ,
finalStr = str ,
lng = matchPos . length ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( lng > 0 ) {
var bits = [ ] ;
if ( matchPos [ 0 ] . wholeMatch . start !== 0 ) {
bits . push ( str . slice ( 0 , matchPos [ 0 ] . wholeMatch . start ) ) ;
}
for ( var i = 0 ; i < lng ; ++ i ) {
bits . push (
replacement (
str . slice ( matchPos [ i ] . wholeMatch . start , matchPos [ i ] . wholeMatch . end ) ,
str . slice ( matchPos [ i ] . match . start , matchPos [ i ] . match . end ) ,
str . slice ( matchPos [ i ] . left . start , matchPos [ i ] . left . end ) ,
str . slice ( matchPos [ i ] . right . start , matchPos [ i ] . right . end )
)
) ;
if ( i < lng - 1 ) {
bits . push ( str . slice ( matchPos [ i ] . wholeMatch . end , matchPos [ i + 1 ] . wholeMatch . start ) ) ;
}
}
if ( matchPos [ lng - 1 ] . wholeMatch . end < str . length ) {
bits . push ( str . slice ( matchPos [ lng - 1 ] . wholeMatch . end ) ) ;
}
finalStr = bits . join ( '' ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return finalStr ;
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Returns the index within the passed String object of the first occurrence of the specified regex ,
* starting the search at fromIndex . Returns - 1 if the value is not found .
*
* @ param { string } str string to search
* @ param { RegExp } regex Regular expression to search
* @ param { int } [ fromIndex = 0 ] Index to start the search
* @ returns { Number }
* @ throws InvalidArgumentError
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . helper . regexIndexOf = function ( str , regex , fromIndex ) {
'use strict' ;
if ( ! showdown . helper . isString ( str ) ) {
throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string' ;
}
if ( regex instanceof RegExp === false ) {
throw 'InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp' ;
}
var indexOf = str . substring ( fromIndex || 0 ) . search ( regex ) ;
return ( indexOf >= 0 ) ? ( indexOf + ( fromIndex || 0 ) ) : indexOf ;
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Splits the passed string object at the defined index , and returns an array composed of the two substrings
* @ param { string } str string to split
* @ param { int } index index to split string at
* @ returns { [ string , string ] }
* @ throws InvalidArgumentError
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . helper . splitAtIndex = function ( str , index ) {
'use strict' ;
if ( ! showdown . helper . isString ( str ) ) {
throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string' ;
}
return [ str . substring ( 0 , index ) , str . substring ( index ) ] ;
} ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Obfuscate an e - mail address through the use of Character Entities ,
* transforming ASCII characters into their equivalent decimal or hex entities .
*
* Since it has a random component , subsequent calls to this function produce different results
*
* @ param { string } mail
* @ returns { string }
* /
showdown . helper . encodeEmailAddress = function ( mail ) {
'use strict' ;
var encode = [
function ( ch ) {
return '&#' + ch . charCodeAt ( 0 ) + ';' ;
} ,
function ( ch ) {
return '&#x' + ch . charCodeAt ( 0 ) . toString ( 16 ) + ';' ;
} ,
function ( ch ) {
return ch ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
] ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
mail = mail . replace ( /./g , function ( ch ) {
if ( ch === '@' ) {
// this *must* be encoded. I insist.
ch = encode [ Math . floor ( Math . random ( ) * 2 ) ] ( ch ) ;
} else {
var r = Math . random ( ) ;
// roughly 10% raw, 45% hex, 45% dec
ch = (
r > 0.9 ? encode [ 2 ] ( ch ) : r > 0.45 ? encode [ 1 ] ( ch ) : encode [ 0 ] ( ch )
) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return ch ;
} ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return mail ;
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
*
* @ param str
* @ param targetLength
* @ param padString
* @ returns { string }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . helper . padEnd = function padEnd ( str , targetLength , padString ) {
'use strict' ;
/*jshint bitwise: false*/
// eslint-disable-next-line space-infix-ops
targetLength = targetLength >> 0 ; //floor if number or convert non-number to 0;
/*jshint bitwise: true*/
padString = String ( padString || ' ' ) ;
if ( str . length > targetLength ) {
return String ( str ) ;
} else {
targetLength = targetLength - str . length ;
if ( targetLength > padString . length ) {
padString += padString . repeat ( targetLength / padString . length ) ; //append to original to ensure we are longer than needed
}
return String ( str ) + padString . slice ( 0 , targetLength ) ;
}
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* POLYFILLS
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
// use this instead of builtin is undefined for IE8 compatibility
if ( typeof ( console ) === 'undefined' ) {
console = {
warn : function ( msg ) {
'use strict' ;
alert ( msg ) ;
} ,
log : function ( msg ) {
'use strict' ;
alert ( msg ) ;
} ,
error : function ( msg ) {
'use strict' ;
throw msg ;
}
} ;
}
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Common regexes .
* We declare some common regexes to improve performance
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
showdown . helper . regexes = {
asteriskDashAndColon : /([*_:~])/g
} ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* EMOJIS LIST
2018-12-14 05:41:57 +01:00
* /
showdown . helper . emojis = {
'+1' : '\ud83d\udc4d' ,
'-1' : '\ud83d\udc4e' ,
'100' : '\ud83d\udcaf' ,
'1234' : '\ud83d\udd22' ,
'1st_place_medal' : '\ud83e\udd47' ,
'2nd_place_medal' : '\ud83e\udd48' ,
'3rd_place_medal' : '\ud83e\udd49' ,
'8ball' : '\ud83c\udfb1' ,
'a' : '\ud83c\udd70\ufe0f' ,
'ab' : '\ud83c\udd8e' ,
'abc' : '\ud83d\udd24' ,
'abcd' : '\ud83d\udd21' ,
'accept' : '\ud83c\ude51' ,
'aerial_tramway' : '\ud83d\udea1' ,
'airplane' : '\u2708\ufe0f' ,
'alarm_clock' : '\u23f0' ,
'alembic' : '\u2697\ufe0f' ,
'alien' : '\ud83d\udc7d' ,
'ambulance' : '\ud83d\ude91' ,
'amphora' : '\ud83c\udffa' ,
'anchor' : '\u2693\ufe0f' ,
'angel' : '\ud83d\udc7c' ,
'anger' : '\ud83d\udca2' ,
'angry' : '\ud83d\ude20' ,
'anguished' : '\ud83d\ude27' ,
'ant' : '\ud83d\udc1c' ,
'apple' : '\ud83c\udf4e' ,
'aquarius' : '\u2652\ufe0f' ,
'aries' : '\u2648\ufe0f' ,
'arrow_backward' : '\u25c0\ufe0f' ,
'arrow_double_down' : '\u23ec' ,
'arrow_double_up' : '\u23eb' ,
'arrow_down' : '\u2b07\ufe0f' ,
'arrow_down_small' : '\ud83d\udd3d' ,
'arrow_forward' : '\u25b6\ufe0f' ,
'arrow_heading_down' : '\u2935\ufe0f' ,
'arrow_heading_up' : '\u2934\ufe0f' ,
'arrow_left' : '\u2b05\ufe0f' ,
'arrow_lower_left' : '\u2199\ufe0f' ,
'arrow_lower_right' : '\u2198\ufe0f' ,
'arrow_right' : '\u27a1\ufe0f' ,
'arrow_right_hook' : '\u21aa\ufe0f' ,
'arrow_up' : '\u2b06\ufe0f' ,
'arrow_up_down' : '\u2195\ufe0f' ,
'arrow_up_small' : '\ud83d\udd3c' ,
'arrow_upper_left' : '\u2196\ufe0f' ,
'arrow_upper_right' : '\u2197\ufe0f' ,
'arrows_clockwise' : '\ud83d\udd03' ,
'arrows_counterclockwise' : '\ud83d\udd04' ,
'art' : '\ud83c\udfa8' ,
'articulated_lorry' : '\ud83d\ude9b' ,
'artificial_satellite' : '\ud83d\udef0' ,
'astonished' : '\ud83d\ude32' ,
'athletic_shoe' : '\ud83d\udc5f' ,
'atm' : '\ud83c\udfe7' ,
'atom_symbol' : '\u269b\ufe0f' ,
'avocado' : '\ud83e\udd51' ,
'b' : '\ud83c\udd71\ufe0f' ,
'baby' : '\ud83d\udc76' ,
'baby_bottle' : '\ud83c\udf7c' ,
'baby_chick' : '\ud83d\udc24' ,
'baby_symbol' : '\ud83d\udebc' ,
'back' : '\ud83d\udd19' ,
'bacon' : '\ud83e\udd53' ,
'badminton' : '\ud83c\udff8' ,
'baggage_claim' : '\ud83d\udec4' ,
'baguette_bread' : '\ud83e\udd56' ,
'balance_scale' : '\u2696\ufe0f' ,
'balloon' : '\ud83c\udf88' ,
'ballot_box' : '\ud83d\uddf3' ,
'ballot_box_with_check' : '\u2611\ufe0f' ,
'bamboo' : '\ud83c\udf8d' ,
'banana' : '\ud83c\udf4c' ,
'bangbang' : '\u203c\ufe0f' ,
'bank' : '\ud83c\udfe6' ,
'bar_chart' : '\ud83d\udcca' ,
'barber' : '\ud83d\udc88' ,
'baseball' : '\u26be\ufe0f' ,
'basketball' : '\ud83c\udfc0' ,
'basketball_man' : '\u26f9\ufe0f' ,
'basketball_woman' : '\u26f9\ufe0f‍\u2640\ufe0f' ,
'bat' : '\ud83e\udd87' ,
'bath' : '\ud83d\udec0' ,
'bathtub' : '\ud83d\udec1' ,
'battery' : '\ud83d\udd0b' ,
'beach_umbrella' : '\ud83c\udfd6' ,
'bear' : '\ud83d\udc3b' ,
'bed' : '\ud83d\udecf' ,
'bee' : '\ud83d\udc1d' ,
'beer' : '\ud83c\udf7a' ,
'beers' : '\ud83c\udf7b' ,
'beetle' : '\ud83d\udc1e' ,
'beginner' : '\ud83d\udd30' ,
'bell' : '\ud83d\udd14' ,
'bellhop_bell' : '\ud83d\udece' ,
'bento' : '\ud83c\udf71' ,
'biking_man' : '\ud83d\udeb4' ,
'bike' : '\ud83d\udeb2' ,
'biking_woman' : '\ud83d\udeb4‍\u2640\ufe0f' ,
'bikini' : '\ud83d\udc59' ,
'biohazard' : '\u2623\ufe0f' ,
'bird' : '\ud83d\udc26' ,
'birthday' : '\ud83c\udf82' ,
'black_circle' : '\u26ab\ufe0f' ,
'black_flag' : '\ud83c\udff4' ,
'black_heart' : '\ud83d\udda4' ,
'black_joker' : '\ud83c\udccf' ,
'black_large_square' : '\u2b1b\ufe0f' ,
'black_medium_small_square' : '\u25fe\ufe0f' ,
'black_medium_square' : '\u25fc\ufe0f' ,
'black_nib' : '\u2712\ufe0f' ,
'black_small_square' : '\u25aa\ufe0f' ,
'black_square_button' : '\ud83d\udd32' ,
'blonde_man' : '\ud83d\udc71' ,
'blonde_woman' : '\ud83d\udc71‍\u2640\ufe0f' ,
'blossom' : '\ud83c\udf3c' ,
'blowfish' : '\ud83d\udc21' ,
'blue_book' : '\ud83d\udcd8' ,
'blue_car' : '\ud83d\ude99' ,
'blue_heart' : '\ud83d\udc99' ,
'blush' : '\ud83d\ude0a' ,
'boar' : '\ud83d\udc17' ,
'boat' : '\u26f5\ufe0f' ,
'bomb' : '\ud83d\udca3' ,
'book' : '\ud83d\udcd6' ,
'bookmark' : '\ud83d\udd16' ,
'bookmark_tabs' : '\ud83d\udcd1' ,
'books' : '\ud83d\udcda' ,
'boom' : '\ud83d\udca5' ,
'boot' : '\ud83d\udc62' ,
'bouquet' : '\ud83d\udc90' ,
'bowing_man' : '\ud83d\ude47' ,
'bow_and_arrow' : '\ud83c\udff9' ,
'bowing_woman' : '\ud83d\ude47‍\u2640\ufe0f' ,
'bowling' : '\ud83c\udfb3' ,
'boxing_glove' : '\ud83e\udd4a' ,
'boy' : '\ud83d\udc66' ,
'bread' : '\ud83c\udf5e' ,
'bride_with_veil' : '\ud83d\udc70' ,
'bridge_at_night' : '\ud83c\udf09' ,
'briefcase' : '\ud83d\udcbc' ,
'broken_heart' : '\ud83d\udc94' ,
'bug' : '\ud83d\udc1b' ,
'building_construction' : '\ud83c\udfd7' ,
'bulb' : '\ud83d\udca1' ,
'bullettrain_front' : '\ud83d\ude85' ,
'bullettrain_side' : '\ud83d\ude84' ,
'burrito' : '\ud83c\udf2f' ,
'bus' : '\ud83d\ude8c' ,
'business_suit_levitating' : '\ud83d\udd74' ,
'busstop' : '\ud83d\ude8f' ,
'bust_in_silhouette' : '\ud83d\udc64' ,
'busts_in_silhouette' : '\ud83d\udc65' ,
'butterfly' : '\ud83e\udd8b' ,
'cactus' : '\ud83c\udf35' ,
'cake' : '\ud83c\udf70' ,
'calendar' : '\ud83d\udcc6' ,
'call_me_hand' : '\ud83e\udd19' ,
'calling' : '\ud83d\udcf2' ,
'camel' : '\ud83d\udc2b' ,
'camera' : '\ud83d\udcf7' ,
'camera_flash' : '\ud83d\udcf8' ,
'camping' : '\ud83c\udfd5' ,
'cancer' : '\u264b\ufe0f' ,
'candle' : '\ud83d\udd6f' ,
'candy' : '\ud83c\udf6c' ,
'canoe' : '\ud83d\udef6' ,
'capital_abcd' : '\ud83d\udd20' ,
'capricorn' : '\u2651\ufe0f' ,
'car' : '\ud83d\ude97' ,
'card_file_box' : '\ud83d\uddc3' ,
'card_index' : '\ud83d\udcc7' ,
'card_index_dividers' : '\ud83d\uddc2' ,
'carousel_horse' : '\ud83c\udfa0' ,
'carrot' : '\ud83e\udd55' ,
'cat' : '\ud83d\udc31' ,
'cat2' : '\ud83d\udc08' ,
'cd' : '\ud83d\udcbf' ,
'chains' : '\u26d3' ,
'champagne' : '\ud83c\udf7e' ,
'chart' : '\ud83d\udcb9' ,
'chart_with_downwards_trend' : '\ud83d\udcc9' ,
'chart_with_upwards_trend' : '\ud83d\udcc8' ,
'checkered_flag' : '\ud83c\udfc1' ,
'cheese' : '\ud83e\uddc0' ,
'cherries' : '\ud83c\udf52' ,
'cherry_blossom' : '\ud83c\udf38' ,
'chestnut' : '\ud83c\udf30' ,
'chicken' : '\ud83d\udc14' ,
'children_crossing' : '\ud83d\udeb8' ,
'chipmunk' : '\ud83d\udc3f' ,
'chocolate_bar' : '\ud83c\udf6b' ,
'christmas_tree' : '\ud83c\udf84' ,
'church' : '\u26ea\ufe0f' ,
'cinema' : '\ud83c\udfa6' ,
'circus_tent' : '\ud83c\udfaa' ,
'city_sunrise' : '\ud83c\udf07' ,
'city_sunset' : '\ud83c\udf06' ,
'cityscape' : '\ud83c\udfd9' ,
'cl' : '\ud83c\udd91' ,
'clamp' : '\ud83d\udddc' ,
'clap' : '\ud83d\udc4f' ,
'clapper' : '\ud83c\udfac' ,
'classical_building' : '\ud83c\udfdb' ,
'clinking_glasses' : '\ud83e\udd42' ,
'clipboard' : '\ud83d\udccb' ,
'clock1' : '\ud83d\udd50' ,
'clock10' : '\ud83d\udd59' ,
'clock1030' : '\ud83d\udd65' ,
'clock11' : '\ud83d\udd5a' ,
'clock1130' : '\ud83d\udd66' ,
'clock12' : '\ud83d\udd5b' ,
'clock1230' : '\ud83d\udd67' ,
'clock130' : '\ud83d\udd5c' ,
'clock2' : '\ud83d\udd51' ,
'clock230' : '\ud83d\udd5d' ,
'clock3' : '\ud83d\udd52' ,
'clock330' : '\ud83d\udd5e' ,
'clock4' : '\ud83d\udd53' ,
'clock430' : '\ud83d\udd5f' ,
'clock5' : '\ud83d\udd54' ,
'clock530' : '\ud83d\udd60' ,
'clock6' : '\ud83d\udd55' ,
'clock630' : '\ud83d\udd61' ,
'clock7' : '\ud83d\udd56' ,
'clock730' : '\ud83d\udd62' ,
'clock8' : '\ud83d\udd57' ,
'clock830' : '\ud83d\udd63' ,
'clock9' : '\ud83d\udd58' ,
'clock930' : '\ud83d\udd64' ,
'closed_book' : '\ud83d\udcd5' ,
'closed_lock_with_key' : '\ud83d\udd10' ,
'closed_umbrella' : '\ud83c\udf02' ,
'cloud' : '\u2601\ufe0f' ,
'cloud_with_lightning' : '\ud83c\udf29' ,
'cloud_with_lightning_and_rain' : '\u26c8' ,
'cloud_with_rain' : '\ud83c\udf27' ,
'cloud_with_snow' : '\ud83c\udf28' ,
'clown_face' : '\ud83e\udd21' ,
'clubs' : '\u2663\ufe0f' ,
'cocktail' : '\ud83c\udf78' ,
'coffee' : '\u2615\ufe0f' ,
'coffin' : '\u26b0\ufe0f' ,
'cold_sweat' : '\ud83d\ude30' ,
'comet' : '\u2604\ufe0f' ,
'computer' : '\ud83d\udcbb' ,
'computer_mouse' : '\ud83d\uddb1' ,
'confetti_ball' : '\ud83c\udf8a' ,
'confounded' : '\ud83d\ude16' ,
'confused' : '\ud83d\ude15' ,
'congratulations' : '\u3297\ufe0f' ,
'construction' : '\ud83d\udea7' ,
'construction_worker_man' : '\ud83d\udc77' ,
'construction_worker_woman' : '\ud83d\udc77‍\u2640\ufe0f' ,
'control_knobs' : '\ud83c\udf9b' ,
'convenience_store' : '\ud83c\udfea' ,
'cookie' : '\ud83c\udf6a' ,
'cool' : '\ud83c\udd92' ,
'policeman' : '\ud83d\udc6e' ,
'copyright' : '\u00a9\ufe0f' ,
'corn' : '\ud83c\udf3d' ,
'couch_and_lamp' : '\ud83d\udecb' ,
'couple' : '\ud83d\udc6b' ,
'couple_with_heart_woman_man' : '\ud83d\udc91' ,
'couple_with_heart_man_man' : '\ud83d\udc68‍\u2764\ufe0f‍\ud83d\udc68' ,
'couple_with_heart_woman_woman' : '\ud83d\udc69‍\u2764\ufe0f‍\ud83d\udc69' ,
'couplekiss_man_man' : '\ud83d\udc68‍\u2764\ufe0f‍\ud83d\udc8b‍\ud83d\udc68' ,
'couplekiss_man_woman' : '\ud83d\udc8f' ,
'couplekiss_woman_woman' : '\ud83d\udc69‍\u2764\ufe0f‍\ud83d\udc8b‍\ud83d\udc69' ,
'cow' : '\ud83d\udc2e' ,
'cow2' : '\ud83d\udc04' ,
'cowboy_hat_face' : '\ud83e\udd20' ,
'crab' : '\ud83e\udd80' ,
'crayon' : '\ud83d\udd8d' ,
'credit_card' : '\ud83d\udcb3' ,
'crescent_moon' : '\ud83c\udf19' ,
'cricket' : '\ud83c\udfcf' ,
'crocodile' : '\ud83d\udc0a' ,
'croissant' : '\ud83e\udd50' ,
'crossed_fingers' : '\ud83e\udd1e' ,
'crossed_flags' : '\ud83c\udf8c' ,
'crossed_swords' : '\u2694\ufe0f' ,
'crown' : '\ud83d\udc51' ,
'cry' : '\ud83d\ude22' ,
'crying_cat_face' : '\ud83d\ude3f' ,
'crystal_ball' : '\ud83d\udd2e' ,
'cucumber' : '\ud83e\udd52' ,
'cupid' : '\ud83d\udc98' ,
'curly_loop' : '\u27b0' ,
'currency_exchange' : '\ud83d\udcb1' ,
'curry' : '\ud83c\udf5b' ,
'custard' : '\ud83c\udf6e' ,
'customs' : '\ud83d\udec3' ,
'cyclone' : '\ud83c\udf00' ,
'dagger' : '\ud83d\udde1' ,
'dancer' : '\ud83d\udc83' ,
'dancing_women' : '\ud83d\udc6f' ,
'dancing_men' : '\ud83d\udc6f‍\u2642\ufe0f' ,
'dango' : '\ud83c\udf61' ,
'dark_sunglasses' : '\ud83d\udd76' ,
'dart' : '\ud83c\udfaf' ,
'dash' : '\ud83d\udca8' ,
'date' : '\ud83d\udcc5' ,
'deciduous_tree' : '\ud83c\udf33' ,
'deer' : '\ud83e\udd8c' ,
'department_store' : '\ud83c\udfec' ,
'derelict_house' : '\ud83c\udfda' ,
'desert' : '\ud83c\udfdc' ,
'desert_island' : '\ud83c\udfdd' ,
'desktop_computer' : '\ud83d\udda5' ,
'male_detective' : '\ud83d\udd75\ufe0f' ,
'diamond_shape_with_a_dot_inside' : '\ud83d\udca0' ,
'diamonds' : '\u2666\ufe0f' ,
'disappointed' : '\ud83d\ude1e' ,
'disappointed_relieved' : '\ud83d\ude25' ,
'dizzy' : '\ud83d\udcab' ,
'dizzy_face' : '\ud83d\ude35' ,
'do_not_litter' : '\ud83d\udeaf' ,
'dog' : '\ud83d\udc36' ,
'dog2' : '\ud83d\udc15' ,
'dollar' : '\ud83d\udcb5' ,
'dolls' : '\ud83c\udf8e' ,
'dolphin' : '\ud83d\udc2c' ,
'door' : '\ud83d\udeaa' ,
'doughnut' : '\ud83c\udf69' ,
'dove' : '\ud83d\udd4a' ,
'dragon' : '\ud83d\udc09' ,
'dragon_face' : '\ud83d\udc32' ,
'dress' : '\ud83d\udc57' ,
'dromedary_camel' : '\ud83d\udc2a' ,
'drooling_face' : '\ud83e\udd24' ,
'droplet' : '\ud83d\udca7' ,
'drum' : '\ud83e\udd41' ,
'duck' : '\ud83e\udd86' ,
'dvd' : '\ud83d\udcc0' ,
'e-mail' : '\ud83d\udce7' ,
'eagle' : '\ud83e\udd85' ,
'ear' : '\ud83d\udc42' ,
'ear_of_rice' : '\ud83c\udf3e' ,
'earth_africa' : '\ud83c\udf0d' ,
'earth_americas' : '\ud83c\udf0e' ,
'earth_asia' : '\ud83c\udf0f' ,
'egg' : '\ud83e\udd5a' ,
'eggplant' : '\ud83c\udf46' ,
'eight_pointed_black_star' : '\u2734\ufe0f' ,
'eight_spoked_asterisk' : '\u2733\ufe0f' ,
'electric_plug' : '\ud83d\udd0c' ,
'elephant' : '\ud83d\udc18' ,
'email' : '\u2709\ufe0f' ,
'end' : '\ud83d\udd1a' ,
'envelope_with_arrow' : '\ud83d\udce9' ,
'euro' : '\ud83d\udcb6' ,
'european_castle' : '\ud83c\udff0' ,
'european_post_office' : '\ud83c\udfe4' ,
'evergreen_tree' : '\ud83c\udf32' ,
'exclamation' : '\u2757\ufe0f' ,
'expressionless' : '\ud83d\ude11' ,
'eye' : '\ud83d\udc41' ,
'eye_speech_bubble' : '\ud83d\udc41‍\ud83d\udde8' ,
'eyeglasses' : '\ud83d\udc53' ,
'eyes' : '\ud83d\udc40' ,
'face_with_head_bandage' : '\ud83e\udd15' ,
'face_with_thermometer' : '\ud83e\udd12' ,
'fist_oncoming' : '\ud83d\udc4a' ,
'factory' : '\ud83c\udfed' ,
'fallen_leaf' : '\ud83c\udf42' ,
'family_man_woman_boy' : '\ud83d\udc6a' ,
'family_man_boy' : '\ud83d\udc68‍\ud83d\udc66' ,
'family_man_boy_boy' : '\ud83d\udc68‍\ud83d\udc66‍\ud83d\udc66' ,
'family_man_girl' : '\ud83d\udc68‍\ud83d\udc67' ,
'family_man_girl_boy' : '\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc66' ,
'family_man_girl_girl' : '\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc67' ,
'family_man_man_boy' : '\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc66' ,
'family_man_man_boy_boy' : '\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc66‍\ud83d\udc66' ,
'family_man_man_girl' : '\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc67' ,
'family_man_man_girl_boy' : '\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc66' ,
'family_man_man_girl_girl' : '\ud83d\udc68‍\ud83d\udc68‍\ud83d\udc67‍\ud83d\udc67' ,
'family_man_woman_boy_boy' : '\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc66‍\ud83d\udc66' ,
'family_man_woman_girl' : '\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc67' ,
'family_man_woman_girl_boy' : '\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc66' ,
'family_man_woman_girl_girl' : '\ud83d\udc68‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc67' ,
'family_woman_boy' : '\ud83d\udc69‍\ud83d\udc66' ,
'family_woman_boy_boy' : '\ud83d\udc69‍\ud83d\udc66‍\ud83d\udc66' ,
'family_woman_girl' : '\ud83d\udc69‍\ud83d\udc67' ,
'family_woman_girl_boy' : '\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc66' ,
'family_woman_girl_girl' : '\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc67' ,
'family_woman_woman_boy' : '\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc66' ,
'family_woman_woman_boy_boy' : '\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc66‍\ud83d\udc66' ,
'family_woman_woman_girl' : '\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc67' ,
'family_woman_woman_girl_boy' : '\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc66' ,
'family_woman_woman_girl_girl' : '\ud83d\udc69‍\ud83d\udc69‍\ud83d\udc67‍\ud83d\udc67' ,
'fast_forward' : '\u23e9' ,
'fax' : '\ud83d\udce0' ,
'fearful' : '\ud83d\ude28' ,
'feet' : '\ud83d\udc3e' ,
'female_detective' : '\ud83d\udd75\ufe0f‍\u2640\ufe0f' ,
'ferris_wheel' : '\ud83c\udfa1' ,
'ferry' : '\u26f4' ,
'field_hockey' : '\ud83c\udfd1' ,
'file_cabinet' : '\ud83d\uddc4' ,
'file_folder' : '\ud83d\udcc1' ,
'film_projector' : '\ud83d\udcfd' ,
'film_strip' : '\ud83c\udf9e' ,
'fire' : '\ud83d\udd25' ,
'fire_engine' : '\ud83d\ude92' ,
'fireworks' : '\ud83c\udf86' ,
'first_quarter_moon' : '\ud83c\udf13' ,
'first_quarter_moon_with_face' : '\ud83c\udf1b' ,
'fish' : '\ud83d\udc1f' ,
'fish_cake' : '\ud83c\udf65' ,
'fishing_pole_and_fish' : '\ud83c\udfa3' ,
'fist_raised' : '\u270a' ,
'fist_left' : '\ud83e\udd1b' ,
'fist_right' : '\ud83e\udd1c' ,
'flags' : '\ud83c\udf8f' ,
'flashlight' : '\ud83d\udd26' ,
'fleur_de_lis' : '\u269c\ufe0f' ,
'flight_arrival' : '\ud83d\udeec' ,
'flight_departure' : '\ud83d\udeeb' ,
'floppy_disk' : '\ud83d\udcbe' ,
'flower_playing_cards' : '\ud83c\udfb4' ,
'flushed' : '\ud83d\ude33' ,
'fog' : '\ud83c\udf2b' ,
'foggy' : '\ud83c\udf01' ,
'football' : '\ud83c\udfc8' ,
'footprints' : '\ud83d\udc63' ,
'fork_and_knife' : '\ud83c\udf74' ,
'fountain' : '\u26f2\ufe0f' ,
'fountain_pen' : '\ud83d\udd8b' ,
'four_leaf_clover' : '\ud83c\udf40' ,
'fox_face' : '\ud83e\udd8a' ,
'framed_picture' : '\ud83d\uddbc' ,
'free' : '\ud83c\udd93' ,
'fried_egg' : '\ud83c\udf73' ,
'fried_shrimp' : '\ud83c\udf64' ,
'fries' : '\ud83c\udf5f' ,
'frog' : '\ud83d\udc38' ,
'frowning' : '\ud83d\ude26' ,
'frowning_face' : '\u2639\ufe0f' ,
'frowning_man' : '\ud83d\ude4d‍\u2642\ufe0f' ,
'frowning_woman' : '\ud83d\ude4d' ,
'middle_finger' : '\ud83d\udd95' ,
'fuelpump' : '\u26fd\ufe0f' ,
'full_moon' : '\ud83c\udf15' ,
'full_moon_with_face' : '\ud83c\udf1d' ,
'funeral_urn' : '\u26b1\ufe0f' ,
'game_die' : '\ud83c\udfb2' ,
'gear' : '\u2699\ufe0f' ,
'gem' : '\ud83d\udc8e' ,
'gemini' : '\u264a\ufe0f' ,
'ghost' : '\ud83d\udc7b' ,
'gift' : '\ud83c\udf81' ,
'gift_heart' : '\ud83d\udc9d' ,
'girl' : '\ud83d\udc67' ,
'globe_with_meridians' : '\ud83c\udf10' ,
'goal_net' : '\ud83e\udd45' ,
'goat' : '\ud83d\udc10' ,
'golf' : '\u26f3\ufe0f' ,
'golfing_man' : '\ud83c\udfcc\ufe0f' ,
'golfing_woman' : '\ud83c\udfcc\ufe0f‍\u2640\ufe0f' ,
'gorilla' : '\ud83e\udd8d' ,
'grapes' : '\ud83c\udf47' ,
'green_apple' : '\ud83c\udf4f' ,
'green_book' : '\ud83d\udcd7' ,
'green_heart' : '\ud83d\udc9a' ,
'green_salad' : '\ud83e\udd57' ,
'grey_exclamation' : '\u2755' ,
'grey_question' : '\u2754' ,
'grimacing' : '\ud83d\ude2c' ,
'grin' : '\ud83d\ude01' ,
'grinning' : '\ud83d\ude00' ,
'guardsman' : '\ud83d\udc82' ,
'guardswoman' : '\ud83d\udc82‍\u2640\ufe0f' ,
'guitar' : '\ud83c\udfb8' ,
'gun' : '\ud83d\udd2b' ,
'haircut_woman' : '\ud83d\udc87' ,
'haircut_man' : '\ud83d\udc87‍\u2642\ufe0f' ,
'hamburger' : '\ud83c\udf54' ,
'hammer' : '\ud83d\udd28' ,
'hammer_and_pick' : '\u2692' ,
'hammer_and_wrench' : '\ud83d\udee0' ,
'hamster' : '\ud83d\udc39' ,
'hand' : '\u270b' ,
'handbag' : '\ud83d\udc5c' ,
'handshake' : '\ud83e\udd1d' ,
'hankey' : '\ud83d\udca9' ,
'hatched_chick' : '\ud83d\udc25' ,
'hatching_chick' : '\ud83d\udc23' ,
'headphones' : '\ud83c\udfa7' ,
'hear_no_evil' : '\ud83d\ude49' ,
'heart' : '\u2764\ufe0f' ,
'heart_decoration' : '\ud83d\udc9f' ,
'heart_eyes' : '\ud83d\ude0d' ,
'heart_eyes_cat' : '\ud83d\ude3b' ,
'heartbeat' : '\ud83d\udc93' ,
'heartpulse' : '\ud83d\udc97' ,
'hearts' : '\u2665\ufe0f' ,
'heavy_check_mark' : '\u2714\ufe0f' ,
'heavy_division_sign' : '\u2797' ,
'heavy_dollar_sign' : '\ud83d\udcb2' ,
'heavy_heart_exclamation' : '\u2763\ufe0f' ,
'heavy_minus_sign' : '\u2796' ,
'heavy_multiplication_x' : '\u2716\ufe0f' ,
'heavy_plus_sign' : '\u2795' ,
'helicopter' : '\ud83d\ude81' ,
'herb' : '\ud83c\udf3f' ,
'hibiscus' : '\ud83c\udf3a' ,
'high_brightness' : '\ud83d\udd06' ,
'high_heel' : '\ud83d\udc60' ,
'hocho' : '\ud83d\udd2a' ,
'hole' : '\ud83d\udd73' ,
'honey_pot' : '\ud83c\udf6f' ,
'horse' : '\ud83d\udc34' ,
'horse_racing' : '\ud83c\udfc7' ,
'hospital' : '\ud83c\udfe5' ,
'hot_pepper' : '\ud83c\udf36' ,
'hotdog' : '\ud83c\udf2d' ,
'hotel' : '\ud83c\udfe8' ,
'hotsprings' : '\u2668\ufe0f' ,
'hourglass' : '\u231b\ufe0f' ,
'hourglass_flowing_sand' : '\u23f3' ,
'house' : '\ud83c\udfe0' ,
'house_with_garden' : '\ud83c\udfe1' ,
'houses' : '\ud83c\udfd8' ,
'hugs' : '\ud83e\udd17' ,
'hushed' : '\ud83d\ude2f' ,
'ice_cream' : '\ud83c\udf68' ,
'ice_hockey' : '\ud83c\udfd2' ,
'ice_skate' : '\u26f8' ,
'icecream' : '\ud83c\udf66' ,
'id' : '\ud83c\udd94' ,
'ideograph_advantage' : '\ud83c\ude50' ,
'imp' : '\ud83d\udc7f' ,
'inbox_tray' : '\ud83d\udce5' ,
'incoming_envelope' : '\ud83d\udce8' ,
'tipping_hand_woman' : '\ud83d\udc81' ,
'information_source' : '\u2139\ufe0f' ,
'innocent' : '\ud83d\ude07' ,
'interrobang' : '\u2049\ufe0f' ,
'iphone' : '\ud83d\udcf1' ,
'izakaya_lantern' : '\ud83c\udfee' ,
'jack_o_lantern' : '\ud83c\udf83' ,
'japan' : '\ud83d\uddfe' ,
'japanese_castle' : '\ud83c\udfef' ,
'japanese_goblin' : '\ud83d\udc7a' ,
'japanese_ogre' : '\ud83d\udc79' ,
'jeans' : '\ud83d\udc56' ,
'joy' : '\ud83d\ude02' ,
'joy_cat' : '\ud83d\ude39' ,
'joystick' : '\ud83d\udd79' ,
'kaaba' : '\ud83d\udd4b' ,
'key' : '\ud83d\udd11' ,
'keyboard' : '\u2328\ufe0f' ,
'keycap_ten' : '\ud83d\udd1f' ,
'kick_scooter' : '\ud83d\udef4' ,
'kimono' : '\ud83d\udc58' ,
'kiss' : '\ud83d\udc8b' ,
'kissing' : '\ud83d\ude17' ,
'kissing_cat' : '\ud83d\ude3d' ,
'kissing_closed_eyes' : '\ud83d\ude1a' ,
'kissing_heart' : '\ud83d\ude18' ,
'kissing_smiling_eyes' : '\ud83d\ude19' ,
'kiwi_fruit' : '\ud83e\udd5d' ,
'koala' : '\ud83d\udc28' ,
'koko' : '\ud83c\ude01' ,
'label' : '\ud83c\udff7' ,
'large_blue_circle' : '\ud83d\udd35' ,
'large_blue_diamond' : '\ud83d\udd37' ,
'large_orange_diamond' : '\ud83d\udd36' ,
'last_quarter_moon' : '\ud83c\udf17' ,
'last_quarter_moon_with_face' : '\ud83c\udf1c' ,
'latin_cross' : '\u271d\ufe0f' ,
'laughing' : '\ud83d\ude06' ,
'leaves' : '\ud83c\udf43' ,
'ledger' : '\ud83d\udcd2' ,
'left_luggage' : '\ud83d\udec5' ,
'left_right_arrow' : '\u2194\ufe0f' ,
'leftwards_arrow_with_hook' : '\u21a9\ufe0f' ,
'lemon' : '\ud83c\udf4b' ,
'leo' : '\u264c\ufe0f' ,
'leopard' : '\ud83d\udc06' ,
'level_slider' : '\ud83c\udf9a' ,
'libra' : '\u264e\ufe0f' ,
'light_rail' : '\ud83d\ude88' ,
'link' : '\ud83d\udd17' ,
'lion' : '\ud83e\udd81' ,
'lips' : '\ud83d\udc44' ,
'lipstick' : '\ud83d\udc84' ,
'lizard' : '\ud83e\udd8e' ,
'lock' : '\ud83d\udd12' ,
'lock_with_ink_pen' : '\ud83d\udd0f' ,
'lollipop' : '\ud83c\udf6d' ,
'loop' : '\u27bf' ,
'loud_sound' : '\ud83d\udd0a' ,
'loudspeaker' : '\ud83d\udce2' ,
'love_hotel' : '\ud83c\udfe9' ,
'love_letter' : '\ud83d\udc8c' ,
'low_brightness' : '\ud83d\udd05' ,
'lying_face' : '\ud83e\udd25' ,
'm' : '\u24c2\ufe0f' ,
'mag' : '\ud83d\udd0d' ,
'mag_right' : '\ud83d\udd0e' ,
'mahjong' : '\ud83c\udc04\ufe0f' ,
'mailbox' : '\ud83d\udceb' ,
'mailbox_closed' : '\ud83d\udcea' ,
'mailbox_with_mail' : '\ud83d\udcec' ,
'mailbox_with_no_mail' : '\ud83d\udced' ,
'man' : '\ud83d\udc68' ,
'man_artist' : '\ud83d\udc68‍\ud83c\udfa8' ,
'man_astronaut' : '\ud83d\udc68‍\ud83d\ude80' ,
'man_cartwheeling' : '\ud83e\udd38‍\u2642\ufe0f' ,
'man_cook' : '\ud83d\udc68‍\ud83c\udf73' ,
'man_dancing' : '\ud83d\udd7a' ,
'man_facepalming' : '\ud83e\udd26‍\u2642\ufe0f' ,
'man_factory_worker' : '\ud83d\udc68‍\ud83c\udfed' ,
'man_farmer' : '\ud83d\udc68‍\ud83c\udf3e' ,
'man_firefighter' : '\ud83d\udc68‍\ud83d\ude92' ,
'man_health_worker' : '\ud83d\udc68‍\u2695\ufe0f' ,
'man_in_tuxedo' : '\ud83e\udd35' ,
'man_judge' : '\ud83d\udc68‍\u2696\ufe0f' ,
'man_juggling' : '\ud83e\udd39‍\u2642\ufe0f' ,
'man_mechanic' : '\ud83d\udc68‍\ud83d\udd27' ,
'man_office_worker' : '\ud83d\udc68‍\ud83d\udcbc' ,
'man_pilot' : '\ud83d\udc68‍\u2708\ufe0f' ,
'man_playing_handball' : '\ud83e\udd3e‍\u2642\ufe0f' ,
'man_playing_water_polo' : '\ud83e\udd3d‍\u2642\ufe0f' ,
'man_scientist' : '\ud83d\udc68‍\ud83d\udd2c' ,
'man_shrugging' : '\ud83e\udd37‍\u2642\ufe0f' ,
'man_singer' : '\ud83d\udc68‍\ud83c\udfa4' ,
'man_student' : '\ud83d\udc68‍\ud83c\udf93' ,
'man_teacher' : '\ud83d\udc68‍\ud83c\udfeb' ,
'man_technologist' : '\ud83d\udc68‍\ud83d\udcbb' ,
'man_with_gua_pi_mao' : '\ud83d\udc72' ,
'man_with_turban' : '\ud83d\udc73' ,
'tangerine' : '\ud83c\udf4a' ,
'mans_shoe' : '\ud83d\udc5e' ,
'mantelpiece_clock' : '\ud83d\udd70' ,
'maple_leaf' : '\ud83c\udf41' ,
'martial_arts_uniform' : '\ud83e\udd4b' ,
'mask' : '\ud83d\ude37' ,
'massage_woman' : '\ud83d\udc86' ,
'massage_man' : '\ud83d\udc86‍\u2642\ufe0f' ,
'meat_on_bone' : '\ud83c\udf56' ,
'medal_military' : '\ud83c\udf96' ,
'medal_sports' : '\ud83c\udfc5' ,
'mega' : '\ud83d\udce3' ,
'melon' : '\ud83c\udf48' ,
'memo' : '\ud83d\udcdd' ,
'men_wrestling' : '\ud83e\udd3c‍\u2642\ufe0f' ,
'menorah' : '\ud83d\udd4e' ,
'mens' : '\ud83d\udeb9' ,
'metal' : '\ud83e\udd18' ,
'metro' : '\ud83d\ude87' ,
'microphone' : '\ud83c\udfa4' ,
'microscope' : '\ud83d\udd2c' ,
'milk_glass' : '\ud83e\udd5b' ,
'milky_way' : '\ud83c\udf0c' ,
'minibus' : '\ud83d\ude90' ,
'minidisc' : '\ud83d\udcbd' ,
'mobile_phone_off' : '\ud83d\udcf4' ,
'money_mouth_face' : '\ud83e\udd11' ,
'money_with_wings' : '\ud83d\udcb8' ,
'moneybag' : '\ud83d\udcb0' ,
'monkey' : '\ud83d\udc12' ,
'monkey_face' : '\ud83d\udc35' ,
'monorail' : '\ud83d\ude9d' ,
'moon' : '\ud83c\udf14' ,
'mortar_board' : '\ud83c\udf93' ,
'mosque' : '\ud83d\udd4c' ,
'motor_boat' : '\ud83d\udee5' ,
'motor_scooter' : '\ud83d\udef5' ,
'motorcycle' : '\ud83c\udfcd' ,
'motorway' : '\ud83d\udee3' ,
'mount_fuji' : '\ud83d\uddfb' ,
'mountain' : '\u26f0' ,
'mountain_biking_man' : '\ud83d\udeb5' ,
'mountain_biking_woman' : '\ud83d\udeb5‍\u2640\ufe0f' ,
'mountain_cableway' : '\ud83d\udea0' ,
'mountain_railway' : '\ud83d\ude9e' ,
'mountain_snow' : '\ud83c\udfd4' ,
'mouse' : '\ud83d\udc2d' ,
'mouse2' : '\ud83d\udc01' ,
'movie_camera' : '\ud83c\udfa5' ,
'moyai' : '\ud83d\uddff' ,
'mrs_claus' : '\ud83e\udd36' ,
'muscle' : '\ud83d\udcaa' ,
'mushroom' : '\ud83c\udf44' ,
'musical_keyboard' : '\ud83c\udfb9' ,
'musical_note' : '\ud83c\udfb5' ,
'musical_score' : '\ud83c\udfbc' ,
'mute' : '\ud83d\udd07' ,
'nail_care' : '\ud83d\udc85' ,
'name_badge' : '\ud83d\udcdb' ,
'national_park' : '\ud83c\udfde' ,
'nauseated_face' : '\ud83e\udd22' ,
'necktie' : '\ud83d\udc54' ,
'negative_squared_cross_mark' : '\u274e' ,
'nerd_face' : '\ud83e\udd13' ,
'neutral_face' : '\ud83d\ude10' ,
'new' : '\ud83c\udd95' ,
'new_moon' : '\ud83c\udf11' ,
'new_moon_with_face' : '\ud83c\udf1a' ,
'newspaper' : '\ud83d\udcf0' ,
'newspaper_roll' : '\ud83d\uddde' ,
'next_track_button' : '\u23ed' ,
'ng' : '\ud83c\udd96' ,
'no_good_man' : '\ud83d\ude45‍\u2642\ufe0f' ,
'no_good_woman' : '\ud83d\ude45' ,
'night_with_stars' : '\ud83c\udf03' ,
'no_bell' : '\ud83d\udd15' ,
'no_bicycles' : '\ud83d\udeb3' ,
'no_entry' : '\u26d4\ufe0f' ,
'no_entry_sign' : '\ud83d\udeab' ,
'no_mobile_phones' : '\ud83d\udcf5' ,
'no_mouth' : '\ud83d\ude36' ,
'no_pedestrians' : '\ud83d\udeb7' ,
'no_smoking' : '\ud83d\udead' ,
'non-potable_water' : '\ud83d\udeb1' ,
'nose' : '\ud83d\udc43' ,
'notebook' : '\ud83d\udcd3' ,
'notebook_with_decorative_cover' : '\ud83d\udcd4' ,
'notes' : '\ud83c\udfb6' ,
'nut_and_bolt' : '\ud83d\udd29' ,
'o' : '\u2b55\ufe0f' ,
'o2' : '\ud83c\udd7e\ufe0f' ,
'ocean' : '\ud83c\udf0a' ,
'octopus' : '\ud83d\udc19' ,
'oden' : '\ud83c\udf62' ,
'office' : '\ud83c\udfe2' ,
'oil_drum' : '\ud83d\udee2' ,
'ok' : '\ud83c\udd97' ,
'ok_hand' : '\ud83d\udc4c' ,
'ok_man' : '\ud83d\ude46‍\u2642\ufe0f' ,
'ok_woman' : '\ud83d\ude46' ,
'old_key' : '\ud83d\udddd' ,
'older_man' : '\ud83d\udc74' ,
'older_woman' : '\ud83d\udc75' ,
'om' : '\ud83d\udd49' ,
'on' : '\ud83d\udd1b' ,
'oncoming_automobile' : '\ud83d\ude98' ,
'oncoming_bus' : '\ud83d\ude8d' ,
'oncoming_police_car' : '\ud83d\ude94' ,
'oncoming_taxi' : '\ud83d\ude96' ,
'open_file_folder' : '\ud83d\udcc2' ,
'open_hands' : '\ud83d\udc50' ,
'open_mouth' : '\ud83d\ude2e' ,
'open_umbrella' : '\u2602\ufe0f' ,
'ophiuchus' : '\u26ce' ,
'orange_book' : '\ud83d\udcd9' ,
'orthodox_cross' : '\u2626\ufe0f' ,
'outbox_tray' : '\ud83d\udce4' ,
'owl' : '\ud83e\udd89' ,
'ox' : '\ud83d\udc02' ,
'package' : '\ud83d\udce6' ,
'page_facing_up' : '\ud83d\udcc4' ,
'page_with_curl' : '\ud83d\udcc3' ,
'pager' : '\ud83d\udcdf' ,
'paintbrush' : '\ud83d\udd8c' ,
'palm_tree' : '\ud83c\udf34' ,
'pancakes' : '\ud83e\udd5e' ,
'panda_face' : '\ud83d\udc3c' ,
'paperclip' : '\ud83d\udcce' ,
'paperclips' : '\ud83d\udd87' ,
'parasol_on_ground' : '\u26f1' ,
'parking' : '\ud83c\udd7f\ufe0f' ,
'part_alternation_mark' : '\u303d\ufe0f' ,
'partly_sunny' : '\u26c5\ufe0f' ,
'passenger_ship' : '\ud83d\udef3' ,
'passport_control' : '\ud83d\udec2' ,
'pause_button' : '\u23f8' ,
'peace_symbol' : '\u262e\ufe0f' ,
'peach' : '\ud83c\udf51' ,
'peanuts' : '\ud83e\udd5c' ,
'pear' : '\ud83c\udf50' ,
'pen' : '\ud83d\udd8a' ,
'pencil2' : '\u270f\ufe0f' ,
'penguin' : '\ud83d\udc27' ,
'pensive' : '\ud83d\ude14' ,
'performing_arts' : '\ud83c\udfad' ,
'persevere' : '\ud83d\ude23' ,
'person_fencing' : '\ud83e\udd3a' ,
'pouting_woman' : '\ud83d\ude4e' ,
'phone' : '\u260e\ufe0f' ,
'pick' : '\u26cf' ,
'pig' : '\ud83d\udc37' ,
'pig2' : '\ud83d\udc16' ,
'pig_nose' : '\ud83d\udc3d' ,
'pill' : '\ud83d\udc8a' ,
'pineapple' : '\ud83c\udf4d' ,
'ping_pong' : '\ud83c\udfd3' ,
'pisces' : '\u2653\ufe0f' ,
'pizza' : '\ud83c\udf55' ,
'place_of_worship' : '\ud83d\uded0' ,
'plate_with_cutlery' : '\ud83c\udf7d' ,
'play_or_pause_button' : '\u23ef' ,
'point_down' : '\ud83d\udc47' ,
'point_left' : '\ud83d\udc48' ,
'point_right' : '\ud83d\udc49' ,
'point_up' : '\u261d\ufe0f' ,
'point_up_2' : '\ud83d\udc46' ,
'police_car' : '\ud83d\ude93' ,
'policewoman' : '\ud83d\udc6e‍\u2640\ufe0f' ,
'poodle' : '\ud83d\udc29' ,
'popcorn' : '\ud83c\udf7f' ,
'post_office' : '\ud83c\udfe3' ,
'postal_horn' : '\ud83d\udcef' ,
'postbox' : '\ud83d\udcee' ,
'potable_water' : '\ud83d\udeb0' ,
'potato' : '\ud83e\udd54' ,
'pouch' : '\ud83d\udc5d' ,
'poultry_leg' : '\ud83c\udf57' ,
'pound' : '\ud83d\udcb7' ,
'rage' : '\ud83d\ude21' ,
'pouting_cat' : '\ud83d\ude3e' ,
'pouting_man' : '\ud83d\ude4e‍\u2642\ufe0f' ,
'pray' : '\ud83d\ude4f' ,
'prayer_beads' : '\ud83d\udcff' ,
'pregnant_woman' : '\ud83e\udd30' ,
'previous_track_button' : '\u23ee' ,
'prince' : '\ud83e\udd34' ,
'princess' : '\ud83d\udc78' ,
'printer' : '\ud83d\udda8' ,
'purple_heart' : '\ud83d\udc9c' ,
'purse' : '\ud83d\udc5b' ,
'pushpin' : '\ud83d\udccc' ,
'put_litter_in_its_place' : '\ud83d\udeae' ,
'question' : '\u2753' ,
'rabbit' : '\ud83d\udc30' ,
'rabbit2' : '\ud83d\udc07' ,
'racehorse' : '\ud83d\udc0e' ,
'racing_car' : '\ud83c\udfce' ,
'radio' : '\ud83d\udcfb' ,
'radio_button' : '\ud83d\udd18' ,
'radioactive' : '\u2622\ufe0f' ,
'railway_car' : '\ud83d\ude83' ,
'railway_track' : '\ud83d\udee4' ,
'rainbow' : '\ud83c\udf08' ,
'rainbow_flag' : '\ud83c\udff3\ufe0f‍\ud83c\udf08' ,
'raised_back_of_hand' : '\ud83e\udd1a' ,
'raised_hand_with_fingers_splayed' : '\ud83d\udd90' ,
'raised_hands' : '\ud83d\ude4c' ,
'raising_hand_woman' : '\ud83d\ude4b' ,
'raising_hand_man' : '\ud83d\ude4b‍\u2642\ufe0f' ,
'ram' : '\ud83d\udc0f' ,
'ramen' : '\ud83c\udf5c' ,
'rat' : '\ud83d\udc00' ,
'record_button' : '\u23fa' ,
'recycle' : '\u267b\ufe0f' ,
'red_circle' : '\ud83d\udd34' ,
'registered' : '\u00ae\ufe0f' ,
'relaxed' : '\u263a\ufe0f' ,
'relieved' : '\ud83d\ude0c' ,
'reminder_ribbon' : '\ud83c\udf97' ,
'repeat' : '\ud83d\udd01' ,
'repeat_one' : '\ud83d\udd02' ,
'rescue_worker_helmet' : '\u26d1' ,
'restroom' : '\ud83d\udebb' ,
'revolving_hearts' : '\ud83d\udc9e' ,
'rewind' : '\u23ea' ,
'rhinoceros' : '\ud83e\udd8f' ,
'ribbon' : '\ud83c\udf80' ,
'rice' : '\ud83c\udf5a' ,
'rice_ball' : '\ud83c\udf59' ,
'rice_cracker' : '\ud83c\udf58' ,
'rice_scene' : '\ud83c\udf91' ,
'right_anger_bubble' : '\ud83d\uddef' ,
'ring' : '\ud83d\udc8d' ,
'robot' : '\ud83e\udd16' ,
'rocket' : '\ud83d\ude80' ,
'rofl' : '\ud83e\udd23' ,
'roll_eyes' : '\ud83d\ude44' ,
'roller_coaster' : '\ud83c\udfa2' ,
'rooster' : '\ud83d\udc13' ,
'rose' : '\ud83c\udf39' ,
'rosette' : '\ud83c\udff5' ,
'rotating_light' : '\ud83d\udea8' ,
'round_pushpin' : '\ud83d\udccd' ,
'rowing_man' : '\ud83d\udea3' ,
'rowing_woman' : '\ud83d\udea3‍\u2640\ufe0f' ,
'rugby_football' : '\ud83c\udfc9' ,
'running_man' : '\ud83c\udfc3' ,
'running_shirt_with_sash' : '\ud83c\udfbd' ,
'running_woman' : '\ud83c\udfc3‍\u2640\ufe0f' ,
'sa' : '\ud83c\ude02\ufe0f' ,
'sagittarius' : '\u2650\ufe0f' ,
'sake' : '\ud83c\udf76' ,
'sandal' : '\ud83d\udc61' ,
'santa' : '\ud83c\udf85' ,
'satellite' : '\ud83d\udce1' ,
'saxophone' : '\ud83c\udfb7' ,
'school' : '\ud83c\udfeb' ,
'school_satchel' : '\ud83c\udf92' ,
'scissors' : '\u2702\ufe0f' ,
'scorpion' : '\ud83e\udd82' ,
'scorpius' : '\u264f\ufe0f' ,
'scream' : '\ud83d\ude31' ,
'scream_cat' : '\ud83d\ude40' ,
'scroll' : '\ud83d\udcdc' ,
'seat' : '\ud83d\udcba' ,
'secret' : '\u3299\ufe0f' ,
'see_no_evil' : '\ud83d\ude48' ,
'seedling' : '\ud83c\udf31' ,
'selfie' : '\ud83e\udd33' ,
'shallow_pan_of_food' : '\ud83e\udd58' ,
'shamrock' : '\u2618\ufe0f' ,
'shark' : '\ud83e\udd88' ,
'shaved_ice' : '\ud83c\udf67' ,
'sheep' : '\ud83d\udc11' ,
'shell' : '\ud83d\udc1a' ,
'shield' : '\ud83d\udee1' ,
'shinto_shrine' : '\u26e9' ,
'ship' : '\ud83d\udea2' ,
'shirt' : '\ud83d\udc55' ,
'shopping' : '\ud83d\udecd' ,
'shopping_cart' : '\ud83d\uded2' ,
'shower' : '\ud83d\udebf' ,
'shrimp' : '\ud83e\udd90' ,
'signal_strength' : '\ud83d\udcf6' ,
'six_pointed_star' : '\ud83d\udd2f' ,
'ski' : '\ud83c\udfbf' ,
'skier' : '\u26f7' ,
'skull' : '\ud83d\udc80' ,
'skull_and_crossbones' : '\u2620\ufe0f' ,
'sleeping' : '\ud83d\ude34' ,
'sleeping_bed' : '\ud83d\udecc' ,
'sleepy' : '\ud83d\ude2a' ,
'slightly_frowning_face' : '\ud83d\ude41' ,
'slightly_smiling_face' : '\ud83d\ude42' ,
'slot_machine' : '\ud83c\udfb0' ,
'small_airplane' : '\ud83d\udee9' ,
'small_blue_diamond' : '\ud83d\udd39' ,
'small_orange_diamond' : '\ud83d\udd38' ,
'small_red_triangle' : '\ud83d\udd3a' ,
'small_red_triangle_down' : '\ud83d\udd3b' ,
'smile' : '\ud83d\ude04' ,
'smile_cat' : '\ud83d\ude38' ,
'smiley' : '\ud83d\ude03' ,
'smiley_cat' : '\ud83d\ude3a' ,
'smiling_imp' : '\ud83d\ude08' ,
'smirk' : '\ud83d\ude0f' ,
'smirk_cat' : '\ud83d\ude3c' ,
'smoking' : '\ud83d\udeac' ,
'snail' : '\ud83d\udc0c' ,
'snake' : '\ud83d\udc0d' ,
'sneezing_face' : '\ud83e\udd27' ,
'snowboarder' : '\ud83c\udfc2' ,
'snowflake' : '\u2744\ufe0f' ,
'snowman' : '\u26c4\ufe0f' ,
'snowman_with_snow' : '\u2603\ufe0f' ,
'sob' : '\ud83d\ude2d' ,
'soccer' : '\u26bd\ufe0f' ,
'soon' : '\ud83d\udd1c' ,
'sos' : '\ud83c\udd98' ,
'sound' : '\ud83d\udd09' ,
'space_invader' : '\ud83d\udc7e' ,
'spades' : '\u2660\ufe0f' ,
'spaghetti' : '\ud83c\udf5d' ,
'sparkle' : '\u2747\ufe0f' ,
'sparkler' : '\ud83c\udf87' ,
'sparkles' : '\u2728' ,
'sparkling_heart' : '\ud83d\udc96' ,
'speak_no_evil' : '\ud83d\ude4a' ,
'speaker' : '\ud83d\udd08' ,
'speaking_head' : '\ud83d\udde3' ,
'speech_balloon' : '\ud83d\udcac' ,
'speedboat' : '\ud83d\udea4' ,
'spider' : '\ud83d\udd77' ,
'spider_web' : '\ud83d\udd78' ,
'spiral_calendar' : '\ud83d\uddd3' ,
'spiral_notepad' : '\ud83d\uddd2' ,
'spoon' : '\ud83e\udd44' ,
'squid' : '\ud83e\udd91' ,
'stadium' : '\ud83c\udfdf' ,
'star' : '\u2b50\ufe0f' ,
'star2' : '\ud83c\udf1f' ,
'star_and_crescent' : '\u262a\ufe0f' ,
'star_of_david' : '\u2721\ufe0f' ,
'stars' : '\ud83c\udf20' ,
'station' : '\ud83d\ude89' ,
'statue_of_liberty' : '\ud83d\uddfd' ,
'steam_locomotive' : '\ud83d\ude82' ,
'stew' : '\ud83c\udf72' ,
'stop_button' : '\u23f9' ,
'stop_sign' : '\ud83d\uded1' ,
'stopwatch' : '\u23f1' ,
'straight_ruler' : '\ud83d\udccf' ,
'strawberry' : '\ud83c\udf53' ,
'stuck_out_tongue' : '\ud83d\ude1b' ,
'stuck_out_tongue_closed_eyes' : '\ud83d\ude1d' ,
'stuck_out_tongue_winking_eye' : '\ud83d\ude1c' ,
'studio_microphone' : '\ud83c\udf99' ,
'stuffed_flatbread' : '\ud83e\udd59' ,
'sun_behind_large_cloud' : '\ud83c\udf25' ,
'sun_behind_rain_cloud' : '\ud83c\udf26' ,
'sun_behind_small_cloud' : '\ud83c\udf24' ,
'sun_with_face' : '\ud83c\udf1e' ,
'sunflower' : '\ud83c\udf3b' ,
'sunglasses' : '\ud83d\ude0e' ,
'sunny' : '\u2600\ufe0f' ,
'sunrise' : '\ud83c\udf05' ,
'sunrise_over_mountains' : '\ud83c\udf04' ,
'surfing_man' : '\ud83c\udfc4' ,
'surfing_woman' : '\ud83c\udfc4‍\u2640\ufe0f' ,
'sushi' : '\ud83c\udf63' ,
'suspension_railway' : '\ud83d\ude9f' ,
'sweat' : '\ud83d\ude13' ,
'sweat_drops' : '\ud83d\udca6' ,
'sweat_smile' : '\ud83d\ude05' ,
'sweet_potato' : '\ud83c\udf60' ,
'swimming_man' : '\ud83c\udfca' ,
'swimming_woman' : '\ud83c\udfca‍\u2640\ufe0f' ,
'symbols' : '\ud83d\udd23' ,
'synagogue' : '\ud83d\udd4d' ,
'syringe' : '\ud83d\udc89' ,
'taco' : '\ud83c\udf2e' ,
'tada' : '\ud83c\udf89' ,
'tanabata_tree' : '\ud83c\udf8b' ,
'taurus' : '\u2649\ufe0f' ,
'taxi' : '\ud83d\ude95' ,
'tea' : '\ud83c\udf75' ,
'telephone_receiver' : '\ud83d\udcde' ,
'telescope' : '\ud83d\udd2d' ,
'tennis' : '\ud83c\udfbe' ,
'tent' : '\u26fa\ufe0f' ,
'thermometer' : '\ud83c\udf21' ,
'thinking' : '\ud83e\udd14' ,
'thought_balloon' : '\ud83d\udcad' ,
'ticket' : '\ud83c\udfab' ,
'tickets' : '\ud83c\udf9f' ,
'tiger' : '\ud83d\udc2f' ,
'tiger2' : '\ud83d\udc05' ,
'timer_clock' : '\u23f2' ,
'tipping_hand_man' : '\ud83d\udc81‍\u2642\ufe0f' ,
'tired_face' : '\ud83d\ude2b' ,
'tm' : '\u2122\ufe0f' ,
'toilet' : '\ud83d\udebd' ,
'tokyo_tower' : '\ud83d\uddfc' ,
'tomato' : '\ud83c\udf45' ,
'tongue' : '\ud83d\udc45' ,
'top' : '\ud83d\udd1d' ,
'tophat' : '\ud83c\udfa9' ,
'tornado' : '\ud83c\udf2a' ,
'trackball' : '\ud83d\uddb2' ,
'tractor' : '\ud83d\ude9c' ,
'traffic_light' : '\ud83d\udea5' ,
'train' : '\ud83d\ude8b' ,
'train2' : '\ud83d\ude86' ,
'tram' : '\ud83d\ude8a' ,
'triangular_flag_on_post' : '\ud83d\udea9' ,
'triangular_ruler' : '\ud83d\udcd0' ,
'trident' : '\ud83d\udd31' ,
'triumph' : '\ud83d\ude24' ,
'trolleybus' : '\ud83d\ude8e' ,
'trophy' : '\ud83c\udfc6' ,
'tropical_drink' : '\ud83c\udf79' ,
'tropical_fish' : '\ud83d\udc20' ,
'truck' : '\ud83d\ude9a' ,
'trumpet' : '\ud83c\udfba' ,
'tulip' : '\ud83c\udf37' ,
'tumbler_glass' : '\ud83e\udd43' ,
'turkey' : '\ud83e\udd83' ,
'turtle' : '\ud83d\udc22' ,
'tv' : '\ud83d\udcfa' ,
'twisted_rightwards_arrows' : '\ud83d\udd00' ,
'two_hearts' : '\ud83d\udc95' ,
'two_men_holding_hands' : '\ud83d\udc6c' ,
'two_women_holding_hands' : '\ud83d\udc6d' ,
'u5272' : '\ud83c\ude39' ,
'u5408' : '\ud83c\ude34' ,
'u55b6' : '\ud83c\ude3a' ,
'u6307' : '\ud83c\ude2f\ufe0f' ,
'u6708' : '\ud83c\ude37\ufe0f' ,
'u6709' : '\ud83c\ude36' ,
'u6e80' : '\ud83c\ude35' ,
'u7121' : '\ud83c\ude1a\ufe0f' ,
'u7533' : '\ud83c\ude38' ,
'u7981' : '\ud83c\ude32' ,
'u7a7a' : '\ud83c\ude33' ,
'umbrella' : '\u2614\ufe0f' ,
'unamused' : '\ud83d\ude12' ,
'underage' : '\ud83d\udd1e' ,
'unicorn' : '\ud83e\udd84' ,
'unlock' : '\ud83d\udd13' ,
'up' : '\ud83c\udd99' ,
'upside_down_face' : '\ud83d\ude43' ,
'v' : '\u270c\ufe0f' ,
'vertical_traffic_light' : '\ud83d\udea6' ,
'vhs' : '\ud83d\udcfc' ,
'vibration_mode' : '\ud83d\udcf3' ,
'video_camera' : '\ud83d\udcf9' ,
'video_game' : '\ud83c\udfae' ,
'violin' : '\ud83c\udfbb' ,
'virgo' : '\u264d\ufe0f' ,
'volcano' : '\ud83c\udf0b' ,
'volleyball' : '\ud83c\udfd0' ,
'vs' : '\ud83c\udd9a' ,
'vulcan_salute' : '\ud83d\udd96' ,
'walking_man' : '\ud83d\udeb6' ,
'walking_woman' : '\ud83d\udeb6‍\u2640\ufe0f' ,
'waning_crescent_moon' : '\ud83c\udf18' ,
'waning_gibbous_moon' : '\ud83c\udf16' ,
'warning' : '\u26a0\ufe0f' ,
'wastebasket' : '\ud83d\uddd1' ,
'watch' : '\u231a\ufe0f' ,
'water_buffalo' : '\ud83d\udc03' ,
'watermelon' : '\ud83c\udf49' ,
'wave' : '\ud83d\udc4b' ,
'wavy_dash' : '\u3030\ufe0f' ,
'waxing_crescent_moon' : '\ud83c\udf12' ,
'wc' : '\ud83d\udebe' ,
'weary' : '\ud83d\ude29' ,
'wedding' : '\ud83d\udc92' ,
'weight_lifting_man' : '\ud83c\udfcb\ufe0f' ,
'weight_lifting_woman' : '\ud83c\udfcb\ufe0f‍\u2640\ufe0f' ,
'whale' : '\ud83d\udc33' ,
'whale2' : '\ud83d\udc0b' ,
'wheel_of_dharma' : '\u2638\ufe0f' ,
'wheelchair' : '\u267f\ufe0f' ,
'white_check_mark' : '\u2705' ,
'white_circle' : '\u26aa\ufe0f' ,
'white_flag' : '\ud83c\udff3\ufe0f' ,
'white_flower' : '\ud83d\udcae' ,
'white_large_square' : '\u2b1c\ufe0f' ,
'white_medium_small_square' : '\u25fd\ufe0f' ,
'white_medium_square' : '\u25fb\ufe0f' ,
'white_small_square' : '\u25ab\ufe0f' ,
'white_square_button' : '\ud83d\udd33' ,
'wilted_flower' : '\ud83e\udd40' ,
'wind_chime' : '\ud83c\udf90' ,
'wind_face' : '\ud83c\udf2c' ,
'wine_glass' : '\ud83c\udf77' ,
'wink' : '\ud83d\ude09' ,
'wolf' : '\ud83d\udc3a' ,
'woman' : '\ud83d\udc69' ,
'woman_artist' : '\ud83d\udc69‍\ud83c\udfa8' ,
'woman_astronaut' : '\ud83d\udc69‍\ud83d\ude80' ,
'woman_cartwheeling' : '\ud83e\udd38‍\u2640\ufe0f' ,
'woman_cook' : '\ud83d\udc69‍\ud83c\udf73' ,
'woman_facepalming' : '\ud83e\udd26‍\u2640\ufe0f' ,
'woman_factory_worker' : '\ud83d\udc69‍\ud83c\udfed' ,
'woman_farmer' : '\ud83d\udc69‍\ud83c\udf3e' ,
'woman_firefighter' : '\ud83d\udc69‍\ud83d\ude92' ,
'woman_health_worker' : '\ud83d\udc69‍\u2695\ufe0f' ,
'woman_judge' : '\ud83d\udc69‍\u2696\ufe0f' ,
'woman_juggling' : '\ud83e\udd39‍\u2640\ufe0f' ,
'woman_mechanic' : '\ud83d\udc69‍\ud83d\udd27' ,
'woman_office_worker' : '\ud83d\udc69‍\ud83d\udcbc' ,
'woman_pilot' : '\ud83d\udc69‍\u2708\ufe0f' ,
'woman_playing_handball' : '\ud83e\udd3e‍\u2640\ufe0f' ,
'woman_playing_water_polo' : '\ud83e\udd3d‍\u2640\ufe0f' ,
'woman_scientist' : '\ud83d\udc69‍\ud83d\udd2c' ,
'woman_shrugging' : '\ud83e\udd37‍\u2640\ufe0f' ,
'woman_singer' : '\ud83d\udc69‍\ud83c\udfa4' ,
'woman_student' : '\ud83d\udc69‍\ud83c\udf93' ,
'woman_teacher' : '\ud83d\udc69‍\ud83c\udfeb' ,
'woman_technologist' : '\ud83d\udc69‍\ud83d\udcbb' ,
'woman_with_turban' : '\ud83d\udc73‍\u2640\ufe0f' ,
'womans_clothes' : '\ud83d\udc5a' ,
'womans_hat' : '\ud83d\udc52' ,
'women_wrestling' : '\ud83e\udd3c‍\u2640\ufe0f' ,
'womens' : '\ud83d\udeba' ,
'world_map' : '\ud83d\uddfa' ,
'worried' : '\ud83d\ude1f' ,
'wrench' : '\ud83d\udd27' ,
'writing_hand' : '\u270d\ufe0f' ,
'x' : '\u274c' ,
'yellow_heart' : '\ud83d\udc9b' ,
'yen' : '\ud83d\udcb4' ,
'yin_yang' : '\u262f\ufe0f' ,
'yum' : '\ud83d\ude0b' ,
'zap' : '\u26a1\ufe0f' ,
'zipper_mouth_face' : '\ud83e\udd10' ,
'zzz' : '\ud83d\udca4' ,
2018-12-18 04:14:52 +01:00
/* special emojis :P */
'octocat' : '<img alt=":octocat:" height="20" width="20" align="absmiddle" src="https://assets-cdn.github.com/images/icons/emoji/octocat.png">' ,
'showdown' : '<span style="font-family: \'Anonymous Pro\', monospace; text-decoration: underline; text-decoration-style: dashed; text-decoration-color: #3e8b8a;text-underline-position: under;">S</span>'
} ;
/ * *
* Created by Estevao on 31 - 05 - 2015.
* /
/ * *
* Showdown Converter class
* @ class
* @ param { object } [ converterOptions ]
* @ returns { Converter }
* /
showdown . Converter = function ( converterOptions ) {
'use strict' ;
var
/ * *
* Options used by this converter
* @ private
* @ type { { } }
* /
options = { } ,
/ * *
* Language extensions used by this converter
* @ private
* @ type { Array }
* /
langExtensions = [ ] ,
/ * *
* Output modifiers extensions used by this converter
* @ private
* @ type { Array }
* /
outputModifiers = [ ] ,
/ * *
* Event listeners
* @ private
* @ type { { } }
* /
listeners = { } ,
/ * *
* The flavor set in this converter
* /
setConvFlavor = setFlavor ,
/ * *
* Metadata of the document
* @ type { { parsed : { } , raw : string , format : string } }
* /
metadata = {
parsed : { } ,
raw : '' ,
format : ''
} ;
_constructor ( ) ;
/ * *
* Converter constructor
* @ private
* /
function _constructor ( ) {
converterOptions = converterOptions || { } ;
for ( var gOpt in globalOptions ) {
if ( globalOptions . hasOwnProperty ( gOpt ) ) {
options [ gOpt ] = globalOptions [ gOpt ] ;
}
}
// Merge options
if ( typeof converterOptions === 'object' ) {
for ( var opt in converterOptions ) {
if ( converterOptions . hasOwnProperty ( opt ) ) {
options [ opt ] = converterOptions [ opt ] ;
}
}
} else {
throw Error ( 'Converter expects the passed parameter to be an object, but ' + typeof converterOptions +
' was passed instead.' ) ;
}
if ( options . extensions ) {
showdown . helper . forEach ( options . extensions , _parseExtension ) ;
}
}
/ * *
* Parse extension
* @ param { * } ext
* @ param { string } [ name = '' ]
* @ private
* /
function _parseExtension ( ext , name ) {
name = name || null ;
// If it's a string, the extension was previously loaded
if ( showdown . helper . isString ( ext ) ) {
ext = showdown . helper . stdExtName ( ext ) ;
name = ext ;
// LEGACY_SUPPORT CODE
if ( showdown . extensions [ ext ] ) {
console . warn ( 'DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' +
'Please inform the developer that the extension should be updated!' ) ;
legacyExtensionLoading ( showdown . extensions [ ext ] , ext ) ;
return ;
// END LEGACY SUPPORT CODE
} else if ( ! showdown . helper . isUndefined ( extensions [ ext ] ) ) {
ext = extensions [ ext ] ;
} else {
throw Error ( 'Extension "' + ext + '" could not be loaded. It was either not found or is not a valid extension.' ) ;
}
}
if ( typeof ext === 'function' ) {
ext = ext ( ) ;
}
if ( ! showdown . helper . isArray ( ext ) ) {
ext = [ ext ] ;
}
var validExt = validate ( ext , name ) ;
if ( ! validExt . valid ) {
throw Error ( validExt . error ) ;
}
for ( var i = 0 ; i < ext . length ; ++ i ) {
switch ( ext [ i ] . type ) {
case 'lang' :
langExtensions . push ( ext [ i ] ) ;
break ;
case 'output' :
outputModifiers . push ( ext [ i ] ) ;
break ;
}
if ( ext [ i ] . hasOwnProperty ( 'listeners' ) ) {
for ( var ln in ext [ i ] . listeners ) {
if ( ext [ i ] . listeners . hasOwnProperty ( ln ) ) {
listen ( ln , ext [ i ] . listeners [ ln ] ) ;
}
}
}
}
}
/ * *
* LEGACY _SUPPORT
* @ param { * } ext
* @ param { string } name
* /
function legacyExtensionLoading ( ext , name ) {
if ( typeof ext === 'function' ) {
ext = ext ( new showdown . Converter ( ) ) ;
}
if ( ! showdown . helper . isArray ( ext ) ) {
ext = [ ext ] ;
}
var valid = validate ( ext , name ) ;
if ( ! valid . valid ) {
throw Error ( valid . error ) ;
}
for ( var i = 0 ; i < ext . length ; ++ i ) {
switch ( ext [ i ] . type ) {
case 'lang' :
langExtensions . push ( ext [ i ] ) ;
break ;
case 'output' :
outputModifiers . push ( ext [ i ] ) ;
break ;
default : // should never reach here
throw Error ( 'Extension loader error: Type unrecognized!!!' ) ;
}
}
}
/ * *
* Listen to an event
* @ param { string } name
* @ param { function } callback
* /
function listen ( name , callback ) {
if ( ! showdown . helper . isString ( name ) ) {
throw Error ( 'Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given' ) ;
}
if ( typeof callback !== 'function' ) {
throw Error ( 'Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given' ) ;
}
if ( ! listeners . hasOwnProperty ( name ) ) {
listeners [ name ] = [ ] ;
}
listeners [ name ] . push ( callback ) ;
}
function rTrimInputText ( text ) {
var rsp = text . match ( /^\s*/ ) [ 0 ] . length ,
rgx = new RegExp ( '^\\s{0,' + rsp + '}' , 'gm' ) ;
return text . replace ( rgx , '' ) ;
}
/ * *
* Dispatch an event
* @ private
* @ param { string } evtName Event name
* @ param { string } text Text
* @ param { { } } options Converter Options
* @ param { { } } globals
* @ returns { string }
* /
this . _dispatch = function dispatch ( evtName , text , options , globals ) {
if ( listeners . hasOwnProperty ( evtName ) ) {
for ( var ei = 0 ; ei < listeners [ evtName ] . length ; ++ ei ) {
var nText = listeners [ evtName ] [ ei ] ( evtName , text , this , options , globals ) ;
if ( nText && typeof nText !== 'undefined' ) {
text = nText ;
}
}
}
return text ;
} ;
/ * *
* Listen to an event
* @ param { string } name
* @ param { function } callback
* @ returns { showdown . Converter }
* /
this . listen = function ( name , callback ) {
listen ( name , callback ) ;
return this ;
} ;
/ * *
* Converts a markdown string into HTML
* @ param { string } text
* @ returns { * }
* /
this . makeHtml = function ( text ) {
//check if text is not falsy
if ( ! text ) {
return text ;
}
var globals = {
gHtmlBlocks : [ ] ,
gHtmlMdBlocks : [ ] ,
gHtmlSpans : [ ] ,
gUrls : { } ,
gTitles : { } ,
gDimensions : { } ,
gListLevel : 0 ,
hashLinkCounts : { } ,
langExtensions : langExtensions ,
outputModifiers : outputModifiers ,
converter : this ,
ghCodeBlocks : [ ] ,
metadata : {
parsed : { } ,
raw : '' ,
format : ''
}
} ;
// This lets us use ¨ trema as an escape char to avoid md5 hashes
// The choice of character is arbitrary; anything that isn't
// magic in Markdown will work.
text = text . replace ( /¨/g , '¨T' ) ;
// Replace $ with ¨D
// RegExp interprets $ as a special character
// when it's in a replacement string
text = text . replace ( /\$/g , '¨D' ) ;
// Standardize line endings
text = text . replace ( /\r\n/g , '\n' ) ; // DOS to Unix
text = text . replace ( /\r/g , '\n' ) ; // Mac to Unix
// Stardardize line spaces
text = text . replace ( /\u00A0/g , ' ' ) ;
if ( options . smartIndentationFix ) {
text = rTrimInputText ( text ) ;
}
// Make sure text begins and ends with a couple of newlines:
text = '\n\n' + text + '\n\n' ;
// detab
text = showdown . subParser ( 'detab' ) ( text , options , globals ) ;
/ * *
* Strip any lines consisting only of spaces and tabs .
* This makes subsequent regexs easier to write , because we can
* match consecutive blank lines with /\n+/ instead of something
* contorted like / [ \ t ] * \ n + /
* /
text = text . replace ( /^[ \t]+$/mg , '' ) ;
//run languageExtensions
showdown . helper . forEach ( langExtensions , function ( ext ) {
text = showdown . subParser ( 'runExtension' ) ( ext , text , options , globals ) ;
} ) ;
// run the sub parsers
text = showdown . subParser ( 'metadata' ) ( text , options , globals ) ;
text = showdown . subParser ( 'hashPreCodeTags' ) ( text , options , globals ) ;
text = showdown . subParser ( 'githubCodeBlocks' ) ( text , options , globals ) ;
text = showdown . subParser ( 'hashHTMLBlocks' ) ( text , options , globals ) ;
text = showdown . subParser ( 'hashCodeTags' ) ( text , options , globals ) ;
text = showdown . subParser ( 'stripLinkDefinitions' ) ( text , options , globals ) ;
text = showdown . subParser ( 'blockGamut' ) ( text , options , globals ) ;
text = showdown . subParser ( 'unhashHTMLSpans' ) ( text , options , globals ) ;
text = showdown . subParser ( 'unescapeSpecialChars' ) ( text , options , globals ) ;
// attacklab: Restore dollar signs
text = text . replace ( /¨D/g , '$$' ) ;
// attacklab: Restore tremas
text = text . replace ( /¨T/g , '¨' ) ;
// render a complete html document instead of a partial if the option is enabled
text = showdown . subParser ( 'completeHTMLDocument' ) ( text , options , globals ) ;
// Run output modifiers
showdown . helper . forEach ( outputModifiers , function ( ext ) {
text = showdown . subParser ( 'runExtension' ) ( ext , text , options , globals ) ;
} ) ;
// update metadata
metadata = globals . metadata ;
return text ;
} ;
/ * *
* Converts an HTML string into a markdown string
* @ param src
* @ param [ HTMLParser ] A WHATWG DOM and HTML parser , such as JSDOM . If none is supplied , window . document will be used .
* @ returns { string }
* /
this . makeMarkdown = this . makeMd = function ( src , HTMLParser ) {
// replace \r\n with \n
src = src . replace ( /\r\n/g , '\n' ) ;
src = src . replace ( /\r/g , '\n' ) ; // old macs
// due to an edge case, we need to find this: > <
// to prevent removing of non silent white spaces
// ex: <em>this is</em> <strong>sparta</strong>
src = src . replace ( />[ \t]+</ , '>¨NBSP;<' ) ;
if ( ! HTMLParser ) {
if ( window && window . document ) {
HTMLParser = window . document ;
} else {
throw new Error ( 'HTMLParser is undefined. If in a webworker or nodejs environment, you need to provide a WHATWG DOM and HTML such as JSDOM' ) ;
}
}
var doc = HTMLParser . createElement ( 'div' ) ;
doc . innerHTML = src ;
var globals = {
preList : substitutePreCodeTags ( doc )
} ;
// remove all newlines and collapse spaces
clean ( doc ) ;
// some stuff, like accidental reference links must now be escaped
// TODO
// doc.innerHTML = doc.innerHTML.replace(/\[[\S\t ]]/);
var nodes = doc . childNodes ,
mdDoc = '' ;
for ( var i = 0 ; i < nodes . length ; i ++ ) {
mdDoc += showdown . subParser ( 'makeMarkdown.node' ) ( nodes [ i ] , globals ) ;
}
function clean ( node ) {
for ( var n = 0 ; n < node . childNodes . length ; ++ n ) {
var child = node . childNodes [ n ] ;
if ( child . nodeType === 3 ) {
if ( ! /\S/ . test ( child . nodeValue ) ) {
node . removeChild ( child ) ;
-- n ;
} else {
child . nodeValue = child . nodeValue . split ( '\n' ) . join ( ' ' ) ;
child . nodeValue = child . nodeValue . replace ( /(\s)+/g , '$1' ) ;
}
} else if ( child . nodeType === 1 ) {
clean ( child ) ;
}
}
}
// find all pre tags and replace contents with placeholder
// we need this so that we can remove all indentation from html
// to ease up parsing
function substitutePreCodeTags ( doc ) {
var pres = doc . querySelectorAll ( 'pre' ) ,
presPH = [ ] ;
for ( var i = 0 ; i < pres . length ; ++ i ) {
if ( pres [ i ] . childElementCount === 1 && pres [ i ] . firstChild . tagName . toLowerCase ( ) === 'code' ) {
var content = pres [ i ] . firstChild . innerHTML . trim ( ) ,
language = pres [ i ] . firstChild . getAttribute ( 'data-language' ) || '' ;
// if data-language attribute is not defined, then we look for class language-*
if ( language === '' ) {
var classes = pres [ i ] . firstChild . className . split ( ' ' ) ;
for ( var c = 0 ; c < classes . length ; ++ c ) {
var matches = classes [ c ] . match ( /^language-(.+)$/ ) ;
if ( matches !== null ) {
language = matches [ 1 ] ;
break ;
}
}
}
// unescape html entities in content
content = showdown . helper . unescapeHTMLEntities ( content ) ;
presPH . push ( content ) ;
pres [ i ] . outerHTML = '<precode language="' + language + '" precodenum="' + i . toString ( ) + '"></precode>' ;
} else {
presPH . push ( pres [ i ] . innerHTML ) ;
pres [ i ] . innerHTML = '' ;
pres [ i ] . setAttribute ( 'prenum' , i . toString ( ) ) ;
}
}
return presPH ;
}
return mdDoc ;
} ;
/ * *
* Set an option of this Converter instance
* @ param { string } key
* @ param { * } value
* /
this . setOption = function ( key , value ) {
options [ key ] = value ;
} ;
/ * *
* Get the option of this Converter instance
* @ param { string } key
* @ returns { * }
* /
this . getOption = function ( key ) {
return options [ key ] ;
} ;
/ * *
* Get the options of this Converter instance
* @ returns { { } }
* /
this . getOptions = function ( ) {
return options ;
} ;
/ * *
* Add extension to THIS converter
* @ param { { } } extension
* @ param { string } [ name = null ]
* /
this . addExtension = function ( extension , name ) {
name = name || null ;
_parseExtension ( extension , name ) ;
} ;
/ * *
* Use a global registered extension with THIS converter
* @ param { string } extensionName Name of the previously registered extension
* /
this . useExtension = function ( extensionName ) {
_parseExtension ( extensionName ) ;
} ;
/ * *
* Set the flavor THIS converter should use
* @ param { string } name
* /
this . setFlavor = function ( name ) {
if ( ! flavor . hasOwnProperty ( name ) ) {
throw Error ( name + ' flavor was not found' ) ;
}
var preset = flavor [ name ] ;
setConvFlavor = name ;
for ( var option in preset ) {
if ( preset . hasOwnProperty ( option ) ) {
options [ option ] = preset [ option ] ;
}
}
} ;
/ * *
* Get the currently set flavor of this converter
* @ returns { string }
* /
this . getFlavor = function ( ) {
return setConvFlavor ;
} ;
/ * *
* Remove an extension from THIS converter .
* Note : This is a costly operation . It ' s better to initialize a new converter
* and specify the extensions you wish to use
* @ param { Array } extension
* /
this . removeExtension = function ( extension ) {
if ( ! showdown . helper . isArray ( extension ) ) {
extension = [ extension ] ;
}
for ( var a = 0 ; a < extension . length ; ++ a ) {
var ext = extension [ a ] ;
for ( var i = 0 ; i < langExtensions . length ; ++ i ) {
if ( langExtensions [ i ] === ext ) {
langExtensions [ i ] . splice ( i , 1 ) ;
}
}
for ( var ii = 0 ; ii < outputModifiers . length ; ++ i ) {
if ( outputModifiers [ ii ] === ext ) {
outputModifiers [ ii ] . splice ( i , 1 ) ;
}
}
}
} ;
/ * *
* Get all extension of THIS converter
* @ returns { { language : Array , output : Array } }
* /
this . getAllExtensions = function ( ) {
return {
language : langExtensions ,
output : outputModifiers
} ;
} ;
/ * *
* Get the metadata of the previously parsed document
* @ param raw
* @ returns { string | { } }
* /
this . getMetadata = function ( raw ) {
if ( raw ) {
return metadata . raw ;
} else {
return metadata . parsed ;
}
} ;
/ * *
* Get the metadata format of the previously parsed document
* @ returns { string }
* /
this . getMetadataFormat = function ( ) {
return metadata . format ;
} ;
/ * *
* Private : set a single key , value metadata pair
* @ param { string } key
* @ param { string } value
* /
this . _setMetadataPair = function ( key , value ) {
metadata . parsed [ key ] = value ;
} ;
/ * *
* Private : set metadata format
* @ param { string } format
* /
this . _setMetadataFormat = function ( format ) {
metadata . format = format ;
} ;
/ * *
* Private : set metadata raw text
* @ param { string } raw
* /
this . _setMetadataRaw = function ( raw ) {
metadata . raw = raw ;
} ;
} ;
/ * *
* Turn Markdown link shortcuts into XHTML < a > tags .
* /
showdown . subParser ( 'anchors' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'anchors.before' , text , options , globals ) ;
var writeAnchorTag = function ( wholeMatch , linkText , linkId , url , m5 , m6 , title ) {
if ( showdown . helper . isUndefined ( title ) ) {
title = '' ;
}
linkId = linkId . toLowerCase ( ) ;
// Special case for explicit empty url
if ( wholeMatch . search ( /\(<?\s*>? ?(['"].*['"])?\)$/m ) > - 1 ) {
url = '' ;
} else if ( ! url ) {
if ( ! linkId ) {
// lower-case and turn embedded newlines into spaces
linkId = linkText . toLowerCase ( ) . replace ( / ?\n/g , ' ' ) ;
}
url = '#' + linkId ;
if ( ! showdown . helper . isUndefined ( globals . gUrls [ linkId ] ) ) {
url = globals . gUrls [ linkId ] ;
if ( ! showdown . helper . isUndefined ( globals . gTitles [ linkId ] ) ) {
title = globals . gTitles [ linkId ] ;
}
} else {
return wholeMatch ;
}
}
//url = showdown.helper.escapeCharacters(url, '*_', false); // replaced line to improve performance
url = url . replace ( showdown . helper . regexes . asteriskDashAndColon , showdown . helper . escapeCharactersCallback ) ;
var result = '<a href="' + url + '"' ;
if ( title !== '' && title !== null ) {
title = title . replace ( /"/g , '"' ) ;
//title = showdown.helper.escapeCharacters(title, '*_', false); // replaced line to improve performance
title = title . replace ( showdown . helper . regexes . asteriskDashAndColon , showdown . helper . escapeCharactersCallback ) ;
result += ' title="' + title + '"' ;
}
// optionLinksInNewWindow only applies
// to external links. Hash links (#) open in same page
if ( options . openLinksInNewWindow && ! /^#/ . test ( url ) ) {
// escaped _
result += ' target="¨E95Eblank"' ;
}
result += '>' + linkText + '</a>' ;
return result ;
} ;
// First, handle reference-style links: [link text] [id]
text = text . replace ( /\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g , writeAnchorTag ) ;
// Next, inline-style links: [link text](url "optional title")
// cases with crazy urls like ./image/cat1).png
text = text . replace ( /\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g ,
writeAnchorTag ) ;
// normal cases
text = text . replace ( /\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<?([\S]+?(?:\([\S]*?\)[\S]*?)?)>?(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g ,
writeAnchorTag ) ;
// handle reference-style shortcuts: [link text]
// These must come last in case you've also got [link test][1]
// or [link test](/foo)
text = text . replace ( /\[([^\[\]]+)]()()()()()/g , writeAnchorTag ) ;
// Lastly handle GithubMentions if option is enabled
if ( options . ghMentions ) {
text = text . replace ( /(^|\s)(\\)?(@([a-z\d]+(?:[a-z\d.-]+?[a-z\d]+)*))/gmi , function ( wm , st , escape , mentions , username ) {
if ( escape === '\\' ) {
return st + mentions ;
}
//check if options.ghMentionsLink is a string
if ( ! showdown . helper . isString ( options . ghMentionsLink ) ) {
throw new Error ( 'ghMentionsLink option must be a string' ) ;
}
var lnk = options . ghMentionsLink . replace ( /\{u}/g , username ) ,
target = '' ;
if ( options . openLinksInNewWindow ) {
target = ' target="¨E95Eblank"' ;
}
return st + '<a href="' + lnk + '"' + target + '>' + mentions + '</a>' ;
} ) ;
}
text = globals . converter . _dispatch ( 'anchors.after' , text , options , globals ) ;
return text ;
} ) ;
// url allowed chars [a-z\d_.~:/?#[]@!$&'()*+,;=-]
var simpleURLRegex = /([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+?\.[^'">\s]+?)()(\1)?(?=\s|$)(?!["<>])/gi ,
simpleURLRegex2 = /([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?,()\[\]])?(\1)?(?=\s|$)(?!["<>])/gi ,
delimUrlRegex = /()<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)()>()/gi ,
simpleMailRegex = /(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gmi ,
delimMailRegex = /<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi ,
replaceLink = function ( options ) {
'use strict' ;
return function ( wm , leadingMagicChars , link , m2 , m3 , trailingPunctuation , trailingMagicChars ) {
link = link . replace ( showdown . helper . regexes . asteriskDashAndColon , showdown . helper . escapeCharactersCallback ) ;
var lnkTxt = link ,
append = '' ,
target = '' ,
lmc = leadingMagicChars || '' ,
tmc = trailingMagicChars || '' ;
if ( /^www\./i . test ( link ) ) {
link = link . replace ( /^www\./i , 'http://www.' ) ;
}
if ( options . excludeTrailingPunctuationFromURLs && trailingPunctuation ) {
append = trailingPunctuation ;
}
if ( options . openLinksInNewWindow ) {
target = ' target="¨E95Eblank"' ;
}
return lmc + '<a href="' + link + '"' + target + '>' + lnkTxt + '</a>' + append + tmc ;
} ;
} ,
replaceMail = function ( options , globals ) {
'use strict' ;
return function ( wholeMatch , b , mail ) {
var href = 'mailto:' ;
b = b || '' ;
mail = showdown . subParser ( 'unescapeSpecialChars' ) ( mail , options , globals ) ;
if ( options . encodeEmails ) {
href = showdown . helper . encodeEmailAddress ( href + mail ) ;
mail = showdown . helper . encodeEmailAddress ( mail ) ;
} else {
href = href + mail ;
}
return b + '<a href="' + href + '">' + mail + '</a>' ;
} ;
} ;
showdown . subParser ( 'autoLinks' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'autoLinks.before' , text , options , globals ) ;
text = text . replace ( delimUrlRegex , replaceLink ( options ) ) ;
text = text . replace ( delimMailRegex , replaceMail ( options , globals ) ) ;
text = globals . converter . _dispatch ( 'autoLinks.after' , text , options , globals ) ;
return text ;
} ) ;
showdown . subParser ( 'simplifiedAutoLinks' , function ( text , options , globals ) {
'use strict' ;
if ( ! options . simplifiedAutoLink ) {
return text ;
}
text = globals . converter . _dispatch ( 'simplifiedAutoLinks.before' , text , options , globals ) ;
if ( options . excludeTrailingPunctuationFromURLs ) {
text = text . replace ( simpleURLRegex2 , replaceLink ( options ) ) ;
} else {
text = text . replace ( simpleURLRegex , replaceLink ( options ) ) ;
}
text = text . replace ( simpleMailRegex , replaceMail ( options , globals ) ) ;
text = globals . converter . _dispatch ( 'simplifiedAutoLinks.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* These are all the transformations that form block - level
* tags like paragraphs , headers , and list items .
* /
showdown . subParser ( 'blockGamut' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'blockGamut.before' , text , options , globals ) ;
// we parse blockquotes first so that we can have headings and hrs
// inside blockquotes
text = showdown . subParser ( 'blockQuotes' ) ( text , options , globals ) ;
text = showdown . subParser ( 'headers' ) ( text , options , globals ) ;
// Do Horizontal Rules:
text = showdown . subParser ( 'horizontalRule' ) ( text , options , globals ) ;
text = showdown . subParser ( 'lists' ) ( text , options , globals ) ;
text = showdown . subParser ( 'codeBlocks' ) ( text , options , globals ) ;
text = showdown . subParser ( 'tables' ) ( text , options , globals ) ;
// We already ran _HashHTMLBlocks() before, in Markdown(), but that
// was to escape raw HTML in the original Markdown source. This time,
// we're escaping the markup we've just created, so that we don't wrap
// <p> tags around block-level tags.
text = showdown . subParser ( 'hashHTMLBlocks' ) ( text , options , globals ) ;
text = showdown . subParser ( 'paragraphs' ) ( text , options , globals ) ;
text = globals . converter . _dispatch ( 'blockGamut.after' , text , options , globals ) ;
return text ;
} ) ;
showdown . subParser ( 'blockQuotes' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'blockQuotes.before' , text , options , globals ) ;
// add a couple extra lines after the text and endtext mark
text = text + '\n\n' ;
var rgx = /(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm ;
if ( options . splitAdjacentBlockquotes ) {
rgx = /^ {0,3}>[\s\S]*?(?:\n\n)/gm ;
}
text = text . replace ( rgx , function ( bq ) {
// attacklab: hack around Konqueror 3.5.4 bug:
// "----------bug".replace(/^-/g,"") == "bug"
bq = bq . replace ( /^[ \t]*>[ \t]?/gm , '' ) ; // trim one level of quoting
// attacklab: clean up hack
bq = bq . replace ( /¨0/g , '' ) ;
bq = bq . replace ( /^[ \t]+$/gm , '' ) ; // trim whitespace-only lines
bq = showdown . subParser ( 'githubCodeBlocks' ) ( bq , options , globals ) ;
bq = showdown . subParser ( 'blockGamut' ) ( bq , options , globals ) ; // recurse
bq = bq . replace ( /(^|\n)/g , '$1 ' ) ;
// These leading spaces screw with <pre> content, so we need to fix that:
bq = bq . replace ( /(\s*<pre>[^\r]+?<\/pre>)/gm , function ( wholeMatch , m1 ) {
var pre = m1 ;
// attacklab: hack around Konqueror 3.5.4 bug:
pre = pre . replace ( /^ /mg , '¨0' ) ;
pre = pre . replace ( /¨0/g , '' ) ;
return pre ;
} ) ;
return showdown . subParser ( 'hashBlock' ) ( '<blockquote>\n' + bq + '\n</blockquote>' , options , globals ) ;
} ) ;
text = globals . converter . _dispatch ( 'blockQuotes.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Process Markdown ` <pre><code> ` blocks .
* /
showdown . subParser ( 'codeBlocks' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'codeBlocks.before' , text , options , globals ) ;
// sentinel workarounds for lack of \A and \Z, safari\khtml bug
text += '¨0' ;
var pattern = /(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g ;
text = text . replace ( pattern , function ( wholeMatch , m1 , m2 ) {
var codeblock = m1 ,
nextChar = m2 ,
end = '\n' ;
codeblock = showdown . subParser ( 'outdent' ) ( codeblock , options , globals ) ;
codeblock = showdown . subParser ( 'encodeCode' ) ( codeblock , options , globals ) ;
codeblock = showdown . subParser ( 'detab' ) ( codeblock , options , globals ) ;
codeblock = codeblock . replace ( /^\n+/g , '' ) ; // trim leading newlines
codeblock = codeblock . replace ( /\n+$/g , '' ) ; // trim trailing newlines
if ( options . omitExtraWLInCodeBlocks ) {
end = '' ;
}
codeblock = '<pre><code>' + codeblock + end + '</code></pre>' ;
return showdown . subParser ( 'hashBlock' ) ( codeblock , options , globals ) + nextChar ;
} ) ;
// strip sentinel
text = text . replace ( /¨0/ , '' ) ;
text = globals . converter . _dispatch ( 'codeBlocks.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
*
* * Backtick quotes are used for < code > < / c o d e > s p a n s .
*
* * You can use multiple backticks as the delimiters if you want to
* include literal backticks in the code span . So , this input :
*
* Just type ` ` foo ` bar ` baz ` ` at the prompt .
*
* Will translate to :
*
* < p > Just type < code > foo ` bar ` baz < / c o d e > a t t h e p r o m p t . < / p >
*
* There ' s no arbitrary limit to the number of backticks you
* can use as delimters . If you need three consecutive backticks
* in your code , use four for delimiters , etc .
*
* * You can use spaces to get literal backticks at the edges :
*
* ... type ` ` ` bar ` ` ` ...
*
* Turns to :
*
* ... type < code > ` bar ` < / c o d e > . . .
* /
showdown . subParser ( 'codeSpans' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'codeSpans.before' , text , options , globals ) ;
if ( typeof ( text ) === 'undefined' ) {
text = '' ;
}
text = text . replace ( /(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm ,
function ( wholeMatch , m1 , m2 , m3 ) {
var c = m3 ;
c = c . replace ( /^([ \t]*)/g , '' ) ; // leading whitespace
c = c . replace ( /[ \t]*$/g , '' ) ; // trailing whitespace
c = showdown . subParser ( 'encodeCode' ) ( c , options , globals ) ;
c = m1 + '<code>' + c + '</code>' ;
c = showdown . subParser ( 'hashHTMLSpans' ) ( c , options , globals ) ;
return c ;
}
) ;
text = globals . converter . _dispatch ( 'codeSpans.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Create a full HTML document from the processed markdown
* /
showdown . subParser ( 'completeHTMLDocument' , function ( text , options , globals ) {
'use strict' ;
if ( ! options . completeHTMLDocument ) {
return text ;
}
text = globals . converter . _dispatch ( 'completeHTMLDocument.before' , text , options , globals ) ;
var doctype = 'html' ,
doctypeParsed = '<!DOCTYPE HTML>\n' ,
title = '' ,
charset = '<meta charset="utf-8">\n' ,
lang = '' ,
metadata = '' ;
if ( typeof globals . metadata . parsed . doctype !== 'undefined' ) {
doctypeParsed = '<!DOCTYPE ' + globals . metadata . parsed . doctype + '>\n' ;
doctype = globals . metadata . parsed . doctype . toString ( ) . toLowerCase ( ) ;
if ( doctype === 'html' || doctype === 'html5' ) {
charset = '<meta charset="utf-8">' ;
}
}
for ( var meta in globals . metadata . parsed ) {
if ( globals . metadata . parsed . hasOwnProperty ( meta ) ) {
switch ( meta . toLowerCase ( ) ) {
case 'doctype' :
break ;
case 'title' :
title = '<title>' + globals . metadata . parsed . title + '</title>\n' ;
break ;
case 'charset' :
if ( doctype === 'html' || doctype === 'html5' ) {
charset = '<meta charset="' + globals . metadata . parsed . charset + '">\n' ;
} else {
charset = '<meta name="charset" content="' + globals . metadata . parsed . charset + '">\n' ;
}
break ;
case 'language' :
case 'lang' :
lang = ' lang="' + globals . metadata . parsed [ meta ] + '"' ;
metadata += '<meta name="' + meta + '" content="' + globals . metadata . parsed [ meta ] + '">\n' ;
break ;
default :
metadata += '<meta name="' + meta + '" content="' + globals . metadata . parsed [ meta ] + '">\n' ;
}
}
}
text = doctypeParsed + '<html' + lang + '>\n<head>\n' + title + charset + metadata + '</head>\n<body>\n' + text . trim ( ) + '\n</body>\n</html>' ;
text = globals . converter . _dispatch ( 'completeHTMLDocument.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Convert all tabs to spaces
* /
showdown . subParser ( 'detab' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'detab.before' , text , options , globals ) ;
// expand first n-1 tabs
text = text . replace ( /\t(?=\t)/g , ' ' ) ; // g_tab_width
// replace the nth with two sentinels
text = text . replace ( /\t/g , '¨A¨B' ) ;
// use the sentinel to anchor our regex so it doesn't explode
text = text . replace ( /¨B(.+?)¨A/g , function ( wholeMatch , m1 ) {
var leadingText = m1 ,
numSpaces = 4 - leadingText . length % 4 ; // g_tab_width
// there *must* be a better way to do this:
for ( var i = 0 ; i < numSpaces ; i ++ ) {
leadingText += ' ' ;
}
return leadingText ;
} ) ;
// clean up sentinels
text = text . replace ( /¨A/g , ' ' ) ; // g_tab_width
text = text . replace ( /¨B/g , '' ) ;
text = globals . converter . _dispatch ( 'detab.after' , text , options , globals ) ;
return text ;
} ) ;
showdown . subParser ( 'ellipsis' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'ellipsis.before' , text , options , globals ) ;
text = text . replace ( /\.\.\./g , '…' ) ;
text = globals . converter . _dispatch ( 'ellipsis.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Turn emoji codes into emojis
*
* List of supported emojis : https : //github.com/showdownjs/showdown/wiki/Emojis
* /
showdown . subParser ( 'emoji' , function ( text , options , globals ) {
'use strict' ;
if ( ! options . emoji ) {
return text ;
}
text = globals . converter . _dispatch ( 'emoji.before' , text , options , globals ) ;
var emojiRgx = /:([\S]+?):/g ;
text = text . replace ( emojiRgx , function ( wm , emojiCode ) {
if ( showdown . helper . emojis . hasOwnProperty ( emojiCode ) ) {
return showdown . helper . emojis [ emojiCode ] ;
}
return wm ;
} ) ;
text = globals . converter . _dispatch ( 'emoji.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Smart processing for ampersands and angle brackets that need to be encoded .
* /
showdown . subParser ( 'encodeAmpsAndAngles' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'encodeAmpsAndAngles.before' , text , options , globals ) ;
// Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:
// http://bumppo.net/projects/amputator/
text = text . replace ( /&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g , '&' ) ;
// Encode naked <'s
text = text . replace ( /<(?![a-z\/?$!])/gi , '<' ) ;
// Encode <
text = text . replace ( /</g , '<' ) ;
// Encode >
text = text . replace ( />/g , '>' ) ;
text = globals . converter . _dispatch ( 'encodeAmpsAndAngles.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Returns the string , with after processing the following backslash escape sequences .
*
* attacklab : The polite way to do this is with the new escapeCharacters ( ) function :
*
* text = escapeCharacters ( text , "\\" , true ) ;
* text = escapeCharacters ( text , "`*_{}[]()>#+-.!" , true ) ;
*
* ... but we ' re sidestepping its use of the ( slow ) RegExp constructor
* as an optimization for Firefox . This function gets called a LOT .
* /
showdown . subParser ( 'encodeBackslashEscapes' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'encodeBackslashEscapes.before' , text , options , globals ) ;
text = text . replace ( /\\(\\)/g , showdown . helper . escapeCharactersCallback ) ;
text = text . replace ( /\\([`*_{}\[\]()>#+.!~=|-])/g , showdown . helper . escapeCharactersCallback ) ;
text = globals . converter . _dispatch ( 'encodeBackslashEscapes.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Encode / escape certain characters inside Markdown code runs .
* The point is that in code , these characters are literals ,
* and lose their special Markdown meanings .
* /
showdown . subParser ( 'encodeCode' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'encodeCode.before' , text , options , globals ) ;
// Encode all ampersands; HTML entities are not
// entities within a Markdown code span.
text = text
. replace ( /&/g , '&' )
// Do the angle bracket song and dance:
. replace ( /</g , '<' )
. replace ( />/g , '>' )
// Now, escape characters that are magic in Markdown:
. replace ( /([*_{}\[\]\\=~-])/g , showdown . helper . escapeCharactersCallback ) ;
text = globals . converter . _dispatch ( 'encodeCode.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Within tags -- meaning between < and > -- encode [ \ ` * _ ~ =] so they
* don ' t conflict with their use in Markdown for code , italics and strong .
* /
showdown . subParser ( 'escapeSpecialCharsWithinTagAttributes' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'escapeSpecialCharsWithinTagAttributes.before' , text , options , globals ) ;
// Build a regex to find HTML tags.
var tags = /<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi ,
comments = /<!(--(?:(?:[^>-]|-[^>])(?:[^-]|-[^-])*)--)>/gi ;
text = text . replace ( tags , function ( wholeMatch ) {
return wholeMatch
. replace ( /(.)<\/?code>(?=.)/g , '$1`' )
. replace ( /([\\`*_~=|])/g , showdown . helper . escapeCharactersCallback ) ;
} ) ;
text = text . replace ( comments , function ( wholeMatch ) {
return wholeMatch
. replace ( /([\\`*_~=|])/g , showdown . helper . escapeCharactersCallback ) ;
} ) ;
text = globals . converter . _dispatch ( 'escapeSpecialCharsWithinTagAttributes.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Handle github codeblocks prior to running HashHTML so that
* HTML contained within the codeblock gets escaped properly
* Example :
* ` ` ` ruby
* def hello _world ( x )
* puts "Hello, #{x}"
* end
* ` ` `
* /
showdown . subParser ( 'githubCodeBlocks' , function ( text , options , globals ) {
'use strict' ;
// early exit if option is not enabled
if ( ! options . ghCodeBlocks ) {
return text ;
}
text = globals . converter . _dispatch ( 'githubCodeBlocks.before' , text , options , globals ) ;
text += '¨0' ;
text = text . replace ( /(?:^|\n)(?: {0,3})(```+|~~~+)(?: *)([^\s`~]*)\n([\s\S]*?)\n(?: {0,3})\1/g , function ( wholeMatch , delim , language , codeblock ) {
var end = ( options . omitExtraWLInCodeBlocks ) ? '' : '\n' ;
// First parse the github code block
codeblock = showdown . subParser ( 'encodeCode' ) ( codeblock , options , globals ) ;
codeblock = showdown . subParser ( 'detab' ) ( codeblock , options , globals ) ;
codeblock = codeblock . replace ( /^\n+/g , '' ) ; // trim leading newlines
codeblock = codeblock . replace ( /\n+$/g , '' ) ; // trim trailing whitespace
codeblock = '<pre><code' + ( language ? ' class="' + language + ' language-' + language + '"' : '' ) + '>' + codeblock + end + '</code></pre>' ;
codeblock = showdown . subParser ( 'hashBlock' ) ( codeblock , options , globals ) ;
// Since GHCodeblocks can be false positives, we need to
// store the primitive text and the parsed text in a global var,
// and then return a token
return '\n\n¨G' + ( globals . ghCodeBlocks . push ( { text : wholeMatch , codeblock : codeblock } ) - 1 ) + 'G\n\n' ;
} ) ;
// attacklab: strip sentinel
text = text . replace ( /¨0/ , '' ) ;
return globals . converter . _dispatch ( 'githubCodeBlocks.after' , text , options , globals ) ;
} ) ;
showdown . subParser ( 'hashBlock' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'hashBlock.before' , text , options , globals ) ;
text = text . replace ( /(^\n+|\n+$)/g , '' ) ;
text = '\n\n¨K' + ( globals . gHtmlBlocks . push ( text ) - 1 ) + 'K\n\n' ;
text = globals . converter . _dispatch ( 'hashBlock.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Hash and escape < code > elements that should not be parsed as markdown
* /
showdown . subParser ( 'hashCodeTags' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'hashCodeTags.before' , text , options , globals ) ;
var repFunc = function ( wholeMatch , match , left , right ) {
var codeblock = left + showdown . subParser ( 'encodeCode' ) ( match , options , globals ) + right ;
return '¨C' + ( globals . gHtmlSpans . push ( codeblock ) - 1 ) + 'C' ;
} ;
// Hash naked <code>
text = showdown . helper . replaceRecursiveRegExp ( text , repFunc , '<code\\b[^>]*>' , '</code>' , 'gim' ) ;
text = globals . converter . _dispatch ( 'hashCodeTags.after' , text , options , globals ) ;
return text ;
} ) ;
showdown . subParser ( 'hashElement' , function ( text , options , globals ) {
'use strict' ;
return function ( wholeMatch , m1 ) {
var blockText = m1 ;
// Undo double lines
blockText = blockText . replace ( /\n\n/g , '\n' ) ;
blockText = blockText . replace ( /^\n/ , '' ) ;
// strip trailing blank lines
blockText = blockText . replace ( /\n+$/g , '' ) ;
// Replace the element text with a marker ("¨KxK" where x is its key)
blockText = '\n\n¨K' + ( globals . gHtmlBlocks . push ( blockText ) - 1 ) + 'K\n\n' ;
return blockText ;
} ;
} ) ;
showdown . subParser ( 'hashHTMLBlocks' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'hashHTMLBlocks.before' , text , options , globals ) ;
var blockTags = [
'pre' ,
'div' ,
'h1' ,
'h2' ,
'h3' ,
'h4' ,
'h5' ,
'h6' ,
'blockquote' ,
'table' ,
'dl' ,
'ol' ,
'ul' ,
'script' ,
'noscript' ,
'form' ,
'fieldset' ,
'iframe' ,
'math' ,
'style' ,
'section' ,
'header' ,
'footer' ,
'nav' ,
'article' ,
'aside' ,
'address' ,
'audio' ,
'canvas' ,
'figure' ,
'hgroup' ,
'output' ,
'video' ,
'p'
] ,
repFunc = function ( wholeMatch , match , left , right ) {
var txt = wholeMatch ;
// check if this html element is marked as markdown
// if so, it's contents should be parsed as markdown
if ( left . search ( /\bmarkdown\b/ ) !== - 1 ) {
txt = left + globals . converter . makeHtml ( match ) + right ;
}
return '\n\n¨K' + ( globals . gHtmlBlocks . push ( txt ) - 1 ) + 'K\n\n' ;
} ;
if ( options . backslashEscapesHTMLTags ) {
// encode backslash escaped HTML tags
text = text . replace ( /\\<(\/?[^>]+?)>/g , function ( wm , inside ) {
return '<' + inside + '>' ;
} ) ;
}
// hash HTML Blocks
for ( var i = 0 ; i < blockTags . length ; ++ i ) {
var opTagPos ,
rgx1 = new RegExp ( '^ {0,3}(<' + blockTags [ i ] + '\\b[^>]*>)' , 'im' ) ,
patLeft = '<' + blockTags [ i ] + '\\b[^>]*>' ,
patRight = '</' + blockTags [ i ] + '>' ;
// 1. Look for the first position of the first opening HTML tag in the text
while ( ( opTagPos = showdown . helper . regexIndexOf ( text , rgx1 ) ) !== - 1 ) {
// if the HTML tag is \ escaped, we need to escape it and break
//2. Split the text in that position
var subTexts = showdown . helper . splitAtIndex ( text , opTagPos ) ,
//3. Match recursively
newSubText1 = showdown . helper . replaceRecursiveRegExp ( subTexts [ 1 ] , repFunc , patLeft , patRight , 'im' ) ;
// prevent an infinite loop
if ( newSubText1 === subTexts [ 1 ] ) {
break ;
}
text = subTexts [ 0 ] . concat ( newSubText1 ) ;
}
}
// HR SPECIAL CASE
text = text . replace ( /(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g ,
showdown . subParser ( 'hashElement' ) ( text , options , globals ) ) ;
// Special case for standalone HTML comments
text = showdown . helper . replaceRecursiveRegExp ( text , function ( txt ) {
return '\n\n¨K' + ( globals . gHtmlBlocks . push ( txt ) - 1 ) + 'K\n\n' ;
} , '^ {0,3}<!--' , '-->' , 'gm' ) ;
// PHP and ASP-style processor instructions (<?...?> and <%...%>)
text = text . replace ( /(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g ,
showdown . subParser ( 'hashElement' ) ( text , options , globals ) ) ;
text = globals . converter . _dispatch ( 'hashHTMLBlocks.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Hash span elements that should not be parsed as markdown
* /
showdown . subParser ( 'hashHTMLSpans' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'hashHTMLSpans.before' , text , options , globals ) ;
function hashHTMLSpan ( html ) {
return '¨C' + ( globals . gHtmlSpans . push ( html ) - 1 ) + 'C' ;
}
// Hash Self Closing tags
text = text . replace ( /<[^>]+?\/>/gi , function ( wm ) {
return hashHTMLSpan ( wm ) ;
} ) ;
// Hash tags without properties
text = text . replace ( /<([^>]+?)>[\s\S]*?<\/\1>/g , function ( wm ) {
return hashHTMLSpan ( wm ) ;
} ) ;
// Hash tags with properties
text = text . replace ( /<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g , function ( wm ) {
return hashHTMLSpan ( wm ) ;
} ) ;
// Hash self closing tags without />
text = text . replace ( /<[^>]+?>/gi , function ( wm ) {
return hashHTMLSpan ( wm ) ;
} ) ;
/*showdown.helper.matchRecursiveRegExp(text, '<code\\b[^>]*>', '</code>', 'gi');*/
text = globals . converter . _dispatch ( 'hashHTMLSpans.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Unhash HTML spans
* /
showdown . subParser ( 'unhashHTMLSpans' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'unhashHTMLSpans.before' , text , options , globals ) ;
for ( var i = 0 ; i < globals . gHtmlSpans . length ; ++ i ) {
var repText = globals . gHtmlSpans [ i ] ,
// limiter to prevent infinite loop (assume 10 as limit for recurse)
limit = 0 ;
while ( /¨C(\d+)C/ . test ( repText ) ) {
var num = RegExp . $1 ;
repText = repText . replace ( '¨C' + num + 'C' , globals . gHtmlSpans [ num ] ) ;
if ( limit === 10 ) {
console . error ( 'maximum nesting of 10 spans reached!!!' ) ;
break ;
}
++ limit ;
}
text = text . replace ( '¨C' + i + 'C' , repText ) ;
}
text = globals . converter . _dispatch ( 'unhashHTMLSpans.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Hash and escape < pre > < code > elements that should not be parsed as markdown
* /
showdown . subParser ( 'hashPreCodeTags' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'hashPreCodeTags.before' , text , options , globals ) ;
var repFunc = function ( wholeMatch , match , left , right ) {
// encode html entities
var codeblock = left + showdown . subParser ( 'encodeCode' ) ( match , options , globals ) + right ;
return '\n\n¨G' + ( globals . ghCodeBlocks . push ( { text : wholeMatch , codeblock : codeblock } ) - 1 ) + 'G\n\n' ;
} ;
// Hash <pre><code>
text = showdown . helper . replaceRecursiveRegExp ( text , repFunc , '^ {0,3}<pre\\b[^>]*>\\s*<code\\b[^>]*>' , '^ {0,3}</code>\\s*</pre>' , 'gim' ) ;
text = globals . converter . _dispatch ( 'hashPreCodeTags.after' , text , options , globals ) ;
return text ;
} ) ;
showdown . subParser ( 'headers' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'headers.before' , text , options , globals ) ;
var headerLevelStart = ( isNaN ( parseInt ( options . headerLevelStart ) ) ) ? 1 : parseInt ( options . headerLevelStart ) ,
// Set text-style headers:
// Header 1
// ========
//
// Header 2
// --------
//
setextRegexH1 = ( options . smoothLivePreview ) ? /^(.+)[ \t]*\n={2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n=+[ \t]*\n+/gm ,
setextRegexH2 = ( options . smoothLivePreview ) ? /^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n-+[ \t]*\n+/gm ;
text = text . replace ( setextRegexH1 , function ( wholeMatch , m1 ) {
var spanGamut = showdown . subParser ( 'spanGamut' ) ( m1 , options , globals ) ,
hID = ( options . noHeaderId ) ? '' : ' id="' + headerId ( m1 ) + '"' ,
hLevel = headerLevelStart ,
hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>' ;
return showdown . subParser ( 'hashBlock' ) ( hashBlock , options , globals ) ;
} ) ;
text = text . replace ( setextRegexH2 , function ( matchFound , m1 ) {
var spanGamut = showdown . subParser ( 'spanGamut' ) ( m1 , options , globals ) ,
hID = ( options . noHeaderId ) ? '' : ' id="' + headerId ( m1 ) + '"' ,
hLevel = headerLevelStart + 1 ,
hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>' ;
return showdown . subParser ( 'hashBlock' ) ( hashBlock , options , globals ) ;
} ) ;
// atx-style headers:
// # Header 1
// ## Header 2
// ## Header 2 with closing hashes ##
// ...
// ###### Header 6
//
var atxStyle = ( options . requireSpaceBeforeHeadingText ) ? /^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm : /^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm ;
text = text . replace ( atxStyle , function ( wholeMatch , m1 , m2 ) {
var hText = m2 ;
if ( options . customizedHeaderId ) {
hText = m2 . replace ( /\s?\{([^{]+?)}\s*$/ , '' ) ;
}
var span = showdown . subParser ( 'spanGamut' ) ( hText , options , globals ) ,
hID = ( options . noHeaderId ) ? '' : ' id="' + headerId ( m2 ) + '"' ,
hLevel = headerLevelStart - 1 + m1 . length ,
header = '<h' + hLevel + hID + '>' + span + '</h' + hLevel + '>' ;
return showdown . subParser ( 'hashBlock' ) ( header , options , globals ) ;
} ) ;
function headerId ( m ) {
var title ,
prefix ;
// It is separate from other options to allow combining prefix and customized
if ( options . customizedHeaderId ) {
var match = m . match ( /\{([^{]+?)}\s*$/ ) ;
if ( match && match [ 1 ] ) {
m = match [ 1 ] ;
}
}
title = m ;
// Prefix id to prevent causing inadvertent pre-existing style matches.
if ( showdown . helper . isString ( options . prefixHeaderId ) ) {
prefix = options . prefixHeaderId ;
} else if ( options . prefixHeaderId === true ) {
prefix = 'section-' ;
} else {
prefix = '' ;
}
if ( ! options . rawPrefixHeaderId ) {
title = prefix + title ;
}
if ( options . ghCompatibleHeaderId ) {
title = title
. replace ( / /g , '-' )
// replace previously escaped chars (&, ¨ and $)
. replace ( /&/g , '' )
. replace ( /¨T/g , '' )
. replace ( /¨D/g , '' )
// replace rest of the chars (&~$ are repeated as they might have been escaped)
// borrowed from github's redcarpet (some they should produce similar results)
. replace ( /[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g , '' )
. toLowerCase ( ) ;
} else if ( options . rawHeaderId ) {
title = title
. replace ( / /g , '-' )
// replace previously escaped chars (&, ¨ and $)
. replace ( /&/g , '&' )
. replace ( /¨T/g , '¨' )
. replace ( /¨D/g , '$' )
// replace " and '
. replace ( /["']/g , '-' )
. toLowerCase ( ) ;
} else {
title = title
. replace ( /[^\w]/g , '' )
. toLowerCase ( ) ;
}
if ( options . rawPrefixHeaderId ) {
title = prefix + title ;
}
if ( globals . hashLinkCounts [ title ] ) {
title = title + '-' + ( globals . hashLinkCounts [ title ] ++ ) ;
} else {
globals . hashLinkCounts [ title ] = 1 ;
}
return title ;
}
text = globals . converter . _dispatch ( 'headers.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Turn Markdown link shortcuts into XHTML < a > tags .
* /
showdown . subParser ( 'horizontalRule' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'horizontalRule.before' , text , options , globals ) ;
var key = showdown . subParser ( 'hashBlock' ) ( '<hr />' , options , globals ) ;
text = text . replace ( /^ {0,2}( ?-){3,}[ \t]*$/gm , key ) ;
text = text . replace ( /^ {0,2}( ?\*){3,}[ \t]*$/gm , key ) ;
text = text . replace ( /^ {0,2}( ?_){3,}[ \t]*$/gm , key ) ;
text = globals . converter . _dispatch ( 'horizontalRule.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Turn Markdown image shortcuts into < img > tags .
* /
showdown . subParser ( 'images' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'images.before' , text , options , globals ) ;
var inlineRegExp = /!\[([^\]]*?)][ \t]*()\([ \t]?<?([\S]+?(?:\([\S]*?\)[\S]*?)?)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g ,
crazyRegExp = /!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g ,
base64RegExp = /!\[([^\]]*?)][ \t]*()\([ \t]?<?(data:.+?\/.+?;base64,[A-Za-z0-9+/=\n]+?)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g ,
referenceRegExp = /!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g ,
refShortcutRegExp = /!\[([^\[\]]+)]()()()()()/g ;
function writeImageTagBase64 ( wholeMatch , altText , linkId , url , width , height , m5 , title ) {
url = url . replace ( /\s/g , '' ) ;
return writeImageTag ( wholeMatch , altText , linkId , url , width , height , m5 , title ) ;
}
function writeImageTag ( wholeMatch , altText , linkId , url , width , height , m5 , title ) {
var gUrls = globals . gUrls ,
gTitles = globals . gTitles ,
gDims = globals . gDimensions ;
linkId = linkId . toLowerCase ( ) ;
if ( ! title ) {
title = '' ;
}
// Special case for explicit empty url
if ( wholeMatch . search ( /\(<?\s*>? ?(['"].*['"])?\)$/m ) > - 1 ) {
url = '' ;
} else if ( url === '' || url === null ) {
if ( linkId === '' || linkId === null ) {
// lower-case and turn embedded newlines into spaces
linkId = altText . toLowerCase ( ) . replace ( / ?\n/g , ' ' ) ;
}
url = '#' + linkId ;
if ( ! showdown . helper . isUndefined ( gUrls [ linkId ] ) ) {
url = gUrls [ linkId ] ;
if ( ! showdown . helper . isUndefined ( gTitles [ linkId ] ) ) {
title = gTitles [ linkId ] ;
}
if ( ! showdown . helper . isUndefined ( gDims [ linkId ] ) ) {
width = gDims [ linkId ] . width ;
height = gDims [ linkId ] . height ;
}
} else {
return wholeMatch ;
}
}
altText = altText
. replace ( /"/g , '"' )
//altText = showdown.helper.escapeCharacters(altText, '*_', false);
. replace ( showdown . helper . regexes . asteriskDashAndColon , showdown . helper . escapeCharactersCallback ) ;
//url = showdown.helper.escapeCharacters(url, '*_', false);
url = url . replace ( showdown . helper . regexes . asteriskDashAndColon , showdown . helper . escapeCharactersCallback ) ;
var result = '<img src="' + url + '" alt="' + altText + '"' ;
if ( title && showdown . helper . isString ( title ) ) {
title = title
. replace ( /"/g , '"' )
//title = showdown.helper.escapeCharacters(title, '*_', false);
. replace ( showdown . helper . regexes . asteriskDashAndColon , showdown . helper . escapeCharactersCallback ) ;
result += ' title="' + title + '"' ;
}
if ( width && height ) {
width = ( width === '*' ) ? 'auto' : width ;
height = ( height === '*' ) ? 'auto' : height ;
result += ' width="' + width + '"' ;
result += ' height="' + height + '"' ;
}
result += ' />' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return result ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// First, handle reference-style labeled images: ![alt text][id]
text = text . replace ( referenceRegExp , writeImageTag ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// Next, handle inline images: ![alt text](url =<width>x<height> "optional title")
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// base64 encoded images
text = text . replace ( base64RegExp , writeImageTagBase64 ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// cases with crazy urls like ./image/cat1).png
text = text . replace ( crazyRegExp , writeImageTag ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// normal cases
text = text . replace ( inlineRegExp , writeImageTag ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// handle reference-style shortcuts: ![img text]
text = text . replace ( refShortcutRegExp , writeImageTag ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = globals . converter . _dispatch ( 'images.after' , text , options , globals ) ;
return text ;
} ) ;
showdown . subParser ( 'italicsAndBold' , function ( text , options , globals ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = globals . converter . _dispatch ( 'italicsAndBold.before' , text , options , globals ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// it's faster to have 3 separate regexes for each case than have just one
// because of backtracing, in some cases, it could lead to an exponential effect
// called "catastrophic backtrace". Ominous!
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function parseInside ( txt , left , right ) {
/ *
if ( options . simplifiedAutoLink ) {
txt = showdown . subParser ( 'simplifiedAutoLinks' ) ( txt , options , globals ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
* /
return left + txt + right ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// Parse underscores
if ( options . literalMidWordUnderscores ) {
text = text . replace ( /\b___(\S[\s\S]*?)___\b/g , function ( wm , txt ) {
return parseInside ( txt , '<strong><em>' , '</em></strong>' ) ;
} ) ;
text = text . replace ( /\b__(\S[\s\S]*?)__\b/g , function ( wm , txt ) {
return parseInside ( txt , '<strong>' , '</strong>' ) ;
} ) ;
text = text . replace ( /\b_(\S[\s\S]*?)_\b/g , function ( wm , txt ) {
return parseInside ( txt , '<em>' , '</em>' ) ;
} ) ;
} else {
text = text . replace ( /___(\S[\s\S]*?)___/g , function ( wm , m ) {
return ( /\S$/ . test ( m ) ) ? parseInside ( m , '<strong><em>' , '</em></strong>' ) : wm ;
} ) ;
text = text . replace ( /__(\S[\s\S]*?)__/g , function ( wm , m ) {
return ( /\S$/ . test ( m ) ) ? parseInside ( m , '<strong>' , '</strong>' ) : wm ;
} ) ;
text = text . replace ( /_([^\s_][\s\S]*?)_/g , function ( wm , m ) {
// !/^_[^_]/.test(m) - test if it doesn't start with __ (since it seems redundant, we removed it)
return ( /\S$/ . test ( m ) ) ? parseInside ( m , '<em>' , '</em>' ) : wm ;
} ) ;
}
// Now parse asterisks
if ( options . literalMidWordAsterisks ) {
text = text . replace ( /([^*]|^)\B\*\*\*(\S[\s\S]*?)\*\*\*\B(?!\*)/g , function ( wm , lead , txt ) {
return parseInside ( txt , lead + '<strong><em>' , '</em></strong>' ) ;
} ) ;
text = text . replace ( /([^*]|^)\B\*\*(\S[\s\S]*?)\*\*\B(?!\*)/g , function ( wm , lead , txt ) {
return parseInside ( txt , lead + '<strong>' , '</strong>' ) ;
} ) ;
text = text . replace ( /([^*]|^)\B\*(\S[\s\S]*?)\*\B(?!\*)/g , function ( wm , lead , txt ) {
return parseInside ( txt , lead + '<em>' , '</em>' ) ;
} ) ;
} else {
text = text . replace ( /\*\*\*(\S[\s\S]*?)\*\*\*/g , function ( wm , m ) {
return ( /\S$/ . test ( m ) ) ? parseInside ( m , '<strong><em>' , '</em></strong>' ) : wm ;
} ) ;
text = text . replace ( /\*\*(\S[\s\S]*?)\*\*/g , function ( wm , m ) {
return ( /\S$/ . test ( m ) ) ? parseInside ( m , '<strong>' , '</strong>' ) : wm ;
} ) ;
text = text . replace ( /\*([^\s*][\s\S]*?)\*/g , function ( wm , m ) {
// !/^\*[^*]/.test(m) - test if it doesn't start with ** (since it seems redundant, we removed it)
return ( /\S$/ . test ( m ) ) ? parseInside ( m , '<em>' , '</em>' ) : wm ;
} ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
text = globals . converter . _dispatch ( 'italicsAndBold.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Form HTML ordered ( numbered ) and unordered ( bulleted ) lists .
* /
showdown . subParser ( 'lists' , function ( text , options , globals ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Process the contents of a single ordered or unordered list , splitting it
* into individual list items .
* @ param { string } listStr
* @ param { boolean } trimTrailing
* @ returns { string }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
function processListItems ( listStr , trimTrailing ) {
// The $g_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.".
globals . gListLevel ++ ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// trim trailing blank lines:
listStr = listStr . replace ( /\n{2,}$/ , '\n' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// attacklab: add sentinel to emulate \z
listStr += '¨0' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm ,
isParagraphed = ( /\n[ \t]*\n(?!¨0)/ . test ( listStr ) ) ;
// Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation,
// which is a syntax breaking change
// activating this option reverts to old behavior
if ( options . disableForced4SpacesIndentedSublists ) {
rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm ;
}
listStr = listStr . replace ( rgx , function ( wholeMatch , m1 , m2 , m3 , m4 , taskbtn , checked ) {
checked = ( checked && checked . trim ( ) !== '' ) ;
var item = showdown . subParser ( 'outdent' ) ( m4 , options , globals ) ,
bulletStyle = '' ;
// Support for github tasklists
if ( taskbtn && options . tasklists ) {
bulletStyle = ' class="task-list-item" style="list-style-type: none;"' ;
item = item . replace ( /^[ \t]*\[(x|X| )?]/m , function ( ) {
var otp = '<input type="checkbox" disabled style="margin: 0px 0.35em 0.25em -1.6em; vertical-align: middle;"' ;
if ( checked ) {
otp += ' checked' ;
}
otp += '>' ;
return otp ;
} ) ;
}
// ISSUE #312
// This input: - - - a
// causes trouble to the parser, since it interprets it as:
// <ul><li><li><li>a</li></li></li></ul>
// instead of:
// <ul><li>- - a</li></ul>
// So, to prevent it, we will put a marker (¨A)in the beginning of the line
// Kind of hackish/monkey patching, but seems more effective than overcomplicating the list parser
item = item . replace ( /^([-*+]|\d\.)[ \t]+[\S\n ]*/g , function ( wm2 ) {
return '¨A' + wm2 ;
} ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// m1 - Leading line or
// Has a double return (multi paragraph) or
// Has sublist
if ( m1 || ( item . search ( /\n{2,}/ ) > - 1 ) ) {
item = showdown . subParser ( 'githubCodeBlocks' ) ( item , options , globals ) ;
item = showdown . subParser ( 'blockGamut' ) ( item , options , globals ) ;
2018-12-14 05:41:57 +01:00
} else {
2018-12-18 04:14:52 +01:00
// Recursion for sub-lists:
item = showdown . subParser ( 'lists' ) ( item , options , globals ) ;
item = item . replace ( /\n$/ , '' ) ; // chomp(item)
item = showdown . subParser ( 'hashHTMLBlocks' ) ( item , options , globals ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// Colapse double linebreaks
item = item . replace ( /\n\n+/g , '\n\n' ) ;
if ( isParagraphed ) {
item = showdown . subParser ( 'paragraphs' ) ( item , options , globals ) ;
} else {
item = showdown . subParser ( 'spanGamut' ) ( item , options , globals ) ;
}
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// now we need to remove the marker (¨A)
item = item . replace ( '¨A' , '' ) ;
// we can finally wrap the line in list item tags
item = '<li' + bulletStyle + '>' + item + '</li>\n' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return item ;
} ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// attacklab: strip sentinel
listStr = listStr . replace ( /¨0/g , '' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
globals . gListLevel -- ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( trimTrailing ) {
listStr = listStr . replace ( /\s+$/ , '' ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return listStr ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
function styleStartNumber ( list , listType ) {
// check if ol and starts by a number different than 1
if ( listType === 'ol' ) {
var res = list . match ( /^ *(\d+)\./ ) ;
if ( res && res [ 1 ] !== '1' ) {
return ' start="' + res [ 1 ] + '"' ;
2018-12-14 05:41:57 +01:00
}
}
2018-12-18 04:14:52 +01:00
return '' ;
2018-12-14 05:41:57 +01:00
}
/ * *
2018-12-18 04:14:52 +01:00
* Check and parse consecutive lists ( better fix for issue # 142 )
* @ param { string } list
* @ param { string } listType
* @ param { boolean } trimTrailing
* @ returns { string }
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
function parseConsecutiveLists ( list , listType , trimTrailing ) {
// check if we caught 2 or more consecutive lists by mistake
// we use the counterRgx, meaning if listType is UL we look for OL and vice versa
var olRgx = ( options . disableForced4SpacesIndentedSublists ) ? /^ ?\d+\.[ \t]/gm : /^ {0,3}\d+\.[ \t]/gm ,
ulRgx = ( options . disableForced4SpacesIndentedSublists ) ? /^ ?[*+-][ \t]/gm : /^ {0,3}[*+-][ \t]/gm ,
counterRxg = ( listType === 'ul' ) ? olRgx : ulRgx ,
result = '' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( list . search ( counterRxg ) !== - 1 ) {
( function parseCL ( txt ) {
var pos = txt . search ( counterRxg ) ,
style = styleStartNumber ( list , listType ) ;
if ( pos !== - 1 ) {
// slice
result += '\n\n<' + listType + style + '>\n' + processListItems ( txt . slice ( 0 , pos ) , ! ! trimTrailing ) + '</' + listType + '>\n' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// invert counterType and listType
listType = ( listType === 'ul' ) ? 'ol' : 'ul' ;
counterRxg = ( listType === 'ul' ) ? olRgx : ulRgx ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
//recurse
parseCL ( txt . slice ( pos ) ) ;
} else {
result += '\n\n<' + listType + style + '>\n' + processListItems ( txt , ! ! trimTrailing ) + '</' + listType + '>\n' ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
} ) ( list ) ;
} else {
var style = styleStartNumber ( list , listType ) ;
result = '\n\n<' + listType + style + '>\n' + processListItems ( list , ! ! trimTrailing ) + '</' + listType + '>\n' ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return result ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/** Start of list parsing **/
text = globals . converter . _dispatch ( 'lists.before' , text , options , globals ) ;
// add sentinel to hack around khtml/safari bug:
// http://bugs.webkit.org/show_bug.cgi?id=11231
text += '¨0' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( globals . gListLevel ) {
text = text . replace ( /^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm ,
function ( wholeMatch , list , m2 ) {
var listType = ( m2 . search ( /[*+-]/g ) > - 1 ) ? 'ul' : 'ol' ;
return parseConsecutiveLists ( list , listType , true ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
) ;
} else {
text = text . replace ( /(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm ,
function ( wholeMatch , m1 , list , m3 ) {
var listType = ( m3 . search ( /[*+-]/g ) > - 1 ) ? 'ul' : 'ol' ;
return parseConsecutiveLists ( list , listType , false ) ;
}
) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// strip sentinel
text = text . replace ( /¨0/ , '' ) ;
text = globals . converter . _dispatch ( 'lists.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Parse metadata at the top of the document
* /
showdown . subParser ( 'metadata' , function ( text , options , globals ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! options . metadata ) {
return text ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = globals . converter . _dispatch ( 'metadata.before' , text , options , globals ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function parseMetadataContents ( content ) {
// raw is raw so it's not changed in any way
globals . metadata . raw = content ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// escape chars forbidden in html attributes
// double quotes
content = content
// ampersand first
. replace ( /&/g , '&' )
// double quotes
. replace ( /"/g , '"' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
content = content . replace ( /\n {4}/g , ' ' ) ;
content . replace ( /^([\S ]+): +([\s\S]+?)$/gm , function ( wm , key , value ) {
globals . metadata . parsed [ key ] = value ;
return '' ;
2018-12-14 05:41:57 +01:00
} ) ;
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = text . replace ( /^\s*«««+(\S*?)\n([\s\S]+?)\n»»»+\n/ , function ( wholematch , format , content ) {
parseMetadataContents ( content ) ;
return '¨M' ;
} ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = text . replace ( /^\s*---+(\S*?)\n([\s\S]+?)\n---+\n/ , function ( wholematch , format , content ) {
if ( format ) {
globals . metadata . format = format ;
}
parseMetadataContents ( content ) ;
return '¨M' ;
} ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = text . replace ( /¨M/g , '' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = globals . converter . _dispatch ( 'metadata.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Remove one level of line - leading tabs or spaces
* /
showdown . subParser ( 'outdent' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'outdent.before' , text , options , globals ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// attacklab: hack around Konqueror 3.5.4 bug:
// "----------bug".replace(/^-/g,"") == "bug"
text = text . replace ( /^(\t|[ ]{1,4})/gm , '¨0' ) ; // attacklab: g_tab_width
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// attacklab: clean up hack
text = text . replace ( /¨0/g , '' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = globals . converter . _dispatch ( 'outdent.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
*
* /
showdown . subParser ( 'paragraphs' , function ( text , options , globals ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = globals . converter . _dispatch ( 'paragraphs.before' , text , options , globals ) ;
// Strip leading and trailing lines:
text = text . replace ( /^\n+/g , '' ) ;
text = text . replace ( /\n+$/g , '' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var grafs = text . split ( /\n{2,}/g ) ,
grafsOut = [ ] ,
end = grafs . length ; // Wrap <p> tags
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( var i = 0 ; i < end ; i ++ ) {
var str = grafs [ i ] ;
// if this is an HTML marker, copy it
if ( str . search ( /¨(K|G)(\d+)\1/g ) >= 0 ) {
grafsOut . push ( str ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// test for presence of characters to prevent empty lines being parsed
// as paragraphs (resulting in undesired extra empty paragraphs)
} else if ( str . search ( /\S/ ) >= 0 ) {
str = showdown . subParser ( 'spanGamut' ) ( str , options , globals ) ;
str = str . replace ( /^([ \t]*)/g , '<p>' ) ;
str += '</p>' ;
grafsOut . push ( str ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/** Unhashify HTML blocks */
end = grafsOut . length ;
for ( i = 0 ; i < end ; i ++ ) {
var blockText = '' ,
grafsOutIt = grafsOut [ i ] ,
codeFlag = false ;
// if this is a marker for an html block...
// use RegExp.test instead of string.search because of QML bug
while ( /¨(K|G)(\d+)\1/ . test ( grafsOutIt ) ) {
var delim = RegExp . $1 ,
num = RegExp . $2 ;
if ( delim === 'K' ) {
blockText = globals . gHtmlBlocks [ num ] ;
} else {
// we need to check if ghBlock is a false positive
if ( codeFlag ) {
// use encoded version of all text
blockText = showdown . subParser ( 'encodeCode' ) ( globals . ghCodeBlocks [ num ] . text , options , globals ) ;
} else {
blockText = globals . ghCodeBlocks [ num ] . codeblock ;
2018-12-14 05:41:57 +01:00
}
}
2018-12-18 04:14:52 +01:00
blockText = blockText . replace ( /\$/g , '$$$$' ) ; // Escape any dollar signs
grafsOutIt = grafsOutIt . replace ( /(\n\n)?¨(K|G)\d+\2(\n\n)?/ , blockText ) ;
// Check if grafsOutIt is a pre->code
if ( /^<pre\b[^>]*>\s*<code\b[^>]*>/ . test ( grafsOutIt ) ) {
codeFlag = true ;
}
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
grafsOut [ i ] = grafsOutIt ;
}
text = grafsOut . join ( '\n' ) ;
// Strip leading and trailing lines:
text = text . replace ( /^\n+/g , '' ) ;
text = text . replace ( /\n+$/g , '' ) ;
return globals . converter . _dispatch ( 'paragraphs.after' , text , options , globals ) ;
} ) ;
/ * *
* Run extension
* /
showdown . subParser ( 'runExtension' , function ( ext , text , options , globals ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ext . filter ) {
text = ext . filter ( text , globals . converter , options ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
} else if ( ext . regex ) {
// TODO remove this when old extension loading mechanism is deprecated
var re = ext . regex ;
if ( ! ( re instanceof RegExp ) ) {
re = new RegExp ( re , 'g' ) ;
}
text = text . replace ( re , ext . replace ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return text ;
} ) ;
/ * *
* These are all the transformations that occur * within * block - level
* tags like paragraphs , headers , and list items .
* /
showdown . subParser ( 'spanGamut' , function ( text , options , globals ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = globals . converter . _dispatch ( 'spanGamut.before' , text , options , globals ) ;
text = showdown . subParser ( 'codeSpans' ) ( text , options , globals ) ;
text = showdown . subParser ( 'escapeSpecialCharsWithinTagAttributes' ) ( text , options , globals ) ;
text = showdown . subParser ( 'encodeBackslashEscapes' ) ( text , options , globals ) ;
// Process anchor and image tags. Images must come first,
// because ![foo][f] looks like an anchor.
text = showdown . subParser ( 'images' ) ( text , options , globals ) ;
text = showdown . subParser ( 'anchors' ) ( text , options , globals ) ;
// Make links out of things like `<http://example.com/>`
// Must come after anchors, because you can use < and >
// delimiters in inline links like [this](<url>).
text = showdown . subParser ( 'autoLinks' ) ( text , options , globals ) ;
text = showdown . subParser ( 'simplifiedAutoLinks' ) ( text , options , globals ) ;
text = showdown . subParser ( 'emoji' ) ( text , options , globals ) ;
text = showdown . subParser ( 'underline' ) ( text , options , globals ) ;
text = showdown . subParser ( 'italicsAndBold' ) ( text , options , globals ) ;
text = showdown . subParser ( 'strikethrough' ) ( text , options , globals ) ;
text = showdown . subParser ( 'ellipsis' ) ( text , options , globals ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// we need to hash HTML tags inside spans
text = showdown . subParser ( 'hashHTMLSpans' ) ( text , options , globals ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// now we encode amps and angles
text = showdown . subParser ( 'encodeAmpsAndAngles' ) ( text , options , globals ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// Do hard breaks
if ( options . simpleLineBreaks ) {
// GFM style hard breaks
// only add line breaks if the text does not contain a block (special case for lists)
if ( ! /\n\n¨K/ . test ( text ) ) {
text = text . replace ( /\n+/g , '<br />\n' ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
} else {
// Vanilla hard breaks
text = text . replace ( / +\n/g , '<br />\n' ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = globals . converter . _dispatch ( 'spanGamut.after' , text , options , globals ) ;
return text ;
} ) ;
showdown . subParser ( 'strikethrough' , function ( text , options , globals ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function parseInside ( txt ) {
if ( options . simplifiedAutoLink ) {
txt = showdown . subParser ( 'simplifiedAutoLinks' ) ( txt , options , globals ) ;
}
return '<del>' + txt + '</del>' ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( options . strikethrough ) {
text = globals . converter . _dispatch ( 'strikethrough.before' , text , options , globals ) ;
text = text . replace ( /(?:~){2}([\s\S]+?)(?:~){2}/g , function ( wm , txt ) { return parseInside ( txt ) ; } ) ;
text = globals . converter . _dispatch ( 'strikethrough.after' , text , options , globals ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return text ;
} ) ;
/ * *
* Strips link definitions from text , stores the URLs and titles in
* hash references .
* Link defs are in the form : ^ [ id ] : url "optional title"
* /
showdown . subParser ( 'stripLinkDefinitions' , function ( text , options , globals ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var regex = /^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*<?([^>\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm ,
base64Regex = /^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*<?(data:.+?\/.+?;base64,[A-Za-z0-9+/=\n]+?)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
text += '¨0' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var replaceFunc = function ( wholeMatch , linkId , url , width , height , blankLines , title ) {
linkId = linkId . toLowerCase ( ) ;
if ( url . match ( /^data:.+?\/.+?;base64,/ ) ) {
// remove newlines
globals . gUrls [ linkId ] = url . replace ( /\s/g , '' ) ;
} else {
globals . gUrls [ linkId ] = showdown . subParser ( 'encodeAmpsAndAngles' ) ( url , options , globals ) ; // Link IDs are case-insensitive
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
if ( blankLines ) {
// Oops, found blank lines, so it's not a title.
// Put back the parenthetical statement we stole.
return blankLines + title ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
} else {
if ( title ) {
globals . gTitles [ linkId ] = title . replace ( /"|'/g , '"' ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
if ( options . parseImgDimensions && width && height ) {
globals . gDimensions [ linkId ] = {
width : width ,
height : height
} ;
2018-12-14 05:41:57 +01:00
}
}
2018-12-18 04:14:52 +01:00
// Completely remove the definition from the text
return '' ;
2018-12-14 05:41:57 +01:00
} ;
2018-12-18 04:14:52 +01:00
// first we try to find base64 link references
text = text . replace ( base64Regex , replaceFunc ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = text . replace ( regex , replaceFunc ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// attacklab: strip sentinel
text = text . replace ( /¨0/ , '' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return text ;
} ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
showdown . subParser ( 'tables' , function ( text , options , globals ) {
2018-12-14 05:41:57 +01:00
'use strict' ;
2018-12-18 04:14:52 +01:00
if ( ! options . tables ) {
return text ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var tableRgx = /^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm ,
//singeColTblRgx = /^ {0,3}\|.+\|\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n(?: {0,3}\|.+\|\n)+(?:\n\n|¨0)/gm;
singeColTblRgx = /^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm ;
function parseStyles ( sLine ) {
if ( /^:[ \t]*--*$/ . test ( sLine ) ) {
return ' style="text-align:left;"' ;
} else if ( /^--*[ \t]*:[ \t]*$/ . test ( sLine ) ) {
return ' style="text-align:right;"' ;
} else if ( /^:[ \t]*--*[ \t]*:$/ . test ( sLine ) ) {
return ' style="text-align:center;"' ;
} else {
return '' ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function parseHeaders ( header , style ) {
var id = '' ;
header = header . trim ( ) ;
// support both tablesHeaderId and tableHeaderId due to error in documentation so we don't break backwards compatibility
if ( options . tablesHeaderId || options . tableHeaderId ) {
id = ' id="' + header . replace ( / /g , '_' ) . toLowerCase ( ) + '"' ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
header = showdown . subParser ( 'spanGamut' ) ( header , options , globals ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return '<th' + id + style + '>' + header + '</th>\n' ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function parseCells ( cell , style ) {
var subText = showdown . subParser ( 'spanGamut' ) ( cell , options , globals ) ;
return '<td' + style + '>' + subText + '</td>\n' ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function buildTable ( headers , cells ) {
var tb = '<table>\n<thead>\n<tr>\n' ,
tblLgn = headers . length ;
for ( var i = 0 ; i < tblLgn ; ++ i ) {
tb += headers [ i ] ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
tb += '</tr>\n</thead>\n<tbody>\n' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( i = 0 ; i < cells . length ; ++ i ) {
tb += '<tr>\n' ;
for ( var ii = 0 ; ii < tblLgn ; ++ ii ) {
tb += cells [ i ] [ ii ] ;
}
tb += '</tr>\n' ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
tb += '</tbody>\n</table>\n' ;
return tb ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function parseTable ( rawTable ) {
var i , tableLines = rawTable . split ( '\n' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( i = 0 ; i < tableLines . length ; ++ i ) {
// strip wrong first and last column if wrapped tables are used
if ( /^ {0,3}\|/ . test ( tableLines [ i ] ) ) {
tableLines [ i ] = tableLines [ i ] . replace ( /^ {0,3}\|/ , '' ) ;
}
if ( /\|[ \t]*$/ . test ( tableLines [ i ] ) ) {
tableLines [ i ] = tableLines [ i ] . replace ( /\|[ \t]*$/ , '' ) ;
}
// parse code spans first, but we only support one line code spans
tableLines [ i ] = showdown . subParser ( 'codeSpans' ) ( tableLines [ i ] , options , globals ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var rawHeaders = tableLines [ 0 ] . split ( '|' ) . map ( function ( s ) { return s . trim ( ) ; } ) ,
rawStyles = tableLines [ 1 ] . split ( '|' ) . map ( function ( s ) { return s . trim ( ) ; } ) ,
rawCells = [ ] ,
headers = [ ] ,
styles = [ ] ,
cells = [ ] ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
tableLines . shift ( ) ;
tableLines . shift ( ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( i = 0 ; i < tableLines . length ; ++ i ) {
if ( tableLines [ i ] . trim ( ) === '' ) {
continue ;
}
rawCells . push (
tableLines [ i ]
. split ( '|' )
. map ( function ( s ) {
return s . trim ( ) ;
} )
) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( rawHeaders . length < rawStyles . length ) {
return rawTable ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( i = 0 ; i < rawStyles . length ; ++ i ) {
styles . push ( parseStyles ( rawStyles [ i ] ) ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( i = 0 ; i < rawHeaders . length ; ++ i ) {
if ( showdown . helper . isUndefined ( styles [ i ] ) ) {
styles [ i ] = '' ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
headers . push ( parseHeaders ( rawHeaders [ i ] , styles [ i ] ) ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( i = 0 ; i < rawCells . length ; ++ i ) {
var row = [ ] ;
for ( var ii = 0 ; ii < headers . length ; ++ ii ) {
if ( showdown . helper . isUndefined ( rawCells [ i ] [ ii ] ) ) {
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
row . push ( parseCells ( rawCells [ i ] [ ii ] , styles [ ii ] ) ) ;
}
cells . push ( row ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return buildTable ( headers , cells ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = globals . converter . _dispatch ( 'tables.before' , text , options , globals ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// find escaped pipe characters
text = text . replace ( /\\(\|)/g , showdown . helper . escapeCharactersCallback ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// parse multi column tables
text = text . replace ( tableRgx , parseTable ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// parse one column tables
text = text . replace ( singeColTblRgx , parseTable ) ;
text = globals . converter . _dispatch ( 'tables.after' , text , options , globals ) ;
2018-12-14 05:41:57 +01:00
return text ;
} ) ;
2018-12-18 04:14:52 +01:00
showdown . subParser ( 'underline' , function ( text , options , globals ) {
2018-12-14 05:41:57 +01:00
'use strict' ;
2018-12-18 04:14:52 +01:00
if ( ! options . underline ) {
2018-12-14 05:41:57 +01:00
return text ;
}
2018-12-18 04:14:52 +01:00
text = globals . converter . _dispatch ( 'underline.before' , text , options , globals ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( options . literalMidWordUnderscores ) {
text = text . replace ( /\b___(\S[\s\S]*?)___\b/g , function ( wm , txt ) {
return '<u>' + txt + '</u>' ;
} ) ;
text = text . replace ( /\b__(\S[\s\S]*?)__\b/g , function ( wm , txt ) {
return '<u>' + txt + '</u>' ;
} ) ;
2018-12-14 05:41:57 +01:00
} else {
2018-12-18 04:14:52 +01:00
text = text . replace ( /___(\S[\s\S]*?)___/g , function ( wm , m ) {
return ( /\S$/ . test ( m ) ) ? '<u>' + m + '</u>' : wm ;
} ) ;
text = text . replace ( /__(\S[\s\S]*?)__/g , function ( wm , m ) {
return ( /\S$/ . test ( m ) ) ? '<u>' + m + '</u>' : wm ;
} ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
// escape remaining underscores to prevent them being parsed by italic and bold
text = text . replace ( /(_)/g , showdown . helper . escapeCharactersCallback ) ;
text = globals . converter . _dispatch ( 'underline.after' , text , options , globals ) ;
return text ;
} ) ;
/ * *
* Swap back in all the special characters we ' ve hidden .
* /
showdown . subParser ( 'unescapeSpecialChars' , function ( text , options , globals ) {
'use strict' ;
text = globals . converter . _dispatch ( 'unescapeSpecialChars.before' , text , options , globals ) ;
text = text . replace ( /¨E(\d+)E/g , function ( wholeMatch , m1 ) {
var charCodeToReplace = parseInt ( m1 ) ;
return String . fromCharCode ( charCodeToReplace ) ;
} ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
text = globals . converter . _dispatch ( 'unescapeSpecialChars.after' , text , options , globals ) ;
2018-12-14 05:41:57 +01:00
return text ;
} ) ;
2018-12-18 04:14:52 +01:00
showdown . subParser ( 'makeMarkdown.blockquote' , function ( node , globals ) {
2018-12-14 05:41:57 +01:00
'use strict' ;
2018-12-18 04:14:52 +01:00
var txt = '' ;
if ( node . hasChildNodes ( ) ) {
var children = node . childNodes ,
childrenLength = children . length ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( var i = 0 ; i < childrenLength ; ++ i ) {
var innerTxt = showdown . subParser ( 'makeMarkdown.node' ) ( children [ i ] , globals ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( innerTxt === '' ) {
continue ;
}
txt += innerTxt ;
}
}
// cleanup
txt = txt . trim ( ) ;
txt = '> ' + txt . split ( '\n' ) . join ( '\n> ' ) ;
return txt ;
2018-12-14 05:41:57 +01:00
} ) ;
2018-12-18 04:14:52 +01:00
showdown . subParser ( 'makeMarkdown.codeBlock' , function ( node , globals ) {
2018-12-14 05:41:57 +01:00
'use strict' ;
2018-12-18 04:14:52 +01:00
var lang = node . getAttribute ( 'language' ) ,
num = node . getAttribute ( 'precodenum' ) ;
return '```' + lang + '\n' + globals . preList [ num ] + '\n```' ;
} ) ;
showdown . subParser ( 'makeMarkdown.codeSpan' , function ( node ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return '`' + node . innerHTML + '`' ;
} ) ;
showdown . subParser ( 'makeMarkdown.emphasis' , function ( node , globals ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var txt = '' ;
if ( node . hasChildNodes ( ) ) {
txt += '*' ;
var children = node . childNodes ,
childrenLength = children . length ;
for ( var i = 0 ; i < childrenLength ; ++ i ) {
txt += showdown . subParser ( 'makeMarkdown.node' ) ( children [ i ] , globals ) ;
}
txt += '*' ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return txt ;
} ) ;
showdown . subParser ( 'makeMarkdown.header' , function ( node , globals , headerLevel ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var headerMark = new Array ( headerLevel + 1 ) . join ( '#' ) ,
txt = '' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( node . hasChildNodes ( ) ) {
txt = headerMark + ' ' ;
var children = node . childNodes ,
childrenLength = children . length ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( var i = 0 ; i < childrenLength ; ++ i ) {
txt += showdown . subParser ( 'makeMarkdown.node' ) ( children [ i ] , globals ) ;
}
}
return txt ;
} ) ;
showdown . subParser ( 'makeMarkdown.hr' , function ( ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return '---' ;
2018-12-14 05:41:57 +01:00
} ) ;
2018-12-18 04:14:52 +01:00
showdown . subParser ( 'makeMarkdown.image' , function ( node ) {
2018-12-14 05:41:57 +01:00
'use strict' ;
2018-12-18 04:14:52 +01:00
var txt = '' ;
if ( node . hasAttribute ( 'src' ) ) {
txt += '![' + node . getAttribute ( 'alt' ) + '](' ;
txt += '<' + node . getAttribute ( 'src' ) + '>' ;
if ( node . hasAttribute ( 'width' ) && node . hasAttribute ( 'height' ) ) {
txt += ' =' + node . getAttribute ( 'width' ) + 'x' + node . getAttribute ( 'height' ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( node . hasAttribute ( 'title' ) ) {
txt += ' "' + node . getAttribute ( 'title' ) + '"' ;
}
txt += ')' ;
}
return txt ;
} ) ;
showdown . subParser ( 'makeMarkdown.links' , function ( node , globals ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var txt = '' ;
if ( node . hasChildNodes ( ) && node . hasAttribute ( 'href' ) ) {
var children = node . childNodes ,
childrenLength = children . length ;
txt = '[' ;
for ( var i = 0 ; i < childrenLength ; ++ i ) {
txt += showdown . subParser ( 'makeMarkdown.node' ) ( children [ i ] , globals ) ;
}
txt += '](' ;
txt += '<' + node . getAttribute ( 'href' ) + '>' ;
if ( node . hasAttribute ( 'title' ) ) {
txt += ' "' + node . getAttribute ( 'title' ) + '"' ;
}
txt += ')' ;
}
return txt ;
} ) ;
showdown . subParser ( 'makeMarkdown.list' , function ( node , globals , type ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var txt = '' ;
if ( ! node . hasChildNodes ( ) ) {
return '' ;
}
var listItems = node . childNodes ,
listItemsLenght = listItems . length ,
listNum = node . getAttribute ( 'start' ) || 1 ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( var i = 0 ; i < listItemsLenght ; ++ i ) {
if ( typeof listItems [ i ] . tagName === 'undefined' || listItems [ i ] . tagName . toLowerCase ( ) !== 'li' ) {
continue ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
// define the bullet to use in list
var bullet = '' ;
if ( type === 'ol' ) {
bullet = listNum . toString ( ) + '. ' ;
} else {
bullet = '- ' ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// parse list item
txt += bullet + showdown . subParser ( 'makeMarkdown.listItem' ) ( listItems [ i ] , globals ) ;
++ listNum ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// add comment at the end to prevent consecutive lists to be parsed as one
txt += '\n<!-- -->\n' ;
return txt . trim ( ) ;
2018-12-14 05:41:57 +01:00
} ) ;
2018-12-18 04:14:52 +01:00
showdown . subParser ( 'makeMarkdown.listItem' , function ( node , globals ) {
2018-12-14 05:41:57 +01:00
'use strict' ;
2018-12-18 04:14:52 +01:00
var listItemTxt = '' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var children = node . childNodes ,
childrenLenght = children . length ;
for ( var i = 0 ; i < childrenLenght ; ++ i ) {
listItemTxt += showdown . subParser ( 'makeMarkdown.node' ) ( children [ i ] , globals ) ;
}
// if it's only one liner, we need to add a newline at the end
if ( ! /\n$/ . test ( listItemTxt ) ) {
listItemTxt += '\n' ;
} else {
// it's multiparagraph, so we need to indent
listItemTxt = listItemTxt
. split ( '\n' )
. join ( '\n ' )
. replace ( /^ {4}$/gm , '' )
. replace ( /\n\n+/g , '\n\n' ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return listItemTxt ;
2018-12-14 05:41:57 +01:00
} ) ;
2018-12-18 04:14:52 +01:00
showdown . subParser ( 'makeMarkdown.node' , function ( node , globals , spansOnly ) {
2018-12-14 05:41:57 +01:00
'use strict' ;
2018-12-18 04:14:52 +01:00
spansOnly = spansOnly || false ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var txt = '' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// edge case of text without wrapper paragraph
if ( node . nodeType === 3 ) {
return showdown . subParser ( 'makeMarkdown.txt' ) ( node , globals ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// HTML comment
if ( node . nodeType === 8 ) {
return '<!--' + node . data + '-->\n\n' ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
// process only node elements
if ( node . nodeType !== 1 ) {
return '' ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var tagName = node . tagName . toLowerCase ( ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
switch ( tagName ) {
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
//
// BLOCKS
//
case 'h1' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.header' ) ( node , globals , 1 ) + '\n\n' ; }
break ;
case 'h2' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.header' ) ( node , globals , 2 ) + '\n\n' ; }
break ;
case 'h3' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.header' ) ( node , globals , 3 ) + '\n\n' ; }
break ;
case 'h4' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.header' ) ( node , globals , 4 ) + '\n\n' ; }
break ;
case 'h5' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.header' ) ( node , globals , 5 ) + '\n\n' ; }
break ;
case 'h6' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.header' ) ( node , globals , 6 ) + '\n\n' ; }
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
case 'p' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.paragraph' ) ( node , globals ) + '\n\n' ; }
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
case 'blockquote' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.blockquote' ) ( node , globals ) + '\n\n' ; }
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
case 'hr' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.hr' ) ( node , globals ) + '\n\n' ; }
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
case 'ol' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.list' ) ( node , globals , 'ol' ) + '\n\n' ; }
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
case 'ul' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.list' ) ( node , globals , 'ul' ) + '\n\n' ; }
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
case 'precode' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.codeBlock' ) ( node , globals ) + '\n\n' ; }
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
case 'pre' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.pre' ) ( node , globals ) + '\n\n' ; }
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
case 'table' :
if ( ! spansOnly ) { txt = showdown . subParser ( 'makeMarkdown.table' ) ( node , globals ) + '\n\n' ; }
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
//
// SPANS
//
case 'code' :
txt = showdown . subParser ( 'makeMarkdown.codeSpan' ) ( node , globals ) ;
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
case 'em' :
case 'i' :
txt = showdown . subParser ( 'makeMarkdown.emphasis' ) ( node , globals ) ;
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
case 'strong' :
case 'b' :
txt = showdown . subParser ( 'makeMarkdown.strong' ) ( node , globals ) ;
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
case 'del' :
txt = showdown . subParser ( 'makeMarkdown.strikethrough' ) ( node , globals ) ;
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
case 'a' :
txt = showdown . subParser ( 'makeMarkdown.links' ) ( node , globals ) ;
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
case 'img' :
txt = showdown . subParser ( 'makeMarkdown.image' ) ( node , globals ) ;
break ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
default :
txt = node . outerHTML + '\n\n' ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
// common normalization
// TODO eventually
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return txt ;
} ) ;
showdown . subParser ( 'makeMarkdown.paragraph' , function ( node , globals ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var txt = '' ;
if ( node . hasChildNodes ( ) ) {
var children = node . childNodes ,
childrenLength = children . length ;
for ( var i = 0 ; i < childrenLength ; ++ i ) {
txt += showdown . subParser ( 'makeMarkdown.node' ) ( children [ i ] , globals ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// some text normalization
txt = txt . trim ( ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return txt ;
2018-12-14 05:41:57 +01:00
} ) ;
2018-12-18 04:14:52 +01:00
showdown . subParser ( 'makeMarkdown.pre' , function ( node , globals ) {
2018-12-14 05:41:57 +01:00
'use strict' ;
2018-12-18 04:14:52 +01:00
var num = node . getAttribute ( 'prenum' ) ;
return '<pre>' + globals . preList [ num ] + '</pre>' ;
} ) ;
showdown . subParser ( 'makeMarkdown.strikethrough' , function ( node , globals ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var txt = '' ;
if ( node . hasChildNodes ( ) ) {
txt += '~~' ;
var children = node . childNodes ,
childrenLength = children . length ;
for ( var i = 0 ; i < childrenLength ; ++ i ) {
txt += showdown . subParser ( 'makeMarkdown.node' ) ( children [ i ] , globals ) ;
}
txt += '~~' ;
}
return txt ;
2018-12-14 05:41:57 +01:00
} ) ;
2018-12-18 04:14:52 +01:00
showdown . subParser ( 'makeMarkdown.strong' , function ( node , globals ) {
2018-12-14 05:41:57 +01:00
'use strict' ;
2018-12-18 04:14:52 +01:00
var txt = '' ;
if ( node . hasChildNodes ( ) ) {
txt += '**' ;
var children = node . childNodes ,
childrenLength = children . length ;
for ( var i = 0 ; i < childrenLength ; ++ i ) {
txt += showdown . subParser ( 'makeMarkdown.node' ) ( children [ i ] , globals ) ;
}
txt += '**' ;
}
return txt ;
2018-12-14 05:41:57 +01:00
} ) ;
2018-12-18 04:14:52 +01:00
showdown . subParser ( 'makeMarkdown.table' , function ( node , globals ) {
2018-12-14 05:41:57 +01:00
'use strict' ;
2018-12-18 04:14:52 +01:00
var txt = '' ,
tableArray = [ [ ] , [ ] ] ,
headings = node . querySelectorAll ( 'thead>tr>th' ) ,
rows = node . querySelectorAll ( 'tbody>tr' ) ,
i , ii ;
for ( i = 0 ; i < headings . length ; ++ i ) {
var headContent = showdown . subParser ( 'makeMarkdown.tableCell' ) ( headings [ i ] , globals ) ,
allign = '---' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( headings [ i ] . hasAttribute ( 'style' ) ) {
var style = headings [ i ] . getAttribute ( 'style' ) . toLowerCase ( ) . replace ( /\s/g , '' ) ;
switch ( style ) {
case 'text-align:left;' :
allign = ':---' ;
break ;
case 'text-align:right;' :
allign = '---:' ;
break ;
case 'text-align:center;' :
allign = ':---:' ;
break ;
}
}
tableArray [ 0 ] [ i ] = headContent . trim ( ) ;
tableArray [ 1 ] [ i ] = allign ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( i = 0 ; i < rows . length ; ++ i ) {
var r = tableArray . push ( [ ] ) - 1 ,
cols = rows [ i ] . getElementsByTagName ( 'td' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( ii = 0 ; ii < headings . length ; ++ ii ) {
var cellContent = ' ' ;
if ( typeof cols [ ii ] !== 'undefined' ) {
cellContent = showdown . subParser ( 'makeMarkdown.tableCell' ) ( cols [ ii ] , globals ) ;
}
tableArray [ r ] . push ( cellContent ) ;
}
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var cellSpacesCount = 3 ;
for ( i = 0 ; i < tableArray . length ; ++ i ) {
for ( ii = 0 ; ii < tableArray [ i ] . length ; ++ ii ) {
var strLen = tableArray [ i ] [ ii ] . length ;
if ( strLen > cellSpacesCount ) {
cellSpacesCount = strLen ;
}
}
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( i = 0 ; i < tableArray . length ; ++ i ) {
for ( ii = 0 ; ii < tableArray [ i ] . length ; ++ ii ) {
if ( i === 1 ) {
if ( tableArray [ i ] [ ii ] . slice ( - 1 ) === ':' ) {
tableArray [ i ] [ ii ] = showdown . helper . padEnd ( tableArray [ i ] [ ii ] . slice ( - 1 ) , cellSpacesCount - 1 , '-' ) + ':' ;
} else {
tableArray [ i ] [ ii ] = showdown . helper . padEnd ( tableArray [ i ] [ ii ] , cellSpacesCount , '-' ) ;
}
} else {
tableArray [ i ] [ ii ] = showdown . helper . padEnd ( tableArray [ i ] [ ii ] , cellSpacesCount ) ;
}
}
txt += '| ' + tableArray [ i ] . join ( ' | ' ) + ' |\n' ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return txt . trim ( ) ;
2018-12-14 05:41:57 +01:00
} ) ;
2018-12-18 04:14:52 +01:00
showdown . subParser ( 'makeMarkdown.tableCell' , function ( node , globals ) {
2018-12-14 05:41:57 +01:00
'use strict' ;
2018-12-18 04:14:52 +01:00
var txt = '' ;
if ( ! node . hasChildNodes ( ) ) {
return '' ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
var children = node . childNodes ,
childrenLength = children . length ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( var i = 0 ; i < childrenLength ; ++ i ) {
txt += showdown . subParser ( 'makeMarkdown.node' ) ( children [ i ] , globals , true ) ;
}
return txt . trim ( ) ;
} ) ;
showdown . subParser ( 'makeMarkdown.txt' , function ( node ) {
'use strict' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var txt = node . nodeValue ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// multiple spaces are collapsed
txt = txt . replace ( / +/g , ' ' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// replace the custom ¨NBSP; with a space
txt = txt . replace ( /¨NBSP;/g , ' ' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// ", <, > and & should replace escaped html entities
txt = showdown . helper . unescapeHTMLEntities ( txt ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// escape markdown magic characters
// emphasis, strong and strikethrough - can appear everywhere
// we also escape pipe (|) because of tables
// and escape ` because of code blocks and spans
txt = txt . replace ( /([*_~|`])/g , '\\$1' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// escape > because of blockquotes
txt = txt . replace ( /^(\s*)>/g , '\\$1>' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// hash character, only troublesome at the beginning of a line because of headers
txt = txt . replace ( /^#/gm , '\\#' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// horizontal rules
txt = txt . replace ( /^(\s*)([-=]{3,})(\s*)$/ , '$1\\$2$3' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// dot, because of ordered lists, only troublesome at the beginning of a line when preceded by an integer
txt = txt . replace ( /^( {0,3}\d+)\./gm , '$1\\.' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// +, * and -, at the beginning of a line becomes a list, so we need to escape them also (asterisk was already escaped)
txt = txt . replace ( /^( {0,3})([+-])/gm , '$1\\$2' ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// images and links, ] followed by ( is problematic, so we escape it
txt = txt . replace ( /]([\s]*)\(/g , '\\]$1\\(' ) ;
// reference URIs must also be escaped
txt = txt . replace ( /^ {0,3}\[([\S \t]*?)]:/gm , '\\[$1]:' ) ;
return txt ;
2018-12-14 05:41:57 +01:00
} ) ;
2018-12-18 04:14:52 +01:00
var root = this ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// AMD Loader
if ( true ) {
! ( _ _WEBPACK _AMD _DEFINE _RESULT _ _ = ( function ( ) {
'use strict' ;
return showdown ;
} ) . call ( exports , _ _webpack _require _ _ , exports , module ) ,
_ _WEBPACK _AMD _DEFINE _RESULT _ _ !== undefined && ( module . exports = _ _WEBPACK _AMD _DEFINE _RESULT _ _ ) ) ;
// CommonJS/nodeJS Loader
} else { }
} ) . call ( this ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/***/ } ) ,
2018-12-14 05:41:57 +01:00
2019-03-21 13:48:00 +01:00
/***/ 24 :
2018-12-18 04:14:52 +01:00
/***/ ( function ( module , exports ) {
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
( function ( ) { module . exports = this [ "wp" ] [ "hooks" ] ; } ( ) ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/***/ } ) ,
2018-12-14 05:41:57 +01:00
2019-03-21 13:48:00 +01:00
/***/ 25 :
2018-12-18 04:14:52 +01:00
/***/ ( function ( module , exports ) {
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
( function ( ) { module . exports = this [ "wp" ] [ "dom" ] ; } ( ) ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/***/ } ) ,
2018-12-14 05:41:57 +01:00
2019-03-21 13:48:00 +01:00
/***/ 28 :
2018-12-18 04:14:52 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
"use strict" ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js
2019-03-21 13:48:00 +01:00
var arrayWithHoles = _ _webpack _require _ _ ( 37 ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js
function _iterableToArrayLimit ( arr , i ) {
var _arr = [ ] ;
var _n = true ;
var _d = false ;
var _e = undefined ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
try {
for ( var _i = arr [ Symbol . iterator ] ( ) , _s ; ! ( _n = ( _s = _i . next ( ) ) . done ) ; _n = true ) {
_arr . push ( _s . value ) ;
if ( i && _arr . length === i ) break ;
}
} catch ( err ) {
_d = true ;
_e = err ;
} finally {
try {
if ( ! _n && _i [ "return" ] != null ) _i [ "return" ] ( ) ;
} finally {
if ( _d ) throw _e ;
2018-12-14 05:41:57 +01:00
}
}
2018-12-18 04:14:52 +01:00
return _arr ;
}
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js
2019-03-21 13:48:00 +01:00
var nonIterableRest = _ _webpack _require _ _ ( 38 ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return _slicedToArray ; } ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function _slicedToArray ( arr , i ) {
return Object ( arrayWithHoles [ "a" /* default */ ] ) ( arr ) || _iterableToArrayLimit ( arr , i ) || Object ( nonIterableRest [ "a" /* default */ ] ) ( ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/***/ } ) ,
2018-12-14 05:41:57 +01:00
2019-03-21 13:48:00 +01:00
/***/ 30 :
2018-12-18 04:14:52 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
"use strict" ;
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
var LEAF _KEY , hasWeakMap ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
2019-03-07 10:09:59 +01:00
* Arbitrary value used as key for referencing cache object in WeakMap tree .
*
* @ type { Object }
2018-12-18 04:14:52 +01:00
* /
2019-03-07 10:09:59 +01:00
LEAF _KEY = { } ;
2018-12-14 05:41:57 +01:00
/ * *
2019-03-07 10:09:59 +01:00
* Whether environment supports WeakMap .
*
* @ type { boolean }
2018-12-14 05:41:57 +01:00
* /
2019-03-07 10:09:59 +01:00
hasWeakMap = typeof WeakMap !== 'undefined' ;
2018-12-18 04:14:52 +01:00
2018-12-14 05:41:57 +01:00
/ * *
2019-03-07 10:09:59 +01:00
* Returns the first argument as the sole entry in an array .
*
* @ param { * } value Value to return .
*
* @ return { Array } Value returned as entry in array .
2018-12-14 05:41:57 +01:00
* /
2019-03-07 10:09:59 +01:00
function arrayOf ( value ) {
return [ value ] ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
2019-03-07 10:09:59 +01:00
* Returns true if the value passed is object - like , or false otherwise . A value
* is object - like if it can support property assignment , e . g . object or array .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ param { * } value Value to test .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ return { boolean } Whether value is object - like .
2018-12-18 04:14:52 +01:00
* /
2019-03-07 10:09:59 +01:00
function isObjectLike ( value ) {
return ! ! value && 'object' === typeof value ;
}
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
/ * *
* Creates and returns a new cache object .
*
* @ return { Object } Cache object .
* /
function createCache ( ) {
var cache = {
clear : function ( ) {
cache . head = null ;
} ,
} ;
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
return cache ;
2018-12-18 04:14:52 +01:00
}
2019-03-07 10:09:59 +01:00
2018-12-18 04:14:52 +01:00
/ * *
2019-03-07 10:09:59 +01:00
* Returns true if entries within the two arrays are strictly equal by
* reference from a starting index .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ param { Array } a First array .
* @ param { Array } b Second array .
* @ param { number } fromIndex Index from which to start comparison .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ return { boolean } Whether arrays are shallowly equal .
2018-12-18 04:14:52 +01:00
* /
2019-03-07 10:09:59 +01:00
function isShallowEqual ( a , b , fromIndex ) {
var i ;
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
if ( a . length !== b . length ) {
return false ;
}
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
for ( i = fromIndex ; i < a . length ; i ++ ) {
if ( a [ i ] !== b [ i ] ) {
return false ;
}
}
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
return true ;
2018-12-18 04:14:52 +01:00
}
2019-03-07 10:09:59 +01:00
2018-12-18 04:14:52 +01:00
/ * *
2019-03-07 10:09:59 +01:00
* Returns a memoized selector function . The getDependants function argument is
* called before the memoized selector and is expected to return an immutable
* reference or array of references on which the selector depends for computing
* its own return value . The memoize cache is preserved only as long as those
* dependant references remain the same . If getDependants returns a different
* reference ( s ) , the cache is cleared and the selector value regenerated .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ param { Function } selector Selector function .
* @ param { Function } getDependants Dependant getter returning an immutable
* reference or array of reference used in
* cache bust consideration .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ return { Function } Memoized selector .
* /
/* harmony default export */ _ _webpack _exports _ _ [ "a" ] = ( function ( selector , getDependants ) {
var rootCache , getCache ;
// Use object source as dependant if getter not provided
if ( ! getDependants ) {
getDependants = arrayOf ;
}
/ * *
* Returns the root cache . If WeakMap is supported , this is assigned to the
* root WeakMap cache set , otherwise it is a shared instance of the default
* cache object .
*
* @ return { ( WeakMap | Object ) } Root cache object .
* /
function getRootCache ( ) {
return rootCache ;
}
/ * *
* Returns the cache for a given dependants array . When possible , a WeakMap
* will be used to create a unique cache for each set of dependants . This
* is feasible due to the nature of WeakMap in allowing garbage collection
* to occur on entries where the key object is no longer referenced . Since
* WeakMap requires the key to be an object , this is only possible when the
* dependant is object - like . The root cache is created as a hierarchy where
* each top - level key is the first entry in a dependants set , the value a
* WeakMap where each key is the next dependant , and so on . This continues
* so long as the dependants are object - like . If no dependants are object -
* like , then the cache is shared across all invocations .
*
* @ see isObjectLike
*
* @ param { Array } dependants Selector dependants .
*
* @ return { Object } Cache object .
* /
function getWeakMapCache ( dependants ) {
var caches = rootCache ,
isUniqueByDependants = true ,
i , dependant , map , cache ;
for ( i = 0 ; i < dependants . length ; i ++ ) {
dependant = dependants [ i ] ;
// Can only compose WeakMap from object-like key.
if ( ! isObjectLike ( dependant ) ) {
isUniqueByDependants = false ;
break ;
}
// Does current segment of cache already have a WeakMap?
if ( caches . has ( dependant ) ) {
// Traverse into nested WeakMap.
caches = caches . get ( dependant ) ;
} else {
// Create, set, and traverse into a new one.
map = new WeakMap ( ) ;
caches . set ( dependant , map ) ;
caches = map ;
}
}
// We use an arbitrary (but consistent) object as key for the last item
// in the WeakMap to serve as our running cache.
if ( ! caches . has ( LEAF _KEY ) ) {
cache = createCache ( ) ;
cache . isUniqueByDependants = isUniqueByDependants ;
caches . set ( LEAF _KEY , cache ) ;
}
return caches . get ( LEAF _KEY ) ;
}
// Assign cache handler by availability of WeakMap
getCache = hasWeakMap ? getWeakMapCache : getRootCache ;
/ * *
* Resets root memoization cache .
* /
function clear ( ) {
rootCache = hasWeakMap ? new WeakMap ( ) : createCache ( ) ;
}
// eslint-disable-next-line jsdoc/check-param-names
/ * *
* The augmented selector call , considering first whether dependants have
* changed before passing it to underlying memoize function .
*
* @ param { Object } source Source object for derivation .
* @ param { ... * } extraArgs Additional arguments to pass to selector .
*
* @ return { * } Selector result .
* /
function callSelector ( /* source, ...extraArgs */ ) {
var len = arguments . length ,
cache , node , i , args , dependants ;
// Create copy of arguments (avoid leaking deoptimization).
args = new Array ( len ) ;
for ( i = 0 ; i < len ; i ++ ) {
args [ i ] = arguments [ i ] ;
}
dependants = getDependants . apply ( null , args ) ;
cache = getCache ( dependants ) ;
// If not guaranteed uniqueness by dependants (primitive type or lack
// of WeakMap support), shallow compare against last dependants and, if
// references have changed, destroy cache to recalculate result.
if ( ! cache . isUniqueByDependants ) {
if ( cache . lastDependants && ! isShallowEqual ( dependants , cache . lastDependants , 0 ) ) {
cache . clear ( ) ;
}
cache . lastDependants = dependants ;
}
node = cache . head ;
while ( node ) {
// Check whether node arguments match arguments
if ( ! isShallowEqual ( node . args , args , 1 ) ) {
node = node . next ;
continue ;
}
// At this point we can assume we've found a match
// Surface matched node to head if not already
if ( node !== cache . head ) {
// Adjust siblings to point to each other.
node . prev . next = node . next ;
if ( node . next ) {
node . next . prev = node . prev ;
}
node . next = cache . head ;
node . prev = null ;
cache . head . prev = node ;
cache . head = node ;
}
// Return immediately
return node . val ;
}
// No cached value found. Continue to insertion phase:
node = {
// Generate the result from original function
val : selector . apply ( null , args ) ,
} ;
// Avoid including the source object in the cache.
args [ 0 ] = null ;
node . args = args ;
// Don't need to check whether node is already head, since it would
// have been returned above already if it was
// Shift existing head down list
if ( cache . head ) {
cache . head . prev = node ;
node . next = cache . head ;
}
cache . head = node ;
return node . val ;
}
callSelector . getDependants = getDependants ;
callSelector . clear = clear ;
clear ( ) ;
return callSelector ;
} ) ;
/***/ } ) ,
2019-03-21 13:48:00 +01:00
/***/ 34 :
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return _iterableToArray ; } ) ;
function _iterableToArray ( iter ) {
if ( Symbol . iterator in Object ( iter ) || Object . prototype . toString . call ( iter ) === "[object Arguments]" ) return Array . from ( iter ) ;
}
/***/ } ) ,
/***/ 35 :
/***/ ( function ( module , exports ) {
( function ( ) { module . exports = this [ "wp" ] [ "blob" ] ; } ( ) ) ;
/***/ } ) ,
/***/ 362 :
2019-03-07 10:09:59 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
var selectors _namespaceObject = { } ;
_ _webpack _require _ _ . r ( selectors _namespaceObject ) ;
_ _webpack _require _ _ . d ( selectors _namespaceObject , "getBlockTypes" , function ( ) { return getBlockTypes ; } ) ;
_ _webpack _require _ _ . d ( selectors _namespaceObject , "getBlockType" , function ( ) { return getBlockType ; } ) ;
_ _webpack _require _ _ . d ( selectors _namespaceObject , "getBlockStyles" , function ( ) { return getBlockStyles ; } ) ;
_ _webpack _require _ _ . d ( selectors _namespaceObject , "getCategories" , function ( ) { return getCategories ; } ) ;
_ _webpack _require _ _ . d ( selectors _namespaceObject , "getDefaultBlockName" , function ( ) { return getDefaultBlockName ; } ) ;
_ _webpack _require _ _ . d ( selectors _namespaceObject , "getFreeformFallbackBlockName" , function ( ) { return getFreeformFallbackBlockName ; } ) ;
_ _webpack _require _ _ . d ( selectors _namespaceObject , "getUnregisteredFallbackBlockName" , function ( ) { return getUnregisteredFallbackBlockName ; } ) ;
_ _webpack _require _ _ . d ( selectors _namespaceObject , "getChildBlockNames" , function ( ) { return selectors _getChildBlockNames ; } ) ;
_ _webpack _require _ _ . d ( selectors _namespaceObject , "getBlockSupport" , function ( ) { return selectors _getBlockSupport ; } ) ;
_ _webpack _require _ _ . d ( selectors _namespaceObject , "hasBlockSupport" , function ( ) { return hasBlockSupport ; } ) ;
2019-03-21 13:48:00 +01:00
_ _webpack _require _ _ . d ( selectors _namespaceObject , "isMatchingSearchTerm" , function ( ) { return isMatchingSearchTerm ; } ) ;
2019-03-07 10:09:59 +01:00
_ _webpack _require _ _ . d ( selectors _namespaceObject , "hasChildBlocks" , function ( ) { return selectors _hasChildBlocks ; } ) ;
_ _webpack _require _ _ . d ( selectors _namespaceObject , "hasChildBlocksWithInserterSupport" , function ( ) { return selectors _hasChildBlocksWithInserterSupport ; } ) ;
var actions _namespaceObject = { } ;
_ _webpack _require _ _ . r ( actions _namespaceObject ) ;
_ _webpack _require _ _ . d ( actions _namespaceObject , "addBlockTypes" , function ( ) { return addBlockTypes ; } ) ;
_ _webpack _require _ _ . d ( actions _namespaceObject , "removeBlockTypes" , function ( ) { return removeBlockTypes ; } ) ;
_ _webpack _require _ _ . d ( actions _namespaceObject , "addBlockStyles" , function ( ) { return addBlockStyles ; } ) ;
_ _webpack _require _ _ . d ( actions _namespaceObject , "removeBlockStyles" , function ( ) { return removeBlockStyles ; } ) ;
_ _webpack _require _ _ . d ( actions _namespaceObject , "setDefaultBlockName" , function ( ) { return setDefaultBlockName ; } ) ;
_ _webpack _require _ _ . d ( actions _namespaceObject , "setFreeformFallbackBlockName" , function ( ) { return setFreeformFallbackBlockName ; } ) ;
_ _webpack _require _ _ . d ( actions _namespaceObject , "setUnregisteredFallbackBlockName" , function ( ) { return setUnregisteredFallbackBlockName ; } ) ;
_ _webpack _require _ _ . d ( actions _namespaceObject , "setCategories" , function ( ) { return setCategories ; } ) ;
_ _webpack _require _ _ . d ( actions _namespaceObject , "updateCategory" , function ( ) { return updateCategory ; } ) ;
// EXTERNAL MODULE: external {"this":["wp","data"]}
var external _this _wp _data _ = _ _webpack _require _ _ ( 5 ) ;
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js
var defineProperty = _ _webpack _require _ _ ( 15 ) ;
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js + 2 modules
2019-03-21 13:48:00 +01:00
var toConsumableArray = _ _webpack _require _ _ ( 17 ) ;
2019-03-07 10:09:59 +01:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/objectSpread.js
2019-03-21 13:48:00 +01:00
var objectSpread = _ _webpack _require _ _ ( 7 ) ;
2019-03-07 10:09:59 +01:00
// EXTERNAL MODULE: external "lodash"
var external _lodash _ = _ _webpack _require _ _ ( 2 ) ;
// EXTERNAL MODULE: external {"this":["wp","i18n"]}
var external _this _wp _i18n _ = _ _webpack _require _ _ ( 1 ) ;
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/store/reducer.js
/ * *
* External dependencies
* /
/ * *
* WordPress dependencies
* /
/ * *
* Module Constants
* /
var DEFAULT _CATEGORIES = [ {
slug : 'common' ,
title : Object ( external _this _wp _i18n _ [ "__" ] ) ( 'Common Blocks' )
} , {
slug : 'formatting' ,
title : Object ( external _this _wp _i18n _ [ "__" ] ) ( 'Formatting' )
} , {
slug : 'layout' ,
title : Object ( external _this _wp _i18n _ [ "__" ] ) ( 'Layout Elements' )
} , {
slug : 'widgets' ,
title : Object ( external _this _wp _i18n _ [ "__" ] ) ( 'Widgets' )
} , {
slug : 'embed' ,
title : Object ( external _this _wp _i18n _ [ "__" ] ) ( 'Embeds' )
} , {
slug : 'reusable' ,
title : Object ( external _this _wp _i18n _ [ "__" ] ) ( 'Reusable Blocks' )
} ] ;
/ * *
* Reducer managing the block types
*
* @ param { Object } state Current state .
* @ param { Object } action Dispatched action .
*
* @ return { Object } Updated state .
* /
function reducer _blockTypes ( ) {
var state = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : { } ;
var action = arguments . length > 1 ? arguments [ 1 ] : undefined ;
switch ( action . type ) {
case 'ADD_BLOCK_TYPES' :
return Object ( objectSpread [ "a" /* default */ ] ) ( { } , state , Object ( external _lodash _ [ "keyBy" ] ) ( Object ( external _lodash _ [ "map" ] ) ( action . blockTypes , function ( blockType ) {
return Object ( external _lodash _ [ "omit" ] ) ( blockType , 'styles ' ) ;
} ) , 'name' ) ) ;
case 'REMOVE_BLOCK_TYPES' :
return Object ( external _lodash _ [ "omit" ] ) ( state , action . names ) ;
}
return state ;
}
/ * *
* Reducer managing the block style variations .
*
* @ param { Object } state Current state .
* @ param { Object } action Dispatched action .
*
* @ return { Object } Updated state .
* /
function blockStyles ( ) {
var state = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : { } ;
var action = arguments . length > 1 ? arguments [ 1 ] : undefined ;
switch ( action . type ) {
case 'ADD_BLOCK_TYPES' :
return Object ( objectSpread [ "a" /* default */ ] ) ( { } , state , Object ( external _lodash _ [ "mapValues" ] ) ( Object ( external _lodash _ [ "keyBy" ] ) ( action . blockTypes , 'name' ) , function ( blockType ) {
return Object ( external _lodash _ [ "uniqBy" ] ) ( [ ] . concat ( Object ( toConsumableArray [ "a" /* default */ ] ) ( Object ( external _lodash _ [ "get" ] ) ( blockType , [ 'styles' ] , [ ] ) ) , Object ( toConsumableArray [ "a" /* default */ ] ) ( Object ( external _lodash _ [ "get" ] ) ( state , [ blockType . name ] , [ ] ) ) ) , function ( style ) {
return style . name ;
} ) ;
} ) ) ;
case 'ADD_BLOCK_STYLES' :
return Object ( objectSpread [ "a" /* default */ ] ) ( { } , state , Object ( defineProperty [ "a" /* default */ ] ) ( { } , action . blockName , Object ( external _lodash _ [ "uniqBy" ] ) ( [ ] . concat ( Object ( toConsumableArray [ "a" /* default */ ] ) ( Object ( external _lodash _ [ "get" ] ) ( state , [ action . blockName ] , [ ] ) ) , Object ( toConsumableArray [ "a" /* default */ ] ) ( action . styles ) ) , function ( style ) {
return style . name ;
} ) ) ) ;
case 'REMOVE_BLOCK_STYLES' :
return Object ( objectSpread [ "a" /* default */ ] ) ( { } , state , Object ( defineProperty [ "a" /* default */ ] ) ( { } , action . blockName , Object ( external _lodash _ [ "filter" ] ) ( Object ( external _lodash _ [ "get" ] ) ( state , [ action . blockName ] , [ ] ) , function ( style ) {
return action . styleNames . indexOf ( style . name ) === - 1 ;
} ) ) ) ;
}
return state ;
}
/ * *
* Higher - order Reducer creating a reducer keeping track of given block name .
*
* @ param { string } setActionType Action type .
*
* @ return { function } Reducer .
2018-12-18 04:14:52 +01:00
* /
function createBlockNameSetterReducer ( setActionType ) {
return function ( ) {
var state = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : null ;
var action = arguments . length > 1 ? arguments [ 1 ] : undefined ;
switch ( action . type ) {
case 'REMOVE_BLOCK_TYPES' :
if ( action . names . indexOf ( state ) !== - 1 ) {
return null ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return state ;
case setActionType :
return action . name || null ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return state ;
} ;
}
var reducer _defaultBlockName = createBlockNameSetterReducer ( 'SET_DEFAULT_BLOCK_NAME' ) ;
var freeformFallbackBlockName = createBlockNameSetterReducer ( 'SET_FREEFORM_FALLBACK_BLOCK_NAME' ) ;
var unregisteredFallbackBlockName = createBlockNameSetterReducer ( 'SET_UNREGISTERED_FALLBACK_BLOCK_NAME' ) ;
/ * *
* Reducer managing the categories
*
* @ param { Object } state Current state .
* @ param { Object } action Dispatched action .
*
* @ return { Object } Updated state .
* /
function reducer _categories ( ) {
var state = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : DEFAULT _CATEGORIES ;
var action = arguments . length > 1 ? arguments [ 1 ] : undefined ;
2018-12-19 04:16:48 +01:00
switch ( action . type ) {
case 'SET_CATEGORIES' :
return action . categories || [ ] ;
case 'UPDATE_CATEGORY' :
{
if ( ! action . category || Object ( external _lodash _ [ "isEmpty" ] ) ( action . category ) ) {
return state ;
}
var categoryToChange = Object ( external _lodash _ [ "find" ] ) ( state , [ 'slug' , action . slug ] ) ;
if ( categoryToChange ) {
return Object ( external _lodash _ [ "map" ] ) ( state , function ( category ) {
if ( category . slug === action . slug ) {
return Object ( objectSpread [ "a" /* default */ ] ) ( { } , category , action . category ) ;
}
return category ;
} ) ;
}
}
2018-12-18 04:14:52 +01:00
}
return state ;
}
/* harmony default export */ var reducer = ( Object ( external _this _wp _data _ [ "combineReducers" ] ) ( {
blockTypes : reducer _blockTypes ,
blockStyles : blockStyles ,
defaultBlockName : reducer _defaultBlockName ,
freeformFallbackBlockName : freeformFallbackBlockName ,
unregisteredFallbackBlockName : unregisteredFallbackBlockName ,
categories : reducer _categories
} ) ) ;
// EXTERNAL MODULE: ./node_modules/rememo/es/rememo.js
2019-03-21 13:48:00 +01:00
var rememo = _ _webpack _require _ _ ( 30 ) ;
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/store/selectors.js
/ * *
* External dependencies
* /
2019-03-21 13:48:00 +01:00
/ * *
* Given a block name or block type object , returns the corresponding
* normalized block type object .
*
* @ param { Object } state Blocks state .
* @ param { ( string | Object ) } nameOrType Block name or type object
*
* @ return { Object } Block type object .
* /
var getNormalizedBlockType = function getNormalizedBlockType ( state , nameOrType ) {
return 'string' === typeof nameOrType ? getBlockType ( state , nameOrType ) : nameOrType ;
} ;
2018-12-18 04:14:52 +01:00
/ * *
* Returns all the available block types .
*
* @ param { Object } state Data state .
*
* @ return { Array } Block Types .
* /
2019-03-21 13:48:00 +01:00
2018-12-18 04:14:52 +01:00
var getBlockTypes = Object ( rememo [ "a" /* default */ ] ) ( function ( state ) {
return Object . values ( state . blockTypes ) ;
} , function ( state ) {
return [ state . blockTypes ] ;
} ) ;
/ * *
* Returns a block type by name .
*
* @ param { Object } state Data state .
* @ param { string } name Block type name .
*
* @ return { Object ? } Block Type .
* /
function getBlockType ( state , name ) {
return state . blockTypes [ name ] ;
}
/ * *
* Returns block styles by block name .
*
* @ param { Object } state Data state .
* @ param { string } name Block type name .
*
* @ return { Array ? } Block Styles .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function getBlockStyles ( state , name ) {
return state . blockStyles [ name ] ;
}
/ * *
* Returns all the available categories .
*
* @ param { Object } state Data state .
*
* @ return { Array } Categories list .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function getCategories ( state ) {
return state . categories ;
}
/ * *
* Returns the name of the default block name .
*
* @ param { Object } state Data state .
*
* @ return { string ? } Default block name .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function getDefaultBlockName ( state ) {
return state . defaultBlockName ;
}
/ * *
* Returns the name of the block for handling non - block content .
*
* @ param { Object } state Data state .
*
* @ return { string ? } Name of the block for handling non - block content .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function getFreeformFallbackBlockName ( state ) {
return state . freeformFallbackBlockName ;
}
/ * *
* Returns the name of the block for handling unregistered blocks .
*
* @ param { Object } state Data state .
*
* @ return { string ? } Name of the block for handling unregistered blocks .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function getUnregisteredFallbackBlockName ( state ) {
return state . unregisteredFallbackBlockName ;
}
/ * *
* Returns an array with the child blocks of a given block .
*
* @ param { Object } state Data state .
* @ param { string } blockName Block type name .
*
* @ return { Array } Array of child block names .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var selectors _getChildBlockNames = Object ( rememo [ "a" /* default */ ] ) ( function ( state , blockName ) {
return Object ( external _lodash _ [ "map" ] ) ( Object ( external _lodash _ [ "filter" ] ) ( state . blockTypes , function ( blockType ) {
return Object ( external _lodash _ [ "includes" ] ) ( blockType . parent , blockName ) ;
} ) , function ( _ref ) {
var name = _ref . name ;
return name ;
} ) ;
} , function ( state ) {
return [ state . blockTypes ] ;
} ) ;
/ * *
* Returns the block support value for a feature , if defined .
*
* @ param { Object } state Data state .
* @ param { ( string | Object ) } nameOrType Block name or type object
* @ param { string } feature Feature to retrieve
* @ param { * } defaultSupports Default value to return if not
* explicitly defined
*
* @ return { ? * } Block support value
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var selectors _getBlockSupport = function getBlockSupport ( state , nameOrType , feature , defaultSupports ) {
2019-03-21 13:48:00 +01:00
var blockType = getNormalizedBlockType ( state , nameOrType ) ;
2018-12-18 04:14:52 +01:00
return Object ( external _lodash _ [ "get" ] ) ( blockType , [ 'supports' , feature ] , defaultSupports ) ;
} ;
/ * *
* Returns true if the block defines support for a feature , or false otherwise .
*
* @ param { Object } state Data state .
* @ param { ( string | Object ) } nameOrType Block name or type object .
* @ param { string } feature Feature to test .
* @ param { boolean } defaultSupports Whether feature is supported by
* default if not explicitly defined .
*
* @ return { boolean } Whether block supports feature .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function hasBlockSupport ( state , nameOrType , feature , defaultSupports ) {
return ! ! selectors _getBlockSupport ( state , nameOrType , feature , defaultSupports ) ;
}
2019-03-21 13:48:00 +01:00
/ * *
* Returns true if the block type by the given name or object value matches a
* search term , or false otherwise .
*
* @ param { Object } state Blocks state .
* @ param { ( string | Object ) } nameOrType Block name or type object .
* @ param { string } searchTerm Search term by which to filter .
*
* @ return { Object [ ] } Wheter block type matches search term .
* /
function isMatchingSearchTerm ( state , nameOrType , searchTerm ) {
var blockType = getNormalizedBlockType ( state , nameOrType ) ;
var getNormalizedSearchTerm = Object ( external _lodash _ [ "flow" ] ) ( [ // Disregard diacritics.
// Input: "média"
external _lodash _ [ "deburr" ] , // Lowercase.
// Input: "MEDIA"
function ( term ) {
return term . toLowerCase ( ) ;
} , // Strip leading and trailing whitespace.
// Input: " media "
function ( term ) {
return term . trim ( ) ;
} ] ) ;
var normalizedSearchTerm = getNormalizedSearchTerm ( searchTerm ) ;
var isSearchMatch = Object ( external _lodash _ [ "flow" ] ) ( [ getNormalizedSearchTerm , function ( normalizedCandidate ) {
return Object ( external _lodash _ [ "includes" ] ) ( normalizedCandidate , normalizedSearchTerm ) ;
} ] ) ;
return isSearchMatch ( blockType . title ) || Object ( external _lodash _ [ "some" ] ) ( blockType . keywords , isSearchMatch ) || isSearchMatch ( blockType . category ) ;
}
2018-12-18 04:14:52 +01:00
/ * *
* Returns a boolean indicating if a block has child blocks or not .
*
* @ param { Object } state Data state .
* @ param { string } blockName Block type name .
*
* @ return { boolean } True if a block contains child blocks and false otherwise .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var selectors _hasChildBlocks = function hasChildBlocks ( state , blockName ) {
return selectors _getChildBlockNames ( state , blockName ) . length > 0 ;
} ;
/ * *
* Returns a boolean indicating if a block has at least one child block with inserter support .
*
* @ param { Object } state Data state .
* @ param { string } blockName Block type name .
*
* @ return { boolean } True if a block contains at least one child blocks with inserter support
* and false otherwise .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var selectors _hasChildBlocksWithInserterSupport = function hasChildBlocksWithInserterSupport ( state , blockName ) {
return Object ( external _lodash _ [ "some" ] ) ( selectors _getChildBlockNames ( state , blockName ) , function ( childBlockName ) {
return hasBlockSupport ( state , childBlockName , 'inserter' , true ) ;
} ) ;
} ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/store/actions.js
/ * *
* External dependencies
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Returns an action object used in signalling that block types have been added .
*
* @ param { Array | Object } blockTypes Block types received .
*
* @ return { Object } Action object .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function addBlockTypes ( blockTypes ) {
return {
type : 'ADD_BLOCK_TYPES' ,
blockTypes : Object ( external _lodash _ [ "castArray" ] ) ( blockTypes )
} ;
}
/ * *
* Returns an action object used to remove a registered block type .
*
* @ param { string | Array } names Block name .
*
* @ return { Object } Action object .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function removeBlockTypes ( names ) {
return {
type : 'REMOVE_BLOCK_TYPES' ,
names : Object ( external _lodash _ [ "castArray" ] ) ( names )
} ;
}
/ * *
* Returns an action object used in signalling that new block styles have been added .
*
* @ param { string } blockName Block name .
* @ param { Array | Object } styles Block styles .
*
* @ return { Object } Action object .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function addBlockStyles ( blockName , styles ) {
return {
type : 'ADD_BLOCK_STYLES' ,
styles : Object ( external _lodash _ [ "castArray" ] ) ( styles ) ,
blockName : blockName
} ;
}
/ * *
* Returns an action object used in signalling that block styles have been removed .
*
* @ param { string } blockName Block name .
* @ param { Array | string } styleNames Block style names .
*
* @ return { Object } Action object .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function removeBlockStyles ( blockName , styleNames ) {
return {
type : 'REMOVE_BLOCK_STYLES' ,
styleNames : Object ( external _lodash _ [ "castArray" ] ) ( styleNames ) ,
blockName : blockName
} ;
}
/ * *
* Returns an action object used to set the default block name .
*
* @ param { string } name Block name .
*
* @ return { Object } Action object .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function setDefaultBlockName ( name ) {
return {
type : 'SET_DEFAULT_BLOCK_NAME' ,
name : name
} ;
}
/ * *
* Returns an action object used to set the name of the block used as a fallback
* for non - block content .
*
* @ param { string } name Block name .
*
* @ return { Object } Action object .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function setFreeformFallbackBlockName ( name ) {
return {
type : 'SET_FREEFORM_FALLBACK_BLOCK_NAME' ,
name : name
} ;
}
/ * *
* Returns an action object used to set the name of the block used as a fallback
* for unregistered blocks .
*
* @ param { string } name Block name .
*
* @ return { Object } Action object .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function setUnregisteredFallbackBlockName ( name ) {
return {
type : 'SET_UNREGISTERED_FALLBACK_BLOCK_NAME' ,
name : name
} ;
}
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Returns an action object used to set block categories .
*
* @ param { Object [ ] } categories Block categories .
*
* @ return { Object } Action object .
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
function setCategories ( categories ) {
return {
type : 'SET_CATEGORIES' ,
categories : categories
} ;
}
2018-12-19 04:16:48 +01:00
/ * *
* Returns an action object used to update a category .
*
* @ param { string } slug Block category slug .
* @ param { Object } category Object containing the category properties that should be updated .
*
* @ return { Object } Action object .
* /
function updateCategory ( slug , category ) {
return {
type : 'UPDATE_CATEGORY' ,
slug : slug ,
category : category
} ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/store/index.js
/ * *
* WordPress dependencies
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Internal dependencies
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
Object ( external _this _wp _data _ [ "registerStore" ] ) ( 'core/blocks' , {
reducer : reducer ,
selectors : selectors _namespaceObject ,
actions : actions _namespaceObject
} ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: ./node_modules/uuid/v4.js
2019-03-21 13:48:00 +01:00
var v4 = _ _webpack _require _ _ ( 65 ) ;
2018-12-18 04:14:52 +01:00
var v4 _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( v4 ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: external {"this":["wp","hooks"]}
2019-03-21 13:48:00 +01:00
var external _this _wp _hooks _ = _ _webpack _require _ _ ( 24 ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: ./node_modules/tinycolor2/tinycolor.js
var tinycolor = _ _webpack _require _ _ ( 45 ) ;
var tinycolor _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( tinycolor ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: external {"this":["wp","element"]}
var external _this _wp _element _ = _ _webpack _require _ _ ( 0 ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/utils.js
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* External dependencies
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* WordPress dependencies
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Internal dependencies
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Array of icon colors containing a color to be used if the icon color
* was not explicitly set but the icon background color was .
*
* @ type { Object }
* /
var ICON _COLORS = [ '#191e23' , '#f8f9f9' ] ;
/ * *
* Determines whether the block is a default block
* and its attributes are equal to the default attributes
* which means the block is unmodified .
*
* @ param { WPBlock } block Block Object
*
* @ return { boolean } Whether the block is an unmodified default block
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function isUnmodifiedDefaultBlock ( block ) {
var defaultBlockName = registration _getDefaultBlockName ( ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( block . name !== defaultBlockName ) {
return false ;
2018-12-19 04:16:48 +01:00
} // Cache a created default block if no cache exists or the default block
// name changed.
if ( ! isUnmodifiedDefaultBlock . block || isUnmodifiedDefaultBlock . block . name !== defaultBlockName ) {
isUnmodifiedDefaultBlock . block = createBlock ( defaultBlockName ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-19 04:16:48 +01:00
var newDefaultBlock = isUnmodifiedDefaultBlock . block ;
var blockType = registration _getBlockType ( defaultBlockName ) ;
return Object ( external _lodash _ [ "every" ] ) ( blockType . attributes , function ( value , key ) {
return newDefaultBlock . attributes [ key ] === block . attributes [ key ] ;
2018-12-18 04:14:52 +01:00
} ) ;
}
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Function that checks if the parameter is a valid icon .
*
* @ param { * } icon Parameter to be checked .
*
* @ return { boolean } True if the parameter is a valid icon and false otherwise .
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
function isValidIcon ( icon ) {
return ! ! icon && ( Object ( external _lodash _ [ "isString" ] ) ( icon ) || Object ( external _this _wp _element _ [ "isValidElement" ] ) ( icon ) || Object ( external _lodash _ [ "isFunction" ] ) ( icon ) || icon instanceof external _this _wp _element _ [ "Component" ] ) ;
}
/ * *
* Function that receives an icon as set by the blocks during the registration
* and returns a new icon object that is normalized so we can rely on just on possible icon structure
* in the codebase .
*
* @ param { ( Object | string | WPElement ) } icon Slug of the Dashicon to be shown
* as the icon for the block in the
* inserter , or element or an object describing the icon .
*
* @ return { Object } Object describing the icon .
* /
function normalizeIconObject ( icon ) {
if ( ! icon ) {
icon = 'block-default' ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
if ( isValidIcon ( icon ) ) {
return {
src : icon
} ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( Object ( external _lodash _ [ "has" ] ) ( icon , [ 'background' ] ) ) {
var tinyBgColor = tinycolor _default ( ) ( icon . background ) ;
return Object ( objectSpread [ "a" /* default */ ] ) ( { } , icon , {
foreground : icon . foreground ? icon . foreground : Object ( tinycolor [ "mostReadable" ] ) ( tinyBgColor , ICON _COLORS , {
includeFallbackColors : true ,
level : 'AA' ,
size : 'large'
} ) . toHexString ( ) ,
shadowColor : tinyBgColor . setAlpha ( 0.3 ) . toRgbString ( )
} ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return icon ;
}
/ * *
* Normalizes block type passed as param . When string is passed then
* it converts it to the matching block type object .
* It passes the original object otherwise .
*
* @ param { string | Object } blockTypeOrName Block type or name .
*
* @ return { ? Object } Block type .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function normalizeBlockType ( blockTypeOrName ) {
if ( Object ( external _lodash _ [ "isString" ] ) ( blockTypeOrName ) ) {
return registration _getBlockType ( blockTypeOrName ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return blockTypeOrName ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/registration.js
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/* eslint no-console: [ 'error', { allow: [ 'error' ] } ] */
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* External dependencies
2018-12-14 05:41:57 +01:00
* /
/ * *
2018-12-18 04:14:52 +01:00
* WordPress dependencies
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
/ * *
* Internal dependencies
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Defined behavior of a block type .
*
* @ typedef { WPBlockType }
*
* @ property { string } name Block ' s namespaced name .
* @ property { string } title Human - readable label for a block .
* Shown in the block inserter .
* @ property { string } category Category classification of block ,
* impacting where block is shown in
* inserter results .
* @ property { ( Object | string | WPElement ) } icon Slug of the Dashicon to be shown
* as the icon for the block in the
* inserter , or element or an object describing the icon .
* @ property { ? string [ ] } keywords Additional keywords to produce
* block as inserter search result .
* @ property { ? Object } attributes Block attributes .
* @ property { Function } save Serialize behavior of a block ,
* returning an element describing
* structure of the block ' s post
* content markup .
* @ property { WPComponent } edit Component rendering element to be
* interacted with in an editor .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var serverSideBlockDefinitions = { } ;
/ * *
* Set the server side block definition of blocks .
*
* @ param { Object } definitions Server - side block definitions
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function unstable _ _bootstrapServerSideBlockDefinitions ( definitions ) {
// eslint-disable-line camelcase
serverSideBlockDefinitions = definitions ;
}
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Registers a new block provided a unique name and an object defining its
* behavior . Once registered , the block is made available as an option to any
* editor interface where blocks are implemented .
*
* @ param { string } name Block name .
* @ param { Object } settings Block settings .
*
* @ return { ? WPBlock } The block , if it has been successfully registered ;
* otherwise ` undefined ` .
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
function registerBlockType ( name , settings ) {
settings = Object ( objectSpread [ "a" /* default */ ] ) ( {
name : name
} , Object ( external _lodash _ [ "get" ] ) ( serverSideBlockDefinitions , name ) , settings ) ;
if ( typeof name !== 'string' ) {
console . error ( 'Block names must be strings.' ) ;
return ;
}
if ( ! /^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/ . test ( name ) ) {
console . error ( 'Block names must contain a namespace prefix, include only lowercase alphanumeric characters or dashes, and start with a letter. Example: my-plugin/my-custom-block' ) ;
return ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . getBlockType ( name ) ) {
console . error ( 'Block "' + name + '" is already registered.' ) ;
return ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
settings = Object ( external _this _wp _hooks _ [ "applyFilters" ] ) ( 'blocks.registerBlockType' , settings , name ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! settings || ! Object ( external _lodash _ [ "isFunction" ] ) ( settings . save ) ) {
console . error ( 'The "save" property must be specified and must be a valid function.' ) ;
return ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( 'edit' in settings && ! Object ( external _lodash _ [ "isFunction" ] ) ( settings . edit ) ) {
console . error ( 'The "edit" property must be a valid function.' ) ;
return ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! ( 'category' in settings ) ) {
console . error ( 'The block "' + name + '" must have a category.' ) ;
return ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( 'category' in settings && ! Object ( external _lodash _ [ "some" ] ) ( Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . getCategories ( ) , {
slug : settings . category
} ) ) {
console . error ( 'The block "' + name + '" must have a registered category.' ) ;
return ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! ( 'title' in settings ) || settings . title === '' ) {
console . error ( 'The block "' + name + '" must have a title.' ) ;
return ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
if ( typeof settings . title !== 'string' ) {
console . error ( 'Block titles must be strings.' ) ;
return ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
settings . icon = normalizeIconObject ( settings . icon ) ;
if ( ! isValidIcon ( settings . icon . src ) ) {
2019-03-07 10:09:59 +01:00
console . error ( 'The icon passed is invalid. ' + 'The icon should be a string, an element, a function, or an object following the specifications documented in https://wordpress.org/gutenberg/handbook/designers-developers/developers/block-api/block-registration/#icon-optional' ) ;
2018-12-18 04:14:52 +01:00
return ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
Object ( external _this _wp _data _ [ "dispatch" ] ) ( 'core/blocks' ) . addBlockTypes ( settings ) ;
return settings ;
}
/ * *
* Unregisters a block .
*
* @ param { string } name Block name .
*
* @ return { ? WPBlock } The previous block value , if it has been successfully
* unregistered ; otherwise ` undefined ` .
* /
function unregisterBlockType ( name ) {
var oldBlock = Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . getBlockType ( name ) ;
if ( ! oldBlock ) {
console . error ( 'Block "' + name + '" is not registered.' ) ;
return ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
Object ( external _this _wp _data _ [ "dispatch" ] ) ( 'core/blocks' ) . removeBlockTypes ( name ) ;
return oldBlock ;
}
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Assigns name of block for handling non - block content .
*
* @ param { string } blockName Block name .
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
function setFreeformContentHandlerName ( blockName ) {
Object ( external _this _wp _data _ [ "dispatch" ] ) ( 'core/blocks' ) . setFreeformFallbackBlockName ( blockName ) ;
}
/ * *
* Retrieves name of block handling non - block content , or undefined if no
* handler has been defined .
*
* @ return { ? string } Blog name .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function getFreeformContentHandlerName ( ) {
return Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . getFreeformFallbackBlockName ( ) ;
}
/ * *
* Assigns name of block handling unregistered block types .
*
* @ param { string } blockName Block name .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function setUnregisteredTypeHandlerName ( blockName ) {
Object ( external _this _wp _data _ [ "dispatch" ] ) ( 'core/blocks' ) . setUnregisteredFallbackBlockName ( blockName ) ;
}
/ * *
* Retrieves name of block handling unregistered block types , or undefined if no
* handler has been defined .
*
* @ return { ? string } Blog name .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function getUnregisteredTypeHandlerName ( ) {
return Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . getUnregisteredFallbackBlockName ( ) ;
}
/ * *
* Assigns the default block name .
*
* @ param { string } name Block name .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function registration _setDefaultBlockName ( name ) {
Object ( external _this _wp _data _ [ "dispatch" ] ) ( 'core/blocks' ) . setDefaultBlockName ( name ) ;
}
/ * *
* Retrieves the default block name .
*
* @ return { ? string } Block name .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function registration _getDefaultBlockName ( ) {
return Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . getDefaultBlockName ( ) ;
}
/ * *
* Returns a registered block type .
*
* @ param { string } name Block name .
*
* @ return { ? Object } Block type .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function registration _getBlockType ( name ) {
return Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . getBlockType ( name ) ;
}
/ * *
* Returns all registered blocks .
*
* @ return { Array } Block settings .
* /
function registration _getBlockTypes ( ) {
return Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . getBlockTypes ( ) ;
}
/ * *
* Returns the block support value for a feature , if defined .
*
* @ param { ( string | Object ) } nameOrType Block name or type object
* @ param { string } feature Feature to retrieve
* @ param { * } defaultSupports Default value to return if not
* explicitly defined
*
* @ return { ? * } Block support value
* /
function registration _getBlockSupport ( nameOrType , feature , defaultSupports ) {
return Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . getBlockSupport ( nameOrType , feature , defaultSupports ) ;
}
/ * *
* Returns true if the block defines support for a feature , or false otherwise .
*
* @ param { ( string | Object ) } nameOrType Block name or type object .
* @ param { string } feature Feature to test .
* @ param { boolean } defaultSupports Whether feature is supported by
* default if not explicitly defined .
*
* @ return { boolean } Whether block supports feature .
* /
function registration _hasBlockSupport ( nameOrType , feature , defaultSupports ) {
return Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . hasBlockSupport ( nameOrType , feature , defaultSupports ) ;
}
/ * *
* Determines whether or not the given block is a reusable block . This is a
* special block type that is used to point to a global block stored via the
* API .
*
* @ param { Object } blockOrType Block or Block Type to test .
*
* @ return { boolean } Whether the given block is a reusable block .
* /
function isReusableBlock ( blockOrType ) {
return blockOrType . name === 'core/block' ;
}
/ * *
* Returns an array with the child blocks of a given block .
*
* @ param { string } blockName Name of block ( example : “ latest - posts ” ) .
*
* @ return { Array } Array of child block names .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var registration _getChildBlockNames = function getChildBlockNames ( blockName ) {
return Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . getChildBlockNames ( blockName ) ;
} ;
/ * *
* Returns a boolean indicating if a block has child blocks or not .
*
* @ param { string } blockName Name of block ( example : “ latest - posts ” ) .
*
* @ return { boolean } True if a block contains child blocks and false otherwise .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var registration _hasChildBlocks = function hasChildBlocks ( blockName ) {
return Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . hasChildBlocks ( blockName ) ;
} ;
/ * *
* Returns a boolean indicating if a block has at least one child block with inserter support .
*
* @ param { string } blockName Block type name .
*
* @ return { boolean } True if a block contains at least one child blocks with inserter support
* and false otherwise .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var registration _hasChildBlocksWithInserterSupport = function hasChildBlocksWithInserterSupport ( blockName ) {
return Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . hasChildBlocksWithInserterSupport ( blockName ) ;
} ;
/ * *
* Registers a new block style variation for the given block .
*
* @ param { string } blockName Name of block ( example : “ core / latest - posts ” ) .
* @ param { Object } styleVariation Object containing ` name ` which is the class name applied to the block and ` label ` which identifies the variation to the user .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var registration _registerBlockStyle = function registerBlockStyle ( blockName , styleVariation ) {
Object ( external _this _wp _data _ [ "dispatch" ] ) ( 'core/blocks' ) . addBlockStyles ( blockName , styleVariation ) ;
} ;
/ * *
* Unregisters a block style variation for the given block .
*
* @ param { string } blockName Name of block ( example : “ core / latest - posts ” ) .
* @ param { string } styleVariationName Name of class applied to the block .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var registration _unregisterBlockStyle = function unregisterBlockStyle ( blockName , styleVariationName ) {
Object ( external _this _wp _data _ [ "dispatch" ] ) ( 'core/blocks' ) . removeBlockStyles ( blockName , styleVariationName ) ;
} ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/factory.js
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* External dependencies
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* WordPress dependencies
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Internal dependencies
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Returns a block object given its type and attributes .
*
* @ param { string } name Block name .
* @ param { Object } attributes Block attributes .
* @ param { ? Array } innerBlocks Nested blocks .
*
* @ return { Object } Block object .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function createBlock ( name ) {
var attributes = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : { } ;
var innerBlocks = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : [ ] ;
// Get the type definition associated with a registered block.
var blockType = registration _getBlockType ( name ) ; // Ensure attributes contains only values defined by block type, and merge
// default values for missing attributes.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var sanitizedAttributes = Object ( external _lodash _ [ "reduce" ] ) ( blockType . attributes , function ( result , schema , key ) {
var value = attributes [ key ] ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( undefined !== value ) {
result [ key ] = value ;
} else if ( schema . hasOwnProperty ( 'default' ) ) {
result [ key ] = schema . default ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
if ( [ 'node' , 'children' ] . indexOf ( schema . source ) !== - 1 ) {
// Ensure value passed is always an array, which we're expecting in
// the RichText component to handle the deprecated value.
if ( typeof result [ key ] === 'string' ) {
result [ key ] = [ result [ key ] ] ;
} else if ( ! Array . isArray ( result [ key ] ) ) {
result [ key ] = [ ] ;
2018-12-14 05:41:57 +01:00
}
}
2018-12-18 04:14:52 +01:00
return result ;
} , { } ) ;
var clientId = v4 _default ( ) ( ) ; // Blocks are stored with a unique ID, the assigned type name, the block
// attributes, and their inner blocks.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return {
clientId : clientId ,
name : name ,
isValid : true ,
attributes : sanitizedAttributes ,
innerBlocks : innerBlocks
} ;
}
/ * *
* Given a block object , returns a copy of the block object , optionally merging
* new attributes and / or replacing its inner blocks .
*
* @ param { Object } block Block instance .
* @ param { Object } mergeAttributes Block attributes .
* @ param { ? Array } newInnerBlocks Nested blocks .
*
* @ return { Object } A cloned block .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function cloneBlock ( block ) {
var mergeAttributes = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : { } ;
var newInnerBlocks = arguments . length > 2 ? arguments [ 2 ] : undefined ;
var clientId = v4 _default ( ) ( ) ;
return Object ( objectSpread [ "a" /* default */ ] ) ( { } , block , {
clientId : clientId ,
attributes : Object ( objectSpread [ "a" /* default */ ] ) ( { } , block . attributes , mergeAttributes ) ,
innerBlocks : newInnerBlocks || block . innerBlocks . map ( function ( innerBlock ) {
return cloneBlock ( innerBlock ) ;
} )
} ) ;
}
/ * *
* Returns a boolean indicating whether a transform is possible based on
* various bits of context .
*
* @ param { Object } transform The transform object to validate .
* @ param { string } direction Is this a 'from' or 'to' transform .
* @ param { Array } blocks The blocks to transform from .
*
* @ return { boolean } Is the transform possible ?
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var factory _isPossibleTransformForSource = function isPossibleTransformForSource ( transform , direction , blocks ) {
if ( Object ( external _lodash _ [ "isEmpty" ] ) ( blocks ) ) {
return false ;
2019-01-04 20:38:57 +01:00
} // If multiple blocks are selected, only multi block transforms are allowed.
2018-12-14 05:41:57 +01:00
2019-01-04 20:38:57 +01:00
var isMultiBlock = blocks . length > 1 ;
2018-12-18 04:14:52 +01:00
var isValidForMultiBlocks = ! isMultiBlock || transform . isMultiBlock ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! isValidForMultiBlocks ) {
return false ;
} // Only consider 'block' type transforms as valid.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var isBlockType = transform . type === 'block' ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! isBlockType ) {
return false ;
} // Check if the transform's block name matches the source block only if this is a transform 'from'.
2018-12-14 05:41:57 +01:00
2019-01-04 20:38:57 +01:00
var sourceBlock = Object ( external _lodash _ [ "first" ] ) ( blocks ) ;
2018-12-18 04:14:52 +01:00
var hasMatchingName = direction !== 'from' || transform . blocks . indexOf ( sourceBlock . name ) !== - 1 ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! hasMatchingName ) {
return false ;
} // If the transform has a `isMatch` function specified, check that it returns true.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( Object ( external _lodash _ [ "isFunction" ] ) ( transform . isMatch ) ) {
var attributes = transform . isMultiBlock ? blocks . map ( function ( block ) {
return block . attributes ;
} ) : sourceBlock . attributes ;
if ( ! transform . isMatch ( attributes ) ) {
return false ;
2018-12-14 05:41:57 +01:00
}
}
2018-12-18 04:14:52 +01:00
return true ;
} ;
/ * *
* Returns block types that the 'blocks' can be transformed into , based on
* 'from' transforms on other blocks .
*
* @ param { Array } blocks The blocks to transform from .
*
* @ return { Array } Block types that the blocks can be transformed into .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var factory _getBlockTypesForPossibleFromTransforms = function getBlockTypesForPossibleFromTransforms ( blocks ) {
if ( Object ( external _lodash _ [ "isEmpty" ] ) ( blocks ) ) {
return [ ] ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
var allBlockTypes = registration _getBlockTypes ( ) ; // filter all blocks to find those with a 'from' transform.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var blockTypesWithPossibleFromTransforms = Object ( external _lodash _ [ "filter" ] ) ( allBlockTypes , function ( blockType ) {
var fromTransforms = getBlockTransforms ( 'from' , blockType . name ) ;
return ! ! findTransform ( fromTransforms , function ( transform ) {
return factory _isPossibleTransformForSource ( transform , 'from' , blocks ) ;
} ) ;
} ) ;
return blockTypesWithPossibleFromTransforms ;
} ;
/ * *
* Returns block types that the 'blocks' can be transformed into , based on
* the source block 's own ' to ' transforms .
*
* @ param { Array } blocks The blocks to transform from .
*
* @ return { Array } Block types that the source can be transformed into .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var factory _getBlockTypesForPossibleToTransforms = function getBlockTypesForPossibleToTransforms ( blocks ) {
if ( Object ( external _lodash _ [ "isEmpty" ] ) ( blocks ) ) {
return [ ] ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
var sourceBlock = Object ( external _lodash _ [ "first" ] ) ( blocks ) ;
var blockType = registration _getBlockType ( sourceBlock . name ) ;
var transformsTo = getBlockTransforms ( 'to' , blockType . name ) ; // filter all 'to' transforms to find those that are possible.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var possibleTransforms = Object ( external _lodash _ [ "filter" ] ) ( transformsTo , function ( transform ) {
return factory _isPossibleTransformForSource ( transform , 'to' , blocks ) ;
} ) ; // Build a list of block names using the possible 'to' transforms.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var blockNames = Object ( external _lodash _ [ "flatMap" ] ) ( possibleTransforms , function ( transformation ) {
return transformation . blocks ;
} ) ; // Map block names to block types.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return blockNames . map ( function ( name ) {
return registration _getBlockType ( name ) ;
} ) ;
} ;
/ * *
* Returns an array of block types that the set of blocks received as argument
* can be transformed into .
*
* @ param { Array } blocks Blocks array .
*
* @ return { Array } Block types that the blocks argument can be transformed to .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function getPossibleBlockTransformations ( blocks ) {
if ( Object ( external _lodash _ [ "isEmpty" ] ) ( blocks ) ) {
return [ ] ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var sourceBlock = Object ( external _lodash _ [ "first" ] ) ( blocks ) ;
var isMultiBlock = blocks . length > 1 ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( isMultiBlock && ! Object ( external _lodash _ [ "every" ] ) ( blocks , {
name : sourceBlock . name
} ) ) {
return [ ] ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
var blockTypesForFromTransforms = factory _getBlockTypesForPossibleFromTransforms ( blocks ) ;
var blockTypesForToTransforms = factory _getBlockTypesForPossibleToTransforms ( blocks ) ;
2019-03-07 10:09:59 +01:00
return Object ( external _lodash _ [ "uniq" ] ) ( [ ] . concat ( Object ( toConsumableArray [ "a" /* default */ ] ) ( blockTypesForFromTransforms ) , Object ( toConsumableArray [ "a" /* default */ ] ) ( blockTypesForToTransforms ) ) ) ;
2018-12-18 04:14:52 +01:00
}
/ * *
* Given an array of transforms , returns the highest - priority transform where
* the predicate function returns a truthy value . A higher - priority transform
* is one with a lower priority value ( i . e . first in priority order ) . Returns
* null if the transforms set is empty or the predicate function returns a
* falsey value for all entries .
*
* @ param { Object [ ] } transforms Transforms to search .
* @ param { Function } predicate Function returning true on matching transform .
*
* @ return { ? Object } Highest - priority transform candidate .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function findTransform ( transforms , predicate ) {
// The hooks library already has built-in mechanisms for managing priority
// queue, so leverage via locally-defined instance.
var hooks = Object ( external _this _wp _hooks _ [ "createHooks" ] ) ( ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var _loop = function _loop ( i ) {
var candidate = transforms [ i ] ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( predicate ( candidate ) ) {
hooks . addFilter ( 'transform' , 'transform/' + i . toString ( ) , function ( result ) {
return result ? result : candidate ;
} , candidate . priority ) ;
}
} ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( var i = 0 ; i < transforms . length ; i ++ ) {
_loop ( i ) ;
} // Filter name is arbitrarily chosen but consistent with above aggregation.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return hooks . applyFilters ( 'transform' , null ) ;
}
/ * *
* Returns normal block transforms for a given transform direction , optionally
* for a specific block by name , or an empty array if there are no transforms .
* If no block name is provided , returns transforms for all blocks . A normal
* transform object includes ` blockName ` as a property .
*
* @ param { string } direction Transform direction ( "to" , "from" ) .
* @ param { string | Object } blockTypeOrName Block type or name .
*
* @ return { Array } Block transforms for direction .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function getBlockTransforms ( direction , blockTypeOrName ) {
// When retrieving transforms for all block types, recurse into self.
if ( blockTypeOrName === undefined ) {
return Object ( external _lodash _ [ "flatMap" ] ) ( registration _getBlockTypes ( ) , function ( _ref ) {
var name = _ref . name ;
return getBlockTransforms ( direction , name ) ;
} ) ;
} // Validate that block type exists and has array of direction.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var blockType = normalizeBlockType ( blockTypeOrName ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var _ref2 = blockType || { } ,
blockName = _ref2 . name ,
transforms = _ref2 . transforms ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! transforms || ! Array . isArray ( transforms [ direction ] ) ) {
return [ ] ;
} // Map transforms to normal form.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return transforms [ direction ] . map ( function ( transform ) {
return Object ( objectSpread [ "a" /* default */ ] ) ( { } , transform , {
blockName : blockName
} ) ;
} ) ;
}
/ * *
* Switch one or more blocks into one or more blocks of the new block type .
*
* @ param { Array | Object } blocks Blocks array or block object .
* @ param { string } name Block name .
*
* @ return { Array } Array of blocks .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function switchToBlockType ( blocks , name ) {
var blocksArray = Object ( external _lodash _ [ "castArray" ] ) ( blocks ) ;
var isMultiBlock = blocksArray . length > 1 ;
var firstBlock = blocksArray [ 0 ] ;
var sourceName = firstBlock . name ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( isMultiBlock && ! Object ( external _lodash _ [ "every" ] ) ( blocksArray , function ( block ) {
return block . name === sourceName ;
} ) ) {
return null ;
} // Find the right transformation by giving priority to the "to"
// transformation.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var transformationsFrom = getBlockTransforms ( 'from' , name ) ;
var transformationsTo = getBlockTransforms ( 'to' , sourceName ) ;
var transformation = findTransform ( transformationsTo , function ( t ) {
return t . type === 'block' && t . blocks . indexOf ( name ) !== - 1 && ( ! isMultiBlock || t . isMultiBlock ) ;
} ) || findTransform ( transformationsFrom , function ( t ) {
return t . type === 'block' && t . blocks . indexOf ( sourceName ) !== - 1 && ( ! isMultiBlock || t . isMultiBlock ) ;
} ) ; // Stop if there is no valid transformation.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! transformation ) {
return null ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var transformationResults ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( transformation . isMultiBlock ) {
transformationResults = transformation . transform ( blocksArray . map ( function ( currentBlock ) {
return currentBlock . attributes ;
2019-03-07 10:09:59 +01:00
} ) , blocksArray . map ( function ( currentBlock ) {
return currentBlock . innerBlocks ;
2018-12-18 04:14:52 +01:00
} ) ) ;
} else {
2019-03-07 10:09:59 +01:00
transformationResults = transformation . transform ( firstBlock . attributes , firstBlock . innerBlocks ) ;
2018-12-18 04:14:52 +01:00
} // Ensure that the transformation function returned an object or an array
// of objects.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! Object ( external _lodash _ [ "isObjectLike" ] ) ( transformationResults ) ) {
return null ;
} // If the transformation function returned a single object, we want to work
// with an array instead.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
transformationResults = Object ( external _lodash _ [ "castArray" ] ) ( transformationResults ) ; // Ensure that every block object returned by the transformation has a
// valid block type.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( transformationResults . some ( function ( result ) {
return ! registration _getBlockType ( result . name ) ;
} ) ) {
return null ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
var firstSwitchedBlock = Object ( external _lodash _ [ "findIndex" ] ) ( transformationResults , function ( result ) {
return result . name === name ;
} ) ; // Ensure that at least one block object returned by the transformation has
// the expected "destination" block type.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( firstSwitchedBlock < 0 ) {
return null ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return transformationResults . map ( function ( result , index ) {
var transformedBlock = Object ( objectSpread [ "a" /* default */ ] ) ( { } , result , {
// The first transformed block whose type matches the "destination"
// type gets to keep the existing client ID of the first block.
clientId : index === firstSwitchedBlock ? firstBlock . clientId : result . clientId
} ) ;
/ * *
* Filters an individual transform result from block transformation .
* All of the original blocks are passed , since transformations are
* many - to - many , not one - to - one .
*
* @ param { Object } transformedBlock The transformed block .
* @ param { Object [ ] } blocks Original blocks transformed .
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return Object ( external _this _wp _hooks _ [ "applyFilters" ] ) ( 'blocks.switchToBlockType.transformedBlock' , transformedBlock , blocks ) ;
} ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js + 1 modules
2019-03-21 13:48:00 +01:00
var slicedToArray = _ _webpack _require _ _ ( 28 ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/hpq/es/get-path.js
/ * *
* Given object and string of dot - delimited path segments , returns value at
* path or undefined if path cannot be resolved .
*
* @ param { Object } object Lookup object
* @ param { string } path Path to resolve
* @ return { ? * } Resolved value
* /
function getPath ( object , path ) {
var segments = path . split ( '.' ) ;
var segment ;
while ( segment = segments . shift ( ) ) {
if ( ! ( segment in object ) ) {
return ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
object = object [ segment ] ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return object ;
}
// CONCATENATED MODULE: ./node_modules/hpq/es/index.js
/ * *
* Internal dependencies
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Function returning a DOM document created by ` createHTMLDocument ` . The same
* document is returned between invocations .
*
* @ return { Document } DOM document .
* /
var getDocument = function ( ) {
var doc ;
return function ( ) {
if ( ! doc ) {
doc = document . implementation . createHTMLDocument ( '' ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return doc ;
} ;
} ( ) ;
/ * *
* Given a markup string or DOM element , creates an object aligning with the
* shape of the matchers object , or the value returned by the matcher .
*
* @ param { ( string | Element ) } source Source content
* @ param { ( Object | Function ) } matchers Matcher function or object of matchers
* @ return { ( Object | * ) } Matched value ( s ) , shaped by object
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function es _parse ( source , matchers ) {
if ( ! matchers ) {
return ;
} // Coerce to element
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( 'string' === typeof source ) {
var doc = getDocument ( ) ;
doc . body . innerHTML = source ;
source = doc . body ;
} // Return singular value
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( 'function' === typeof matchers ) {
return matchers ( source ) ;
} // Bail if we can't handle matchers
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( Object !== matchers . constructor ) {
return ;
} // Shape result by matcher object
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return Object . keys ( matchers ) . reduce ( function ( memo , key ) {
memo [ key ] = es _parse ( source , matchers [ key ] ) ;
return memo ;
} , { } ) ;
}
/ * *
* Generates a function which matches node of type selector , returning an
* attribute by property if the attribute exists . If no selector is passed ,
* returns property of the query element .
*
* @ param { ? string } selector Optional selector
* @ param { string } name Property name
* @ return { * } Property value
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function prop ( selector , name ) {
if ( 1 === arguments . length ) {
name = selector ;
selector = undefined ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return function ( node ) {
var match = node ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( selector ) {
match = node . querySelector ( selector ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( match ) {
return getPath ( match , name ) ;
}
} ;
}
/ * *
* Generates a function which matches node of type selector , returning an
* attribute by name if the attribute exists . If no selector is passed ,
* returns attribute of the query element .
*
* @ param { ? string } selector Optional selector
* @ param { string } name Attribute name
* @ return { ? string } Attribute value
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function attr ( selector , name ) {
if ( 1 === arguments . length ) {
name = selector ;
selector = undefined ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return function ( node ) {
var attributes = prop ( selector , 'attributes' ) ( node ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( attributes && attributes . hasOwnProperty ( name ) ) {
return attributes [ name ] . value ;
}
} ;
}
/ * *
* Convenience for ` prop( selector, 'innerHTML' ) ` .
*
* @ see prop ( )
*
* @ param { ? string } selector Optional selector
* @ return { string } Inner HTML
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function es _html ( selector ) {
return prop ( selector , 'innerHTML' ) ;
}
/ * *
* Convenience for ` prop( selector, 'textContent' ) ` .
*
* @ see prop ( )
*
* @ param { ? string } selector Optional selector
* @ return { string } Text content
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function es _text ( selector ) {
return prop ( selector , 'textContent' ) ;
}
/ * *
* Creates a new matching context by first finding elements matching selector
* using querySelectorAll before then running another ` parse ` on ` matchers `
* scoped to the matched elements .
*
* @ see parse ( )
*
* @ param { string } selector Selector to match
* @ param { ( Object | Function ) } matchers Matcher function or object of matchers
* @ return { Array . < * , Object > } Array of matched value ( s )
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function query ( selector , matchers ) {
return function ( node ) {
var matches = node . querySelectorAll ( selector ) ;
return [ ] . map . call ( matches , function ( match ) {
return es _parse ( match , matchers ) ;
} ) ;
} ;
}
// EXTERNAL MODULE: external {"this":["wp","autop"]}
2019-03-21 13:48:00 +01:00
var external _this _wp _autop _ = _ _webpack _require _ _ ( 66 ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: external {"this":["wp","blockSerializationDefaultParser"]}
2019-03-21 13:48:00 +01:00
var external _this _wp _blockSerializationDefaultParser _ = _ _webpack _require _ _ ( 205 ) ;
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js
2019-03-21 13:48:00 +01:00
var arrayWithHoles = _ _webpack _require _ _ ( 37 ) ;
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js
2019-03-21 13:48:00 +01:00
var iterableToArray = _ _webpack _require _ _ ( 34 ) ;
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js
2019-03-21 13:48:00 +01:00
var nonIterableRest = _ _webpack _require _ _ ( 38 ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toArray.js
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function _toArray ( arr ) {
return Object ( arrayWithHoles [ "a" /* default */ ] ) ( arr ) || Object ( iterableToArray [ "a" /* default */ ] ) ( arr ) || Object ( nonIterableRest [ "a" /* default */ ] ) ( ) ;
}
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js
var classCallCheck = _ _webpack _require _ _ ( 10 ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/createClass.js
var createClass = _ _webpack _require _ _ ( 9 ) ;
// CONCATENATED MODULE: ./node_modules/simple-html-tokenizer/dist/es6/utils.js
var WSP = /[\t\n\f ]/ ;
var ALPHA = /[A-Za-z]/ ;
var CRLF = /\r\n?/g ;
function isSpace ( char ) {
return WSP . test ( char ) ;
}
function isAlpha ( char ) {
return ALPHA . test ( char ) ;
}
function preprocessInput ( input ) {
return input . replace ( CRLF , "\n" ) ;
}
function unwrap ( maybe , msg ) {
if ( ! maybe )
throw new Error ( ( msg || 'value' ) + " was null" ) ;
return maybe ;
}
function or ( maybe , otherwise ) {
return maybe || otherwise ;
}
// CONCATENATED MODULE: ./node_modules/simple-html-tokenizer/dist/es6/evented-tokenizer.js
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var evented _tokenizer _EventedTokenizer = /** @class */ ( function ( ) {
2018-12-14 05:41:57 +01:00
function EventedTokenizer ( delegate , entityParser ) {
this . delegate = delegate ;
this . entityParser = entityParser ;
this . state = null ;
this . input = null ;
this . index = - 1 ;
this . tagLine = - 1 ;
this . tagColumn = - 1 ;
this . line = - 1 ;
this . column = - 1 ;
this . states = {
beforeData : function ( ) {
var char = this . peek ( ) ;
if ( char === "<" ) {
this . state = 'tagOpen' ;
this . markTagStart ( ) ;
this . consume ( ) ;
}
else {
this . state = 'data' ;
this . delegate . beginData ( ) ;
}
} ,
data : function ( ) {
var char = this . peek ( ) ;
if ( char === "<" ) {
this . delegate . finishData ( ) ;
this . state = 'tagOpen' ;
this . markTagStart ( ) ;
this . consume ( ) ;
}
else if ( char === "&" ) {
this . consume ( ) ;
this . delegate . appendToData ( this . consumeCharRef ( ) || "&" ) ;
}
else {
this . consume ( ) ;
this . delegate . appendToData ( char ) ;
}
} ,
tagOpen : function ( ) {
var char = this . consume ( ) ;
if ( char === "!" ) {
this . state = 'markupDeclaration' ;
}
else if ( char === "/" ) {
this . state = 'endTagOpen' ;
}
2018-12-18 04:14:52 +01:00
else if ( isAlpha ( char ) ) {
2018-12-14 05:41:57 +01:00
this . state = 'tagName' ;
this . delegate . beginStartTag ( ) ;
this . delegate . appendToTagName ( char . toLowerCase ( ) ) ;
}
} ,
markupDeclaration : function ( ) {
var char = this . consume ( ) ;
if ( char === "-" && this . input . charAt ( this . index ) === "-" ) {
this . consume ( ) ;
this . state = 'commentStart' ;
this . delegate . beginComment ( ) ;
}
} ,
commentStart : function ( ) {
var char = this . consume ( ) ;
if ( char === "-" ) {
this . state = 'commentStartDash' ;
}
else if ( char === ">" ) {
this . delegate . finishComment ( ) ;
this . state = 'beforeData' ;
}
else {
this . delegate . appendToCommentData ( char ) ;
this . state = 'comment' ;
}
} ,
commentStartDash : function ( ) {
var char = this . consume ( ) ;
if ( char === "-" ) {
this . state = 'commentEnd' ;
}
else if ( char === ">" ) {
this . delegate . finishComment ( ) ;
this . state = 'beforeData' ;
}
else {
this . delegate . appendToCommentData ( "-" ) ;
this . state = 'comment' ;
}
} ,
comment : function ( ) {
var char = this . consume ( ) ;
if ( char === "-" ) {
this . state = 'commentEndDash' ;
}
else {
this . delegate . appendToCommentData ( char ) ;
}
} ,
commentEndDash : function ( ) {
var char = this . consume ( ) ;
if ( char === "-" ) {
this . state = 'commentEnd' ;
}
else {
this . delegate . appendToCommentData ( "-" + char ) ;
this . state = 'comment' ;
}
} ,
commentEnd : function ( ) {
var char = this . consume ( ) ;
if ( char === ">" ) {
this . delegate . finishComment ( ) ;
this . state = 'beforeData' ;
}
else {
this . delegate . appendToCommentData ( "--" + char ) ;
this . state = 'comment' ;
}
} ,
tagName : function ( ) {
var char = this . consume ( ) ;
2018-12-18 04:14:52 +01:00
if ( isSpace ( char ) ) {
2018-12-14 05:41:57 +01:00
this . state = 'beforeAttributeName' ;
}
else if ( char === "/" ) {
this . state = 'selfClosingStartTag' ;
}
else if ( char === ">" ) {
this . delegate . finishTag ( ) ;
this . state = 'beforeData' ;
}
else {
this . delegate . appendToTagName ( char ) ;
}
} ,
beforeAttributeName : function ( ) {
var char = this . peek ( ) ;
2018-12-18 04:14:52 +01:00
if ( isSpace ( char ) ) {
2018-12-14 05:41:57 +01:00
this . consume ( ) ;
return ;
}
else if ( char === "/" ) {
this . state = 'selfClosingStartTag' ;
this . consume ( ) ;
}
else if ( char === ">" ) {
this . consume ( ) ;
this . delegate . finishTag ( ) ;
this . state = 'beforeData' ;
}
else if ( char === '=' ) {
this . delegate . reportSyntaxError ( "attribute name cannot start with equals sign" ) ;
this . state = 'attributeName' ;
this . delegate . beginAttribute ( ) ;
this . consume ( ) ;
this . delegate . appendToAttributeName ( char ) ;
}
else {
this . state = 'attributeName' ;
this . delegate . beginAttribute ( ) ;
}
} ,
attributeName : function ( ) {
var char = this . peek ( ) ;
2018-12-18 04:14:52 +01:00
if ( isSpace ( char ) ) {
2018-12-14 05:41:57 +01:00
this . state = 'afterAttributeName' ;
this . consume ( ) ;
}
else if ( char === "/" ) {
this . delegate . beginAttributeValue ( false ) ;
this . delegate . finishAttributeValue ( ) ;
this . consume ( ) ;
this . state = 'selfClosingStartTag' ;
}
else if ( char === "=" ) {
this . state = 'beforeAttributeValue' ;
this . consume ( ) ;
}
else if ( char === ">" ) {
this . delegate . beginAttributeValue ( false ) ;
this . delegate . finishAttributeValue ( ) ;
this . consume ( ) ;
this . delegate . finishTag ( ) ;
this . state = 'beforeData' ;
}
else if ( char === '"' || char === "'" || char === '<' ) {
this . delegate . reportSyntaxError ( char + " is not a valid character within attribute names" ) ;
this . consume ( ) ;
this . delegate . appendToAttributeName ( char ) ;
}
else {
this . consume ( ) ;
this . delegate . appendToAttributeName ( char ) ;
}
} ,
afterAttributeName : function ( ) {
var char = this . peek ( ) ;
2018-12-18 04:14:52 +01:00
if ( isSpace ( char ) ) {
2018-12-14 05:41:57 +01:00
this . consume ( ) ;
return ;
}
else if ( char === "/" ) {
this . delegate . beginAttributeValue ( false ) ;
this . delegate . finishAttributeValue ( ) ;
this . consume ( ) ;
this . state = 'selfClosingStartTag' ;
}
else if ( char === "=" ) {
this . consume ( ) ;
this . state = 'beforeAttributeValue' ;
}
else if ( char === ">" ) {
this . delegate . beginAttributeValue ( false ) ;
this . delegate . finishAttributeValue ( ) ;
this . consume ( ) ;
this . delegate . finishTag ( ) ;
this . state = 'beforeData' ;
}
else {
this . delegate . beginAttributeValue ( false ) ;
this . delegate . finishAttributeValue ( ) ;
this . consume ( ) ;
this . state = 'attributeName' ;
this . delegate . beginAttribute ( ) ;
this . delegate . appendToAttributeName ( char ) ;
}
} ,
beforeAttributeValue : function ( ) {
var char = this . peek ( ) ;
2018-12-18 04:14:52 +01:00
if ( isSpace ( char ) ) {
2018-12-14 05:41:57 +01:00
this . consume ( ) ;
}
else if ( char === '"' ) {
this . state = 'attributeValueDoubleQuoted' ;
this . delegate . beginAttributeValue ( true ) ;
this . consume ( ) ;
}
else if ( char === "'" ) {
this . state = 'attributeValueSingleQuoted' ;
this . delegate . beginAttributeValue ( true ) ;
this . consume ( ) ;
}
else if ( char === ">" ) {
this . delegate . beginAttributeValue ( false ) ;
this . delegate . finishAttributeValue ( ) ;
this . consume ( ) ;
this . delegate . finishTag ( ) ;
this . state = 'beforeData' ;
}
else {
this . state = 'attributeValueUnquoted' ;
this . delegate . beginAttributeValue ( false ) ;
this . consume ( ) ;
this . delegate . appendToAttributeValue ( char ) ;
}
} ,
attributeValueDoubleQuoted : function ( ) {
var char = this . consume ( ) ;
if ( char === '"' ) {
this . delegate . finishAttributeValue ( ) ;
this . state = 'afterAttributeValueQuoted' ;
}
else if ( char === "&" ) {
this . delegate . appendToAttributeValue ( this . consumeCharRef ( '"' ) || "&" ) ;
}
else {
this . delegate . appendToAttributeValue ( char ) ;
}
} ,
attributeValueSingleQuoted : function ( ) {
var char = this . consume ( ) ;
if ( char === "'" ) {
this . delegate . finishAttributeValue ( ) ;
this . state = 'afterAttributeValueQuoted' ;
}
else if ( char === "&" ) {
this . delegate . appendToAttributeValue ( this . consumeCharRef ( "'" ) || "&" ) ;
}
else {
this . delegate . appendToAttributeValue ( char ) ;
}
} ,
attributeValueUnquoted : function ( ) {
var char = this . peek ( ) ;
2018-12-18 04:14:52 +01:00
if ( isSpace ( char ) ) {
2018-12-14 05:41:57 +01:00
this . delegate . finishAttributeValue ( ) ;
this . consume ( ) ;
this . state = 'beforeAttributeName' ;
}
else if ( char === "&" ) {
this . consume ( ) ;
this . delegate . appendToAttributeValue ( this . consumeCharRef ( ">" ) || "&" ) ;
}
else if ( char === ">" ) {
this . delegate . finishAttributeValue ( ) ;
this . consume ( ) ;
this . delegate . finishTag ( ) ;
this . state = 'beforeData' ;
}
else {
this . consume ( ) ;
this . delegate . appendToAttributeValue ( char ) ;
}
} ,
afterAttributeValueQuoted : function ( ) {
var char = this . peek ( ) ;
2018-12-18 04:14:52 +01:00
if ( isSpace ( char ) ) {
2018-12-14 05:41:57 +01:00
this . consume ( ) ;
this . state = 'beforeAttributeName' ;
}
else if ( char === "/" ) {
this . consume ( ) ;
this . state = 'selfClosingStartTag' ;
}
else if ( char === ">" ) {
this . consume ( ) ;
this . delegate . finishTag ( ) ;
this . state = 'beforeData' ;
}
else {
this . state = 'beforeAttributeName' ;
}
} ,
selfClosingStartTag : function ( ) {
var char = this . peek ( ) ;
if ( char === ">" ) {
this . consume ( ) ;
this . delegate . markTagAsSelfClosing ( ) ;
this . delegate . finishTag ( ) ;
this . state = 'beforeData' ;
}
else {
this . state = 'beforeAttributeName' ;
}
} ,
endTagOpen : function ( ) {
var char = this . consume ( ) ;
2018-12-18 04:14:52 +01:00
if ( isAlpha ( char ) ) {
2018-12-14 05:41:57 +01:00
this . state = 'tagName' ;
this . delegate . beginEndTag ( ) ;
this . delegate . appendToTagName ( char . toLowerCase ( ) ) ;
}
}
2018-12-18 04:14:52 +01:00
} ;
this . reset ( ) ;
}
EventedTokenizer . prototype . reset = function ( ) {
this . state = 'beforeData' ;
this . input = '' ;
this . index = 0 ;
this . line = 1 ;
this . column = 0 ;
this . tagLine = - 1 ;
this . tagColumn = - 1 ;
this . delegate . reset ( ) ;
} ;
EventedTokenizer . prototype . tokenize = function ( input ) {
this . reset ( ) ;
this . tokenizePart ( input ) ;
this . tokenizeEOF ( ) ;
} ;
EventedTokenizer . prototype . tokenizePart = function ( input ) {
this . input += preprocessInput ( input ) ;
while ( this . index < this . input . length ) {
this . states [ this . state ] . call ( this ) ;
}
} ;
EventedTokenizer . prototype . tokenizeEOF = function ( ) {
this . flushData ( ) ;
} ;
EventedTokenizer . prototype . flushData = function ( ) {
if ( this . state === 'data' ) {
this . delegate . finishData ( ) ;
this . state = 'beforeData' ;
}
} ;
EventedTokenizer . prototype . peek = function ( ) {
return this . input . charAt ( this . index ) ;
} ;
EventedTokenizer . prototype . consume = function ( ) {
var char = this . peek ( ) ;
this . index ++ ;
if ( char === "\n" ) {
this . line ++ ;
this . column = 0 ;
}
else {
this . column ++ ;
}
return char ;
} ;
EventedTokenizer . prototype . consumeCharRef = function ( ) {
var endIndex = this . input . indexOf ( ';' , this . index ) ;
if ( endIndex === - 1 ) {
return ;
}
var entity = this . input . slice ( this . index , endIndex ) ;
var chars = this . entityParser . parse ( entity ) ;
if ( chars ) {
var count = entity . length ;
// consume the entity chars
while ( count ) {
this . consume ( ) ;
count -- ;
}
// consume the `;`
this . consume ( ) ;
return chars ;
}
} ;
EventedTokenizer . prototype . markTagStart = function ( ) {
// these properties to be removed in next major bump
this . tagLine = this . line ;
this . tagColumn = this . column ;
if ( this . delegate . tagOpen ) {
this . delegate . tagOpen ( ) ;
}
} ;
return EventedTokenizer ;
} ( ) ) ;
/* harmony default export */ var evented _tokenizer = ( evented _tokenizer _EventedTokenizer ) ;
// CONCATENATED MODULE: ./node_modules/simple-html-tokenizer/dist/es6/tokenizer.js
;
var tokenizer _Tokenizer = /** @class */ ( function ( ) {
function Tokenizer ( entityParser , options ) {
if ( options === void 0 ) { options = { } ; }
this . options = options ;
this . _token = null ;
this . startLine = 1 ;
this . startColumn = 0 ;
this . tokens = [ ] ;
this . currentAttribute = null ;
this . tokenizer = new evented _tokenizer ( this , entityParser ) ;
}
Object . defineProperty ( Tokenizer . prototype , "token" , {
get : function ( ) {
return unwrap ( this . _token ) ;
} ,
set : function ( value ) {
this . _token = value ;
} ,
enumerable : true ,
configurable : true
} ) ;
Tokenizer . prototype . tokenize = function ( input ) {
this . tokens = [ ] ;
this . tokenizer . tokenize ( input ) ;
return this . tokens ;
} ;
Tokenizer . prototype . tokenizePart = function ( input ) {
this . tokens = [ ] ;
this . tokenizer . tokenizePart ( input ) ;
return this . tokens ;
} ;
Tokenizer . prototype . tokenizeEOF = function ( ) {
this . tokens = [ ] ;
this . tokenizer . tokenizeEOF ( ) ;
return this . tokens [ 0 ] ;
} ;
Tokenizer . prototype . reset = function ( ) {
this . _token = null ;
this . startLine = 1 ;
this . startColumn = 0 ;
} ;
Tokenizer . prototype . addLocInfo = function ( ) {
if ( this . options . loc ) {
this . token . loc = {
start : {
line : this . startLine ,
column : this . startColumn
} ,
end : {
line : this . tokenizer . line ,
column : this . tokenizer . column
}
} ;
}
this . startLine = this . tokenizer . line ;
this . startColumn = this . tokenizer . column ;
} ;
// Data
Tokenizer . prototype . beginData = function ( ) {
this . token = {
type : 'Chars' ,
chars : ''
} ;
this . tokens . push ( this . token ) ;
} ;
Tokenizer . prototype . appendToData = function ( char ) {
this . token . chars += char ;
} ;
Tokenizer . prototype . finishData = function ( ) {
this . addLocInfo ( ) ;
} ;
// Comment
Tokenizer . prototype . beginComment = function ( ) {
this . token = {
type : 'Comment' ,
chars : ''
} ;
this . tokens . push ( this . token ) ;
} ;
Tokenizer . prototype . appendToCommentData = function ( char ) {
this . token . chars += char ;
} ;
Tokenizer . prototype . finishComment = function ( ) {
this . addLocInfo ( ) ;
} ;
// Tags - basic
Tokenizer . prototype . beginStartTag = function ( ) {
this . token = {
type : 'StartTag' ,
tagName : '' ,
attributes : [ ] ,
selfClosing : false
} ;
this . tokens . push ( this . token ) ;
} ;
Tokenizer . prototype . beginEndTag = function ( ) {
this . token = {
type : 'EndTag' ,
tagName : ''
} ;
this . tokens . push ( this . token ) ;
} ;
Tokenizer . prototype . finishTag = function ( ) {
this . addLocInfo ( ) ;
} ;
Tokenizer . prototype . markTagAsSelfClosing = function ( ) {
this . token . selfClosing = true ;
} ;
// Tags - name
Tokenizer . prototype . appendToTagName = function ( char ) {
this . token . tagName += char ;
} ;
// Tags - attributes
Tokenizer . prototype . beginAttribute = function ( ) {
var attributes = unwrap ( this . token . attributes , "current token's attributs" ) ;
this . currentAttribute = [ "" , "" , false ] ;
attributes . push ( this . currentAttribute ) ;
} ;
Tokenizer . prototype . appendToAttributeName = function ( char ) {
var currentAttribute = unwrap ( this . currentAttribute ) ;
currentAttribute [ 0 ] += char ;
} ;
Tokenizer . prototype . beginAttributeValue = function ( isQuoted ) {
var currentAttribute = unwrap ( this . currentAttribute ) ;
currentAttribute [ 2 ] = isQuoted ;
} ;
Tokenizer . prototype . appendToAttributeValue = function ( char ) {
var currentAttribute = unwrap ( this . currentAttribute ) ;
currentAttribute [ 1 ] = currentAttribute [ 1 ] || "" ;
currentAttribute [ 1 ] += char ;
} ;
Tokenizer . prototype . finishAttributeValue = function ( ) {
} ;
Tokenizer . prototype . reportSyntaxError = function ( message ) {
this . token . syntaxError = message ;
} ;
return Tokenizer ;
} ( ) ) ;
/* harmony default export */ var tokenizer = ( tokenizer _Tokenizer ) ;
// EXTERNAL MODULE: external {"this":["wp","htmlEntities"]}
2019-03-21 13:48:00 +01:00
var external _this _wp _htmlEntities _ = _ _webpack _require _ _ ( 57 ) ;
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: external {"this":["wp","isShallowEqual"]}
2019-03-21 13:48:00 +01:00
var external _this _wp _isShallowEqual _ = _ _webpack _require _ _ ( 42 ) ;
2018-12-18 04:14:52 +01:00
var external _this _wp _isShallowEqual _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( external _this _wp _isShallowEqual _ ) ;
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js
2019-03-07 10:09:59 +01:00
var esm _extends = _ _webpack _require _ _ ( 19 ) ;
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: external {"this":["wp","compose"]}
2019-03-21 13:48:00 +01:00
var external _this _wp _compose _ = _ _webpack _require _ _ ( 6 ) ;
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/block-content-provider/index.js
/ * *
* WordPress dependencies
* /
/ * *
* Internal dependencies
* /
var _createContext = Object ( external _this _wp _element _ [ "createContext" ] ) ( function ( ) { } ) ,
Consumer = _createContext . Consumer ,
Provider = _createContext . Provider ;
/ * *
* An internal block component used in block content serialization to inject
* nested block content within the ` save ` implementation of the ancestor
* component in which it is nested . The component provides a pre - bound
* ` BlockContent ` component via context , which is used by the developer - facing
* ` InnerBlocks.Content ` component to render block content .
*
* @ example
*
* ` ` ` jsx
* < BlockContentProvider innerBlocks = { innerBlocks } >
* { blockSaveElement }
* < / B l o c k C o n t e n t P r o v i d e r >
* ` ` `
*
* @ return { WPElement } Element with BlockContent injected via context .
* /
var block _content _provider _BlockContentProvider = function BlockContentProvider ( _ref ) {
var children = _ref . children ,
innerBlocks = _ref . innerBlocks ;
var BlockContent = function BlockContent ( ) {
// Value is an array of blocks, so defer to block serializer
var html = serialize ( innerBlocks ) ; // Use special-cased raw HTML tag to avoid default escaping
return Object ( external _this _wp _element _ [ "createElement" ] ) ( external _this _wp _element _ [ "RawHTML" ] , null , html ) ;
} ;
return Object ( external _this _wp _element _ [ "createElement" ] ) ( Provider , {
value : BlockContent
} , children ) ;
} ;
/ * *
* A Higher Order Component used to inject BlockContent using context to the
* wrapped component .
*
* @ return { Component } Enhanced component with injected BlockContent as prop .
* /
var withBlockContentContext = Object ( external _this _wp _compose _ [ "createHigherOrderComponent" ] ) ( function ( OriginalComponent ) {
return function ( props ) {
return Object ( external _this _wp _element _ [ "createElement" ] ) ( Consumer , null , function ( context ) {
return Object ( external _this _wp _element _ [ "createElement" ] ) ( OriginalComponent , Object ( esm _extends [ "a" /* default */ ] ) ( { } , props , {
BlockContent : context
} ) ) ;
} ) ;
} ;
} , 'withBlockContentContext' ) ;
/* harmony default export */ var block _content _provider = ( block _content _provider _BlockContentProvider ) ;
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/serializer.js
/ * *
* External dependencies
* /
/ * *
* WordPress dependencies
* /
/ * *
* Internal dependencies
* /
/ * *
* Returns the block ' s default classname from its name .
*
* @ param { string } blockName The block name .
*
* @ return { string } The block ' s default class .
* /
function getBlockDefaultClassName ( blockName ) {
// Generated HTML classes for blocks follow the `wp-block-{name}` nomenclature.
// Blocks provided by WordPress drop the prefixes 'core/' or 'core-' (used in 'core-embed/').
var className = 'wp-block-' + blockName . replace ( /\// , '-' ) . replace ( /^core-/ , '' ) ;
return Object ( external _this _wp _hooks _ [ "applyFilters" ] ) ( 'blocks.getBlockDefaultClassName' , className , blockName ) ;
}
/ * *
* Returns the block ' s default menu item classname from its name .
*
* @ param { string } blockName The block name .
*
* @ return { string } The block ' s default menu item class .
* /
function getBlockMenuDefaultClassName ( blockName ) {
// Generated HTML classes for blocks follow the `editor-block-list-item-{name}` nomenclature.
// Blocks provided by WordPress drop the prefixes 'core/' or 'core-' (used in 'core-embed/').
var className = 'editor-block-list-item-' + blockName . replace ( /\// , '-' ) . replace ( /^core-/ , '' ) ;
return Object ( external _this _wp _hooks _ [ "applyFilters" ] ) ( 'blocks.getBlockMenuDefaultClassName' , className , blockName ) ;
}
/ * *
* Given a block type containing a save render implementation and attributes , returns the
* enhanced element to be saved or string when raw HTML expected .
*
* @ param { string | Object } blockTypeOrName Block type or name .
* @ param { Object } attributes Block attributes .
* @ param { ? Array } innerBlocks Nested blocks .
*
* @ return { Object | string } Save element or raw HTML string .
* /
function getSaveElement ( blockTypeOrName , attributes ) {
var innerBlocks = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : [ ] ;
var blockType = normalizeBlockType ( blockTypeOrName ) ;
var save = blockType . save ; // Component classes are unsupported for save since serialization must
// occur synchronously. For improved interoperability with higher-order
// components which often return component class, emulate basic support.
if ( save . prototype instanceof external _this _wp _element _ [ "Component" ] ) {
var instance = new save ( {
attributes : attributes
} ) ;
save = instance . render . bind ( instance ) ;
}
var element = save ( {
attributes : attributes ,
innerBlocks : innerBlocks
} ) ;
if ( Object ( external _lodash _ [ "isObject" ] ) ( element ) && Object ( external _this _wp _hooks _ [ "hasFilter" ] ) ( 'blocks.getSaveContent.extraProps' ) ) {
/ * *
* Filters the props applied to the block save result element .
*
* @ param { Object } props Props applied to save element .
* @ param { WPBlockType } blockType Block type definition .
* @ param { Object } attributes Block attributes .
* /
var props = Object ( external _this _wp _hooks _ [ "applyFilters" ] ) ( 'blocks.getSaveContent.extraProps' , Object ( objectSpread [ "a" /* default */ ] ) ( { } , element . props ) , blockType , attributes ) ;
if ( ! external _this _wp _isShallowEqual _default ( ) ( props , element . props ) ) {
element = Object ( external _this _wp _element _ [ "cloneElement" ] ) ( element , props ) ;
}
}
/ * *
* Filters the save result of a block during serialization .
*
* @ param { WPElement } element Block save result .
* @ param { WPBlockType } blockType Block type definition .
* @ param { Object } attributes Block attributes .
* /
element = Object ( external _this _wp _hooks _ [ "applyFilters" ] ) ( 'blocks.getSaveElement' , element , blockType , attributes ) ;
return Object ( external _this _wp _element _ [ "createElement" ] ) ( block _content _provider , {
innerBlocks : innerBlocks
} , element ) ;
}
/ * *
* Given a block type containing a save render implementation and attributes , returns the
* static markup to be saved .
*
* @ param { string | Object } blockTypeOrName Block type or name .
* @ param { Object } attributes Block attributes .
* @ param { ? Array } innerBlocks Nested blocks .
*
* @ return { string } Save content .
* /
function getSaveContent ( blockTypeOrName , attributes , innerBlocks ) {
var blockType = normalizeBlockType ( blockTypeOrName ) ;
return Object ( external _this _wp _element _ [ "renderToString" ] ) ( getSaveElement ( blockType , attributes , innerBlocks ) ) ;
}
/ * *
* Returns attributes which are to be saved and serialized into the block
* comment delimiter .
*
* When a block exists in memory it contains as its attributes both those
* parsed the block comment delimiter _and _ those which matched from the
* contents of the block .
*
* This function returns only those attributes which are needed to persist and
* which cannot be matched from the block content .
*
* @ param { Object < string , * > } blockType Block type .
* @ param { Object < string , * > } attributes Attributes from in - memory block data .
*
* @ return { Object < string , * > } Subset of attributes for comment serialization .
* /
function getCommentAttributes ( blockType , attributes ) {
return Object ( external _lodash _ [ "reduce" ] ) ( blockType . attributes , function ( result , attributeSchema , key ) {
var value = attributes [ key ] ; // Ignore undefined values.
if ( undefined === value ) {
return result ;
} // Ignore all attributes but the ones with an "undefined" source
// "undefined" source refers to attributes saved in the block comment.
if ( attributeSchema . source !== undefined ) {
return result ;
} // Ignore default value.
if ( 'default' in attributeSchema && attributeSchema . default === value ) {
return result ;
} // Otherwise, include in comment set.
result [ key ] = value ;
return result ;
} , { } ) ;
}
/ * *
* Given an attributes object , returns a string in the serialized attributes
* format prepared for post content .
*
* @ param { Object } attributes Attributes object .
*
* @ return { string } Serialized attributes .
* /
function serializeAttributes ( attributes ) {
return JSON . stringify ( attributes ) // Don't break HTML comments.
. replace ( /--/g , "\\u002d\\u002d" ) // Don't break non-standard-compliant tools.
. replace ( /</g , "\\u003c" ) . replace ( />/g , "\\u003e" ) . replace ( /&/g , "\\u0026" ) // Bypass server stripslashes behavior which would unescape stringify's
// escaping of quotation mark.
//
// See: https://developer.wordpress.org/reference/functions/wp_kses_stripslashes/
. replace ( /\\"/g , "\\u0022" ) ;
}
/ * *
* Given a block object , returns the Block ' s Inner HTML markup .
*
* @ param { Object } block Block instance .
*
* @ return { string } HTML .
* /
function getBlockContent ( block ) {
// @todo why not getBlockInnerHtml?
// If block was parsed as invalid or encounters an error while generating
// save content, use original content instead to avoid content loss. If a
// block contains nested content, exempt it from this condition because we
// otherwise have no access to its original content and content loss would
// still occur.
var saveContent = block . originalContent ;
if ( block . isValid || block . innerBlocks . length ) {
try {
saveContent = getSaveContent ( block . name , block . attributes , block . innerBlocks ) ;
} catch ( error ) { }
}
return saveContent ;
}
/ * *
* Returns the content of a block , including comment delimiters .
*
* @ param { string } rawBlockName Block name .
* @ param { Object } attributes Block attributes .
* @ param { string } content Block save content .
*
* @ return { string } Comment - delimited block content .
* /
function getCommentDelimitedContent ( rawBlockName , attributes , content ) {
var serializedAttributes = ! Object ( external _lodash _ [ "isEmpty" ] ) ( attributes ) ? serializeAttributes ( attributes ) + ' ' : '' ; // Strip core blocks of their namespace prefix.
var blockName = Object ( external _lodash _ [ "startsWith" ] ) ( rawBlockName , 'core/' ) ? rawBlockName . slice ( 5 ) : rawBlockName ; // @todo make the `wp:` prefix potentially configurable.
if ( ! content ) {
return "<!-- wp:" . concat ( blockName , " " ) . concat ( serializedAttributes , "/-->" ) ;
}
return "<!-- wp:" . concat ( blockName , " " ) . concat ( serializedAttributes , "-->\n" ) + content + "\n<!-- /wp:" . concat ( blockName , " -->" ) ;
}
/ * *
* Returns the content of a block , including comment delimiters , determining
* serialized attributes and content form from the current state of the block .
*
* @ param { Object } block Block instance .
*
* @ return { string } Serialized block .
* /
function serializeBlock ( block ) {
var blockName = block . name ;
var saveContent = getBlockContent ( block ) ;
switch ( blockName ) {
case getFreeformContentHandlerName ( ) :
case getUnregisteredTypeHandlerName ( ) :
return saveContent ;
default :
2019-01-04 20:38:57 +01:00
{
var blockType = registration _getBlockType ( blockName ) ;
var saveAttributes = getCommentAttributes ( blockType , block . attributes ) ;
return getCommentDelimitedContent ( blockName , saveAttributes , saveContent ) ;
}
2018-12-18 04:14:52 +01:00
}
}
/ * *
* Takes a block or set of blocks and returns the serialized post content .
*
* @ param { Array } blocks Block ( s ) to serialize .
*
* @ return { string } The post content .
* /
function serialize ( blocks ) {
return Object ( external _lodash _ [ "castArray" ] ) ( blocks ) . map ( serializeBlock ) . join ( '\n\n' ) ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/validation.js
/ * *
* External dependencies
* /
/ * *
* WordPress dependencies
* /
/ * *
* Internal dependencies
* /
/ * *
* Globally matches any consecutive whitespace
*
* @ type { RegExp }
* /
var REGEXP _WHITESPACE = /[\t\n\r\v\f ]+/g ;
/ * *
* Matches a string containing only whitespace
*
* @ type { RegExp }
* /
var REGEXP _ONLY _WHITESPACE = /^[\t\n\r\v\f ]*$/ ;
/ * *
* Matches a CSS URL type value
*
* @ type { RegExp }
* /
var REGEXP _STYLE _URL _TYPE = /^url\s*\(['"\s]*(.*?)['"\s]*\)$/ ;
/ * *
* Boolean attributes are attributes whose presence as being assigned is
* meaningful , even if only empty .
*
* See : https : //html.spec.whatwg.org/multipage/common-microsyntaxes.html#boolean-attributes
* Extracted from : https : //html.spec.whatwg.org/multipage/indices.html#attributes-3
*
* Object . keys ( [ ... document . querySelectorAll ( '#attributes-1 > tbody > tr' ) ]
* . filter ( ( tr ) => tr . lastChild . textContent . indexOf ( 'Boolean attribute' ) !== - 1 )
* . reduce ( ( result , tr ) => Object . assign ( result , {
* [ tr . firstChild . textContent . trim ( ) ] : true
* } ) , { } ) ) . sort ( ) ;
*
* @ type { Array }
* /
var BOOLEAN _ATTRIBUTES = [ 'allowfullscreen' , 'allowpaymentrequest' , 'allowusermedia' , 'async' , 'autofocus' , 'autoplay' , 'checked' , 'controls' , 'default' , 'defer' , 'disabled' , 'download' , 'formnovalidate' , 'hidden' , 'ismap' , 'itemscope' , 'loop' , 'multiple' , 'muted' , 'nomodule' , 'novalidate' , 'open' , 'playsinline' , 'readonly' , 'required' , 'reversed' , 'selected' , 'typemustmatch' ] ;
/ * *
* Enumerated attributes are attributes which must be of a specific value form .
* Like boolean attributes , these are meaningful if specified , even if not of a
* valid enumerated value .
*
* See : https : //html.spec.whatwg.org/multipage/common-microsyntaxes.html#enumerated-attribute
* Extracted from : https : //html.spec.whatwg.org/multipage/indices.html#attributes-3
*
* Object . keys ( [ ... document . querySelectorAll ( '#attributes-1 > tbody > tr' ) ]
* . filter ( ( tr ) => / ^ ( "(.+?)" ; ? \ s * ) + / . t e s t ( t r . l a s t C h i l d . t e x t C o n t e n t . t r i m ( ) ) )
* . reduce ( ( result , tr ) => Object . assign ( result , {
* [ tr . firstChild . textContent . trim ( ) ] : true
* } ) , { } ) ) . sort ( ) ;
*
* @ type { Array }
* /
var ENUMERATED _ATTRIBUTES = [ 'autocapitalize' , 'autocomplete' , 'charset' , 'contenteditable' , 'crossorigin' , 'decoding' , 'dir' , 'draggable' , 'enctype' , 'formenctype' , 'formmethod' , 'http-equiv' , 'inputmode' , 'kind' , 'method' , 'preload' , 'scope' , 'shape' , 'spellcheck' , 'translate' , 'type' , 'wrap' ] ;
/ * *
* Meaningful attributes are those who cannot be safely ignored when omitted in
* one HTML markup string and not another .
*
* @ type { Array }
* /
2019-03-07 10:09:59 +01:00
var MEANINGFUL _ATTRIBUTES = [ ] . concat ( BOOLEAN _ATTRIBUTES , ENUMERATED _ATTRIBUTES ) ;
2018-12-18 04:14:52 +01:00
/ * *
* Array of functions which receive a text string on which to apply normalizing
* behavior for consideration in text token equivalence , carefully ordered from
* least - to - most expensive operations .
*
* @ type { Array }
* /
var TEXT _NORMALIZATIONS = [ external _lodash _ [ "identity" ] , getTextWithCollapsedWhitespace ] ;
/ * *
2019-03-07 10:09:59 +01:00
* Regular expression matching a named character reference . In lieu of bundling
* a full set of references , the pattern covers the minimal necessary to test
* positively against the full set .
*
* " The ampersand must be followed by one of the names given in the named
* character references section , using the same case . "
*
* Tested aginst "12.5 Named character references" :
*
* ` ` `
* const references = [ ... document . querySelectorAll (
* '#named-character-references-table tr[id^=entity-] td:first-child'
* ) ] . map ( ( code ) => code . textContent )
* references . every ( ( reference ) => / ^ [ \ da - z ] + $ / i . test ( reference ) )
* ` ` `
*
* @ link https : //html.spec.whatwg.org/multipage/syntax.html#character-references
* @ link https : //html.spec.whatwg.org/multipage/named-characters.html#named-character-references
*
* @ type { RegExp }
* /
var REGEXP _NAMED _CHARACTER _REFERENCE = /^[\da-z]+$/i ;
/ * *
* Regular expression matching a decimal character reference .
*
* " The ampersand must be followed by a U + 0023 NUMBER SIGN character ( # ) ,
* followed by one or more ASCII digits , representing a base - ten integer "
*
* @ link https : //html.spec.whatwg.org/multipage/syntax.html#character-references
*
* @ type { RegExp }
* /
var REGEXP _DECIMAL _CHARACTER _REFERENCE = /^#\d+$/ ;
/ * *
* Regular expression matching a hexadecimal character reference .
*
* " The ampersand must be followed by a U + 0023 NUMBER SIGN character ( # ) , which
* must be followed by either a U + 0078 LATIN SMALL LETTER X character ( x ) or a
* U + 0058 LATIN CAPITAL LETTER X character ( X ) , which must then be followed by
* one or more ASCII hex digits , representing a hexadecimal integer "
*
* @ link https : //html.spec.whatwg.org/multipage/syntax.html#character-references
*
* @ type { RegExp }
* /
var REGEXP _HEXADECIMAL _CHARACTER _REFERENCE = /^#x[\da-f]+$/i ;
/ * *
* Returns true if the given string is a valid character reference segment , or
* false otherwise . The text should be stripped of ` & ` and ` ; ` demarcations .
*
* @ param { string } text Text to test .
*
* @ return { boolean } Whether text is valid character reference .
* /
function isValidCharacterReference ( text ) {
return REGEXP _NAMED _CHARACTER _REFERENCE . test ( text ) || REGEXP _DECIMAL _CHARACTER _REFERENCE . test ( text ) || REGEXP _HEXADECIMAL _CHARACTER _REFERENCE . test ( text ) ;
}
/ * *
* Subsitute EntityParser class for ` simple-html-tokenizer ` which uses the
* implementation of ` decodeEntities ` from ` html-entities ` , in order to avoid
* bundling a massive named character reference .
2018-12-18 04:14:52 +01:00
*
* @ see https : //github.com/tildeio/simple-html-tokenizer/tree/master/src/entity-parser.ts
* /
2019-03-07 10:09:59 +01:00
var validation _DecodeEntityParser =
2018-12-18 04:14:52 +01:00
/*#__PURE__*/
function ( ) {
2019-03-07 10:09:59 +01:00
function DecodeEntityParser ( ) {
Object ( classCallCheck [ "a" /* default */ ] ) ( this , DecodeEntityParser ) ;
2018-12-18 04:14:52 +01:00
}
2019-03-07 10:09:59 +01:00
Object ( createClass [ "a" /* default */ ] ) ( DecodeEntityParser , [ {
2018-12-18 04:14:52 +01:00
key : "parse" ,
/ * *
* Returns a substitute string for an entity string sequence between ` & `
* and ` ; ` , or undefined if no substitution should occur .
*
* @ param { string } entity Entity fragment discovered in HTML .
*
* @ return { ? string } Entity substitute value .
* /
value : function parse ( entity ) {
2019-03-07 10:09:59 +01:00
if ( isValidCharacterReference ( entity ) ) {
return Object ( external _this _wp _htmlEntities _ [ "decodeEntities" ] ) ( '&' + entity + ';' ) ;
}
2018-12-18 04:14:52 +01:00
}
} ] ) ;
2019-03-07 10:09:59 +01:00
return DecodeEntityParser ;
2018-12-18 04:14:52 +01:00
} ( ) ;
/ * *
* Object of logger functions .
* /
var log = function ( ) {
/ * *
* Creates a logger with block validation prefix .
*
* @ param { Function } logger Original logger function .
*
* @ return { Function } Augmented logger function .
* /
function createLogger ( logger ) {
// In test environments, pre-process the sprintf message to improve
// readability of error messages. We'd prefer to avoid pulling in this
// dependency in runtime environments, and it can be dropped by a combo
// of Webpack env substitution + UglifyJS dead code elimination.
if ( false ) { }
return function ( message ) {
for ( var _len = arguments . length , args = new Array ( _len > 1 ? _len - 1 : 0 ) , _key = 1 ; _key < _len ; _key ++ ) {
args [ _key - 1 ] = arguments [ _key ] ;
}
return logger . apply ( void 0 , [ 'Block validation: ' + message ] . concat ( args ) ) ;
} ;
}
return {
/* eslint-disable no-console */
error : createLogger ( console . error ) ,
warning : createLogger ( console . warn )
/* eslint-enable no-console */
} ;
} ( ) ;
/ * *
* Given a specified string , returns an array of strings split by consecutive
* whitespace , ignoring leading or trailing whitespace .
*
* @ param { string } text Original text .
*
* @ return { string [ ] } Text pieces split on whitespace .
* /
function getTextPiecesSplitOnWhitespace ( text ) {
return text . trim ( ) . split ( REGEXP _WHITESPACE ) ;
}
/ * *
* Given a specified string , returns a new trimmed string where all consecutive
* whitespace is collapsed to a single space .
*
* @ param { string } text Original text .
*
* @ return { string } Trimmed text with consecutive whitespace collapsed .
* /
function getTextWithCollapsedWhitespace ( text ) {
// This is an overly simplified whitespace comparison. The specification is
// more prescriptive of whitespace behavior in inline and block contexts.
//
// See: https://medium.com/@patrickbrosset/when-does-white-space-matter-in-html-b90e8a7cdd33
return getTextPiecesSplitOnWhitespace ( text ) . join ( ' ' ) ;
}
/ * *
* Returns attribute pairs of the given StartTag token , including only pairs
* where the value is non - empty or the attribute is a boolean attribute , an
* enumerated attribute , or a custom data - attribute .
*
* @ see MEANINGFUL _ATTRIBUTES
*
* @ param { Object } token StartTag token .
*
* @ return { Array [ ] } Attribute pairs .
* /
function getMeaningfulAttributePairs ( token ) {
return token . attributes . filter ( function ( pair ) {
var _pair = Object ( slicedToArray [ "a" /* default */ ] ) ( pair , 2 ) ,
key = _pair [ 0 ] ,
value = _pair [ 1 ] ;
return value || key . indexOf ( 'data-' ) === 0 || Object ( external _lodash _ [ "includes" ] ) ( MEANINGFUL _ATTRIBUTES , key ) ;
} ) ;
}
/ * *
* Returns true if two text tokens ( with ` chars ` property ) are equivalent , or
* false otherwise .
*
* @ param { Object } actual Actual token .
* @ param { Object } expected Expected token .
*
* @ return { boolean } Whether two text tokens are equivalent .
* /
function isEquivalentTextTokens ( actual , expected ) {
// This function is intentionally written as syntactically "ugly" as a hot
// path optimization. Text is progressively normalized in order from least-
// to-most operationally expensive, until the earliest point at which text
// can be confidently inferred as being equal.
var actualChars = actual . chars ;
var expectedChars = expected . chars ;
for ( var i = 0 ; i < TEXT _NORMALIZATIONS . length ; i ++ ) {
var normalize = TEXT _NORMALIZATIONS [ i ] ;
actualChars = normalize ( actualChars ) ;
expectedChars = normalize ( expectedChars ) ;
if ( actualChars === expectedChars ) {
return true ;
}
}
log . warning ( 'Expected text `%s`, saw `%s`.' , expected . chars , actual . chars ) ;
return false ;
}
/ * *
* Given a style value , returns a normalized style value for strict equality
* comparison .
*
* @ param { string } value Style value .
*
* @ return { string } Normalized style value .
* /
function getNormalizedStyleValue ( value ) {
return value // Normalize URL type to omit whitespace or quotes
. replace ( REGEXP _STYLE _URL _TYPE , 'url($1)' ) ;
}
/ * *
* Given a style attribute string , returns an object of style properties .
*
* @ param { string } text Style attribute .
*
* @ return { Object } Style properties .
* /
function getStyleProperties ( text ) {
var pairs = text // Trim ending semicolon (avoid including in split)
. replace ( /;?\s*$/ , '' ) // Split on property assignment
. split ( ';' ) // For each property assignment...
. map ( function ( style ) {
// ...split further into key-value pairs
var _style$split = style . split ( ':' ) ,
_style$split2 = _toArray ( _style$split ) ,
key = _style$split2 [ 0 ] ,
valueParts = _style$split2 . slice ( 1 ) ;
var value = valueParts . join ( ':' ) ;
return [ key . trim ( ) , getNormalizedStyleValue ( value . trim ( ) ) ] ;
} ) ;
return Object ( external _lodash _ [ "fromPairs" ] ) ( pairs ) ;
}
/ * *
* Attribute - specific equality handlers
*
* @ type { Object }
* /
var isEqualAttributesOfName = Object ( objectSpread [ "a" /* default */ ] ) ( {
class : function _class ( actual , expected ) {
// Class matches if members are the same, even if out of order or
// superfluous whitespace between.
return ! external _lodash _ [ "xor" ] . apply ( void 0 , Object ( toConsumableArray [ "a" /* default */ ] ) ( [ actual , expected ] . map ( getTextPiecesSplitOnWhitespace ) ) ) . length ;
} ,
style : function style ( actual , expected ) {
return external _lodash _ [ "isEqual" ] . apply ( void 0 , Object ( toConsumableArray [ "a" /* default */ ] ) ( [ actual , expected ] . map ( getStyleProperties ) ) ) ;
}
} , Object ( external _lodash _ [ "fromPairs" ] ) ( BOOLEAN _ATTRIBUTES . map ( function ( attribute ) {
return [ attribute , external _lodash _ [ "stubTrue" ] ] ;
} ) ) ) ;
/ * *
* Given two sets of attribute tuples , returns true if the attribute sets are
* equivalent .
*
* @ param { Array [ ] } actual Actual attributes tuples .
* @ param { Array [ ] } expected Expected attributes tuples .
*
* @ return { boolean } Whether attributes are equivalent .
* /
function isEqualTagAttributePairs ( actual , expected ) {
// Attributes is tokenized as tuples. Their lengths should match. This also
// avoids us needing to check both attributes sets, since if A has any keys
// which do not exist in B, we know the sets to be different.
if ( actual . length !== expected . length ) {
log . warning ( 'Expected attributes %o, instead saw %o.' , expected , actual ) ;
return false ;
} // Convert tuples to object for ease of lookup
var _map = [ actual , expected ] . map ( external _lodash _ [ "fromPairs" ] ) ,
_map2 = Object ( slicedToArray [ "a" /* default */ ] ) ( _map , 2 ) ,
actualAttributes = _map2 [ 0 ] ,
expectedAttributes = _map2 [ 1 ] ;
for ( var name in actualAttributes ) {
// As noted above, if missing member in B, assume different
if ( ! expectedAttributes . hasOwnProperty ( name ) ) {
log . warning ( 'Encountered unexpected attribute `%s`.' , name ) ;
return false ;
}
var actualValue = actualAttributes [ name ] ;
var expectedValue = expectedAttributes [ name ] ;
var isEqualAttributes = isEqualAttributesOfName [ name ] ;
if ( isEqualAttributes ) {
// Defer custom attribute equality handling
if ( ! isEqualAttributes ( actualValue , expectedValue ) ) {
log . warning ( 'Expected attribute `%s` of value `%s`, saw `%s`.' , name , expectedValue , actualValue ) ;
return false ;
}
} else if ( actualValue !== expectedValue ) {
// Otherwise strict inequality should bail
log . warning ( 'Expected attribute `%s` of value `%s`, saw `%s`.' , name , expectedValue , actualValue ) ;
return false ;
}
}
return true ;
}
/ * *
* Token - type - specific equality handlers
*
* @ type { Object }
* /
var isEqualTokensOfType = {
StartTag : function StartTag ( actual , expected ) {
if ( actual . tagName !== expected . tagName ) {
log . warning ( 'Expected tag name `%s`, instead saw `%s`.' , expected . tagName , actual . tagName ) ;
return false ;
}
return isEqualTagAttributePairs . apply ( void 0 , Object ( toConsumableArray [ "a" /* default */ ] ) ( [ actual , expected ] . map ( getMeaningfulAttributePairs ) ) ) ;
} ,
Chars : isEquivalentTextTokens ,
Comment : isEquivalentTextTokens
} ;
/ * *
* Given an array of tokens , returns the first token which is not purely
* whitespace .
*
* Mutates the tokens array .
*
* @ param { Object [ ] } tokens Set of tokens to search .
*
* @ return { Object } Next non - whitespace token .
* /
function getNextNonWhitespaceToken ( tokens ) {
var token ;
while ( token = tokens . shift ( ) ) {
if ( token . type !== 'Chars' ) {
return token ;
}
if ( ! REGEXP _ONLY _WHITESPACE . test ( token . chars ) ) {
return token ;
}
}
}
/ * *
* Tokenize an HTML string , gracefully handling any errors thrown during
* underlying tokenization .
*
* @ param { string } html HTML string to tokenize .
*
* @ return { Object [ ] | null } Array of valid tokenized HTML elements , or null on error
* /
function getHTMLTokens ( html ) {
try {
2019-03-07 10:09:59 +01:00
return new tokenizer ( new validation _DecodeEntityParser ( ) ) . tokenize ( html ) ;
2018-12-18 04:14:52 +01:00
} catch ( e ) {
log . warning ( 'Malformed HTML detected: %s' , html ) ;
}
return null ;
}
/ * *
* Returns true if the next HTML token closes the current token .
*
* @ param { Object } currentToken Current token to compare with .
* @ param { Object | undefined } nextToken Next token to compare against .
*
* @ return { boolean } true if ` nextToken ` closes ` currentToken ` , false otherwise
* /
function isClosedByToken ( currentToken , nextToken ) {
// Ensure this is a self closed token
if ( ! currentToken . selfClosing ) {
return false ;
} // Check token names and determine if nextToken is the closing tag for currentToken
if ( nextToken && nextToken . tagName === currentToken . tagName && nextToken . type === 'EndTag' ) {
return true ;
}
return false ;
}
/ * *
* Returns true if the given HTML strings are effectively equivalent , or
* false otherwise . Invalid HTML is not considered equivalent , even if the
* strings directly match .
*
* @ param { string } actual Actual HTML string .
* @ param { string } expected Expected HTML string .
*
* @ return { boolean } Whether HTML strings are equivalent .
* /
function isEquivalentHTML ( actual , expected ) {
// Tokenize input content and reserialized save content
var _map3 = [ actual , expected ] . map ( getHTMLTokens ) ,
_map4 = Object ( slicedToArray [ "a" /* default */ ] ) ( _map3 , 2 ) ,
actualTokens = _map4 [ 0 ] ,
expectedTokens = _map4 [ 1 ] ; // If either is malformed then stop comparing - the strings are not equivalent
if ( ! actualTokens || ! expectedTokens ) {
return false ;
}
var actualToken , expectedToken ;
while ( actualToken = getNextNonWhitespaceToken ( actualTokens ) ) {
expectedToken = getNextNonWhitespaceToken ( expectedTokens ) ; // Inequal if exhausted all expected tokens
if ( ! expectedToken ) {
log . warning ( 'Expected end of content, instead saw %o.' , actualToken ) ;
return false ;
} // Inequal if next non-whitespace token of each set are not same type
if ( actualToken . type !== expectedToken . type ) {
log . warning ( 'Expected token of type `%s` (%o), instead saw `%s` (%o).' , expectedToken . type , expectedToken , actualToken . type , actualToken ) ;
return false ;
} // Defer custom token type equality handling, otherwise continue and
// assume as equal
var isEqualTokens = isEqualTokensOfType [ actualToken . type ] ;
if ( isEqualTokens && ! isEqualTokens ( actualToken , expectedToken ) ) {
return false ;
} // Peek at the next tokens (actual and expected) to see if they close
// a self-closing tag
if ( isClosedByToken ( actualToken , expectedTokens [ 0 ] ) ) {
// Consume the next expected token that closes the current actual
// self-closing token
getNextNonWhitespaceToken ( expectedTokens ) ;
} else if ( isClosedByToken ( expectedToken , actualTokens [ 0 ] ) ) {
// Consume the next actual token that closes the current expected
// self-closing token
getNextNonWhitespaceToken ( actualTokens ) ;
}
}
if ( expectedToken = getNextNonWhitespaceToken ( expectedTokens ) ) {
// If any non-whitespace tokens remain in expected token set, this
// indicates inequality
log . warning ( 'Expected %o, instead saw end of content.' , expectedToken ) ;
return false ;
}
return true ;
}
/ * *
* Returns true if the parsed block is valid given the input content . A block
* is considered valid if , when serialized with assumed attributes , the content
* matches the original value .
*
* Logs to console in development environments when invalid .
*
2019-03-21 13:48:00 +01:00
* @ param { string | Object } blockTypeOrName Block type .
* @ param { Object } attributes Parsed block attributes .
* @ param { string } originalBlockContent Original block content .
2018-12-18 04:14:52 +01:00
*
* @ return { boolean } Whether block is valid .
* /
2019-03-21 13:48:00 +01:00
function isValidBlockContent ( blockTypeOrName , attributes , originalBlockContent ) {
2018-12-18 04:14:52 +01:00
var blockType = normalizeBlockType ( blockTypeOrName ) ;
2019-03-21 13:48:00 +01:00
var generatedBlockContent ;
2018-12-18 04:14:52 +01:00
try {
2019-03-21 13:48:00 +01:00
generatedBlockContent = getSaveContent ( blockType , attributes ) ;
2018-12-18 04:14:52 +01:00
} catch ( error ) {
log . error ( 'Block validation failed because an error occurred while generating block content:\n\n%s' , error . toString ( ) ) ;
return false ;
}
2019-03-21 13:48:00 +01:00
var isValid = isEquivalentHTML ( originalBlockContent , generatedBlockContent ) ;
2018-12-18 04:14:52 +01:00
if ( ! isValid ) {
2019-03-21 13:48:00 +01:00
log . error ( 'Block validation failed for `%s` (%o).\n\nContent generated by `save` function:\n\n%s\n\nContent retrieved from post body:\n\n%s' , blockType . name , blockType , generatedBlockContent , originalBlockContent ) ;
2018-12-18 04:14:52 +01:00
}
return isValid ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/children.js
/ * *
* External dependencies
* /
/ * *
* WordPress dependencies
* /
/ * *
* Internal dependencies
* /
/ * *
* A representation of a block ' s rich text value .
*
* @ typedef { WPBlockNode [ ] } WPBlockChildren
* /
/ * *
* Given block children , returns a serialize - capable WordPress element .
*
* @ param { WPBlockChildren } children Block children object to convert .
*
* @ return { WPElement } A serialize - capable element .
* /
function getSerializeCapableElement ( children ) {
// The fact that block children are compatible with the element serializer is
// merely an implementation detail that currently serves to be true, but
// should not be mistaken as being a guarantee on the external API. The
// public API only offers guarantees to work with strings (toHTML) and DOM
// elements (fromDOM), and should provide utilities to manipulate the value
// rather than expect consumers to inspect or construct its shape (concat).
return children ;
}
/ * *
* Given block children , returns an array of block nodes .
*
* @ param { WPBlockChildren } children Block children object to convert .
*
* @ return { Array < WPBlockNode > } An array of individual block nodes .
* /
function getChildrenArray ( children ) {
// The fact that block children are compatible with the element serializer
// is merely an implementation detail that currently serves to be true, but
// should not be mistaken as being a guarantee on the external API.
return children ;
}
/ * *
* Given two or more block nodes , returns a new block node representing a
* concatenation of its values .
*
* @ param { ... WPBlockChildren } blockNodes Block nodes to concatenate .
*
* @ return { WPBlockChildren } Concatenated block node .
* /
function concat ( ) {
var result = [ ] ;
for ( var i = 0 ; i < arguments . length ; i ++ ) {
var blockNode = Object ( external _lodash _ [ "castArray" ] ) ( i < 0 || arguments . length <= i ? undefined : arguments [ i ] ) ;
for ( var j = 0 ; j < blockNode . length ; j ++ ) {
var child = blockNode [ j ] ;
var canConcatToPreviousString = typeof child === 'string' && typeof result [ result . length - 1 ] === 'string' ;
if ( canConcatToPreviousString ) {
result [ result . length - 1 ] += child ;
} else {
result . push ( child ) ;
}
}
}
return result ;
}
/ * *
* Given an iterable set of DOM nodes , returns equivalent block children .
* Ignores any non - element / text nodes included in set .
*
* @ param { Iterable . < Node > } domNodes Iterable set of DOM nodes to convert .
*
* @ return { WPBlockChildren } Block children equivalent to DOM nodes .
* /
function fromDOM ( domNodes ) {
var result = [ ] ;
for ( var i = 0 ; i < domNodes . length ; i ++ ) {
try {
result . push ( node _fromDOM ( domNodes [ i ] ) ) ;
} catch ( error ) { // Simply ignore if DOM node could not be converted.
}
}
return result ;
}
/ * *
* Given a block node , returns its HTML string representation .
*
* @ param { WPBlockChildren } children Block node ( s ) to convert to string .
*
* @ return { string } String HTML representation of block node .
* /
function toHTML ( children ) {
var element = getSerializeCapableElement ( children ) ;
return Object ( external _this _wp _element _ [ "renderToString" ] ) ( element ) ;
}
/ * *
* Given a selector , returns an hpq matcher generating a WPBlockChildren value
* matching the selector result .
*
* @ param { string } selector DOM selector .
*
* @ return { Function } hpq matcher .
* /
function children _matcher ( selector ) {
return function ( domNode ) {
var match = domNode ;
if ( selector ) {
match = domNode . querySelector ( selector ) ;
}
if ( match ) {
return fromDOM ( match . childNodes ) ;
}
return [ ] ;
} ;
}
/* harmony default export */ var api _children = ( {
concat : concat ,
getChildrenArray : getChildrenArray ,
fromDOM : fromDOM ,
toHTML : toHTML ,
matcher : children _matcher
} ) ;
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/node.js
/ * *
* Internal dependencies
* /
/ * *
* Browser dependencies
* /
var _window$Node = window . Node ,
TEXT _NODE = _window$Node . TEXT _NODE ,
ELEMENT _NODE = _window$Node . ELEMENT _NODE ;
/ * *
* A representation of a single node within a block ' s rich text value . If
* representing a text node , the value is simply a string of the node value .
* As representing an element node , it is an object of :
*
* 1. ` type ` ( string ) : Tag name .
* 2. ` props ` ( object ) : Attributes and children array of WPBlockNode .
*
* @ typedef { string | Object } WPBlockNode
* /
/ * *
* Given a single node and a node type ( e . g . ` 'br' ` ) , returns true if the node
* corresponds to that type , false otherwise .
*
* @ param { WPBlockNode } node Block node to test
* @ param { string } type Node to type to test against .
*
* @ return { boolean } Whether node is of intended type .
* /
function isNodeOfType ( node , type ) {
return node && node . type === type ;
}
/ * *
* Given an object implementing the NamedNodeMap interface , returns a plain
* object equivalent value of name , value key - value pairs .
*
* @ see https : //dom.spec.whatwg.org/#interface-namednodemap
*
* @ param { NamedNodeMap } nodeMap NamedNodeMap to convert to object .
*
* @ return { Object } Object equivalent value of NamedNodeMap .
* /
function getNamedNodeMapAsObject ( nodeMap ) {
var result = { } ;
for ( var i = 0 ; i < nodeMap . length ; i ++ ) {
var _nodeMap$i = nodeMap [ i ] ,
name = _nodeMap$i . name ,
value = _nodeMap$i . value ;
result [ name ] = value ;
}
return result ;
}
/ * *
* Given a DOM Element or Text node , returns an equivalent block node . Throws
* if passed any node type other than element or text .
*
* @ throws { TypeError } If non - element / text node is passed .
*
* @ param { Node } domNode DOM node to convert .
*
* @ return { WPBlockNode } Block node equivalent to DOM node .
* /
function node _fromDOM ( domNode ) {
if ( domNode . nodeType === TEXT _NODE ) {
return domNode . nodeValue ;
}
if ( domNode . nodeType !== ELEMENT _NODE ) {
throw new TypeError ( 'A block node can only be created from a node of type text or ' + 'element.' ) ;
}
return {
type : domNode . nodeName . toLowerCase ( ) ,
props : Object ( objectSpread [ "a" /* default */ ] ) ( { } , getNamedNodeMapAsObject ( domNode . attributes ) , {
children : fromDOM ( domNode . childNodes )
} )
} ;
}
/ * *
* Given a block node , returns its HTML string representation .
*
* @ param { WPBlockNode } node Block node to convert to string .
*
* @ return { string } String HTML representation of block node .
* /
function node _toHTML ( node ) {
return toHTML ( [ node ] ) ;
}
/ * *
* Given a selector , returns an hpq matcher generating a WPBlockNode value
* matching the selector result .
*
* @ param { string } selector DOM selector .
*
* @ return { Function } hpq matcher .
* /
function node _matcher ( selector ) {
return function ( domNode ) {
var match = domNode ;
if ( selector ) {
match = domNode . querySelector ( selector ) ;
}
try {
return node _fromDOM ( match ) ;
} catch ( error ) {
return null ;
}
} ;
}
/* harmony default export */ var api _node = ( {
isNodeOfType : isNodeOfType ,
fromDOM : node _fromDOM ,
toHTML : node _toHTML ,
matcher : node _matcher
} ) ;
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/matchers.js
/ * *
* External dependencies
* /
/ * *
* Internal dependencies
* /
function matchers _html ( selector , multilineTag ) {
return function ( domNode ) {
var match = domNode ;
if ( selector ) {
match = domNode . querySelector ( selector ) ;
}
if ( ! match ) {
return '' ;
}
if ( multilineTag ) {
var value = '' ;
var length = match . children . length ;
for ( var index = 0 ; index < length ; index ++ ) {
var child = match . children [ index ] ;
if ( child . nodeName . toLowerCase ( ) !== multilineTag ) {
continue ;
}
value += child . outerHTML ;
}
return value ;
}
return match . innerHTML ;
} ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/parser.js
/ * *
* External dependencies
* /
/ * *
* WordPress dependencies
* /
/ * *
* Internal dependencies
* /
/ * *
* Sources which are guaranteed to return a string value .
*
* @ type { Set }
* /
var STRING _SOURCES = new Set ( [ 'attribute' , 'html' , 'text' , 'tag' ] ) ;
/ * *
* Higher - order hpq matcher which enhances an attribute matcher to return true
* or false depending on whether the original matcher returns undefined . This
* is useful for boolean attributes ( e . g . disabled ) whose attribute values may
* be technically falsey ( empty string ) , though their mere presence should be
* enough to infer as true .
*
* @ param { Function } matcher Original hpq matcher .
*
* @ return { Function } Enhanced hpq matcher .
* /
var parser _toBooleanAttributeMatcher = function toBooleanAttributeMatcher ( matcher ) {
return Object ( external _lodash _ [ "flow" ] ) ( [ matcher , // Expected values from `attr( 'disabled' )`:
//
// <input>
// - Value: `undefined`
// - Transformed: `false`
//
// <input disabled>
// - Value: `''`
// - Transformed: `true`
//
// <input disabled="disabled">
// - Value: `'disabled'`
// - Transformed: `true`
function ( value ) {
return value !== undefined ;
} ] ) ;
} ;
/ * *
* Returns true if value is of the given JSON schema type , or false otherwise .
*
* @ see http : //json-schema.org/latest/json-schema-validation.html#rfc.section.6.25
*
* @ param { * } value Value to test .
* @ param { string } type Type to test .
*
* @ return { boolean } Whether value is of type .
* /
function isOfType ( value , type ) {
switch ( type ) {
case 'string' :
return typeof value === 'string' ;
case 'boolean' :
return typeof value === 'boolean' ;
case 'object' :
return ! ! value && value . constructor === Object ;
case 'null' :
return value === null ;
case 'array' :
return Array . isArray ( value ) ;
case 'integer' :
case 'number' :
return typeof value === 'number' ;
}
return true ;
}
/ * *
* Returns true if value is of an array of given JSON schema types , or false
* otherwise .
*
* @ see http : //json-schema.org/latest/json-schema-validation.html#rfc.section.6.25
*
* @ param { * } value Value to test .
* @ param { string [ ] } types Types to test .
*
* @ return { boolean } Whether value is of types .
* /
function isOfTypes ( value , types ) {
return types . some ( function ( type ) {
return isOfType ( value , type ) ;
} ) ;
}
/ * *
* Returns true if the given attribute schema describes a value which may be
* an ambiguous string .
*
* Some sources are ambiguously serialized as strings , for which value casting
* is enabled . This is only possible when a singular type is assigned to the
* attribute schema , since the string ambiguity makes it impossible to know the
* correct type of multiple to which to cast .
*
* @ param { Object } attributeSchema Attribute ' s schema .
*
* @ return { boolean } Whether attribute schema defines an ambiguous string
* source .
* /
function isAmbiguousStringSource ( attributeSchema ) {
var source = attributeSchema . source ,
type = attributeSchema . type ;
var isStringSource = STRING _SOURCES . has ( source ) ;
var isSingleType = typeof type === 'string' ;
return isStringSource && isSingleType ;
}
/ * *
* Returns value coerced to the specified JSON schema type string .
*
* @ see http : //json-schema.org/latest/json-schema-validation.html#rfc.section.6.25
*
* @ param { * } value Original value .
* @ param { string } type Type to coerce .
*
* @ return { * } Coerced value .
* /
function asType ( value , type ) {
switch ( type ) {
case 'string' :
return String ( value ) ;
case 'boolean' :
return Boolean ( value ) ;
case 'object' :
return Object ( value ) ;
case 'null' :
return null ;
case 'array' :
if ( Array . isArray ( value ) ) {
return value ;
}
return Array . from ( value ) ;
case 'integer' :
case 'number' :
return Number ( value ) ;
}
return value ;
}
/ * *
* Returns an hpq matcher given a source object .
*
* @ param { Object } sourceConfig Attribute Source object .
*
* @ return { Function } A hpq Matcher .
* /
function matcherFromSource ( sourceConfig ) {
switch ( sourceConfig . source ) {
case 'attribute' :
var matcher = attr ( sourceConfig . selector , sourceConfig . attribute ) ;
if ( sourceConfig . type === 'boolean' ) {
matcher = parser _toBooleanAttributeMatcher ( matcher ) ;
}
return matcher ;
case 'html' :
return matchers _html ( sourceConfig . selector , sourceConfig . multiline ) ;
case 'text' :
return es _text ( sourceConfig . selector ) ;
case 'children' :
return children _matcher ( sourceConfig . selector ) ;
case 'node' :
return node _matcher ( sourceConfig . selector ) ;
case 'query' :
var subMatchers = Object ( external _lodash _ [ "mapValues" ] ) ( sourceConfig . query , matcherFromSource ) ;
return query ( sourceConfig . selector , subMatchers ) ;
case 'tag' :
return Object ( external _lodash _ [ "flow" ] ) ( [ prop ( sourceConfig . selector , 'nodeName' ) , function ( value ) {
return value . toLowerCase ( ) ;
} ] ) ;
default :
// eslint-disable-next-line no-console
console . error ( "Unknown source type \"" . concat ( sourceConfig . source , "\"" ) ) ;
}
}
/ * *
* Given a block 's raw content and an attribute' s schema returns the attribute ' s
* value depending on its source .
*
* @ param { string } innerHTML Block ' s raw content .
* @ param { Object } attributeSchema Attribute ' s schema .
*
* @ return { * } Attribute value .
* /
function parseWithAttributeSchema ( innerHTML , attributeSchema ) {
return es _parse ( innerHTML , matcherFromSource ( attributeSchema ) ) ;
}
/ * *
* Given an attribute key , an attribute 's schema, a block' s raw content and the
* commentAttributes returns the attribute value depending on its source
* definition of the given attribute key .
*
* @ param { string } attributeKey Attribute key .
* @ param { Object } attributeSchema Attribute ' s schema .
* @ param { string } innerHTML Block ' s raw content .
* @ param { Object } commentAttributes Block ' s comment attributes .
*
* @ return { * } Attribute value .
* /
function getBlockAttribute ( attributeKey , attributeSchema , innerHTML , commentAttributes ) {
var type = attributeSchema . type ;
var value ;
switch ( attributeSchema . source ) {
// undefined source means that it's an attribute serialized to the block's "comment"
case undefined :
value = commentAttributes ? commentAttributes [ attributeKey ] : undefined ;
break ;
case 'attribute' :
case 'property' :
case 'html' :
case 'text' :
case 'children' :
case 'node' :
case 'query' :
case 'tag' :
value = parseWithAttributeSchema ( innerHTML , attributeSchema ) ;
break ;
}
if ( type !== undefined && ! isOfTypes ( value , Object ( external _lodash _ [ "castArray" ] ) ( type ) ) ) {
// Reject the value if it is not valid of type. Reverting to the
// undefined value ensures the default is restored, if applicable.
value = undefined ;
}
if ( value === undefined ) {
return attributeSchema . default ;
}
return value ;
}
/ * *
* Returns the block attributes of a registered block node given its type .
*
* @ param { string | Object } blockTypeOrName Block type or name .
* @ param { string } innerHTML Raw block content .
* @ param { ? Object } attributes Known block attributes ( from delimiters ) .
*
* @ return { Object } All block attributes .
* /
function getBlockAttributes ( blockTypeOrName , innerHTML ) {
var attributes = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : { } ;
var blockType = normalizeBlockType ( blockTypeOrName ) ;
var blockAttributes = Object ( external _lodash _ [ "mapValues" ] ) ( blockType . attributes , function ( attributeSchema , attributeKey ) {
return getBlockAttribute ( attributeKey , attributeSchema , innerHTML , attributes ) ;
} ) ;
return Object ( external _this _wp _hooks _ [ "applyFilters" ] ) ( 'blocks.getBlockAttributes' , blockAttributes , blockType , innerHTML , attributes ) ;
}
/ * *
* Given a block object , returns a new copy of the block with any applicable
* deprecated migrations applied , or the original block if it was both valid
* and no eligible migrations exist .
*
2019-03-07 10:09:59 +01:00
* @ param { WPBlock } block Original block object .
* @ param { Object } parsedAttributes Attributes as parsed from the initial
* block markup .
2018-12-18 04:14:52 +01:00
*
* @ return { WPBlock } Migrated block object .
* /
2019-03-07 10:09:59 +01:00
function getMigratedBlock ( block , parsedAttributes ) {
2018-12-18 04:14:52 +01:00
var blockType = registration _getBlockType ( block . name ) ;
var deprecatedDefinitions = blockType . deprecated ;
if ( ! deprecatedDefinitions || ! deprecatedDefinitions . length ) {
return block ;
}
var _block = block ,
originalContent = _block . originalContent ,
innerBlocks = _block . innerBlocks ;
for ( var i = 0 ; i < deprecatedDefinitions . length ; i ++ ) {
// A block can opt into a migration even if the block is valid by
// defining isEligible on its deprecation. If the block is both valid
// and does not opt to migrate, skip.
var _deprecatedDefinition = deprecatedDefinitions [ i ] . isEligible ,
isEligible = _deprecatedDefinition === void 0 ? external _lodash _ [ "stubFalse" ] : _deprecatedDefinition ;
2019-03-07 10:09:59 +01:00
if ( block . isValid && ! isEligible ( parsedAttributes , innerBlocks ) ) {
2018-12-18 04:14:52 +01:00
continue ;
} // Block type properties which could impact either serialization or
// parsing are not considered in the deprecated block type by default,
// and must be explicitly provided.
var deprecatedBlockType = Object . assign ( Object ( external _lodash _ [ "omit" ] ) ( blockType , [ 'attributes' , 'save' , 'supports' ] ) , deprecatedDefinitions [ i ] ) ;
2019-03-07 10:09:59 +01:00
var migratedAttributes = getBlockAttributes ( deprecatedBlockType , originalContent , parsedAttributes ) ; // Ignore the deprecation if it produces a block which is not valid.
2018-12-18 04:14:52 +01:00
var isValid = isValidBlockContent ( deprecatedBlockType , migratedAttributes , originalContent ) ;
if ( ! isValid ) {
continue ;
}
block = Object ( objectSpread [ "a" /* default */ ] ) ( { } , block , {
isValid : true
} ) ;
var migratedInnerBlocks = innerBlocks ; // A block may provide custom behavior to assign new attributes and/or
// inner blocks.
var migrate = deprecatedBlockType . migrate ;
if ( migrate ) {
var _castArray = Object ( external _lodash _ [ "castArray" ] ) ( migrate ( migratedAttributes , innerBlocks ) ) ;
var _castArray2 = Object ( slicedToArray [ "a" /* default */ ] ) ( _castArray , 2 ) ;
var _castArray2$ = _castArray2 [ 0 ] ;
2019-03-07 10:09:59 +01:00
migratedAttributes = _castArray2$ === void 0 ? parsedAttributes : _castArray2$ ;
2018-12-18 04:14:52 +01:00
var _castArray2$2 = _castArray2 [ 1 ] ;
migratedInnerBlocks = _castArray2$2 === void 0 ? innerBlocks : _castArray2$2 ;
}
block . attributes = migratedAttributes ;
block . innerBlocks = migratedInnerBlocks ;
}
return block ;
}
/ * *
* Creates a block with fallback to the unknown type handler .
*
* @ param { Object } blockNode Parsed block node .
*
* @ return { ? Object } An initialized block object ( if possible ) .
* /
function createBlockWithFallback ( blockNode ) {
var originalName = blockNode . blockName ;
var attributes = blockNode . attrs ,
_blockNode$innerBlock = blockNode . innerBlocks ,
innerBlocks = _blockNode$innerBlock === void 0 ? [ ] : _blockNode$innerBlock ,
innerHTML = blockNode . innerHTML ;
var freeformContentFallbackBlock = getFreeformContentHandlerName ( ) ;
var unregisteredFallbackBlock = getUnregisteredTypeHandlerName ( ) || freeformContentFallbackBlock ;
attributes = attributes || { } ; // Trim content to avoid creation of intermediary freeform segments.
innerHTML = innerHTML . trim ( ) ; // Use type from block content if available. Otherwise, default to the
// freeform content fallback.
var name = originalName || freeformContentFallbackBlock ; // Convert 'core/cover-image' block in existing content to 'core/cover'.
if ( 'core/cover-image' === name ) {
name = 'core/cover' ;
} // Convert 'core/text' blocks in existing content to 'core/paragraph'.
if ( 'core/text' === name || 'core/cover-text' === name ) {
name = 'core/paragraph' ;
} // Fallback content may be upgraded from classic editor expecting implicit
// automatic paragraphs, so preserve them. Assumes wpautop is idempotent,
// meaning there are no negative consequences to repeated autop calls.
if ( name === freeformContentFallbackBlock ) {
innerHTML = Object ( external _this _wp _autop _ [ "autop" ] ) ( innerHTML ) . trim ( ) ;
} // Try finding the type for known block name, else fall back again.
var blockType = registration _getBlockType ( name ) ;
if ( ! blockType ) {
// Preserve undelimited content for use by the unregistered type handler.
var originalUndelimitedContent = innerHTML ; // If detected as a block which is not registered, preserve comment
// delimiters in content of unregistered type handler.
if ( name ) {
innerHTML = getCommentDelimitedContent ( name , attributes , innerHTML ) ;
}
name = unregisteredFallbackBlock ;
attributes = {
originalName : originalName ,
originalUndelimitedContent : originalUndelimitedContent
} ;
blockType = registration _getBlockType ( name ) ;
} // Coerce inner blocks from parsed form to canonical form.
innerBlocks = innerBlocks . map ( createBlockWithFallback ) ;
var isFallbackBlock = name === freeformContentFallbackBlock || name === unregisteredFallbackBlock ; // Include in set only if type was determined.
if ( ! blockType || ! innerHTML && isFallbackBlock ) {
return ;
}
var block = createBlock ( name , getBlockAttributes ( blockType , innerHTML , attributes ) , innerBlocks ) ; // Block validation assumes an idempotent operation from source block to serialized block
// provided there are no changes in attributes. The validation procedure thus compares the
// provided source value with the serialized output before there are any modifications to
// the block. When both match, the block is marked as valid.
if ( ! isFallbackBlock ) {
block . isValid = isValidBlockContent ( blockType , block . attributes , innerHTML ) ;
} // Preserve original content for future use in case the block is parsed as
// invalid, or future serialization attempt results in an error.
block . originalContent = innerHTML ;
2019-03-07 10:09:59 +01:00
block = getMigratedBlock ( block , attributes ) ;
2018-12-18 04:14:52 +01:00
return block ;
}
/ * *
* Creates a parse implementation for the post content which returns a list of blocks .
*
* @ param { Function } parseImplementation Parse implementation .
*
* @ return { Function } An implementation which parses the post content .
* /
var createParse = function createParse ( parseImplementation ) {
return function ( content ) {
return parseImplementation ( content ) . reduce ( function ( memo , blockNode ) {
var block = createBlockWithFallback ( blockNode ) ;
if ( block ) {
memo . push ( block ) ;
}
return memo ;
} , [ ] ) ;
} ;
} ;
/ * *
* Parses the post content with a PegJS grammar and returns a list of blocks .
*
* @ param { string } content The post content .
*
* @ return { Array } Block list .
* /
var parseWithGrammar = createParse ( external _this _wp _blockSerializationDefaultParser _ [ "parse" ] ) ;
/* harmony default export */ var parser = ( parseWithGrammar ) ;
// EXTERNAL MODULE: external {"this":["wp","dom"]}
2019-03-21 13:48:00 +01:00
var external _this _wp _dom _ = _ _webpack _require _ _ ( 25 ) ;
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/phrasing-content.js
/ * *
* External dependencies
* /
var phrasing _content _phrasingContentSchema = {
strong : { } ,
em : { } ,
2019-03-21 13:48:00 +01:00
s : { } ,
2018-12-18 04:14:52 +01:00
del : { } ,
ins : { } ,
a : {
attributes : [ 'href' , 'target' , 'rel' ]
} ,
code : { } ,
abbr : {
attributes : [ 'title' ]
} ,
sub : { } ,
sup : { } ,
br : { } ,
'#text' : { }
} ; // Recursion is needed.
// Possible: strong > em > strong.
// Impossible: strong > strong.
2019-03-21 13:48:00 +01:00
[ 'strong' , 'em' , 's' , 'del' , 'ins' , 'a' , 'code' , 'abbr' , 'sub' , 'sup' ] . forEach ( function ( tag ) {
2018-12-18 04:14:52 +01:00
phrasing _content _phrasingContentSchema [ tag ] . children = Object ( external _lodash _ [ "omit" ] ) ( phrasing _content _phrasingContentSchema , tag ) ;
} ) ;
/ * *
* Get schema of possible paths for phrasing content .
*
* @ see https : //developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Phrasing_content
*
* @ return { Object } Schema .
* /
function getPhrasingContentSchema ( ) {
return phrasing _content _phrasingContentSchema ;
}
/ * *
* Find out whether or not the given node is phrasing content .
*
* @ see https : //developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Phrasing_content
*
* @ param { Element } node The node to test .
*
* @ return { boolean } True if phrasing content , false if not .
* /
function isPhrasingContent ( node ) {
var tag = node . nodeName . toLowerCase ( ) ;
return getPhrasingContentSchema ( ) . hasOwnProperty ( tag ) || tag === 'span' ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/utils.js
/ * *
* External dependencies
* /
/ * *
* WordPress dependencies
* /
/ * *
* Internal dependencies
* /
2019-03-07 10:09:59 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Browser dependencies
* /
var utils _window$Node = window . Node ,
utils _ELEMENT _NODE = utils _window$Node . ELEMENT _NODE ,
utils _TEXT _NODE = utils _window$Node . TEXT _NODE ;
/ * *
* Given raw transforms from blocks , merges all schemas into one .
*
* @ param { Array } transforms Block transforms , of the ` raw ` type .
*
* @ return { Object } A complete block content schema .
* /
function getBlockContentSchema ( transforms ) {
var schemas = transforms . map ( function ( _ref ) {
2018-12-19 04:16:48 +01:00
var isMatch = _ref . isMatch ,
blockName = _ref . blockName ,
2018-12-18 04:14:52 +01:00
schema = _ref . schema ;
2019-03-07 10:09:59 +01:00
var hasAnchorSupport = registration _hasBlockSupport ( blockName , 'anchor' ) ; // If the block does not has anchor support and the transform does not
// provides an isMatch we can return the schema right away.
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
if ( ! hasAnchorSupport && ! isMatch ) {
return schema ;
}
2018-12-19 04:16:48 +01:00
2019-03-07 10:09:59 +01:00
return Object ( external _lodash _ [ "mapValues" ] ) ( schema , function ( value ) {
var attributes = value . attributes || [ ] ; // If the block supports the "anchor" functionality, it needs to keep its ID attribute.
2018-12-19 04:16:48 +01:00
2019-03-07 10:09:59 +01:00
if ( hasAnchorSupport ) {
attributes = [ ] . concat ( Object ( toConsumableArray [ "a" /* default */ ] ) ( attributes ) , [ 'id' ] ) ;
2018-12-19 04:16:48 +01:00
}
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
return Object ( objectSpread [ "a" /* default */ ] ) ( { } , value , {
attributes : attributes ,
isMatch : isMatch ? isMatch : undefined
} ) ;
} ) ;
2018-12-18 04:14:52 +01:00
} ) ;
return external _lodash _ [ "mergeWith" ] . apply ( void 0 , [ { } ] . concat ( Object ( toConsumableArray [ "a" /* default */ ] ) ( schemas ) , [ function ( objValue , srcValue , key ) {
2018-12-19 04:16:48 +01:00
switch ( key ) {
case 'children' :
{
if ( objValue === '*' || srcValue === '*' ) {
return '*' ;
}
return Object ( objectSpread [ "a" /* default */ ] ) ( { } , objValue , srcValue ) ;
}
case 'attributes' :
case 'require' :
{
2019-03-07 10:09:59 +01:00
return [ ] . concat ( Object ( toConsumableArray [ "a" /* default */ ] ) ( objValue || [ ] ) , Object ( toConsumableArray [ "a" /* default */ ] ) ( srcValue || [ ] ) ) ;
2018-12-19 04:16:48 +01:00
}
case 'isMatch' :
{
// If one of the values being merge is undefined (matches everything),
// the result of the merge will be undefined.
if ( ! objValue || ! srcValue ) {
return undefined ;
} // When merging two isMatch functions, the result is a new function
// that returns if one of the source functions returns true.
2018-12-18 04:14:52 +01:00
2018-12-19 04:16:48 +01:00
return function ( ) {
return objValue . apply ( void 0 , arguments ) || srcValue . apply ( void 0 , arguments ) ;
} ;
}
2018-12-18 04:14:52 +01:00
}
} ] ) ) ;
}
/ * *
* Recursively checks if an element is empty . An element is not empty if it
* contains text or contains elements with attributes such as images .
*
* @ param { Element } element The element to check .
*
* @ return { boolean } Wether or not the element is empty .
* /
function isEmpty ( element ) {
if ( ! element . hasChildNodes ( ) ) {
return true ;
}
return Array . from ( element . childNodes ) . every ( function ( node ) {
if ( node . nodeType === utils _TEXT _NODE ) {
return ! node . nodeValue . trim ( ) ;
}
if ( node . nodeType === utils _ELEMENT _NODE ) {
if ( node . nodeName === 'BR' ) {
return true ;
} else if ( node . hasAttributes ( ) ) {
return false ;
}
return isEmpty ( node ) ;
}
return true ;
} ) ;
}
/ * *
* Checks wether HTML can be considered plain text . That is , it does not contain
* any elements that are not line breaks .
*
* @ param { string } HTML The HTML to check .
*
* @ return { boolean } Wether the HTML can be considered plain text .
* /
function isPlain ( HTML ) {
return ! /<(?!br[ />])/i . test ( HTML ) ;
}
/ * *
* Given node filters , deeply filters and mutates a NodeList .
*
* @ param { NodeList } nodeList The nodeList to filter .
* @ param { Array } filters An array of functions that can mutate with the provided node .
* @ param { Document } doc The document of the nodeList .
* @ param { Object } schema The schema to use .
* /
function deepFilterNodeList ( nodeList , filters , doc , schema ) {
Array . from ( nodeList ) . forEach ( function ( node ) {
deepFilterNodeList ( node . childNodes , filters , doc , schema ) ;
filters . forEach ( function ( item ) {
// Make sure the node is still attached to the document.
if ( ! doc . contains ( node ) ) {
return ;
}
item ( node , doc , schema ) ;
} ) ;
} ) ;
}
/ * *
* Given node filters , deeply filters HTML tags .
* Filters from the deepest nodes to the top .
*
* @ param { string } HTML The HTML to filter .
* @ param { Array } filters An array of functions that can mutate with the provided node .
* @ param { Object } schema The schema to use .
*
* @ return { string } The filtered HTML .
* /
function deepFilterHTML ( HTML ) {
var filters = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : [ ] ;
var schema = arguments . length > 2 ? arguments [ 2 ] : undefined ;
var doc = document . implementation . createHTMLDocument ( '' ) ;
doc . body . innerHTML = HTML ;
deepFilterNodeList ( doc . body . childNodes , filters , doc , schema ) ;
return doc . body . innerHTML ;
}
/ * *
* Given a schema , unwraps or removes nodes , attributes and classes on a node
* list .
*
* @ param { NodeList } nodeList The nodeList to filter .
* @ param { Document } doc The document of the nodeList .
* @ param { Object } schema An array of functions that can mutate with the provided node .
* @ param { Object } inline Whether to clean for inline mode .
* /
function cleanNodeList ( nodeList , doc , schema , inline ) {
Array . from ( nodeList ) . forEach ( function ( node ) {
2018-12-19 04:16:48 +01:00
var tag = node . nodeName . toLowerCase ( ) ; // It's a valid child, if the tag exists in the schema without an isMatch
// function, or with an isMatch function that matches the node.
2018-12-18 04:14:52 +01:00
2018-12-19 04:16:48 +01:00
if ( schema . hasOwnProperty ( tag ) && ( ! schema [ tag ] . isMatch || schema [ tag ] . isMatch ( node ) ) ) {
2018-12-18 04:14:52 +01:00
if ( node . nodeType === utils _ELEMENT _NODE ) {
var _schema$tag = schema [ tag ] ,
_schema$tag$attribute = _schema$tag . attributes ,
attributes = _schema$tag$attribute === void 0 ? [ ] : _schema$tag$attribute ,
_schema$tag$classes = _schema$tag . classes ,
classes = _schema$tag$classes === void 0 ? [ ] : _schema$tag$classes ,
children = _schema$tag . children ,
_schema$tag$require = _schema$tag . require ,
2019-03-07 10:09:59 +01:00
require = _schema$tag$require === void 0 ? [ ] : _schema$tag$require ,
allowEmpty = _schema$tag . allowEmpty ; // If the node is empty and it's supposed to have children,
2018-12-18 04:14:52 +01:00
// remove the node.
2019-03-07 10:09:59 +01:00
if ( children && ! allowEmpty && isEmpty ( node ) ) {
2018-12-18 04:14:52 +01:00
Object ( external _this _wp _dom _ [ "remove" ] ) ( node ) ;
return ;
}
if ( node . hasAttributes ( ) ) {
// Strip invalid attributes.
Array . from ( node . attributes ) . forEach ( function ( _ref2 ) {
var name = _ref2 . name ;
if ( name !== 'class' && ! Object ( external _lodash _ [ "includes" ] ) ( attributes , name ) ) {
node . removeAttribute ( name ) ;
}
} ) ; // Strip invalid classes.
2019-03-07 10:09:59 +01:00
// In jsdom-jscore, 'node.classList' can be undefined.
// TODO: Explore patching this in jsdom-jscore.
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
if ( node . classList && node . classList . length ) {
2018-12-18 04:14:52 +01:00
var mattchers = classes . map ( function ( item ) {
if ( typeof item === 'string' ) {
return function ( className ) {
return className === item ;
} ;
} else if ( item instanceof RegExp ) {
return function ( className ) {
return item . test ( className ) ;
} ;
}
return external _lodash _ [ "noop" ] ;
} ) ;
Array . from ( node . classList ) . forEach ( function ( name ) {
if ( ! mattchers . some ( function ( isMatch ) {
return isMatch ( name ) ;
} ) ) {
node . classList . remove ( name ) ;
}
} ) ;
if ( ! node . classList . length ) {
node . removeAttribute ( 'class' ) ;
}
}
}
if ( node . hasChildNodes ( ) ) {
// Do not filter any content.
if ( children === '*' ) {
return ;
} // Continue if the node is supposed to have children.
if ( children ) {
// If a parent requires certain children, but it does
// not have them, drop the parent and continue.
if ( require . length && ! node . querySelector ( require . join ( ',' ) ) ) {
cleanNodeList ( node . childNodes , doc , schema , inline ) ;
2019-03-07 10:09:59 +01:00
Object ( external _this _wp _dom _ [ "unwrap" ] ) ( node ) ; // If the node is at the top, phrasing content, and
// contains children that are block content, unwrap
// the node because it is invalid.
} else if ( node . parentNode . nodeName === 'BODY' && isPhrasingContent ( node ) ) {
cleanNodeList ( node . childNodes , doc , schema , inline ) ;
if ( Array . from ( node . childNodes ) . some ( function ( child ) {
return ! isPhrasingContent ( child ) ;
} ) ) {
Object ( external _this _wp _dom _ [ "unwrap" ] ) ( node ) ;
}
} else {
cleanNodeList ( node . childNodes , doc , children , inline ) ;
} // Remove children if the node is not supposed to have any.
2018-12-18 04:14:52 +01:00
} else {
while ( node . firstChild ) {
Object ( external _this _wp _dom _ [ "remove" ] ) ( node . firstChild ) ;
}
}
}
} // Invalid child. Continue with schema at the same place and unwrap.
} else {
cleanNodeList ( node . childNodes , doc , schema , inline ) ; // For inline mode, insert a line break when unwrapping nodes that
// are not phrasing content.
if ( inline && ! isPhrasingContent ( node ) && node . nextElementSibling ) {
Object ( external _this _wp _dom _ [ "insertAfter" ] ) ( doc . createElement ( 'br' ) , node ) ;
}
Object ( external _this _wp _dom _ [ "unwrap" ] ) ( node ) ;
}
} ) ;
}
/ * *
* Given a schema , unwraps or removes nodes , attributes and classes on HTML .
*
* @ param { string } HTML The HTML to clean up .
* @ param { Object } schema Schema for the HTML .
* @ param { Object } inline Whether to clean for inline mode .
*
* @ return { string } The cleaned up HTML .
* /
function removeInvalidHTML ( HTML , schema , inline ) {
var doc = document . implementation . createHTMLDocument ( '' ) ;
doc . body . innerHTML = HTML ;
cleanNodeList ( doc . body . childNodes , doc , schema , inline ) ;
return doc . body . innerHTML ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/normalise-blocks.js
/ * *
* Internal dependencies
* /
/ * *
* Browser dependencies
* /
var normalise _blocks _window$Node = window . Node ,
normalise _blocks _ELEMENT _NODE = normalise _blocks _window$Node . ELEMENT _NODE ,
normalise _blocks _TEXT _NODE = normalise _blocks _window$Node . TEXT _NODE ;
/* harmony default export */ var normalise _blocks = ( function ( HTML ) {
var decuDoc = document . implementation . createHTMLDocument ( '' ) ;
var accuDoc = document . implementation . createHTMLDocument ( '' ) ;
var decu = decuDoc . body ;
var accu = accuDoc . body ;
decu . innerHTML = HTML ;
while ( decu . firstChild ) {
var node = decu . firstChild ; // Text nodes: wrap in a paragraph, or append to previous.
if ( node . nodeType === normalise _blocks _TEXT _NODE ) {
if ( ! node . nodeValue . trim ( ) ) {
decu . removeChild ( node ) ;
} else {
if ( ! accu . lastChild || accu . lastChild . nodeName !== 'P' ) {
accu . appendChild ( accuDoc . createElement ( 'P' ) ) ;
}
accu . lastChild . appendChild ( node ) ;
} // Element nodes.
} else if ( node . nodeType === normalise _blocks _ELEMENT _NODE ) {
// BR nodes: create a new paragraph on double, or append to previous.
if ( node . nodeName === 'BR' ) {
if ( node . nextSibling && node . nextSibling . nodeName === 'BR' ) {
accu . appendChild ( accuDoc . createElement ( 'P' ) ) ;
decu . removeChild ( node . nextSibling ) ;
} // Don't append to an empty paragraph.
if ( accu . lastChild && accu . lastChild . nodeName === 'P' && accu . lastChild . hasChildNodes ( ) ) {
accu . lastChild . appendChild ( node ) ;
} else {
decu . removeChild ( node ) ;
}
} else if ( node . nodeName === 'P' ) {
// Only append non-empty paragraph nodes.
if ( isEmpty ( node ) ) {
decu . removeChild ( node ) ;
} else {
accu . appendChild ( node ) ;
}
} else if ( isPhrasingContent ( node ) ) {
if ( ! accu . lastChild || accu . lastChild . nodeName !== 'P' ) {
accu . appendChild ( accuDoc . createElement ( 'P' ) ) ;
}
accu . lastChild . appendChild ( node ) ;
} else {
accu . appendChild ( node ) ;
}
} else {
decu . removeChild ( node ) ;
}
}
2019-03-07 10:09:59 +01:00
return accu . innerHTML ;
} ) ;
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/special-comment-converter.js
/ * *
* WordPress dependencies
* /
/ * *
* Browser dependencies
* /
var COMMENT _NODE = window . Node . COMMENT _NODE ;
/ * *
* Looks for ` <!--nextpage--> ` and ` <!--more--> ` comments , as well as the
* ` <!--more Some text--> ` variant and its ` <!--noteaser--> ` companion ,
* and replaces them with a custom element representing a future block .
*
* The custom element is a way to bypass the rest of the ` raw-handling `
* transforms , which would eliminate other kinds of node with which to carry
* ` <!--more--> ` ' s data : nodes with ` data ` attributes , empty paragraphs , etc .
*
* The custom element is then expected to be recognized by any registered
* block ' s ` raw ` transform .
*
* @ param { Node } node The node to be processed .
* @ param { Document } doc The document of the node .
* @ return { void }
* /
/* harmony default export */ var special _comment _converter = ( function ( node , doc ) {
if ( node . nodeType !== COMMENT _NODE ) {
return ;
}
if ( node . nodeValue === 'nextpage' ) {
Object ( external _this _wp _dom _ [ "replace" ] ) ( node , createNextpage ( doc ) ) ;
return ;
}
if ( node . nodeValue . indexOf ( 'more' ) === 0 ) {
// Grab any custom text in the comment.
var customText = node . nodeValue . slice ( 4 ) . trim ( ) ;
/ *
* When a ` <!--more--> ` comment is found , we need to look for any
* ` <!--noteaser--> ` sibling , but it may not be a direct sibling
* ( whitespace typically lies in between )
* /
var sibling = node ;
var noTeaser = false ;
while ( sibling = sibling . nextSibling ) {
if ( sibling . nodeType === COMMENT _NODE && sibling . nodeValue === 'noteaser' ) {
noTeaser = true ;
Object ( external _this _wp _dom _ [ "remove" ] ) ( sibling ) ;
break ;
}
}
Object ( external _this _wp _dom _ [ "replace" ] ) ( node , createMore ( customText , noTeaser , doc ) ) ;
}
} ) ;
function createMore ( customText , noTeaser , doc ) {
var node = doc . createElement ( 'wp-block' ) ;
node . dataset . block = 'core/more' ;
if ( customText ) {
node . dataset . customText = customText ;
}
if ( noTeaser ) {
// "Boolean" data attribute
node . dataset . noTeaser = '' ;
}
return node ;
}
function createNextpage ( doc ) {
var node = doc . createElement ( 'wp-block' ) ;
node . dataset . block = 'core/nextpage' ;
return node ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/list-reducer.js
/ * *
* WordPress dependencies
* /
function isList ( node ) {
return node . nodeName === 'OL' || node . nodeName === 'UL' ;
}
function shallowTextContent ( element ) {
return Object ( toConsumableArray [ "a" /* default */ ] ) ( element . childNodes ) . map ( function ( _ref ) {
var _ref$nodeValue = _ref . nodeValue ,
nodeValue = _ref$nodeValue === void 0 ? '' : _ref$nodeValue ;
return nodeValue ;
} ) . join ( '' ) ;
}
/* harmony default export */ var list _reducer = ( function ( node ) {
if ( ! isList ( node ) ) {
return ;
}
var list = node ;
var prevElement = node . previousElementSibling ; // Merge with previous list if:
// * There is a previous list of the same type.
// * There is only one list item.
if ( prevElement && prevElement . nodeName === node . nodeName && list . children . length === 1 ) {
// Move all child nodes, including any text nodes, if any.
while ( list . firstChild ) {
prevElement . appendChild ( list . firstChild ) ;
}
list . parentNode . removeChild ( list ) ;
}
var parentElement = node . parentNode ; // Nested list with empty parent item.
if ( parentElement && parentElement . nodeName === 'LI' && parentElement . children . length === 1 && ! /\S/ . test ( shallowTextContent ( parentElement ) ) ) {
var parentListItem = parentElement ;
var prevListItem = parentListItem . previousElementSibling ;
var parentList = parentListItem . parentNode ;
if ( prevListItem ) {
prevListItem . appendChild ( list ) ;
parentList . removeChild ( parentListItem ) ;
} else {
parentList . parentNode . insertBefore ( list , parentList ) ;
parentList . parentNode . removeChild ( parentList ) ;
}
} // Invalid: OL/UL > OL/UL.
if ( parentElement && isList ( parentElement ) ) {
var _prevListItem = node . previousElementSibling ;
if ( _prevListItem ) {
_prevListItem . appendChild ( node ) ;
} else {
Object ( external _this _wp _dom _ [ "unwrap" ] ) ( node ) ;
}
}
} ) ;
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/blockquote-normaliser.js
/ * *
* Internal dependencies
* /
/* harmony default export */ var blockquote _normaliser = ( function ( node ) {
if ( node . nodeName !== 'BLOCKQUOTE' ) {
return ;
}
node . innerHTML = normalise _blocks ( node . innerHTML ) ;
2018-12-18 04:14:52 +01:00
} ) ;
2019-03-07 10:09:59 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/figure-content-reducer.js
2018-12-18 04:14:52 +01:00
/ * *
2019-03-07 10:09:59 +01:00
* External dependencies
2018-12-18 04:14:52 +01:00
* /
/ * *
2019-03-07 10:09:59 +01:00
* Internal dependencies
2018-12-18 04:14:52 +01:00
* /
2019-03-07 10:09:59 +01:00
2018-12-18 04:14:52 +01:00
/ * *
2019-03-07 10:09:59 +01:00
* Whether or not the given node is figure content .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ param { Node } node The node to check .
* @ param { Object } schema The schema to use .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ return { boolean } True if figure content , false if not .
* /
function isFigureContent ( node , schema ) {
var tag = node . nodeName . toLowerCase ( ) ; // We are looking for tags that can be a child of the figure tag, excluding
// `figcaption` and any phrasing content.
if ( tag === 'figcaption' || isPhrasingContent ( node ) ) {
return false ;
}
return Object ( external _lodash _ [ "has" ] ) ( schema , [ 'figure' , 'children' , tag ] ) ;
}
/ * *
* Whether or not the given node can have an anchor .
*
* @ param { Node } node The node to check .
* @ param { Object } schema The schema to use .
*
* @ return { boolean } True if it can , false if not .
* /
function canHaveAnchor ( node , schema ) {
var tag = node . nodeName . toLowerCase ( ) ;
return Object ( external _lodash _ [ "has" ] ) ( schema , [ 'figure' , 'children' , 'a' , 'children' , tag ] ) ;
}
/ * *
* This filter takes figure content out of paragraphs , wraps it in a figure
* element , and moves any anchors with it if needed .
*
* @ param { Node } node The node to filter .
* @ param { Document } doc The document of the node .
* @ param { Object } schema The schema to use .
2018-12-18 04:14:52 +01:00
*
* @ return { void }
* /
2019-03-07 10:09:59 +01:00
/* harmony default export */ var figure _content _reducer = ( function ( node , doc , schema ) {
if ( ! isFigureContent ( node , schema ) ) {
2018-12-18 04:14:52 +01:00
return ;
}
2019-03-07 10:09:59 +01:00
var nodeToInsert = node ;
var parentNode = node . parentNode ; // If the figure content can have an anchor and its parent is an anchor with
// only the figure content, take the anchor out instead of just the content.
if ( canHaveAnchor ( node , schema ) && parentNode . nodeName === 'A' && parentNode . childNodes . length === 1 ) {
nodeToInsert = node . parentNode ;
2018-12-18 04:14:52 +01:00
}
2019-03-07 10:09:59 +01:00
var wrapper = nodeToInsert ;
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
while ( wrapper && wrapper . nodeName !== 'P' ) {
wrapper = wrapper . parentElement ;
}
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
var figure = doc . createElement ( 'figure' ) ;
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
if ( wrapper ) {
wrapper . parentNode . insertBefore ( figure , wrapper ) ;
} else {
nodeToInsert . parentNode . insertBefore ( figure , nodeToInsert ) ;
2018-12-18 04:14:52 +01:00
}
2019-03-07 10:09:59 +01:00
figure . appendChild ( nodeToInsert ) ;
2018-12-18 04:14:52 +01:00
} ) ;
2019-03-07 10:09:59 +01:00
// EXTERNAL MODULE: external {"this":["wp","shortcode"]}
2019-03-21 13:48:00 +01:00
var external _this _wp _shortcode _ = _ _webpack _require _ _ ( 134 ) ;
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/shortcode-converter.js
/ * *
* External dependencies
* /
/ * *
* WordPress dependencies
* /
/ * *
* Internal dependencies
* /
function segmentHTMLToShortcodeBlock ( HTML ) {
var lastIndex = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : 0 ;
// Get all matches.
var transformsFrom = getBlockTransforms ( 'from' ) ;
var transformation = findTransform ( transformsFrom , function ( transform ) {
return transform . type === 'shortcode' && Object ( external _lodash _ [ "some" ] ) ( Object ( external _lodash _ [ "castArray" ] ) ( transform . tag ) , function ( tag ) {
return Object ( external _this _wp _shortcode _ [ "regexp" ] ) ( tag ) . test ( HTML ) ;
} ) ;
} ) ;
if ( ! transformation ) {
return [ HTML ] ;
2018-12-18 04:14:52 +01:00
}
2019-03-07 10:09:59 +01:00
var transformTags = Object ( external _lodash _ [ "castArray" ] ) ( transformation . tag ) ;
var transformTag = Object ( external _lodash _ [ "first" ] ) ( transformTags ) ;
var match ;
if ( match = Object ( external _this _wp _shortcode _ [ "next" ] ) ( transformTag , HTML , lastIndex ) ) {
var beforeHTML = HTML . substr ( 0 , match . index ) ;
lastIndex = match . index + match . content . length ; // If the shortcode content does not contain HTML and the shortcode is
// not on a new line (or in paragraph from Markdown converter),
// consider the shortcode as inline text, and thus skip conversion for
// this segment.
if ( ! Object ( external _lodash _ [ "includes" ] ) ( match . shortcode . content || '' , '<' ) && ! /(\n|<p>)\s*$/ . test ( beforeHTML ) ) {
return segmentHTMLToShortcodeBlock ( HTML , lastIndex ) ;
}
var attributes = Object ( external _lodash _ [ "mapValues" ] ) ( Object ( external _lodash _ [ "pickBy" ] ) ( transformation . attributes , function ( schema ) {
return schema . shortcode ;
} ) , // Passing all of `match` as second argument is intentionally broad
// but shouldn't be too relied upon.
//
// See: https://github.com/WordPress/gutenberg/pull/3610#discussion_r152546926
function ( schema ) {
return schema . shortcode ( match . shortcode . attrs , match ) ;
} ) ;
var block = createBlock ( transformation . blockName , getBlockAttributes ( Object ( objectSpread [ "a" /* default */ ] ) ( { } , registration _getBlockType ( transformation . blockName ) , {
attributes : transformation . attributes
} ) , match . shortcode . content , attributes ) ) ;
return [ beforeHTML , block ] . concat ( Object ( toConsumableArray [ "a" /* default */ ] ) ( segmentHTMLToShortcodeBlock ( HTML . substr ( lastIndex ) ) ) ) ;
2018-12-18 04:14:52 +01:00
}
2019-03-07 10:09:59 +01:00
return [ HTML ] ;
2018-12-18 04:14:52 +01:00
}
2019-03-07 10:09:59 +01:00
/* harmony default export */ var shortcode _converter = ( segmentHTMLToShortcodeBlock ) ;
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/is-inline-content.js
/ * *
* External dependencies
* /
/ * *
* Internal dependencies
* /
/ * *
* Checks if the given node should be considered inline content , optionally
* depending on a context tag .
*
* @ param { Node } node Node name .
* @ param { string } contextTag Tag name .
*
* @ return { boolean } True if the node is inline content , false if nohe .
* /
function isInline ( node , contextTag ) {
if ( isPhrasingContent ( node ) ) {
return true ;
}
if ( ! contextTag ) {
return false ;
}
var tag = node . nodeName . toLowerCase ( ) ;
var inlineWhitelistTagGroups = [ [ 'ul' , 'li' , 'ol' ] , [ 'h1' , 'h2' , 'h3' , 'h4' , 'h5' , 'h6' ] ] ;
return inlineWhitelistTagGroups . some ( function ( tagGroup ) {
return Object ( external _lodash _ [ "difference" ] ) ( [ tag , contextTag ] , tagGroup ) . length === 0 ;
} ) ;
}
function deepCheck ( nodes , contextTag ) {
return nodes . every ( function ( node ) {
return isInline ( node , contextTag ) && deepCheck ( Array . from ( node . children ) , contextTag ) ;
} ) ;
}
function isDoubleBR ( node ) {
return node . nodeName === 'BR' && node . previousSibling && node . previousSibling . nodeName === 'BR' ;
}
/* harmony default export */ var is _inline _content = ( function ( HTML , contextTag ) {
var doc = document . implementation . createHTMLDocument ( '' ) ;
doc . body . innerHTML = HTML ;
var nodes = Array . from ( doc . body . children ) ;
return ! nodes . some ( isDoubleBR ) && deepCheck ( nodes , contextTag ) ;
} ) ;
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/phrasing-content-reducer.js
/ * *
* WordPress dependencies
* /
2019-03-07 10:09:59 +01:00
/* harmony default export */ var phrasing _content _reducer = ( function ( node , doc ) {
// In jsdom-jscore, 'node.style' can be null.
// TODO: Explore fixing this by patching jsdom-jscore.
if ( node . nodeName === 'SPAN' && node . style ) {
2018-12-18 04:14:52 +01:00
var _node$style = node . style ,
fontWeight = _node$style . fontWeight ,
fontStyle = _node$style . fontStyle ,
textDecorationLine = _node$style . textDecorationLine ,
verticalAlign = _node$style . verticalAlign ;
if ( fontWeight === 'bold' || fontWeight === '700' ) {
Object ( external _this _wp _dom _ [ "wrap" ] ) ( doc . createElement ( 'strong' ) , node ) ;
}
if ( fontStyle === 'italic' ) {
Object ( external _this _wp _dom _ [ "wrap" ] ) ( doc . createElement ( 'em' ) , node ) ;
}
if ( textDecorationLine === 'line-through' ) {
2019-03-21 13:48:00 +01:00
Object ( external _this _wp _dom _ [ "wrap" ] ) ( doc . createElement ( 's' ) , node ) ;
2018-12-18 04:14:52 +01:00
}
if ( verticalAlign === 'super' ) {
Object ( external _this _wp _dom _ [ "wrap" ] ) ( doc . createElement ( 'sup' ) , node ) ;
} else if ( verticalAlign === 'sub' ) {
Object ( external _this _wp _dom _ [ "wrap" ] ) ( doc . createElement ( 'sub' ) , node ) ;
}
} else if ( node . nodeName === 'B' ) {
node = Object ( external _this _wp _dom _ [ "replaceTag" ] ) ( node , 'strong' ) ;
} else if ( node . nodeName === 'I' ) {
node = Object ( external _this _wp _dom _ [ "replaceTag" ] ) ( node , 'em' ) ;
} else if ( node . nodeName === 'A' ) {
2019-03-07 10:09:59 +01:00
// In jsdom-jscore, 'node.target' can be null.
// TODO: Explore fixing this by patching jsdom-jscore.
if ( node . target && node . target . toLowerCase ( ) === '_blank' ) {
2018-12-18 04:14:52 +01:00
node . rel = 'noreferrer noopener' ;
} else {
node . removeAttribute ( 'target' ) ;
node . removeAttribute ( 'rel' ) ;
}
}
} ) ;
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/head-remover.js
/* harmony default export */ var head _remover = ( function ( node ) {
if ( node . nodeName !== 'SCRIPT' && node . nodeName !== 'NOSCRIPT' && node . nodeName !== 'TEMPLATE' && node . nodeName !== 'STYLE' ) {
return ;
}
node . parentNode . removeChild ( node ) ;
} ) ;
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/ms-list-converter.js
/ * *
* Browser dependencies
* /
var _window = window ,
ms _list _converter _parseInt = _window . parseInt ;
2019-03-07 10:09:59 +01:00
function ms _list _converter _isList ( node ) {
2018-12-18 04:14:52 +01:00
return node . nodeName === 'OL' || node . nodeName === 'UL' ;
}
/* harmony default export */ var ms _list _converter = ( function ( node , doc ) {
if ( node . nodeName !== 'P' ) {
return ;
}
var style = node . getAttribute ( 'style' ) ;
if ( ! style ) {
return ;
} // Quick check.
if ( style . indexOf ( 'mso-list' ) === - 1 ) {
return ;
}
var matches = /mso-list\s*:[^;]+level([0-9]+)/i . exec ( style ) ;
if ( ! matches ) {
return ;
}
var level = ms _list _converter _parseInt ( matches [ 1 ] , 10 ) - 1 || 0 ;
var prevNode = node . previousElementSibling ; // Add new list if no previous.
2019-03-07 10:09:59 +01:00
if ( ! prevNode || ! ms _list _converter _isList ( prevNode ) ) {
2018-12-18 04:14:52 +01:00
// See https://html.spec.whatwg.org/multipage/grouping-content.html#attr-ol-type.
var type = node . textContent . trim ( ) . slice ( 0 , 1 ) ;
var isNumeric = /[1iIaA]/ . test ( type ) ;
var newListNode = doc . createElement ( isNumeric ? 'ol' : 'ul' ) ;
if ( isNumeric ) {
newListNode . setAttribute ( 'type' , type ) ;
}
node . parentNode . insertBefore ( newListNode , node ) ;
}
var listNode = node . previousElementSibling ;
var listType = listNode . nodeName ;
var listItem = doc . createElement ( 'li' ) ;
var receivingNode = listNode ; // Remove the first span with list info.
node . removeChild ( node . firstElementChild ) ; // Add content.
while ( node . firstChild ) {
listItem . appendChild ( node . firstChild ) ;
} // Change pointer depending on indentation level.
while ( level -- ) {
receivingNode = receivingNode . lastElementChild || receivingNode ; // If it's a list, move pointer to the last item.
2019-03-07 10:09:59 +01:00
if ( ms _list _converter _isList ( receivingNode ) ) {
2018-12-18 04:14:52 +01:00
receivingNode = receivingNode . lastElementChild || receivingNode ;
}
} // Make sure we append to a list.
2019-03-07 10:09:59 +01:00
if ( ! ms _list _converter _isList ( receivingNode ) ) {
receivingNode = receivingNode . appendChild ( doc . createElement ( listType ) ) ;
} // Append the list item to the list.
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
receivingNode . appendChild ( listItem ) ; // Remove the wrapper paragraph.
node . parentNode . removeChild ( node ) ;
2018-12-18 04:14:52 +01:00
} ) ;
// EXTERNAL MODULE: external {"this":["wp","blob"]}
2019-03-21 13:48:00 +01:00
var external _this _wp _blob _ = _ _webpack _require _ _ ( 35 ) ;
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/image-corrector.js
/ * *
* WordPress dependencies
* /
/ * *
* Browser dependencies
* /
var image _corrector _window = window ,
atob = image _corrector _window . atob ,
File = image _corrector _window . File ;
/* harmony default export */ var image _corrector = ( function ( node ) {
if ( node . nodeName !== 'IMG' ) {
return ;
}
if ( node . src . indexOf ( 'file:' ) === 0 ) {
node . src = '' ;
} // This piece cannot be tested outside a browser env.
if ( node . src . indexOf ( 'data:' ) === 0 ) {
var _node$src$split = node . src . split ( ',' ) ,
_node$src$split2 = Object ( slicedToArray [ "a" /* default */ ] ) ( _node$src$split , 2 ) ,
properties = _node$src$split2 [ 0 ] ,
data = _node$src$split2 [ 1 ] ;
var _properties$slice$spl = properties . slice ( 5 ) . split ( ';' ) ,
_properties$slice$spl2 = Object ( slicedToArray [ "a" /* default */ ] ) ( _properties$slice$spl , 1 ) ,
type = _properties$slice$spl2 [ 0 ] ;
if ( ! data || ! type ) {
node . src = '' ;
return ;
}
var decoded ; // Can throw DOMException!
try {
decoded = atob ( data ) ;
} catch ( e ) {
node . src = '' ;
return ;
}
var uint8Array = new Uint8Array ( decoded . length ) ;
for ( var i = 0 ; i < uint8Array . length ; i ++ ) {
uint8Array [ i ] = decoded . charCodeAt ( i ) ;
}
var name = type . replace ( '/' , '.' ) ;
var file = new File ( [ uint8Array ] , name , {
type : type
} ) ;
node . src = Object ( external _this _wp _blob _ [ "createBlobURL" ] ) ( file ) ;
} // Remove trackers and hardly visible images.
if ( node . height === 1 || node . width === 1 ) {
node . parentNode . removeChild ( node ) ;
}
} ) ;
// EXTERNAL MODULE: ./node_modules/showdown/dist/showdown.js
2019-03-21 13:48:00 +01:00
var showdown = _ _webpack _require _ _ ( 206 ) ;
2018-12-18 04:14:52 +01:00
var showdown _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( showdown ) ;
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/markdown-converter.js
/ * *
* External dependencies
* /
// Reuse the same showdown converter.
var converter = new showdown _default . a . Converter ( {
noHeaderId : true ,
tables : true ,
literalMidWordUnderscores : true ,
omitExtraWLInCodeBlocks : true ,
simpleLineBreaks : true ,
strikethrough : true
} ) ;
/ * *
* Corrects the Slack Markdown variant of the code block .
* If uncorrected , it will be converted to inline code .
*
* @ see https : //get.slack.help/hc/en-us/articles/202288908-how-can-i-add-formatting-to-my-messages-#code-blocks
*
* @ param { string } text The potential Markdown text to correct .
*
* @ return { string } The corrected Markdown .
* /
function slackMarkdownVariantCorrector ( text ) {
return text . replace ( /((?:^|\n)```)([^\n`]+)(```(?:$|\n))/ , function ( match , p1 , p2 , p3 ) {
return "" . concat ( p1 , "\n" ) . concat ( p2 , "\n" ) . concat ( p3 ) ;
} ) ;
}
/ * *
* Converts a piece of text into HTML based on any Markdown present .
* Also decodes any encoded HTML .
*
* @ param { string } text The plain text to convert .
*
* @ return { string } HTML .
* /
/* harmony default export */ var markdown _converter = ( function ( text ) {
return converter . makeHtml ( slackMarkdownVariantCorrector ( text ) ) ;
} ) ;
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/iframe-remover.js
/ * *
* WordPress dependencies
* /
/ * *
* Removes iframes .
*
* @ param { Node } node The node to check .
*
* @ return { void }
* /
/* harmony default export */ var iframe _remover = ( function ( node ) {
if ( node . nodeName === 'IFRAME' ) {
Object ( external _this _wp _dom _ [ "remove" ] ) ( node ) ;
}
} ) ;
2019-03-07 10:09:59 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/google-docs-uid-remover.js
/ * *
* WordPress dependencies
* /
/* harmony default export */ var google _docs _uid _remover = ( function ( node ) {
if ( ! node . id || node . id . indexOf ( 'docs-internal-guid-' ) !== 0 ) {
return ;
}
Object ( external _this _wp _dom _ [ "unwrap" ] ) ( node ) ;
} ) ;
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/paste-handler.js
2018-12-18 04:14:52 +01:00
/ * *
* External dependencies
* /
/ * *
* Internal dependencies
* /
2019-03-07 10:09:59 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Browser dependencies
* /
2019-03-07 10:09:59 +01:00
var paste _handler _window = window ,
paste _handler _console = paste _handler _window . console ;
2018-12-18 04:14:52 +01:00
/ * *
* Filters HTML to only contain phrasing content .
*
* @ param { string } HTML The HTML to filter .
*
* @ return { string } HTML only containing phrasing content .
* /
function filterInlineHTML ( HTML ) {
2019-03-07 10:09:59 +01:00
HTML = deepFilterHTML ( HTML , [ google _docs _uid _remover , phrasing _content _reducer ] ) ;
2018-12-18 04:14:52 +01:00
HTML = removeInvalidHTML ( HTML , getPhrasingContentSchema ( ) , {
inline : true
} ) ; // Allows us to ask for this information when we get a report.
2019-03-07 10:09:59 +01:00
paste _handler _console . log ( 'Processed inline HTML:\n\n' , HTML ) ;
2018-12-18 04:14:52 +01:00
return HTML ;
}
function getRawTransformations ( ) {
return Object ( external _lodash _ [ "filter" ] ) ( getBlockTransforms ( 'from' ) , {
type : 'raw'
} ) . map ( function ( transform ) {
return transform . isMatch ? transform : Object ( objectSpread [ "a" /* default */ ] ) ( { } , transform , {
isMatch : function isMatch ( node ) {
return transform . selector && node . matches ( transform . selector ) ;
}
} ) ;
} ) ;
}
/ * *
* Converts HTML directly to blocks . Looks for a matching transform for each
* top - level tag . The HTML should be filtered to not have any text between
* top - level tags and formatted in a way that blocks can handle the HTML .
*
* @ param { Object } $1 Named parameters .
* @ param { string } $1 . html HTML to convert .
* @ param { Array } $1 . rawTransforms Transforms that can be used .
*
* @ return { Array } An array of blocks .
* /
function htmlToBlocks ( _ref ) {
var html = _ref . html ,
rawTransforms = _ref . rawTransforms ;
var doc = document . implementation . createHTMLDocument ( '' ) ;
doc . body . innerHTML = html ;
return Array . from ( doc . body . children ) . map ( function ( node ) {
var rawTransform = findTransform ( rawTransforms , function ( _ref2 ) {
var isMatch = _ref2 . isMatch ;
return isMatch ( node ) ;
} ) ;
if ( ! rawTransform ) {
return createBlock ( // Should not be hardcoded.
'core/html' , getBlockAttributes ( 'core/html' , node . outerHTML ) ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
var transform = rawTransform . transform ,
blockName = rawTransform . blockName ;
if ( transform ) {
return transform ( node ) ;
}
return createBlock ( blockName , getBlockAttributes ( blockName , node . outerHTML ) ) ;
} ) ;
}
/ * *
* Converts an HTML string to known blocks . Strips everything else .
*
* @ param { string } [ options . HTML ] The HTML to convert .
* @ param { string } [ options . plainText ] Plain text version .
* @ param { string } [ options . mode ] Handle content as blocks or inline content .
* * 'AUTO' : Decide based on the content passed .
* * 'INLINE' : Always handle as inline content , and return string .
* * 'BLOCKS' : Always handle as blocks , and return array of blocks .
* @ param { Array } [ options . tagName ] The tag into which content will be inserted .
* @ param { boolean } [ options . canUserUseUnfilteredHTML ] Whether or not the user can use unfiltered HTML .
*
* @ return { Array | string } A list of blocks or a string , depending on ` handlerMode ` .
* /
function pasteHandler ( _ref3 ) {
var _ref3$HTML = _ref3 . HTML ,
HTML = _ref3$HTML === void 0 ? '' : _ref3$HTML ,
_ref3$plainText = _ref3 . plainText ,
plainText = _ref3$plainText === void 0 ? '' : _ref3$plainText ,
_ref3$mode = _ref3 . mode ,
mode = _ref3$mode === void 0 ? 'AUTO' : _ref3$mode ,
tagName = _ref3 . tagName ,
_ref3$canUserUseUnfil = _ref3 . canUserUseUnfilteredHTML ,
canUserUseUnfilteredHTML = _ref3$canUserUseUnfil === void 0 ? false : _ref3$canUserUseUnfil ;
// First of all, strip any meta tags.
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
HTML = HTML . replace ( /<meta[^>]+>/ , '' ) ; // If we detect block delimiters in HTML, parse entirely as blocks.
2018-12-18 04:14:52 +01:00
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
if ( mode !== 'INLINE' ) {
// Check plain text if there is no HTML.
var content = HTML ? HTML : plainText ;
if ( content . indexOf ( '<!-- wp:' ) !== - 1 ) {
return parseWithGrammar ( content ) ;
}
2018-12-18 04:14:52 +01:00
} // Normalize unicode to use composed characters.
// This is unsupported in IE 11 but it's a nice-to-have feature, not mandatory.
// Not normalizing the content will only affect older browsers and won't
// entirely break the app.
// See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
// See: https://core.trac.wordpress.org/ticket/30130
// See: https://github.com/WordPress/gutenberg/pull/6983#pullrequestreview-125151075
if ( String . prototype . normalize ) {
HTML = HTML . normalize ( ) ;
} // Parse Markdown (and encoded HTML) if:
// * There is a plain text version.
// * There is no HTML version, or it has no formatting.
if ( plainText && ( ! HTML || isPlain ( HTML ) ) ) {
HTML = markdown _converter ( plainText ) ; // Switch to inline mode if:
// * The current mode is AUTO.
// * The original plain text had no line breaks.
// * The original plain text was not an HTML paragraph.
// * The converted text is just a paragraph.
if ( mode === 'AUTO' && plainText . indexOf ( '\n' ) === - 1 && plainText . indexOf ( '<p>' ) !== 0 && HTML . indexOf ( '<p>' ) === 0 ) {
mode = 'INLINE' ;
}
}
if ( mode === 'INLINE' ) {
return filterInlineHTML ( HTML ) ;
} // An array of HTML strings and block objects. The blocks replace matched
// shortcodes.
var pieces = shortcode _converter ( HTML ) ; // The call to shortcodeConverter will always return more than one element
// if shortcodes are matched. The reason is when shortcodes are matched
2019-03-07 10:09:59 +01:00
// empty HTML strings are included.
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
var hasShortcodes = pieces . length > 1 ;
if ( mode === 'AUTO' && ! hasShortcodes && is _inline _content ( HTML , tagName ) ) {
return filterInlineHTML ( HTML ) ;
}
2018-12-18 04:14:52 +01:00
var rawTransforms = getRawTransformations ( ) ;
2019-03-07 10:09:59 +01:00
var phrasingContentSchema = getPhrasingContentSchema ( ) ;
2018-12-18 04:14:52 +01:00
var blockContentSchema = getBlockContentSchema ( rawTransforms ) ;
2019-03-07 10:09:59 +01:00
var blocks = Object ( external _lodash _ [ "compact" ] ) ( Object ( external _lodash _ [ "flatMap" ] ) ( pieces , function ( piece ) {
2018-12-18 04:14:52 +01:00
// Already a block from shortcode.
if ( typeof piece !== 'string' ) {
return piece ;
2019-03-07 10:09:59 +01:00
}
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
var filters = [ google _docs _uid _remover , ms _list _converter , head _remover , list _reducer , image _corrector , phrasing _content _reducer , special _comment _converter , figure _content _reducer , blockquote _normaliser ] ;
if ( ! canUserUseUnfilteredHTML ) {
// Should run before `figureContentReducer`.
filters . unshift ( iframe _remover ) ;
}
var schema = Object ( objectSpread [ "a" /* default */ ] ) ( { } , blockContentSchema , phrasingContentSchema ) ;
2018-12-18 04:14:52 +01:00
piece = deepFilterHTML ( piece , filters , blockContentSchema ) ;
2019-03-07 10:09:59 +01:00
piece = removeInvalidHTML ( piece , schema ) ;
piece = normalise _blocks ( piece ) ; // Allows us to ask for this information when we get a report.
paste _handler _console . log ( 'Processed HTML piece:\n\n' , piece ) ;
2018-12-18 04:14:52 +01:00
return htmlToBlocks ( {
html : piece ,
rawTransforms : rawTransforms
} ) ;
2019-03-07 10:09:59 +01:00
} ) ) ; // If we're allowed to return inline content and there is only one block
// and the original plain text content does not have any line breaks, then
// treat it as inline paste.
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
if ( mode === 'AUTO' && blocks . length === 1 ) {
var trimmedPlainText = plainText . trim ( ) ;
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
if ( trimmedPlainText !== '' && trimmedPlainText . indexOf ( '\n' ) === - 1 ) {
return removeInvalidHTML ( getBlockContent ( blocks [ 0 ] ) , phrasingContentSchema ) ;
}
}
2018-12-19 04:16:48 +01:00
2019-03-07 10:09:59 +01:00
return blocks ;
2018-12-19 04:16:48 +01:00
}
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/raw-handling/index.js
2018-12-18 04:14:52 +01:00
/ * *
* External dependencies
* /
/ * *
* Internal dependencies
* /
2019-03-07 10:09:59 +01:00
function raw _handling _getRawTransformations ( ) {
return Object ( external _lodash _ [ "filter" ] ) ( getBlockTransforms ( 'from' ) , {
type : 'raw'
} ) . map ( function ( transform ) {
return transform . isMatch ? transform : Object ( objectSpread [ "a" /* default */ ] ) ( { } , transform , {
isMatch : function isMatch ( node ) {
return transform . selector && node . matches ( transform . selector ) ;
2018-12-18 04:14:52 +01:00
}
2019-03-07 10:09:59 +01:00
} ) ;
2018-12-18 04:14:52 +01:00
} ) ;
}
2019-03-07 10:09:59 +01:00
/ * *
* Converts HTML directly to blocks . Looks for a matching transform for each
* top - level tag . The HTML should be filtered to not have any text between
* top - level tags and formatted in a way that blocks can handle the HTML .
*
* @ param { Object } $1 Named parameters .
* @ param { string } $1 . html HTML to convert .
* @ param { Array } $1 . rawTransforms Transforms that can be used .
*
* @ return { Array } An array of blocks .
* /
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
function raw _handling _htmlToBlocks ( _ref ) {
var html = _ref . html ,
rawTransforms = _ref . rawTransforms ;
var doc = document . implementation . createHTMLDocument ( '' ) ;
doc . body . innerHTML = html ;
return Array . from ( doc . body . children ) . map ( function ( node ) {
var rawTransform = findTransform ( rawTransforms , function ( _ref2 ) {
var isMatch = _ref2 . isMatch ;
return isMatch ( node ) ;
} ) ;
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
if ( ! rawTransform ) {
return createBlock ( // Should not be hardcoded.
'core/html' , getBlockAttributes ( 'core/html' , node . outerHTML ) ) ;
}
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
var transform = rawTransform . transform ,
blockName = rawTransform . blockName ;
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
if ( transform ) {
return transform ( node ) ;
}
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
return createBlock ( blockName , getBlockAttributes ( blockName , node . outerHTML ) ) ;
} ) ;
}
/ * *
* Converts an HTML string to known blocks .
*
* @ param { string } $1 . HTML The HTML to convert .
*
* @ return { Array } A list of blocks .
* /
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
function rawHandler ( _ref3 ) {
var _ref3$HTML = _ref3 . HTML ,
HTML = _ref3$HTML === void 0 ? '' : _ref3$HTML ;
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
// If we detect block delimiters, parse entirely as blocks.
if ( HTML . indexOf ( '<!-- wp:' ) !== - 1 ) {
return parseWithGrammar ( HTML ) ;
} // An array of HTML strings and block objects. The blocks replace matched
// shortcodes.
var pieces = shortcode _converter ( HTML ) ;
var rawTransforms = raw _handling _getRawTransformations ( ) ;
var blockContentSchema = getBlockContentSchema ( rawTransforms ) ;
return Object ( external _lodash _ [ "compact" ] ) ( Object ( external _lodash _ [ "flatMap" ] ) ( pieces , function ( piece ) {
// Already a block from shortcode.
if ( typeof piece !== 'string' ) {
return piece ;
} // These filters are essential for some blocks to be able to transform
// from raw HTML. These filters move around some content or add
// additional tags, they do not remove any content.
var filters = [ // Needed to adjust invalid lists.
list _reducer , // Needed to create more and nextpage blocks.
special _comment _converter , // Needed to create media blocks.
figure _content _reducer , // Needed to create the quote block, which cannot handle text
// without wrapper paragraphs.
blockquote _normaliser ] ;
piece = deepFilterHTML ( piece , filters , blockContentSchema ) ;
piece = normalise _blocks ( piece ) ;
return raw _handling _htmlToBlocks ( {
html : piece ,
rawTransforms : rawTransforms
} ) ;
} ) ) ;
}
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/categories.js
2018-12-18 04:14:52 +01:00
/ * *
2019-03-07 10:09:59 +01:00
* WordPress dependencies
2018-12-18 04:14:52 +01:00
* /
/ * *
2019-03-07 10:09:59 +01:00
* Returns all the block categories .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ return { Object [ ] } Block categories .
2018-12-18 04:14:52 +01:00
* /
2019-03-07 10:09:59 +01:00
function categories _getCategories ( ) {
return Object ( external _this _wp _data _ [ "select" ] ) ( 'core/blocks' ) . getCategories ( ) ;
}
2018-12-18 04:14:52 +01:00
/ * *
2019-03-07 10:09:59 +01:00
* Sets the block categories .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ param { Object [ ] } categories Block categories .
2018-12-18 04:14:52 +01:00
* /
2019-03-07 10:09:59 +01:00
function categories _setCategories ( categories ) {
Object ( external _this _wp _data _ [ "dispatch" ] ) ( 'core/blocks' ) . setCategories ( categories ) ;
}
2018-12-18 04:14:52 +01:00
/ * *
2019-03-07 10:09:59 +01:00
* Updates a category .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ param { string } slug Block category slug .
* @ param { Object } category Object containing the category properties that should be updated .
2018-12-18 04:14:52 +01:00
* /
2019-03-07 10:09:59 +01:00
function categories _updateCategory ( slug , category ) {
Object ( external _this _wp _data _ [ "dispatch" ] ) ( 'core/blocks' ) . updateCategory ( slug , category ) ;
2018-12-18 04:14:52 +01:00
}
2019-03-07 10:09:59 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/templates.js
2018-12-18 04:14:52 +01:00
/ * *
2019-03-07 10:09:59 +01:00
* External dependencies
* /
/ * *
* WordPress dependencies
2018-12-18 04:14:52 +01:00
* /
/ * *
2019-03-07 10:09:59 +01:00
* Internal dependencies
* /
/ * *
* Checks whether a list of blocks matches a template by comparing the block names .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ param { Array } blocks Block list .
* @ param { Array } template Block template .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ return { boolean } Whether the list of blocks matches a templates
2018-12-18 04:14:52 +01:00
* /
2019-03-07 10:09:59 +01:00
function doBlocksMatchTemplate ( ) {
var blocks = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : [ ] ;
var template = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : [ ] ;
return blocks . length === template . length && Object ( external _lodash _ [ "every" ] ) ( template , function ( _ref , index ) {
var _ref2 = Object ( slicedToArray [ "a" /* default */ ] ) ( _ref , 3 ) ,
name = _ref2 [ 0 ] ,
innerBlocksTemplate = _ref2 [ 2 ] ;
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
var block = blocks [ index ] ;
return name === block . name && doBlocksMatchTemplate ( block . innerBlocks , innerBlocksTemplate ) ;
} ) ;
2018-12-18 04:14:52 +01:00
}
/ * *
2019-03-07 10:09:59 +01:00
* Synchronize a block list with a block template .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* Synchronizing a block list with a block template means that we loop over the blocks
* keep the block as is if it matches the block at the same position in the template
* ( If it has the same name ) and if doesn ' t match , we create a new block based on the template .
* Extra blocks not present in the template are removed .
2018-12-18 04:14:52 +01:00
*
2019-03-07 10:09:59 +01:00
* @ param { Array } blocks Block list .
* @ param { Array } template Block template .
*
* @ return { Array } Updated Block list .
2018-12-18 04:14:52 +01:00
* /
2019-03-07 10:09:59 +01:00
function synchronizeBlocksWithTemplate ( ) {
var blocks = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : [ ] ;
var template = arguments . length > 1 ? arguments [ 1 ] : undefined ;
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
// If no template is provided, return blocks unmodified.
if ( ! template ) {
return blocks ;
}
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
return Object ( external _lodash _ [ "map" ] ) ( template , function ( _ref3 , index ) {
var _ref4 = Object ( slicedToArray [ "a" /* default */ ] ) ( _ref3 , 3 ) ,
name = _ref4 [ 0 ] ,
attributes = _ref4 [ 1 ] ,
innerBlocksTemplate = _ref4 [ 2 ] ;
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
var block = blocks [ index ] ;
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
if ( block && block . name === name ) {
var innerBlocks = synchronizeBlocksWithTemplate ( block . innerBlocks , innerBlocksTemplate ) ;
return Object ( objectSpread [ "a" /* default */ ] ) ( { } , block , {
innerBlocks : innerBlocks
} ) ;
} // To support old templates that were using the "children" format
// for the attributes using "html" strings now, we normalize the template attributes
// before creating the blocks.
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
var blockType = registration _getBlockType ( name ) ;
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
var isHTMLAttribute = function isHTMLAttribute ( attributeDefinition ) {
return Object ( external _lodash _ [ "get" ] ) ( attributeDefinition , [ 'source' ] ) === 'html' ;
} ;
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
var isQueryAttribute = function isQueryAttribute ( attributeDefinition ) {
return Object ( external _lodash _ [ "get" ] ) ( attributeDefinition , [ 'source' ] ) === 'query' ;
} ;
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
var normalizeAttributes = function normalizeAttributes ( schema , values ) {
return Object ( external _lodash _ [ "mapValues" ] ) ( values , function ( value , key ) {
return normalizeAttribute ( schema [ key ] , value ) ;
} ) ;
} ;
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
var normalizeAttribute = function normalizeAttribute ( definition , value ) {
if ( isHTMLAttribute ( definition ) && Object ( external _lodash _ [ "isArray" ] ) ( value ) ) {
// Introduce a deprecated call at this point
// When we're confident that "children" format should be removed from the templates.
return Object ( external _this _wp _element _ [ "renderToString" ] ) ( value ) ;
}
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
if ( isQueryAttribute ( definition ) && value ) {
return value . map ( function ( subValues ) {
return normalizeAttributes ( definition . query , subValues ) ;
} ) ;
}
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
return value ;
} ;
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
var normalizedAttributes = normalizeAttributes ( Object ( external _lodash _ [ "get" ] ) ( blockType , [ 'attributes' ] , { } ) , attributes ) ;
return createBlock ( name , normalizedAttributes , synchronizeBlocksWithTemplate ( [ ] , innerBlocksTemplate ) ) ;
} ) ;
}
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/api/index.js
2018-12-18 04:14:52 +01:00
2019-03-07 10:09:59 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/blocks/build-module/index.js
/* concated harmony reexport createBlock */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "createBlock" , function ( ) { return createBlock ; } ) ;
/* concated harmony reexport cloneBlock */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "cloneBlock" , function ( ) { return cloneBlock ; } ) ;
/* concated harmony reexport getPossibleBlockTransformations */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getPossibleBlockTransformations" , function ( ) { return getPossibleBlockTransformations ; } ) ;
/* concated harmony reexport switchToBlockType */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "switchToBlockType" , function ( ) { return switchToBlockType ; } ) ;
/* concated harmony reexport getBlockTransforms */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getBlockTransforms" , function ( ) { return getBlockTransforms ; } ) ;
/* concated harmony reexport findTransform */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "findTransform" , function ( ) { return findTransform ; } ) ;
/* concated harmony reexport parse */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "parse" , function ( ) { return parser ; } ) ;
/* concated harmony reexport getBlockAttributes */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getBlockAttributes" , function ( ) { return getBlockAttributes ; } ) ;
/* concated harmony reexport parseWithAttributeSchema */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "parseWithAttributeSchema" , function ( ) { return parseWithAttributeSchema ; } ) ;
/* concated harmony reexport pasteHandler */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "pasteHandler" , function ( ) { return pasteHandler ; } ) ;
/* concated harmony reexport rawHandler */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "rawHandler" , function ( ) { return rawHandler ; } ) ;
/* concated harmony reexport getPhrasingContentSchema */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getPhrasingContentSchema" , function ( ) { return getPhrasingContentSchema ; } ) ;
/* concated harmony reexport serialize */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "serialize" , function ( ) { return serialize ; } ) ;
/* concated harmony reexport getBlockContent */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getBlockContent" , function ( ) { return getBlockContent ; } ) ;
/* concated harmony reexport getBlockDefaultClassName */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getBlockDefaultClassName" , function ( ) { return getBlockDefaultClassName ; } ) ;
/* concated harmony reexport getBlockMenuDefaultClassName */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getBlockMenuDefaultClassName" , function ( ) { return getBlockMenuDefaultClassName ; } ) ;
/* concated harmony reexport getSaveElement */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getSaveElement" , function ( ) { return getSaveElement ; } ) ;
/* concated harmony reexport getSaveContent */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getSaveContent" , function ( ) { return getSaveContent ; } ) ;
/* concated harmony reexport isValidBlockContent */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "isValidBlockContent" , function ( ) { return isValidBlockContent ; } ) ;
/* concated harmony reexport getCategories */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getCategories" , function ( ) { return categories _getCategories ; } ) ;
/* concated harmony reexport setCategories */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "setCategories" , function ( ) { return categories _setCategories ; } ) ;
/* concated harmony reexport updateCategory */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "updateCategory" , function ( ) { return categories _updateCategory ; } ) ;
/* concated harmony reexport registerBlockType */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "registerBlockType" , function ( ) { return registerBlockType ; } ) ;
/* concated harmony reexport unregisterBlockType */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "unregisterBlockType" , function ( ) { return unregisterBlockType ; } ) ;
/* concated harmony reexport setFreeformContentHandlerName */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "setFreeformContentHandlerName" , function ( ) { return setFreeformContentHandlerName ; } ) ;
/* concated harmony reexport getFreeformContentHandlerName */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getFreeformContentHandlerName" , function ( ) { return getFreeformContentHandlerName ; } ) ;
/* concated harmony reexport setUnregisteredTypeHandlerName */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "setUnregisteredTypeHandlerName" , function ( ) { return setUnregisteredTypeHandlerName ; } ) ;
/* concated harmony reexport getUnregisteredTypeHandlerName */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getUnregisteredTypeHandlerName" , function ( ) { return getUnregisteredTypeHandlerName ; } ) ;
/* concated harmony reexport setDefaultBlockName */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "setDefaultBlockName" , function ( ) { return registration _setDefaultBlockName ; } ) ;
/* concated harmony reexport getDefaultBlockName */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getDefaultBlockName" , function ( ) { return registration _getDefaultBlockName ; } ) ;
/* concated harmony reexport getBlockType */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getBlockType" , function ( ) { return registration _getBlockType ; } ) ;
/* concated harmony reexport getBlockTypes */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getBlockTypes" , function ( ) { return registration _getBlockTypes ; } ) ;
/* concated harmony reexport getBlockSupport */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getBlockSupport" , function ( ) { return registration _getBlockSupport ; } ) ;
/* concated harmony reexport hasBlockSupport */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "hasBlockSupport" , function ( ) { return registration _hasBlockSupport ; } ) ;
/* concated harmony reexport isReusableBlock */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "isReusableBlock" , function ( ) { return isReusableBlock ; } ) ;
/* concated harmony reexport getChildBlockNames */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "getChildBlockNames" , function ( ) { return registration _getChildBlockNames ; } ) ;
/* concated harmony reexport hasChildBlocks */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "hasChildBlocks" , function ( ) { return registration _hasChildBlocks ; } ) ;
/* concated harmony reexport hasChildBlocksWithInserterSupport */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "hasChildBlocksWithInserterSupport" , function ( ) { return registration _hasChildBlocksWithInserterSupport ; } ) ;
/* concated harmony reexport unstable__bootstrapServerSideBlockDefinitions */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "unstable__bootstrapServerSideBlockDefinitions" , function ( ) { return unstable _ _bootstrapServerSideBlockDefinitions ; } ) ;
/* concated harmony reexport registerBlockStyle */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "registerBlockStyle" , function ( ) { return registration _registerBlockStyle ; } ) ;
/* concated harmony reexport unregisterBlockStyle */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "unregisterBlockStyle" , function ( ) { return registration _unregisterBlockStyle ; } ) ;
/* concated harmony reexport isUnmodifiedDefaultBlock */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "isUnmodifiedDefaultBlock" , function ( ) { return isUnmodifiedDefaultBlock ; } ) ;
/* concated harmony reexport normalizeIconObject */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "normalizeIconObject" , function ( ) { return normalizeIconObject ; } ) ;
/* concated harmony reexport isValidIcon */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "isValidIcon" , function ( ) { return isValidIcon ; } ) ;
/* concated harmony reexport doBlocksMatchTemplate */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "doBlocksMatchTemplate" , function ( ) { return doBlocksMatchTemplate ; } ) ;
/* concated harmony reexport synchronizeBlocksWithTemplate */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "synchronizeBlocksWithTemplate" , function ( ) { return synchronizeBlocksWithTemplate ; } ) ;
/* concated harmony reexport children */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "children" , function ( ) { return api _children ; } ) ;
/* concated harmony reexport node */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "node" , function ( ) { return api _node ; } ) ;
/* concated harmony reexport withBlockContentContext */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "withBlockContentContext" , function ( ) { return withBlockContentContext ; } ) ;
// A "block" is the abstract term used to describe units of markup that,
// when composed together, form the content or layout of a page.
// The API for blocks is exposed via `wp.blocks`.
//
// Supported blocks are registered by calling `registerBlockType`. Once registered,
// the block is made available as an option to the editor interface.
//
// Blocks are inferred from the HTML source of a post through a parsing mechanism
// and then stored as objects in state, from which it is then rendered for editing.
/ * *
* Internal dependencies
* /
2018-12-18 04:14:52 +01:00
2018-12-14 05:41:57 +01:00
/***/ } ) ,
2019-03-21 13:48:00 +01:00
/***/ 37 :
2018-12-18 04:14:52 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return _arrayWithHoles ; } ) ;
function _arrayWithHoles ( arr ) {
if ( Array . isArray ( arr ) ) return arr ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
/***/ } ) ,
2019-03-21 13:48:00 +01:00
/***/ 38 :
2018-12-18 04:14:52 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return _nonIterableRest ; } ) ;
function _nonIterableRest ( ) {
throw new TypeError ( "Invalid attempt to destructure non-iterable instance" ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
/***/ } ) ,
2019-03-21 13:48:00 +01:00
/***/ 42 :
2018-12-18 04:14:52 +01:00
/***/ ( function ( module , exports ) {
( function ( ) { module . exports = this [ "wp" ] [ "isShallowEqual" ] ; } ( ) ) ;
2018-12-14 05:41:57 +01:00
/***/ } ) ,
2018-12-18 04:14:52 +01:00
/***/ 45 :
2018-12-14 05:41:57 +01:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
var _ _WEBPACK _AMD _DEFINE _RESULT _ _ ; // TinyColor v1.4.1
// https://github.com/bgrins/TinyColor
// Brian Grinstead, MIT License
( function ( Math ) {
var trimLeft = /^\s+/ ,
trimRight = /\s+$/ ,
tinyCounter = 0 ,
mathRound = Math . round ,
mathMin = Math . min ,
mathMax = Math . max ,
mathRandom = Math . random ;
function tinycolor ( color , opts ) {
color = ( color ) ? color : '' ;
opts = opts || { } ;
// If input is already a tinycolor, return itself
if ( color instanceof tinycolor ) {
return color ;
}
// If we are called as a function, call using new instead
if ( ! ( this instanceof tinycolor ) ) {
return new tinycolor ( color , opts ) ;
}
var rgb = inputToRGB ( color ) ;
this . _originalInput = color ,
this . _r = rgb . r ,
this . _g = rgb . g ,
this . _b = rgb . b ,
this . _a = rgb . a ,
this . _roundA = mathRound ( 100 * this . _a ) / 100 ,
this . _format = opts . format || rgb . format ;
this . _gradientType = opts . gradientType ;
// Don't let the range of [0,255] come back in [0,1].
// Potentially lose a little bit of precision here, but will fix issues where
// .5 gets interpreted as half of the total, instead of half of 1
// If it was supposed to be 128, this was already taken care of by `inputToRgb`
if ( this . _r < 1 ) { this . _r = mathRound ( this . _r ) ; }
if ( this . _g < 1 ) { this . _g = mathRound ( this . _g ) ; }
if ( this . _b < 1 ) { this . _b = mathRound ( this . _b ) ; }
this . _ok = rgb . ok ;
this . _tc _id = tinyCounter ++ ;
}
tinycolor . prototype = {
isDark : function ( ) {
return this . getBrightness ( ) < 128 ;
} ,
isLight : function ( ) {
return ! this . isDark ( ) ;
} ,
isValid : function ( ) {
return this . _ok ;
} ,
getOriginalInput : function ( ) {
return this . _originalInput ;
} ,
getFormat : function ( ) {
return this . _format ;
} ,
getAlpha : function ( ) {
return this . _a ;
} ,
getBrightness : function ( ) {
//http://www.w3.org/TR/AERT#color-contrast
var rgb = this . toRgb ( ) ;
return ( rgb . r * 299 + rgb . g * 587 + rgb . b * 114 ) / 1000 ;
} ,
getLuminance : function ( ) {
//http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
var rgb = this . toRgb ( ) ;
var RsRGB , GsRGB , BsRGB , R , G , B ;
RsRGB = rgb . r / 255 ;
GsRGB = rgb . g / 255 ;
BsRGB = rgb . b / 255 ;
if ( RsRGB <= 0.03928 ) { R = RsRGB / 12.92 ; } else { R = Math . pow ( ( ( RsRGB + 0.055 ) / 1.055 ) , 2.4 ) ; }
if ( GsRGB <= 0.03928 ) { G = GsRGB / 12.92 ; } else { G = Math . pow ( ( ( GsRGB + 0.055 ) / 1.055 ) , 2.4 ) ; }
if ( BsRGB <= 0.03928 ) { B = BsRGB / 12.92 ; } else { B = Math . pow ( ( ( BsRGB + 0.055 ) / 1.055 ) , 2.4 ) ; }
return ( 0.2126 * R ) + ( 0.7152 * G ) + ( 0.0722 * B ) ;
} ,
setAlpha : function ( value ) {
this . _a = boundAlpha ( value ) ;
this . _roundA = mathRound ( 100 * this . _a ) / 100 ;
return this ;
} ,
toHsv : function ( ) {
var hsv = rgbToHsv ( this . _r , this . _g , this . _b ) ;
return { h : hsv . h * 360 , s : hsv . s , v : hsv . v , a : this . _a } ;
} ,
toHsvString : function ( ) {
var hsv = rgbToHsv ( this . _r , this . _g , this . _b ) ;
var h = mathRound ( hsv . h * 360 ) , s = mathRound ( hsv . s * 100 ) , v = mathRound ( hsv . v * 100 ) ;
return ( this . _a == 1 ) ?
"hsv(" + h + ", " + s + "%, " + v + "%)" :
"hsva(" + h + ", " + s + "%, " + v + "%, " + this . _roundA + ")" ;
} ,
toHsl : function ( ) {
var hsl = rgbToHsl ( this . _r , this . _g , this . _b ) ;
return { h : hsl . h * 360 , s : hsl . s , l : hsl . l , a : this . _a } ;
} ,
toHslString : function ( ) {
var hsl = rgbToHsl ( this . _r , this . _g , this . _b ) ;
var h = mathRound ( hsl . h * 360 ) , s = mathRound ( hsl . s * 100 ) , l = mathRound ( hsl . l * 100 ) ;
return ( this . _a == 1 ) ?
"hsl(" + h + ", " + s + "%, " + l + "%)" :
"hsla(" + h + ", " + s + "%, " + l + "%, " + this . _roundA + ")" ;
} ,
toHex : function ( allow3Char ) {
return rgbToHex ( this . _r , this . _g , this . _b , allow3Char ) ;
} ,
toHexString : function ( allow3Char ) {
return '#' + this . toHex ( allow3Char ) ;
} ,
toHex8 : function ( allow4Char ) {
return rgbaToHex ( this . _r , this . _g , this . _b , this . _a , allow4Char ) ;
} ,
toHex8String : function ( allow4Char ) {
return '#' + this . toHex8 ( allow4Char ) ;
} ,
toRgb : function ( ) {
return { r : mathRound ( this . _r ) , g : mathRound ( this . _g ) , b : mathRound ( this . _b ) , a : this . _a } ;
} ,
toRgbString : function ( ) {
return ( this . _a == 1 ) ?
"rgb(" + mathRound ( this . _r ) + ", " + mathRound ( this . _g ) + ", " + mathRound ( this . _b ) + ")" :
"rgba(" + mathRound ( this . _r ) + ", " + mathRound ( this . _g ) + ", " + mathRound ( this . _b ) + ", " + this . _roundA + ")" ;
} ,
toPercentageRgb : function ( ) {
return { r : mathRound ( bound01 ( this . _r , 255 ) * 100 ) + "%" , g : mathRound ( bound01 ( this . _g , 255 ) * 100 ) + "%" , b : mathRound ( bound01 ( this . _b , 255 ) * 100 ) + "%" , a : this . _a } ;
} ,
toPercentageRgbString : function ( ) {
return ( this . _a == 1 ) ?
"rgb(" + mathRound ( bound01 ( this . _r , 255 ) * 100 ) + "%, " + mathRound ( bound01 ( this . _g , 255 ) * 100 ) + "%, " + mathRound ( bound01 ( this . _b , 255 ) * 100 ) + "%)" :
"rgba(" + mathRound ( bound01 ( this . _r , 255 ) * 100 ) + "%, " + mathRound ( bound01 ( this . _g , 255 ) * 100 ) + "%, " + mathRound ( bound01 ( this . _b , 255 ) * 100 ) + "%, " + this . _roundA + ")" ;
} ,
toName : function ( ) {
if ( this . _a === 0 ) {
return "transparent" ;
}
if ( this . _a < 1 ) {
return false ;
}
return hexNames [ rgbToHex ( this . _r , this . _g , this . _b , true ) ] || false ;
} ,
toFilter : function ( secondColor ) {
var hex8String = '#' + rgbaToArgbHex ( this . _r , this . _g , this . _b , this . _a ) ;
var secondHex8String = hex8String ;
var gradientType = this . _gradientType ? "GradientType = 1, " : "" ;
if ( secondColor ) {
var s = tinycolor ( secondColor ) ;
secondHex8String = '#' + rgbaToArgbHex ( s . _r , s . _g , s . _b , s . _a ) ;
}
return "progid:DXImageTransform.Microsoft.gradient(" + gradientType + "startColorstr=" + hex8String + ",endColorstr=" + secondHex8String + ")" ;
} ,
toString : function ( format ) {
var formatSet = ! ! format ;
format = format || this . _format ;
var formattedString = false ;
var hasAlpha = this . _a < 1 && this . _a >= 0 ;
var needsAlphaFormat = ! formatSet && hasAlpha && ( format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name" ) ;
if ( needsAlphaFormat ) {
// Special case for "transparent", all other non-alpha formats
// will return rgba when there is transparency.
if ( format === "name" && this . _a === 0 ) {
return this . toName ( ) ;
}
return this . toRgbString ( ) ;
}
if ( format === "rgb" ) {
formattedString = this . toRgbString ( ) ;
}
if ( format === "prgb" ) {
formattedString = this . toPercentageRgbString ( ) ;
}
if ( format === "hex" || format === "hex6" ) {
formattedString = this . toHexString ( ) ;
}
if ( format === "hex3" ) {
formattedString = this . toHexString ( true ) ;
}
if ( format === "hex4" ) {
formattedString = this . toHex8String ( true ) ;
}
if ( format === "hex8" ) {
formattedString = this . toHex8String ( ) ;
}
if ( format === "name" ) {
formattedString = this . toName ( ) ;
}
if ( format === "hsl" ) {
formattedString = this . toHslString ( ) ;
}
if ( format === "hsv" ) {
formattedString = this . toHsvString ( ) ;
}
return formattedString || this . toHexString ( ) ;
} ,
clone : function ( ) {
return tinycolor ( this . toString ( ) ) ;
} ,
_applyModification : function ( fn , args ) {
var color = fn . apply ( null , [ this ] . concat ( [ ] . slice . call ( args ) ) ) ;
this . _r = color . _r ;
this . _g = color . _g ;
this . _b = color . _b ;
this . setAlpha ( color . _a ) ;
return this ;
} ,
lighten : function ( ) {
return this . _applyModification ( lighten , arguments ) ;
} ,
brighten : function ( ) {
return this . _applyModification ( brighten , arguments ) ;
} ,
darken : function ( ) {
return this . _applyModification ( darken , arguments ) ;
} ,
desaturate : function ( ) {
return this . _applyModification ( desaturate , arguments ) ;
} ,
saturate : function ( ) {
return this . _applyModification ( saturate , arguments ) ;
} ,
greyscale : function ( ) {
return this . _applyModification ( greyscale , arguments ) ;
} ,
spin : function ( ) {
return this . _applyModification ( spin , arguments ) ;
} ,
_applyCombination : function ( fn , args ) {
return fn . apply ( null , [ this ] . concat ( [ ] . slice . call ( args ) ) ) ;
} ,
analogous : function ( ) {
return this . _applyCombination ( analogous , arguments ) ;
} ,
complement : function ( ) {
return this . _applyCombination ( complement , arguments ) ;
} ,
monochromatic : function ( ) {
return this . _applyCombination ( monochromatic , arguments ) ;
} ,
splitcomplement : function ( ) {
return this . _applyCombination ( splitcomplement , arguments ) ;
} ,
triad : function ( ) {
return this . _applyCombination ( triad , arguments ) ;
} ,
tetrad : function ( ) {
return this . _applyCombination ( tetrad , arguments ) ;
}
} ;
// If input is an object, force 1 into "1.0" to handle ratios properly
// String input requires "1.0" as input, so 1 will be treated as 1
tinycolor . fromRatio = function ( color , opts ) {
if ( typeof color == "object" ) {
var newColor = { } ;
for ( var i in color ) {
if ( color . hasOwnProperty ( i ) ) {
if ( i === "a" ) {
newColor [ i ] = color [ i ] ;
}
else {
newColor [ i ] = convertToPercentage ( color [ i ] ) ;
}
}
}
color = newColor ;
}
return tinycolor ( color , opts ) ;
} ;
// Given a string or object, convert that input to RGB
// Possible string inputs:
//
// "red"
// "#f00" or "f00"
// "#ff0000" or "ff0000"
// "#ff000000" or "ff000000"
// "rgb 255 0 0" or "rgb (255, 0, 0)"
// "rgb 1.0 0 0" or "rgb (1, 0, 0)"
// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
//
function inputToRGB ( color ) {
var rgb = { r : 0 , g : 0 , b : 0 } ;
var a = 1 ;
var s = null ;
var v = null ;
var l = null ;
var ok = false ;
var format = false ;
if ( typeof color == "string" ) {
color = stringInputToObject ( color ) ;
}
if ( typeof color == "object" ) {
if ( isValidCSSUnit ( color . r ) && isValidCSSUnit ( color . g ) && isValidCSSUnit ( color . b ) ) {
rgb = rgbToRgb ( color . r , color . g , color . b ) ;
ok = true ;
format = String ( color . r ) . substr ( - 1 ) === "%" ? "prgb" : "rgb" ;
}
else if ( isValidCSSUnit ( color . h ) && isValidCSSUnit ( color . s ) && isValidCSSUnit ( color . v ) ) {
s = convertToPercentage ( color . s ) ;
v = convertToPercentage ( color . v ) ;
rgb = hsvToRgb ( color . h , s , v ) ;
ok = true ;
format = "hsv" ;
}
else if ( isValidCSSUnit ( color . h ) && isValidCSSUnit ( color . s ) && isValidCSSUnit ( color . l ) ) {
s = convertToPercentage ( color . s ) ;
l = convertToPercentage ( color . l ) ;
rgb = hslToRgb ( color . h , s , l ) ;
ok = true ;
format = "hsl" ;
}
if ( color . hasOwnProperty ( "a" ) ) {
a = color . a ;
}
}
a = boundAlpha ( a ) ;
return {
ok : ok ,
format : color . format || format ,
r : mathMin ( 255 , mathMax ( rgb . r , 0 ) ) ,
g : mathMin ( 255 , mathMax ( rgb . g , 0 ) ) ,
b : mathMin ( 255 , mathMax ( rgb . b , 0 ) ) ,
a : a
} ;
}
// Conversion Functions
// --------------------
// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
// `rgbToRgb`
// Handle bounds / percentage checking to conform to CSS color spec
// <http://www.w3.org/TR/css3-color/>
// *Assumes:* r, g, b in [0, 255] or [0, 1]
// *Returns:* { r, g, b } in [0, 255]
function rgbToRgb ( r , g , b ) {
return {
r : bound01 ( r , 255 ) * 255 ,
g : bound01 ( g , 255 ) * 255 ,
b : bound01 ( b , 255 ) * 255
} ;
}
// `rgbToHsl`
// Converts an RGB color value to HSL.
// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
// *Returns:* { h, s, l } in [0,1]
function rgbToHsl ( r , g , b ) {
r = bound01 ( r , 255 ) ;
g = bound01 ( g , 255 ) ;
b = bound01 ( b , 255 ) ;
var max = mathMax ( r , g , b ) , min = mathMin ( r , g , b ) ;
var h , s , l = ( max + min ) / 2 ;
if ( max == min ) {
h = s = 0 ; // achromatic
}
else {
var d = max - min ;
s = l > 0.5 ? d / ( 2 - max - min ) : d / ( max + min ) ;
switch ( max ) {
case r : h = ( g - b ) / d + ( g < b ? 6 : 0 ) ; break ;
case g : h = ( b - r ) / d + 2 ; break ;
case b : h = ( r - g ) / d + 4 ; break ;
}
h /= 6 ;
}
return { h : h , s : s , l : l } ;
}
// `hslToRgb`
// Converts an HSL color value to RGB.
// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
// *Returns:* { r, g, b } in the set [0, 255]
function hslToRgb ( h , s , l ) {
var r , g , b ;
h = bound01 ( h , 360 ) ;
s = bound01 ( s , 100 ) ;
l = bound01 ( l , 100 ) ;
function hue2rgb ( p , q , t ) {
if ( t < 0 ) t += 1 ;
if ( t > 1 ) t -= 1 ;
if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t ;
if ( t < 1 / 2 ) return q ;
if ( t < 2 / 3 ) return p + ( q - p ) * ( 2 / 3 - t ) * 6 ;
return p ;
}
if ( s === 0 ) {
r = g = b = l ; // achromatic
}
else {
var q = l < 0.5 ? l * ( 1 + s ) : l + s - l * s ;
var p = 2 * l - q ;
r = hue2rgb ( p , q , h + 1 / 3 ) ;
g = hue2rgb ( p , q , h ) ;
b = hue2rgb ( p , q , h - 1 / 3 ) ;
}
return { r : r * 255 , g : g * 255 , b : b * 255 } ;
}
// `rgbToHsv`
// Converts an RGB color value to HSV
// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
// *Returns:* { h, s, v } in [0,1]
function rgbToHsv ( r , g , b ) {
r = bound01 ( r , 255 ) ;
g = bound01 ( g , 255 ) ;
b = bound01 ( b , 255 ) ;
var max = mathMax ( r , g , b ) , min = mathMin ( r , g , b ) ;
var h , s , v = max ;
var d = max - min ;
s = max === 0 ? 0 : d / max ;
if ( max == min ) {
h = 0 ; // achromatic
}
else {
switch ( max ) {
case r : h = ( g - b ) / d + ( g < b ? 6 : 0 ) ; break ;
case g : h = ( b - r ) / d + 2 ; break ;
case b : h = ( r - g ) / d + 4 ; break ;
}
h /= 6 ;
}
return { h : h , s : s , v : v } ;
}
// `hsvToRgb`
// Converts an HSV color value to RGB.
// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
// *Returns:* { r, g, b } in the set [0, 255]
function hsvToRgb ( h , s , v ) {
h = bound01 ( h , 360 ) * 6 ;
s = bound01 ( s , 100 ) ;
v = bound01 ( v , 100 ) ;
var i = Math . floor ( h ) ,
f = h - i ,
p = v * ( 1 - s ) ,
q = v * ( 1 - f * s ) ,
t = v * ( 1 - ( 1 - f ) * s ) ,
mod = i % 6 ,
r = [ v , q , p , p , t , v ] [ mod ] ,
g = [ t , v , v , q , p , p ] [ mod ] ,
b = [ p , p , t , v , v , q ] [ mod ] ;
return { r : r * 255 , g : g * 255 , b : b * 255 } ;
}
// `rgbToHex`
// Converts an RGB color to hex
// Assumes r, g, and b are contained in the set [0, 255]
// Returns a 3 or 6 character hex
function rgbToHex ( r , g , b , allow3Char ) {
var hex = [
pad2 ( mathRound ( r ) . toString ( 16 ) ) ,
pad2 ( mathRound ( g ) . toString ( 16 ) ) ,
pad2 ( mathRound ( b ) . toString ( 16 ) )
] ;
// Return a 3 character hex if possible
if ( allow3Char && hex [ 0 ] . charAt ( 0 ) == hex [ 0 ] . charAt ( 1 ) && hex [ 1 ] . charAt ( 0 ) == hex [ 1 ] . charAt ( 1 ) && hex [ 2 ] . charAt ( 0 ) == hex [ 2 ] . charAt ( 1 ) ) {
return hex [ 0 ] . charAt ( 0 ) + hex [ 1 ] . charAt ( 0 ) + hex [ 2 ] . charAt ( 0 ) ;
}
return hex . join ( "" ) ;
}
// `rgbaToHex`
// Converts an RGBA color plus alpha transparency to hex
// Assumes r, g, b are contained in the set [0, 255] and
// a in [0, 1]. Returns a 4 or 8 character rgba hex
function rgbaToHex ( r , g , b , a , allow4Char ) {
var hex = [
pad2 ( mathRound ( r ) . toString ( 16 ) ) ,
pad2 ( mathRound ( g ) . toString ( 16 ) ) ,
pad2 ( mathRound ( b ) . toString ( 16 ) ) ,
pad2 ( convertDecimalToHex ( a ) )
] ;
// Return a 4 character hex if possible
if ( allow4Char && hex [ 0 ] . charAt ( 0 ) == hex [ 0 ] . charAt ( 1 ) && hex [ 1 ] . charAt ( 0 ) == hex [ 1 ] . charAt ( 1 ) && hex [ 2 ] . charAt ( 0 ) == hex [ 2 ] . charAt ( 1 ) && hex [ 3 ] . charAt ( 0 ) == hex [ 3 ] . charAt ( 1 ) ) {
return hex [ 0 ] . charAt ( 0 ) + hex [ 1 ] . charAt ( 0 ) + hex [ 2 ] . charAt ( 0 ) + hex [ 3 ] . charAt ( 0 ) ;
}
return hex . join ( "" ) ;
}
// `rgbaToArgbHex`
// Converts an RGBA color to an ARGB Hex8 string
// Rarely used, but required for "toFilter()"
function rgbaToArgbHex ( r , g , b , a ) {
var hex = [
pad2 ( convertDecimalToHex ( a ) ) ,
pad2 ( mathRound ( r ) . toString ( 16 ) ) ,
pad2 ( mathRound ( g ) . toString ( 16 ) ) ,
pad2 ( mathRound ( b ) . toString ( 16 ) )
] ;
return hex . join ( "" ) ;
}
// `equals`
// Can be called with any tinycolor input
tinycolor . equals = function ( color1 , color2 ) {
if ( ! color1 || ! color2 ) { return false ; }
return tinycolor ( color1 ) . toRgbString ( ) == tinycolor ( color2 ) . toRgbString ( ) ;
} ;
tinycolor . random = function ( ) {
return tinycolor . fromRatio ( {
r : mathRandom ( ) ,
g : mathRandom ( ) ,
b : mathRandom ( )
} ) ;
} ;
// Modification Functions
// ----------------------
// Thanks to less.js for some of the basics here
// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>
function desaturate ( color , amount ) {
amount = ( amount === 0 ) ? 0 : ( amount || 10 ) ;
var hsl = tinycolor ( color ) . toHsl ( ) ;
hsl . s -= amount / 100 ;
hsl . s = clamp01 ( hsl . s ) ;
return tinycolor ( hsl ) ;
}
function saturate ( color , amount ) {
amount = ( amount === 0 ) ? 0 : ( amount || 10 ) ;
var hsl = tinycolor ( color ) . toHsl ( ) ;
hsl . s += amount / 100 ;
hsl . s = clamp01 ( hsl . s ) ;
return tinycolor ( hsl ) ;
}
function greyscale ( color ) {
return tinycolor ( color ) . desaturate ( 100 ) ;
}
function lighten ( color , amount ) {
amount = ( amount === 0 ) ? 0 : ( amount || 10 ) ;
var hsl = tinycolor ( color ) . toHsl ( ) ;
hsl . l += amount / 100 ;
hsl . l = clamp01 ( hsl . l ) ;
return tinycolor ( hsl ) ;
}
function brighten ( color , amount ) {
amount = ( amount === 0 ) ? 0 : ( amount || 10 ) ;
var rgb = tinycolor ( color ) . toRgb ( ) ;
rgb . r = mathMax ( 0 , mathMin ( 255 , rgb . r - mathRound ( 255 * - ( amount / 100 ) ) ) ) ;
rgb . g = mathMax ( 0 , mathMin ( 255 , rgb . g - mathRound ( 255 * - ( amount / 100 ) ) ) ) ;
rgb . b = mathMax ( 0 , mathMin ( 255 , rgb . b - mathRound ( 255 * - ( amount / 100 ) ) ) ) ;
return tinycolor ( rgb ) ;
}
function darken ( color , amount ) {
amount = ( amount === 0 ) ? 0 : ( amount || 10 ) ;
var hsl = tinycolor ( color ) . toHsl ( ) ;
hsl . l -= amount / 100 ;
hsl . l = clamp01 ( hsl . l ) ;
return tinycolor ( hsl ) ;
}
// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.
// Values outside of this range will be wrapped into this range.
function spin ( color , amount ) {
var hsl = tinycolor ( color ) . toHsl ( ) ;
var hue = ( hsl . h + amount ) % 360 ;
hsl . h = hue < 0 ? 360 + hue : hue ;
return tinycolor ( hsl ) ;
}
// Combination Functions
// ---------------------
// Thanks to jQuery xColor for some of the ideas behind these
// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>
function complement ( color ) {
var hsl = tinycolor ( color ) . toHsl ( ) ;
hsl . h = ( hsl . h + 180 ) % 360 ;
return tinycolor ( hsl ) ;
}
function triad ( color ) {
var hsl = tinycolor ( color ) . toHsl ( ) ;
var h = hsl . h ;
return [
tinycolor ( color ) ,
tinycolor ( { h : ( h + 120 ) % 360 , s : hsl . s , l : hsl . l } ) ,
tinycolor ( { h : ( h + 240 ) % 360 , s : hsl . s , l : hsl . l } )
] ;
}
function tetrad ( color ) {
var hsl = tinycolor ( color ) . toHsl ( ) ;
var h = hsl . h ;
return [
tinycolor ( color ) ,
tinycolor ( { h : ( h + 90 ) % 360 , s : hsl . s , l : hsl . l } ) ,
tinycolor ( { h : ( h + 180 ) % 360 , s : hsl . s , l : hsl . l } ) ,
tinycolor ( { h : ( h + 270 ) % 360 , s : hsl . s , l : hsl . l } )
] ;
}
function splitcomplement ( color ) {
var hsl = tinycolor ( color ) . toHsl ( ) ;
var h = hsl . h ;
return [
tinycolor ( color ) ,
tinycolor ( { h : ( h + 72 ) % 360 , s : hsl . s , l : hsl . l } ) ,
tinycolor ( { h : ( h + 216 ) % 360 , s : hsl . s , l : hsl . l } )
] ;
}
function analogous ( color , results , slices ) {
results = results || 6 ;
slices = slices || 30 ;
var hsl = tinycolor ( color ) . toHsl ( ) ;
var part = 360 / slices ;
var ret = [ tinycolor ( color ) ] ;
for ( hsl . h = ( ( hsl . h - ( part * results >> 1 ) ) + 720 ) % 360 ; -- results ; ) {
hsl . h = ( hsl . h + part ) % 360 ;
ret . push ( tinycolor ( hsl ) ) ;
}
return ret ;
}
function monochromatic ( color , results ) {
results = results || 6 ;
var hsv = tinycolor ( color ) . toHsv ( ) ;
var h = hsv . h , s = hsv . s , v = hsv . v ;
var ret = [ ] ;
var modification = 1 / results ;
while ( results -- ) {
ret . push ( tinycolor ( { h : h , s : s , v : v } ) ) ;
v = ( v + modification ) % 1 ;
}
return ret ;
}
// Utility Functions
// ---------------------
tinycolor . mix = function ( color1 , color2 , amount ) {
amount = ( amount === 0 ) ? 0 : ( amount || 50 ) ;
var rgb1 = tinycolor ( color1 ) . toRgb ( ) ;
var rgb2 = tinycolor ( color2 ) . toRgb ( ) ;
var p = amount / 100 ;
var rgba = {
r : ( ( rgb2 . r - rgb1 . r ) * p ) + rgb1 . r ,
g : ( ( rgb2 . g - rgb1 . g ) * p ) + rgb1 . g ,
b : ( ( rgb2 . b - rgb1 . b ) * p ) + rgb1 . b ,
a : ( ( rgb2 . a - rgb1 . a ) * p ) + rgb1 . a
} ;
return tinycolor ( rgba ) ;
} ;
// Readability Functions
// ---------------------
// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)
// `contrast`
// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)
tinycolor . readability = function ( color1 , color2 ) {
var c1 = tinycolor ( color1 ) ;
var c2 = tinycolor ( color2 ) ;
return ( Math . max ( c1 . getLuminance ( ) , c2 . getLuminance ( ) ) + 0.05 ) / ( Math . min ( c1 . getLuminance ( ) , c2 . getLuminance ( ) ) + 0.05 ) ;
} ;
// `isReadable`
// Ensure that foreground and background color combinations meet WCAG2 guidelines.
// The third argument is an optional Object.
// the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';
// the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.
// If the entire object is absent, isReadable defaults to {level:"AA",size:"small"}.
// *Example*
// tinycolor.isReadable("#000", "#111") => false
// tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false
tinycolor . isReadable = function ( color1 , color2 , wcag2 ) {
var readability = tinycolor . readability ( color1 , color2 ) ;
var wcag2Parms , out ;
out = false ;
wcag2Parms = validateWCAG2Parms ( wcag2 ) ;
switch ( wcag2Parms . level + wcag2Parms . size ) {
case "AAsmall" :
case "AAAlarge" :
out = readability >= 4.5 ;
break ;
case "AAlarge" :
out = readability >= 3 ;
break ;
case "AAAsmall" :
out = readability >= 7 ;
break ;
}
return out ;
} ;
// `mostReadable`
// Given a base color and a list of possible foreground or background
// colors for that base, returns the most readable color.
// Optionally returns Black or White if the most readable color is unreadable.
// *Example*
// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255"
// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff"
// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3"
// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff"
tinycolor . mostReadable = function ( baseColor , colorList , args ) {
var bestColor = null ;
var bestScore = 0 ;
var readability ;
var includeFallbackColors , level , size ;
args = args || { } ;
includeFallbackColors = args . includeFallbackColors ;
level = args . level ;
size = args . size ;
for ( var i = 0 ; i < colorList . length ; i ++ ) {
readability = tinycolor . readability ( baseColor , colorList [ i ] ) ;
if ( readability > bestScore ) {
bestScore = readability ;
bestColor = tinycolor ( colorList [ i ] ) ;
}
}
if ( tinycolor . isReadable ( baseColor , bestColor , { "level" : level , "size" : size } ) || ! includeFallbackColors ) {
return bestColor ;
}
else {
args . includeFallbackColors = false ;
return tinycolor . mostReadable ( baseColor , [ "#fff" , "#000" ] , args ) ;
}
} ;
// Big List of Colors
// ------------------
// <http://www.w3.org/TR/css3-color/#svg-color>
var names = tinycolor . names = {
aliceblue : "f0f8ff" ,
antiquewhite : "faebd7" ,
aqua : "0ff" ,
aquamarine : "7fffd4" ,
azure : "f0ffff" ,
beige : "f5f5dc" ,
bisque : "ffe4c4" ,
black : "000" ,
blanchedalmond : "ffebcd" ,
blue : "00f" ,
blueviolet : "8a2be2" ,
brown : "a52a2a" ,
burlywood : "deb887" ,
burntsienna : "ea7e5d" ,
cadetblue : "5f9ea0" ,
chartreuse : "7fff00" ,
chocolate : "d2691e" ,
coral : "ff7f50" ,
cornflowerblue : "6495ed" ,
cornsilk : "fff8dc" ,
crimson : "dc143c" ,
cyan : "0ff" ,
darkblue : "00008b" ,
darkcyan : "008b8b" ,
darkgoldenrod : "b8860b" ,
darkgray : "a9a9a9" ,
darkgreen : "006400" ,
darkgrey : "a9a9a9" ,
darkkhaki : "bdb76b" ,
darkmagenta : "8b008b" ,
darkolivegreen : "556b2f" ,
darkorange : "ff8c00" ,
darkorchid : "9932cc" ,
darkred : "8b0000" ,
darksalmon : "e9967a" ,
darkseagreen : "8fbc8f" ,
darkslateblue : "483d8b" ,
darkslategray : "2f4f4f" ,
darkslategrey : "2f4f4f" ,
darkturquoise : "00ced1" ,
darkviolet : "9400d3" ,
deeppink : "ff1493" ,
deepskyblue : "00bfff" ,
dimgray : "696969" ,
dimgrey : "696969" ,
dodgerblue : "1e90ff" ,
firebrick : "b22222" ,
floralwhite : "fffaf0" ,
forestgreen : "228b22" ,
fuchsia : "f0f" ,
gainsboro : "dcdcdc" ,
ghostwhite : "f8f8ff" ,
gold : "ffd700" ,
goldenrod : "daa520" ,
gray : "808080" ,
green : "008000" ,
greenyellow : "adff2f" ,
grey : "808080" ,
honeydew : "f0fff0" ,
hotpink : "ff69b4" ,
indianred : "cd5c5c" ,
indigo : "4b0082" ,
ivory : "fffff0" ,
khaki : "f0e68c" ,
lavender : "e6e6fa" ,
lavenderblush : "fff0f5" ,
lawngreen : "7cfc00" ,
lemonchiffon : "fffacd" ,
lightblue : "add8e6" ,
lightcoral : "f08080" ,
lightcyan : "e0ffff" ,
lightgoldenrodyellow : "fafad2" ,
lightgray : "d3d3d3" ,
lightgreen : "90ee90" ,
lightgrey : "d3d3d3" ,
lightpink : "ffb6c1" ,
lightsalmon : "ffa07a" ,
lightseagreen : "20b2aa" ,
lightskyblue : "87cefa" ,
lightslategray : "789" ,
lightslategrey : "789" ,
lightsteelblue : "b0c4de" ,
lightyellow : "ffffe0" ,
lime : "0f0" ,
limegreen : "32cd32" ,
linen : "faf0e6" ,
magenta : "f0f" ,
maroon : "800000" ,
mediumaquamarine : "66cdaa" ,
mediumblue : "0000cd" ,
mediumorchid : "ba55d3" ,
mediumpurple : "9370db" ,
mediumseagreen : "3cb371" ,
mediumslateblue : "7b68ee" ,
mediumspringgreen : "00fa9a" ,
mediumturquoise : "48d1cc" ,
mediumvioletred : "c71585" ,
midnightblue : "191970" ,
mintcream : "f5fffa" ,
mistyrose : "ffe4e1" ,
moccasin : "ffe4b5" ,
navajowhite : "ffdead" ,
navy : "000080" ,
oldlace : "fdf5e6" ,
olive : "808000" ,
olivedrab : "6b8e23" ,
orange : "ffa500" ,
orangered : "ff4500" ,
orchid : "da70d6" ,
palegoldenrod : "eee8aa" ,
palegreen : "98fb98" ,
paleturquoise : "afeeee" ,
palevioletred : "db7093" ,
papayawhip : "ffefd5" ,
peachpuff : "ffdab9" ,
peru : "cd853f" ,
pink : "ffc0cb" ,
plum : "dda0dd" ,
powderblue : "b0e0e6" ,
purple : "800080" ,
rebeccapurple : "663399" ,
red : "f00" ,
rosybrown : "bc8f8f" ,
royalblue : "4169e1" ,
saddlebrown : "8b4513" ,
salmon : "fa8072" ,
sandybrown : "f4a460" ,
seagreen : "2e8b57" ,
seashell : "fff5ee" ,
sienna : "a0522d" ,
silver : "c0c0c0" ,
skyblue : "87ceeb" ,
slateblue : "6a5acd" ,
slategray : "708090" ,
slategrey : "708090" ,
snow : "fffafa" ,
springgreen : "00ff7f" ,
steelblue : "4682b4" ,
tan : "d2b48c" ,
teal : "008080" ,
thistle : "d8bfd8" ,
tomato : "ff6347" ,
turquoise : "40e0d0" ,
violet : "ee82ee" ,
wheat : "f5deb3" ,
white : "fff" ,
whitesmoke : "f5f5f5" ,
yellow : "ff0" ,
yellowgreen : "9acd32"
} ;
// Make it easy to access colors via `hexNames[hex]`
var hexNames = tinycolor . hexNames = flip ( names ) ;
// Utilities
// ---------
// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`
function flip ( o ) {
var flipped = { } ;
for ( var i in o ) {
if ( o . hasOwnProperty ( i ) ) {
flipped [ o [ i ] ] = i ;
}
}
return flipped ;
}
// Return a valid alpha value [0,1] with all invalid values being set to 1
function boundAlpha ( a ) {
a = parseFloat ( a ) ;
if ( isNaN ( a ) || a < 0 || a > 1 ) {
a = 1 ;
}
return a ;
}
// Take input from [0, n] and return it as [0, 1]
function bound01 ( n , max ) {
if ( isOnePointZero ( n ) ) { n = "100%" ; }
var processPercent = isPercentage ( n ) ;
n = mathMin ( max , mathMax ( 0 , parseFloat ( n ) ) ) ;
// Automatically convert percentage into number
if ( processPercent ) {
n = parseInt ( n * max , 10 ) / 100 ;
}
// Handle floating point rounding errors
if ( ( Math . abs ( n - max ) < 0.000001 ) ) {
return 1 ;
}
// Convert into [0, 1] range if it isn't already
return ( n % max ) / parseFloat ( max ) ;
}
// Force a number between 0 and 1
function clamp01 ( val ) {
return mathMin ( 1 , mathMax ( 0 , val ) ) ;
}
// Parse a base-16 hex value into a base-10 integer
function parseIntFromHex ( val ) {
return parseInt ( val , 16 ) ;
}
// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>
function isOnePointZero ( n ) {
return typeof n == "string" && n . indexOf ( '.' ) != - 1 && parseFloat ( n ) === 1 ;
}
// Check to see if string passed in is a percentage
function isPercentage ( n ) {
return typeof n === "string" && n . indexOf ( '%' ) != - 1 ;
}
// Force a hex value to have 2 characters
function pad2 ( c ) {
return c . length == 1 ? '0' + c : '' + c ;
}
// Replace a decimal with it's percentage value
function convertToPercentage ( n ) {
if ( n <= 1 ) {
n = ( n * 100 ) + "%" ;
}
return n ;
}
// Converts a decimal to a hex value
function convertDecimalToHex ( d ) {
return Math . round ( parseFloat ( d ) * 255 ) . toString ( 16 ) ;
}
// Converts a hex value to a decimal
function convertHexToDecimal ( h ) {
return ( parseIntFromHex ( h ) / 255 ) ;
}
var matchers = ( function ( ) {
// <http://www.w3.org/TR/css3-values/#integers>
var CSS _INTEGER = "[-\\+]?\\d+%?" ;
// <http://www.w3.org/TR/css3-values/#number-value>
var CSS _NUMBER = "[-\\+]?\\d*\\.\\d+%?" ;
// Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.
var CSS _UNIT = "(?:" + CSS _NUMBER + ")|(?:" + CSS _INTEGER + ")" ;
// Actual matching.
// Parentheses and commas are optional, but not required.
// Whitespace can take the place of commas or opening paren
var PERMISSIVE _MATCH3 = "[\\s|\\(]+(" + CSS _UNIT + ")[,|\\s]+(" + CSS _UNIT + ")[,|\\s]+(" + CSS _UNIT + ")\\s*\\)?" ;
var PERMISSIVE _MATCH4 = "[\\s|\\(]+(" + CSS _UNIT + ")[,|\\s]+(" + CSS _UNIT + ")[,|\\s]+(" + CSS _UNIT + ")[,|\\s]+(" + CSS _UNIT + ")\\s*\\)?" ;
return {
CSS _UNIT : new RegExp ( CSS _UNIT ) ,
rgb : new RegExp ( "rgb" + PERMISSIVE _MATCH3 ) ,
rgba : new RegExp ( "rgba" + PERMISSIVE _MATCH4 ) ,
hsl : new RegExp ( "hsl" + PERMISSIVE _MATCH3 ) ,
hsla : new RegExp ( "hsla" + PERMISSIVE _MATCH4 ) ,
hsv : new RegExp ( "hsv" + PERMISSIVE _MATCH3 ) ,
hsva : new RegExp ( "hsva" + PERMISSIVE _MATCH4 ) ,
hex3 : /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/ ,
hex6 : /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ ,
hex4 : /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/ ,
hex8 : /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
} ;
} ) ( ) ;
// `isValidCSSUnit`
// Take in a single string / number and check to see if it looks like a CSS unit
// (see `matchers` above for definition).
function isValidCSSUnit ( color ) {
return ! ! matchers . CSS _UNIT . exec ( color ) ;
}
// `stringInputToObject`
// Permissive string parsing. Take in a number of formats, and output an object
// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`
function stringInputToObject ( color ) {
color = color . replace ( trimLeft , '' ) . replace ( trimRight , '' ) . toLowerCase ( ) ;
var named = false ;
if ( names [ color ] ) {
color = names [ color ] ;
named = true ;
}
else if ( color == 'transparent' ) {
return { r : 0 , g : 0 , b : 0 , a : 0 , format : "name" } ;
}
// Try to match string input using regular expressions.
// Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
// Just return an object and let the conversion functions handle that.
// This way the result will be the same whether the tinycolor is initialized with string or object.
var match ;
if ( ( match = matchers . rgb . exec ( color ) ) ) {
return { r : match [ 1 ] , g : match [ 2 ] , b : match [ 3 ] } ;
}
if ( ( match = matchers . rgba . exec ( color ) ) ) {
return { r : match [ 1 ] , g : match [ 2 ] , b : match [ 3 ] , a : match [ 4 ] } ;
}
if ( ( match = matchers . hsl . exec ( color ) ) ) {
return { h : match [ 1 ] , s : match [ 2 ] , l : match [ 3 ] } ;
}
if ( ( match = matchers . hsla . exec ( color ) ) ) {
return { h : match [ 1 ] , s : match [ 2 ] , l : match [ 3 ] , a : match [ 4 ] } ;
}
if ( ( match = matchers . hsv . exec ( color ) ) ) {
return { h : match [ 1 ] , s : match [ 2 ] , v : match [ 3 ] } ;
}
if ( ( match = matchers . hsva . exec ( color ) ) ) {
return { h : match [ 1 ] , s : match [ 2 ] , v : match [ 3 ] , a : match [ 4 ] } ;
}
if ( ( match = matchers . hex8 . exec ( color ) ) ) {
return {
r : parseIntFromHex ( match [ 1 ] ) ,
g : parseIntFromHex ( match [ 2 ] ) ,
b : parseIntFromHex ( match [ 3 ] ) ,
a : convertHexToDecimal ( match [ 4 ] ) ,
format : named ? "name" : "hex8"
} ;
}
if ( ( match = matchers . hex6 . exec ( color ) ) ) {
return {
r : parseIntFromHex ( match [ 1 ] ) ,
g : parseIntFromHex ( match [ 2 ] ) ,
b : parseIntFromHex ( match [ 3 ] ) ,
format : named ? "name" : "hex"
} ;
}
if ( ( match = matchers . hex4 . exec ( color ) ) ) {
return {
r : parseIntFromHex ( match [ 1 ] + '' + match [ 1 ] ) ,
g : parseIntFromHex ( match [ 2 ] + '' + match [ 2 ] ) ,
b : parseIntFromHex ( match [ 3 ] + '' + match [ 3 ] ) ,
a : convertHexToDecimal ( match [ 4 ] + '' + match [ 4 ] ) ,
format : named ? "name" : "hex8"
} ;
}
if ( ( match = matchers . hex3 . exec ( color ) ) ) {
return {
r : parseIntFromHex ( match [ 1 ] + '' + match [ 1 ] ) ,
g : parseIntFromHex ( match [ 2 ] + '' + match [ 2 ] ) ,
b : parseIntFromHex ( match [ 3 ] + '' + match [ 3 ] ) ,
format : named ? "name" : "hex"
} ;
}
return false ;
}
function validateWCAG2Parms ( parms ) {
// return valid WCAG2 parms for isReadable.
// If input parms are invalid, return {"level":"AA", "size":"small"}
var level , size ;
parms = parms || { "level" : "AA" , "size" : "small" } ;
level = ( parms . level || "AA" ) . toUpperCase ( ) ;
size = ( parms . size || "small" ) . toLowerCase ( ) ;
if ( level !== "AA" && level !== "AAA" ) {
level = "AA" ;
}
if ( size !== "small" && size !== "large" ) {
size = "small" ;
}
return { "level" : level , "size" : size } ;
}
// Node: Export function
if ( true && module . exports ) {
module . exports = tinycolor ;
}
// AMD/requirejs: Define the module
else if ( true ) {
! ( _ _WEBPACK _AMD _DEFINE _RESULT _ _ = ( function ( ) { return tinycolor ; } ) . call ( exports , _ _webpack _require _ _ , exports , module ) ,
_ _WEBPACK _AMD _DEFINE _RESULT _ _ !== undefined && ( module . exports = _ _WEBPACK _AMD _DEFINE _RESULT _ _ ) ) ;
}
// Browser: Expose to window
else { }
} ) ( Math ) ;
/***/ } ) ,
2019-03-07 10:09:59 +01:00
/***/ 5 :
2018-12-14 05:41:57 +01:00
/***/ ( function ( module , exports ) {
2019-03-07 10:09:59 +01:00
( function ( ) { module . exports = this [ "wp" ] [ "data" ] ; } ( ) ) ;
2018-12-14 05:41:57 +01:00
/***/ } ) ,
2019-03-21 13:48:00 +01:00
/***/ 57 :
2018-12-14 05:41:57 +01:00
/***/ ( function ( module , exports ) {
2019-03-07 10:09:59 +01:00
( function ( ) { module . exports = this [ "wp" ] [ "htmlEntities" ] ; } ( ) ) ;
2018-12-14 05:41:57 +01:00
/***/ } ) ,
2019-03-21 13:48:00 +01:00
/***/ 6 :
/***/ ( function ( module , exports ) {
( function ( ) { module . exports = this [ "wp" ] [ "compose" ] ; } ( ) ) ;
/***/ } ) ,
/***/ 65 :
2018-12-14 05:41:57 +01:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2019-03-21 13:48:00 +01:00
var rng = _ _webpack _require _ _ ( 87 ) ;
var bytesToUuid = _ _webpack _require _ _ ( 88 ) ;
2018-12-14 05:41:57 +01:00
function v4 ( options , buf , offset ) {
var i = buf && offset || 0 ;
if ( typeof ( options ) == 'string' ) {
buf = options === 'binary' ? new Array ( 16 ) : null ;
options = null ;
}
options = options || { } ;
var rnds = options . random || ( options . rng || rng ) ( ) ;
// Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
rnds [ 6 ] = ( rnds [ 6 ] & 0x0f ) | 0x40 ;
rnds [ 8 ] = ( rnds [ 8 ] & 0x3f ) | 0x80 ;
// Copy bytes to buffer, if provided
if ( buf ) {
for ( var ii = 0 ; ii < 16 ; ++ ii ) {
buf [ i + ii ] = rnds [ ii ] ;
}
}
return buf || bytesToUuid ( rnds ) ;
}
module . exports = v4 ;
/***/ } ) ,
2019-03-21 13:48:00 +01:00
/***/ 66 :
2018-12-14 05:41:57 +01:00
/***/ ( function ( module , exports ) {
( function ( ) { module . exports = this [ "wp" ] [ "autop" ] ; } ( ) ) ;
/***/ } ) ,
2018-12-18 04:14:52 +01:00
/***/ 7 :
2019-03-21 13:48:00 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2018-12-14 05:41:57 +01:00
2019-03-21 13:48:00 +01:00
"use strict" ;
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return _objectSpread ; } ) ;
/* harmony import */ var _defineProperty _ _WEBPACK _IMPORTED _MODULE _0 _ _ = _ _webpack _require _ _ ( 15 ) ;
function _objectSpread ( target ) {
for ( var i = 1 ; i < arguments . length ; i ++ ) {
var source = arguments [ i ] != null ? arguments [ i ] : { } ;
var ownKeys = Object . keys ( source ) ;
if ( typeof Object . getOwnPropertySymbols === 'function' ) {
ownKeys = ownKeys . concat ( Object . getOwnPropertySymbols ( source ) . filter ( function ( sym ) {
return Object . getOwnPropertyDescriptor ( source , sym ) . enumerable ;
} ) ) ;
}
ownKeys . forEach ( function ( key ) {
Object ( _defineProperty _ _WEBPACK _IMPORTED _MODULE _0 _ _ [ /* default */ "a" ] ) ( target , key , source [ key ] ) ;
} ) ;
}
return target ;
}
2018-12-14 05:41:57 +01:00
/***/ } ) ,
2019-03-21 13:48:00 +01:00
/***/ 87 :
2018-12-14 05:41:57 +01:00
/***/ ( function ( module , exports ) {
2018-12-18 04:14:52 +01:00
// Unique ID creation requires a high quality random # generator. In the
// browser this is a little complicated due to unknown quality of Math.random()
// and inconsistent support for the `crypto` API. We do the best we can via
// feature-detection
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// getRandomValues needs to be invoked in a context where "this" is a Crypto
// implementation. Also, find the complete implementation of crypto on IE11.
var getRandomValues = ( typeof ( crypto ) != 'undefined' && crypto . getRandomValues && crypto . getRandomValues . bind ( crypto ) ) ||
( typeof ( msCrypto ) != 'undefined' && typeof window . msCrypto . getRandomValues == 'function' && msCrypto . getRandomValues . bind ( msCrypto ) ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( getRandomValues ) {
// WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto
var rnds8 = new Uint8Array ( 16 ) ; // eslint-disable-line no-undef
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
module . exports = function whatwgRNG ( ) {
getRandomValues ( rnds8 ) ;
return rnds8 ;
} ;
} else {
// Math.random()-based (RNG)
//
// If all else fails, use Math.random(). It's fast, but is of unspecified
// quality.
var rnds = new Array ( 16 ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
module . exports = function mathRNG ( ) {
for ( var i = 0 , r ; i < 16 ; i ++ ) {
if ( ( i & 0x03 ) === 0 ) r = Math . random ( ) * 0x100000000 ;
rnds [ i ] = r >>> ( ( i & 0x03 ) << 3 ) & 0xff ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return rnds ;
} ;
}
2018-12-14 05:41:57 +01:00
/***/ } ) ,
2019-03-21 13:48:00 +01:00
/***/ 88 :
2018-12-14 05:41:57 +01:00
/***/ ( function ( module , exports ) {
2018-12-18 04:14:52 +01:00
/ * *
* Convert array of 16 byte values to UUID string format of the form :
* XXXXXXXX - XXXX - XXXX - XXXX - XXXXXXXXXXXX
* /
var byteToHex = [ ] ;
for ( var i = 0 ; i < 256 ; ++ i ) {
byteToHex [ i ] = ( i + 0x100 ) . toString ( 16 ) . substr ( 1 ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function bytesToUuid ( buf , offset ) {
var i = offset || 0 ;
var bth = byteToHex ;
// join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4
return ( [ bth [ buf [ i ++ ] ] , bth [ buf [ i ++ ] ] ,
bth [ buf [ i ++ ] ] , bth [ buf [ i ++ ] ] , '-' ,
bth [ buf [ i ++ ] ] , bth [ buf [ i ++ ] ] , '-' ,
bth [ buf [ i ++ ] ] , bth [ buf [ i ++ ] ] , '-' ,
bth [ buf [ i ++ ] ] , bth [ buf [ i ++ ] ] , '-' ,
bth [ buf [ i ++ ] ] , bth [ buf [ i ++ ] ] ,
bth [ buf [ i ++ ] ] , bth [ buf [ i ++ ] ] ,
bth [ buf [ i ++ ] ] , bth [ buf [ i ++ ] ] ] ) . join ( '' ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
module . exports = bytesToUuid ;
Block Editor: Update `@wordpress` dependencies to match Gutenberg 4.5.1.
- Update the annotations, api-fetch, block-library, blocks, components, compose, core-data, data, date, dom, edit-post, editor, element, format-library, html-entities, i18n, jest-console, jest-preset-default, keycodes, list-reusable-blocks, notices, nux, plugins, rich-text, scripts, token-lists, url, viewport packages.
- Upgrades React from 16.5.2 to 16.6.3.
- Adds a missing `wp-date` dependency to the editor script.
- Updates changed dependencies in `script-loader.php`.
- Fixes undefined notices in some blocks.
- Removes incorrect `gutenberg` textdomain.
Merges [43891], [43903], and [43919] to trunk.
Props atimmer, aduth, youknowriad, danielbachhuber.
See #45145.
Built from https://develop.svn.wordpress.org/trunk@44262
git-svn-id: http://core.svn.wordpress.org/trunk@44092 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-17 16:37:00 +01:00
2018-12-14 05:41:57 +01:00
/***/ } ) ,
2018-12-18 04:14:52 +01:00
/***/ 9 :
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
"use strict" ;
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return _createClass ; } ) ;
function _defineProperties ( target , props ) {
for ( var i = 0 ; i < props . length ; i ++ ) {
var descriptor = props [ i ] ;
descriptor . enumerable = descriptor . enumerable || false ;
descriptor . configurable = true ;
if ( "value" in descriptor ) descriptor . writable = true ;
Object . defineProperty ( target , descriptor . key , descriptor ) ;
}
}
function _createClass ( Constructor , protoProps , staticProps ) {
if ( protoProps ) _defineProperties ( Constructor . prototype , protoProps ) ;
if ( staticProps ) _defineProperties ( Constructor , staticProps ) ;
return Constructor ;
}
2018-12-14 05:41:57 +01:00
/***/ } )
2018-12-18 04:14:52 +01:00
/******/ } ) ;