PortableMag/editor.js

213 lines
5.2 KiB
JavaScript
Raw Normal View History

/**********************************************************************
*
* Magazine editor actions
*
* XXX do a generic shift left/right add/remove set of function and build
* selectors around them...
*
**********************************************************************/
/********************************************************* generic ***/
// move element to target and atach it at position
// position can be 'before', 'after' (default), 'prepend' or 'append'
function moveElementTo(elem, target, position){
elem
.detach()
[position == 'before'? 'insertBefore'
: position == 'append'? 'appendTo'
: position == 'prepend'? 'prependTo'
// the default...
: 'insertAfter'](target)
return elem
}
/************************************************ editor: magazine ***/
// NOTE: we do not need to create any event handlers here specifically
// as all events are ahndled by the viewer...
function loadMagazine(mag, position, bookmarks){
mag = loadMagazineData(mag)
loadMagazineUserData(position, bookmarks)
return mag
}
// NOTE: this will, in addition to the magazine itself, will populate with
// the basic content (cover, article, article cover)
function createBaseMagazine(title, cover, article){
removeMagazine()
var mag = loadMagazine(createMagazine(title, cover, article), 0, [])
return mag
}
/************************************************* editor: article ***/
function createArticleBefore(article, title){
if(article == null){
article = $('.current.page').parents('.article')
}
// XXX fill the data...
var res = createArticle().insertBefore(article)
setCurrentPage()
$('.viewer').trigger('articleCreated', res)
return res
}
function createArticleAfter(article, title){
if(article == null){
article = $('.current.page').parents('.article')
}
// XXX fill the data...
var res = createArticle().insertAfter(article)
setCurrentPage()
$('.viewer').trigger('articleCreated', res)
return res
}
// XXX TEST!
function shiftArticleLeft(article){
var articles = $('.article')
var i = articles.index(article)
if(i <= 0){
return article
}
var target = $(articles[i-1])
article
.detach()
.insertBefore(target)
setCurrentPage()
$('.viewer').trigger('articleMoved', res)
return res
}
// XXX TEST!
function shiftArticleRight(article){
var articles = $('.article')
var i = articles.index(article)
if(i >= articles.length){
return article
}
var target = $(articles[i+1])
article
.detach()
.insertAfter(target)
setCurrentPage()
$('.viewer').trigger('articleMoved', res)
return res
}
function removeArticle(article){
if(article == null){
article = $('.current.page').parents('.article')
}
article.remove()
setCurrentPage()
$('.viewer').trigger('articleRemoved', res)
return res
}
/*************************************************** editor: pages ***/
function createPageIn(article, template){
if(article == null){
article = $('.current.page').parents('.article')
}
// no article
if(article.length == 0){
return
}
var res = createPage(template).appendTo(article)
$('.viewer').trigger('pageCreated', res)
return res
}
// XXX the next two are almost identical...
// XXX prevent this from working outside of an article....
function createPageAfter(page, template){
if(page == null){
page = $('.current.page')
}
var res = createPage(template).insertAfter(page)
$('.viewer').trigger('pageCreated', res)
return res
}
// XXX prevent this from working outside of an article....
function createPageBefore(page, template){
if(page == null){
page = $('.current.page')
}
var res = createPage(template).insertBefore(page)
$('.viewer').trigger('pageCreated', res)
return res
}
// NOTE: on negative position this will position the element after the
// target, e.g. position -1 is the last element, etc.
// XXX at this point there is no way to move something to either an
// article or a magazine that do not contain any pages directly...
// ...add special cases:
// - if we are moving the page in the direction of an empty article
// push the page into the article...
// - if we are moving page 0 left and the magazine has no cover
// push it to the magazine...
function movePageTo(page, position){
if(page == null){
page = $('.current.page')
}
if(position >= $('.page').length){
position = -1
}
var target = getPageAt(position)
page.detach()
if(position >= 0){
page.insertBefore(target)
} else {
page.insertAfter(target)
}
setCurrentPage(page)
$('.viewer').trigger('pageMoved', page)
return page
}
function shiftPageLeft(page){
if(page == null){
page = $('.current.page')
}
movePageTo(page, getPageNumber(page)-1)
return page
}
function shiftPageRight(page){
if(page == null){
page = $('.current.page')
}
movePageTo(page, getPageNumber(page)+2)
return page
}
function removePage(page){
if(page == null){
page = $('.current.page')
}
var cur = getPageNumber()
page.remove()
setCurrentPage(cur)
$('.viewer').trigger('pageRemoved', page)
return page
}
/*********************************************************************/
// vim:set ts=4 sw=4 :