mirror of
				https://github.com/flynx/PortableMag.git
				synced 2025-10-31 20:10:13 +00:00 
			
		
		
		
	moved metadata handling to a more general and extensible set of code + fixed a minor bug with loading magazine state...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									46c47fd963
								
							
						
					
					
						commit
						50a6b11213
					
				
							
								
								
									
										3
									
								
								TODO.otl
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								TODO.otl
									
									
									
									
									
								
							| @ -55,6 +55,9 @@ | |||||||
| 		[_] BUG: href to existing anchors will mess up layout... | 		[_] BUG: href to existing anchors will mess up layout... | ||||||
| 		| need to find out how can we disable anchor links from actually | 		| need to find out how can we disable anchor links from actually | ||||||
| 		| going to the anchor... | 		| going to the anchor... | ||||||
|  | 		[X] MINOR BUG: on loading a mag from JSON page widths get messed up... | ||||||
|  | 		| ...in cases where content elements have explicit widths pages do  | ||||||
|  | 		| not get stretched, this can be fixed by simply updating the view | ||||||
| 		[X] magazine loader and data format... | 		[X] magazine loader and data format... | ||||||
| 		| this is simple, just use a restyled magazine viewer... | 		| this is simple, just use a restyled magazine viewer... | ||||||
| 		[X] localize magazine event handler setup to setupMagazineEvents function... | 		[X] localize magazine event handler setup to setupMagazineEvents function... | ||||||
|  | |||||||
							
								
								
									
										99
									
								
								magazine.js
									
									
									
									
									
								
							
							
						
						
									
										99
									
								
								magazine.js
									
									
									
									
									
								
							| @ -947,6 +947,59 @@ function resetState(){ | |||||||
| * | * | ||||||
| **********************************************************************/ | **********************************************************************/ | ||||||
| 
 | 
 | ||||||
|  | // there are two type of metadata handlers:
 | ||||||
|  | // 	- 'as-is', this is a trivial read and write value
 | ||||||
|  | // 	- explicit reader/writer, this will convert the data from html to JSON
 | ||||||
|  | // 		data and back...
 | ||||||
|  | JSONMetadata = { | ||||||
|  | 	name: 'as-is', | ||||||
|  | 	title: 'as-is', | ||||||
|  | 	authors: { | ||||||
|  | 		reader: function(data){ | ||||||
|  | 			// NOTE: this might look odd, but we are using JS .map instead 
 | ||||||
|  | 			// 		of the jQuery .map, and they have different signatures...
 | ||||||
|  | 			// 		...(index, elem) in jQuery vs. (elem, index) in JS.
 | ||||||
|  | 			return data.split(',').map(function(e){return e.trim()}) | ||||||
|  | 		}, | ||||||
|  | 		writer: function(data){ | ||||||
|  | 			return data.join(', ') | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | function readMetadata(elem, res, metadata){ | ||||||
|  | 	if(res == null){ | ||||||
|  | 		res = {} | ||||||
|  | 	} | ||||||
|  | 	if(metadata == null){ | ||||||
|  | 		metadata = JSONMetadata | ||||||
|  | 	} | ||||||
|  | 	for(var a in metadata){ | ||||||
|  | 		if(elem.attr(a)){ | ||||||
|  | 			if(metadata[a] == 'as-is'){ | ||||||
|  | 				res[a] = elem.attr(a) | ||||||
|  | 			} else { | ||||||
|  | 				res[a] = metadata[a].reader(elem.attr(a)) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return res | ||||||
|  | } | ||||||
|  | function writeMetadata(elem, res, metadata){ | ||||||
|  | 	if(metadata == null){ | ||||||
|  | 		metadata = JSONMetadata | ||||||
|  | 	} | ||||||
|  | 	for(var a in metadata){ | ||||||
|  | 		if(elem[a]){ | ||||||
|  | 			if(metadata[a] == 'as-is'){ | ||||||
|  | 				res.attr(a, elem[a]) | ||||||
|  | 			} else { | ||||||
|  | 				res.attr(a, metadata[e].writer(elem[a])) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return elem | ||||||
|  | } | ||||||
|  | 
 | ||||||
| function buildJSON(export_bookmarks, export_position){ | function buildJSON(export_bookmarks, export_position){ | ||||||
| 	function _getContent(_, elem){ | 	function _getContent(_, elem){ | ||||||
| 		elem = $(elem) | 		elem = $(elem) | ||||||
| @ -967,6 +1020,9 @@ function buildJSON(export_bookmarks, export_position){ | |||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 		// other...
 | 		// other...
 | ||||||
|  | 		// NOTE: with how the selector that maps this is constructed 
 | ||||||
|  | 		// 		we'll never go into here, but for future compatibility
 | ||||||
|  | 		// 		and idiot-proofness this code will stay... for now...
 | ||||||
| 		} else { | 		} else { | ||||||
| 			var res = { | 			var res = { | ||||||
| 				type: 'raw-html', | 				type: 'raw-html', | ||||||
| @ -975,23 +1031,15 @@ function buildJSON(export_bookmarks, export_position){ | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		// metadata...
 | 		// metadata...
 | ||||||
| 		if(elem.attr('authors')){ | 		readMetadata(elem, res) | ||||||
| 			// NOTE: this might look odd, but we are using JS .map instead 
 |  | ||||||
| 			// 		of the jQuery .map, and they have different signatures...
 |  | ||||||
| 			// 		...(index, elem) in jQuery vs. (elem, index) in JS.
 |  | ||||||
| 			res.authors = $(elem.attr('authors').split(',')).map(function(e){return e.trim()}) |  | ||||||
| 		} |  | ||||||
| 		// XXX more metadata...
 |  | ||||||
| 		// XXX
 |  | ||||||
| 
 | 
 | ||||||
| 		return res | 		return res | ||||||
| 	} | 	} | ||||||
| 	var res = { | 	// read the basic metadata set for the magazine...
 | ||||||
| 		title: $('.magazine').attr('title'), | 	var res = readMetadata($('.magazine')) | ||||||
| 		// this can contain pages or arrays...
 | 	res.pages = $('.magazine > .page, .magazine > .article').map(_getContent).toArray(), | ||||||
| 		pages: $('.magazine > .page, .magazine > .article').map(_getContent).toArray(), | 	res.bookmarks = export_bookmarks ? buildBookmarkList() : [] | ||||||
| 		bookmarks: export_bookmarks ? buildBookmarkList() : [], | 
 | ||||||
| 	} |  | ||||||
| 	if(export_position){ | 	if(export_position){ | ||||||
| 		res.position = getPageNumber() | 		res.position = getPageNumber() | ||||||
| 	} | 	} | ||||||
| @ -1000,16 +1048,20 @@ function buildJSON(export_bookmarks, export_position){ | |||||||
| 
 | 
 | ||||||
| function loadJSON(data, ignore_chrome){ | function loadJSON(data, ignore_chrome){ | ||||||
| 	function _build(block, elem){ | 	function _build(block, elem){ | ||||||
|  | 
 | ||||||
|  | 		// page...
 | ||||||
| 		if(elem.type == 'page'){ | 		if(elem.type == 'page'){ | ||||||
| 			var res = createPage(elem.content) | 			var res = createPage(elem.content) | ||||||
| 				.addClass(elem['class']) | 				.addClass(elem['class']) | ||||||
| 				.appendTo(block) | 				.appendTo(block) | ||||||
| 
 | 
 | ||||||
|  | 		// cover...
 | ||||||
| 		} else if(elem.type == 'cover'){ | 		} else if(elem.type == 'cover'){ | ||||||
| 			var res = createCoverPage(elem.content) | 			var res = createCoverPage(elem.content) | ||||||
| 				.addClass(elem['class']) | 				.addClass(elem['class']) | ||||||
| 				.appendTo(block) | 				.appendTo(block) | ||||||
| 
 | 
 | ||||||
|  | 		// article...
 | ||||||
| 		} else if(elem.type == 'article') { | 		} else if(elem.type == 'article') { | ||||||
| 			// buiold an article...
 | 			// buiold an article...
 | ||||||
| 			var res = createEmptyArticle() | 			var res = createEmptyArticle() | ||||||
| @ -1019,19 +1071,24 @@ function loadJSON(data, ignore_chrome){ | |||||||
| 			$(elem.pages).each(function(_, e){ | 			$(elem.pages).each(function(_, e){ | ||||||
| 				_build(res, e) | 				_build(res, e) | ||||||
| 			}) | 			}) | ||||||
| 		} else if(elem.type == 'article') { | 
 | ||||||
|  | 		// other...
 | ||||||
|  | 		// NOTE: on a wll-formed JSON we'll never go in here, but just 
 | ||||||
|  | 		// 		in case...
 | ||||||
|  | 		} else if(elem.type == 'raw-html') { | ||||||
| 			var res = createPage(elem.content) | 			var res = createPage(elem.content) | ||||||
| 				.addClass(elem['class']) | 				.addClass(elem['class']) | ||||||
| 				.appendTo(block) | 				.appendTo(block) | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
| 		// metadata...
 | 		// metadata...
 | ||||||
| 		if(elem.authors){ | 		writeMetadata(elem, res) | ||||||
| 			res.attr('authors', elem.authors.join(', ')) |  | ||||||
| 		} |  | ||||||
| 		// XXX more metadata...
 |  | ||||||
| 		// XXX
 |  | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	// create an empty magazine...
 | ||||||
| 	var mag = createEmptyMagazine(data.title) | 	var mag = createEmptyMagazine(data.title) | ||||||
|  | 	writeMetadata(mag, data) | ||||||
|  | 	// build the actual strcture...
 | ||||||
| 	$(data.pages).each(function(_, e){ | 	$(data.pages).each(function(_, e){ | ||||||
| 		_build(mag, e) | 		_build(mag, e) | ||||||
| 	}) | 	}) | ||||||
| @ -1116,6 +1173,8 @@ function loadMagazineChrome(position, bookmarks){ | |||||||
| 	setupNavigator() | 	setupNavigator() | ||||||
| 	setCurrentPage(position) | 	setCurrentPage(position) | ||||||
| 	loadBookmarks(bookmarks != null ? bookmarks : []) | 	loadBookmarks(bookmarks != null ? bookmarks : []) | ||||||
|  | 	// XXX do we need to cover this with a splash???
 | ||||||
|  | 	updateView() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user