penguin/AstroJS

Javascript framework for my blog

botanjs/src/Astro/Blog/Components/VerticalNote.js

raw ยท 2174 bytes

(function(){
	var ns = __namespace( "Astro.Blog.Components.VerticalNote" );
	/** @type {Dandelion} */
	var Dand                             = __import( "Dandelion" );
	/** @type {Dandelion.IDOMElement} */
	var IDOMElement                      = __import( "Dandelion.IDOMElement" );
	/** @type {Astro.Bootstrap} */
	var Bootstrap                        = __import( "Astro.Bootstrap" );
	/** @type {Astro.Blog.Config} */
	var Config                           = __import( "Astro.Blog.Config" );
	/** @type {Astro.utils.Date} */
	var XDate                            = __import( "Astro.utils.Date" );

	/** @param {Dandelion.IDOMElement} elem */
	var VerticalNote = function( elem )
	{
		var relem = elem.element;
		var maxHeight = relem.clientHeight;

		// Break for elements that are too long
		var formatted = Dand.wrapc( relem.className.replace( / *source */, " " ) );

		elem.foreach( 1, function( child )
		{
			var ichild = IDOMElement( child );
			switch( ichild.getDAttribute( "flag" ) )
			{
				case "date":
					child.innerHTML = XDate.chinese( new Date( child.innerHTML ) );
				break;
				case "anchor":
				case "image":
					formatted.appendChild( child );
					child.style.display = null;
				return;
			}

			var content = child.innerHTML;
			var len = content.length;
			var blockh = Math.ceil( child.clientHeight / len );

			var opLen = Math.floor( maxHeight / blockh );

			var i = 0;

			var doBreak = function( i )
			{
				var nLine = Dand.wrapne(
					child.nodeName
					, content.substr( opLen * i, opLen )
					, ichild.aKeys()
				);

				formatted.appendChild( nLine );

				if( elem.getDAttribute( "href" ) )
				{
					formatted.addEventListener(
						"click"
						, function( e ) {
							window.location = this.loc;
						}.bind({ loc: elem.getDAttribute( "href" ) })
					);
				}

				len -= opLen;
			};

			for( var i = 0; opLen < len; i ++ ) doBreak( i );
			if( 0 < len ) doBreak( i );
		} );

		relem.style.display = "none";
		relem.parentNode.insertBefore( formatted, relem.nextSibling );
	};

	Bootstrap.regInit(function() {
		Dand.glass( "vertical-text", true )
			.forEach( function( e ) { new VerticalNote( e ); } );
	});

})();