* Validate extension * @param {array} extension * @param {string} name * @returns {{valid: boolean, error: string}}
(extension, name)
| 262 | * @returns {{valid: boolean, error: string}} |
| 263 | */ |
| 264 | function validate (extension, name) { |
| 265 | 'use strict'; |
| 266 | |
| 267 | var errMsg = (name) ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension', |
| 268 | ret = { |
| 269 | valid: true, |
| 270 | error: '' |
| 271 | }; |
| 272 | |
| 273 | if (!showdown.helper.isArray(extension)) { |
| 274 | extension = [extension]; |
| 275 | } |
| 276 | |
| 277 | for (var i = 0; i < extension.length; ++i) { |
| 278 | var baseMsg = errMsg + ' sub-extension ' + i + ': ', |
| 279 | ext = extension[i]; |
| 280 | if (typeof ext !== 'object') { |
| 281 | ret.valid = false; |
| 282 | ret.error = baseMsg + 'must be an object, but ' + typeof ext + ' given'; |
| 283 | return ret; |
| 284 | } |
| 285 | |
| 286 | if (!showdown.helper.isString(ext.type)) { |
| 287 | ret.valid = false; |
| 288 | ret.error = baseMsg + 'property "type" must be a string, but ' + typeof ext.type + ' given'; |
| 289 | return ret; |
| 290 | } |
| 291 | |
| 292 | var type = ext.type = ext.type.toLowerCase(); |
| 293 | |
| 294 | // normalize extension type |
| 295 | if (type === 'language') { |
| 296 | type = ext.type = 'lang'; |
| 297 | } |
| 298 | |
| 299 | if (type === 'html') { |
| 300 | type = ext.type = 'output'; |
| 301 | } |
| 302 | |
| 303 | if (type !== 'lang' && type !== 'output' && type !== 'listener') { |
| 304 | ret.valid = false; |
| 305 | ret.error = baseMsg + 'type ' + type + ' is not recognized. Valid values: "lang/language", "output/html" or "listener"'; |
| 306 | return ret; |
| 307 | } |
| 308 | |
| 309 | if (type === 'listener') { |
| 310 | if (showdown.helper.isUndefined(ext.listeners)) { |
| 311 | ret.valid = false; |
| 312 | ret.error = baseMsg + '. Extensions of type "listener" must have a property called "listeners"'; |
| 313 | return ret; |
| 314 | } |
| 315 | } else { |
| 316 | if (showdown.helper.isUndefined(ext.filter) && showdown.helper.isUndefined(ext.regex)) { |
| 317 | ret.valid = false; |
| 318 | ret.error = baseMsg + type + ' extensions must define either a "regex" property or a "filter" method'; |
| 319 | return ret; |
| 320 | } |
| 321 | } |
no outgoing calls
no test coverage detected
searching dependent graphs…