mirror of
				https://github.com/Jermolene/TiddlyWiki5
				synced 2025-10-31 07:32:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*\
 | |
| title: $:/plugins/tiddlywiki/markdown/wrapper.js
 | |
| type: application/javascript
 | |
| module-type: parser
 | |
| 
 | |
| Wraps up the markdown-js parser for use in TiddlyWiki5
 | |
| 
 | |
| \*/
 | |
| (function(){
 | |
| 
 | |
| /*jslint node: true, browser: true */
 | |
| /*global $tw: false */
 | |
| "use strict";
 | |
| 
 | |
| var markdown = require("$:/plugins/tiddlywiki/markdown/markdown.js");
 | |
| 
 | |
| var CONFIG_DIALECT_TIDDLER = "$:/config/markdown/dialect",
 | |
| 	DEFAULT_DIALECT = "Gruber";
 | |
| 
 | |
| function transformNodes(nodes) {
 | |
| 	var results = [];
 | |
| 	for(var index=0; index<nodes.length; index++) {
 | |
| 		results.push(transformNode(nodes[index]));
 | |
| 	}
 | |
| 	return results;
 | |
| }
 | |
| 
 | |
| function transformNode(node) {
 | |
| 	if($tw.utils.isArray(node)) {
 | |
| 		var p = 0,
 | |
| 			widget = {type: "element", tag: node[p++]};
 | |
| 		if(!$tw.utils.isArray(node[p]) && typeof(node[p]) === "object") {
 | |
| 			widget.attributes = {};
 | |
| 			$tw.utils.each(node[p++],function(value,name) {
 | |
| 				widget.attributes[name] = {type: "string", value: value};
 | |
| 			});
 | |
| 		}
 | |
| 		widget.children = transformNodes(node.slice(p++));
 | |
| 		// Massage images into the image widget
 | |
| 		if(widget.tag === "img") {
 | |
| 			widget.type = "image";
 | |
| 			if(widget.attributes.alt) {
 | |
| 				widget.attributes.tooltip = widget.attributes.alt;
 | |
| 				delete widget.attributes.alt;
 | |
| 			}
 | |
| 			if(widget.attributes.src) {
 | |
| 				widget.attributes.source = widget.attributes.src;
 | |
| 				delete widget.attributes.src;
 | |
| 			}
 | |
| 		}
 | |
| 		// Convert internal links to proper wikilinks
 | |
| 		if (widget.tag === "a" && widget.attributes.href.value[0] === "#") {
 | |
| 			widget.type = "link";
 | |
| 			widget.attributes.to = widget.attributes.href;
 | |
| 			if (widget.attributes.to.type === "string") {
 | |
| 				//Remove '#' before conversion to wikilink
 | |
| 				widget.attributes.to.value = widget.attributes.to.value.substr(1);
 | |
| 			}
 | |
| 			//Children is fine
 | |
| 			delete widget.tag;
 | |
| 			delete widget.attributes.href;
 | |
| 		}
 | |
| 		return widget;
 | |
| 	} else {
 | |
| 		return {type: "text", text: node};
 | |
| 	}
 | |
| }
 | |
| 
 | |
| var MarkdownParser = function(type,text,options) {
 | |
| 	var dialect = options.wiki.getTiddlerText(CONFIG_DIALECT_TIDDLER,DEFAULT_DIALECT),
 | |
| 		markdownTree = markdown.toHTMLTree(text,dialect),
 | |
| 		node = $tw.utils.isArray(markdownTree[1]) ? markdownTree.slice(1) : markdownTree.slice(2);
 | |
| 	this.tree = transformNodes(node);
 | |
| };
 | |
| 
 | |
| /*
 | |
| 
 | |
| [ 'html',
 | |
|   [ 'p', 'something' ],
 | |
|   [ 'h1',
 | |
|     'heading and ',
 | |
|     [ 'strong', 'other' ] ] ]
 | |
| 
 | |
| */
 | |
| 
 | |
| exports["text/x-markdown"] = MarkdownParser;
 | |
| 
 | |
| })();
 | |
| 
 | 
