2012-01-13 16:50:11 +00:00
/ * \
title : js / macros / story . js
\ * /
( function ( ) {
2012-02-02 18:00:42 +00:00
/*jslint node: true, jquery: true */
2012-01-13 16:50:11 +00:00
"use strict" ;
2012-02-02 15:13:50 +00:00
var Tiddler = require ( "../Tiddler.js" ) . Tiddler ,
2012-02-16 20:38:10 +00:00
Renderer = require ( "../Renderer.js" ) . Renderer ,
2012-02-17 14:11:25 +00:00
Dependencies = require ( "../Dependencies.js" ) . Dependencies ,
2012-02-02 15:13:50 +00:00
utils = require ( "../Utils.js" ) ;
2012-01-13 16:50:11 +00:00
exports . macro = {
name : "story" ,
params : {
2012-02-17 17:32:32 +00:00
story : { byName : "default" , type : "tiddler" } ,
2012-03-29 16:02:05 +00:00
defaultViewTemplate : { byName : true , type : "tiddler" } ,
defaultEditTemplate : { byName : true , type : "tiddler" }
2012-01-13 16:50:11 +00:00
} ,
2012-02-02 18:00:42 +00:00
events : {
2012-02-21 21:57:30 +00:00
"tw-navigate" : function ( event ) {
2012-03-29 16:02:05 +00:00
var template = this . hasParameter ( "defaultViewTemplate" ) ? this . params . defaultViewTemplate : "SimpleTemplate" ,
2012-03-29 11:54:51 +00:00
storyTiddler = this . store . getTiddler ( this . params . story ) ,
story = { tiddlers : [ ] } ;
if ( storyTiddler && storyTiddler . hasOwnProperty ( "text" ) ) {
story = JSON . parse ( storyTiddler . text ) ;
}
story . tiddlers . unshift ( { title : event . navigateTo , template : template } ) ;
this . store . addTiddler ( new Tiddler ( storyTiddler , { text : JSON . stringify ( story ) } ) ) ;
2012-02-02 18:00:42 +00:00
$ ( "html,body" ) . animate ( {
scrollTop : 0
} , 400 ) ;
2012-03-15 09:32:53 +00:00
event . stopPropagation ( ) ;
2012-02-09 13:36:21 +00:00
return false ;
2012-03-29 16:02:05 +00:00
} ,
"tw-EditTiddler" : function ( event ) {
var template = this . hasParameter ( "defaultEditTemplate" ) ? this . params . defaultEditTemplate : "EditTemplate" ,
storyTiddler = this . store . getTiddler ( this . params . story ) ,
story = { tiddlers : [ ] } ;
if ( storyTiddler && storyTiddler . hasOwnProperty ( "text" ) ) {
story = JSON . parse ( storyTiddler . text ) ;
}
for ( var t = 0 ; t < story . tiddlers . length ; t ++ ) {
var storyRecord = story . tiddlers [ t ] ;
if ( storyRecord . title === event . tiddlerTitle && storyRecord . template !== template ) {
storyRecord . title = "Draft of " + event . tiddlerTitle + " at " + ( new Date ( ) ) ;
storyRecord . template = template ;
var tiddler = this . store . getTiddler ( event . tiddlerTitle ) ;
2012-03-30 17:17:00 +00:00
this . store . addTiddler ( new Tiddler ( { text : "Type the text for the tiddler '" + event . tiddlerTitle + "'" } , tiddler , { title : storyRecord . title , "draft.title" : event . tiddlerTitle } ) ) ;
2012-03-29 16:02:05 +00:00
}
}
this . store . addTiddler ( new Tiddler ( storyTiddler , { text : JSON . stringify ( story ) } ) ) ;
event . stopPropagation ( ) ;
return false ;
2012-03-30 12:48:59 +00:00
} ,
"tw-SaveTiddler" : function ( event ) {
var template = this . hasParameter ( "defaultViewTemplate" ) ? this . params . defaultEditTemplate : "SimpleTemplate" ,
storyTiddler = this . store . getTiddler ( this . params . story ) ,
2012-03-30 17:12:45 +00:00
story = { tiddlers : [ ] } ,
storyTiddlerModified = false ;
2012-03-30 12:48:59 +00:00
if ( storyTiddler && storyTiddler . hasOwnProperty ( "text" ) ) {
story = JSON . parse ( storyTiddler . text ) ;
}
for ( var t = 0 ; t < story . tiddlers . length ; t ++ ) {
var storyRecord = story . tiddlers [ t ] ;
if ( storyRecord . title === event . tiddlerTitle && storyRecord . template !== template ) {
var tiddler = this . store . getTiddler ( storyRecord . title ) ;
if ( tiddler && tiddler . hasOwnProperty ( "draft.title" ) ) {
// Save the draft tiddler as the real tiddler
this . store . addTiddler ( new Tiddler ( tiddler , { title : tiddler [ "draft.title" ] , "draft.title" : undefined } ) ) ;
// Remove the draft tiddler
this . store . deleteTiddler ( storyRecord . title ) ;
// Make the story record point to the newly saved tiddler
storyRecord . title = tiddler [ "draft.title" ] ;
storyRecord . template = template ;
2012-03-30 17:12:45 +00:00
// Check if we're modifying the story tiddler itself
if ( tiddler [ "draft.title" ] === this . params . story ) {
storyTiddlerModified = true ;
}
2012-03-30 12:48:59 +00:00
}
}
}
2012-03-30 17:12:45 +00:00
if ( ! storyTiddlerModified ) {
this . store . addTiddler ( new Tiddler ( storyTiddler , { text : JSON . stringify ( story ) } ) ) ;
}
2012-03-30 12:48:59 +00:00
event . stopPropagation ( ) ;
return false ;
2012-02-02 18:00:42 +00:00
}
} ,
2012-02-21 21:57:30 +00:00
execute : function ( ) {
2012-03-29 11:54:51 +00:00
var story = JSON . parse ( this . store . getTiddlerText ( this . params . story ) ) ,
2012-02-16 20:38:10 +00:00
content = [ ] ;
2012-03-29 11:54:51 +00:00
for ( var t = 0 ; t < story . tiddlers . length ; t ++ ) {
2012-02-20 18:05:10 +00:00
var m = Renderer . MacroNode ( "tiddler" ,
2012-03-29 11:54:51 +00:00
{ target : story . tiddlers [ t ] . title , template : story . tiddlers [ t ] . template } ,
2012-02-20 18:05:10 +00:00
null ,
2012-02-21 21:57:30 +00:00
this . store ) ;
2012-03-29 13:30:22 +00:00
m . execute ( this . parents , this . tiddlerTitle ) ;
2012-02-16 20:38:10 +00:00
content . push ( m ) ;
2012-01-13 16:50:11 +00:00
}
2012-02-16 20:38:10 +00:00
return content ;
2012-02-01 12:37:29 +00:00
} ,
2012-02-22 23:27:21 +00:00
refreshInDom : function ( changes ) {
2012-02-01 12:37:29 +00:00
/*jslint browser: true */
2012-03-30 15:45:24 +00:00
if ( this . dependencies . hasChanged ( changes , this . tiddlerTitle ) ) {
// Get the tiddlers we're supposed to be displaying
var self = this ,
story = JSON . parse ( this . store . getTiddlerText ( this . params . story ) ) ,
template = this . params . template ,
t , n , domNode ,
findTiddler = function ( childIndex , tiddlerTitle , templateTitle ) {
while ( childIndex < self . content . length ) {
var params = self . content [ childIndex ] . params ;
if ( params . target === tiddlerTitle ) {
if ( ! templateTitle || params . template === templateTitle ) {
return childIndex ;
}
2012-02-16 20:38:10 +00:00
}
2012-03-30 15:45:24 +00:00
childIndex ++ ;
2012-02-16 20:38:10 +00:00
}
2012-03-30 15:45:24 +00:00
return null ;
} ;
for ( t = 0 ; t < story . tiddlers . length ; t ++ ) {
// See if the node we want is already there
var tiddlerNode = findTiddler ( t , story . tiddlers [ t ] . title , story . tiddlers [ t ] . template ) ;
if ( tiddlerNode === null ) {
// If not, render the tiddler
var m = Renderer . MacroNode ( "tiddler" ,
{ target : story . tiddlers [ t ] . title , template : story . tiddlers [ t ] . template } ,
null ,
this . store ) ;
m . execute ( this . parents , this . tiddlerTitle ) ;
m . renderInDom ( this . domNode , this . domNode . childNodes [ t ] ) ;
this . content . splice ( t , 0 , m ) ;
} else {
// Delete any nodes preceding the one we want
if ( tiddlerNode > t ) {
// First delete the DOM nodes
for ( n = t ; n < tiddlerNode ; n ++ ) {
domNode = this . content [ n ] . domNode ;
domNode . parentNode . removeChild ( domNode ) ;
}
// Then delete the actual renderer nodes
this . content . splice ( t , tiddlerNode - t ) ;
2012-02-16 20:38:10 +00:00
}
2012-03-30 15:45:24 +00:00
// Refresh the DOM node we're reusing
this . content [ t ] . refreshInDom ( changes ) ;
2012-02-01 12:37:29 +00:00
}
}
2012-03-30 15:45:24 +00:00
// Remove any left over nodes
if ( this . content . length > story . tiddlers . length ) {
for ( t = story . tiddlers . length ; t < this . content . length ; t ++ ) {
domNode = this . content [ t ] . domNode ;
domNode . parentNode . removeChild ( domNode ) ;
}
this . content . splice ( story . tiddlers . length , this . content . length - story . tiddlers . length ) ;
}
} else {
for ( t = 0 ; t < this . content . length ; t ++ ) {
this . content [ t ] . refreshInDom ( changes ) ;
2012-02-16 20:38:10 +00:00
}
2012-02-01 12:37:29 +00:00
}
2012-01-13 16:50:11 +00:00
}
} ;
} ) ( ) ;