author | Michael Krelin <hacker@klever.net> | 2006-10-02 19:51:26 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2006-10-02 19:51:26 (UTC) |
commit | 5ebff6dee62ada9c0559f65381ccd92892911151 (patch) (side-by-side diff) | |
tree | ca36d8fd3da98846eda11d38cc049ff6dd8c5915 | |
parent | b568e40a49d810d49bcc4af3bcb81ee1812627a5 (diff) | |
download | fireflix-5ebff6dee62ada9c0559f65381ccd92892911151.zip fireflix-5ebff6dee62ada9c0559f65381ccd92892911151.tar.gz fireflix-5ebff6dee62ada9c0559f65381ccd92892911151.tar.bz2 |
preparse photo descriptions to avoid breaking things because of invalid html in description
git-svn-id: http://svn.klever.net/kin/fireflix/trunk@181 fe716a7a-6dde-0310-88d9-d003556173a8
-rw-r--r-- | content/fireflix.js | 14 | ||||
-rw-r--r-- | locale/en-US/fireflix.properties | 2 |
2 files changed, 12 insertions, 4 deletions
diff --git a/content/fireflix.js b/content/fireflix.js index 92c42f4..966630c 100644 --- a/content/fireflix.js +++ b/content/fireflix.js @@ -705,196 +705,202 @@ var fireflix = { return c.id; }, setTree: function(t) { this.tree = t }, isContainer: function(r) { return false }, isSeparator: function(r) { return false }, isSorted: function(r) { return false }, getLevel: function(r) { return 0 }, getImageSrc: function(r,c) { return null }, getRowProperties: function(r,p) { }, getCellProperties: function(cid,cel,p) { }, getColumnProperties: function(cid,cel,p) { }, cycleHeader: function(cid,e) { }, getParentIndex: function(r) { return -1 }, drop: function(r,o) { }, canDropBeforeAfter: function(r,b) { return false }, importXPR: function(xp) { this.selection.clearSelection(); this.selection.currentIndex = -1; this.searchresult_props.hidden = true; this.tree.beginUpdateBatch(); this.photos = new Array(); var n; while(n=xp.iterateNext()) { this.photos.push(new Photo(n)); } this.rowCount = this.photos.length; this.tree.endUpdateBatch(); }, paging: { pars: null, page: null, pages: null, perpage: null, total: null }, search_photos: function() { var pars = { method: 'flickr.photos.search', auth_token: 'default', extras: 'license,date_upload,date_taken,owner_name,icon_server,original_format,last_update,geo' }; if(this.search_mine.checked) pars.user_id='me'; if(this.search_tags.checked) { pars.tags=this.search_for.value.split(/ +/).join(','); }else{ pars.text=this.search_for.value; } this.paging.pars = new Object(); this.paging.page = null; this.paging.pages = null; this.paging.perpage = null; this.paging.total = null; for(var p in pars) this.paging.pars[p] = pars[p]; this.perform_search(pars); }, perform_search: function(p) { var _this = this; this.fireflix.flickr.api_call( p, function(xr) { var x = xr.responseXML; var xp = xp_nodes('/rsp/photos/photo',x); _this.importXPR(xp); _this.tree.ensureRowIsVisible(0); xp = xp_node('/rsp/photos',x); _this.paging.page = parseInt(xp.getAttribute('page')); _this.paging.pages = parseInt(xp.getAttribute('pages')); _this.paging.perpage = parseInt(xp.getAttribute('perpage')); _this.paging.total = parseInt(xp.getAttribute('total')); _this.update_paging(); _this.on_select(); }, function(x,s,c,m) { _this.fireflix.flickr_failure(x,s,c,m); } ); }, on_cmd_prev: function(ev) { var pars = new Object(); for(var p in this.paging.pars) pars[p] = this.paging.pars[p]; pars.page=this.paging.page-1; pars.per_page=this.paging.perpage; this.perform_search(pars); }, on_cmd_next: function(ev) { var pars = new Object(); for(var p in this.paging.pars) pars[p] = this.paging.pars[p]; pars.page=this.paging.page+1; pars.per_page=this.paging.perpage; this.perform_search(pars); }, update_paging: function() { if(! (this.paging.pars && this.paging.page && this.paging.pages) ) { this.search_page.value=''; this.search_page.hidden = true; this.cmd_search_prev_page.setAttribute('disabled','true'); this.cmd_search_next_page.setAttribute('disabled','true'); }else{ this.search_page.value=this.fireflix.loc_strings.getFormattedString('search_page',[this.paging.page,this.paging.pages]); this.search_page.hidden=false; this.cmd_search_prev_page.setAttribute('disabled',(this.paging.page>1)?'false':'true'); this.cmd_search_next_page.setAttribute('disabled',(this.paging.page<this.paging.pages)?'false':'true'); } }, render_description_frame: function(content) { - if(!content) { - this.searchresult_description.innerHTML = ''; - }else{ - this.searchresult_description.innerHTML = content?content:''; + this.searchresult_description.innerHTML = ''; + if(content) { + var dp = new DOMParser(); + var pd = dp.parseFromString( + '<div xmlns="http://www.w3.org/1999/xhtml">'+content+'</div>', 'text/xml' ); + var de = pd.documentElement; + if(de.tagName=='parsererror') + this.searchresult_description.innerHTML=this.fireflix.loc_strings.getString('broken_description'); + else + this.searchresult_description.appendChild(de); /* of all linking elements flickr only allows a */ var as = this.searchresult_description.getElementsByTagName('a'); for(var a=0;a<as.length;++a) as.item(a).setAttribute('target','_blank'); } }, on_select: function() { if(this.selection.currentIndex<0) { this.searchresult_props.hidden = true; }else{ var p = this.photos[this.selection.currentIndex]; if(!p) { this.searchresult_props.hidden = true; }else{ this.search_photo.src = this.fireflix.flickr.make_photo_url(p,'t'); this.searchresult_title.value = p.title; this.searchresult_title.tooltipText = p.title; this.render_description_frame(null); if(p.description==null && p.description==undefined) { var pid = p.id; var ci = this.selection.currentIndex; var _this = this; this.fireflix.flickr.api_call( { method: 'flickr.photos.getInfo', auth_token: 'default', photo_id: p.id, secret: p.secret }, function(xr) { var pp = _this.photos[ci]; if(ci==_this.selection.currentIndex && pp.id==pid) { var n = xp_node('/rsp/photo',xr.responseXML); pp.fromNode_(n); _this.render_description_frame(pp.description); } }, function(x,s,c,m) { _this.fireflix.flickr_failure(x,s,c,m); } ); this.searchresult_props.hidden = false; }else{ this.render_description_frame(p.description); } } } }, on_cmd_open: function(ev) { if(this.selection.currentIndex<0) return; var p = this.photos[this.selection.currentIndex]; if(!p.id) return; this.fireflix.openTab(this.fireflix.flickr.make_photo_url(p,'p')); } }, photo_html: function(p,i,l) { // TODO: add alt/title when possible var rv = '<a href="'+this.flickr.make_photo_url(p,l)+'">' + '<img src="'+this.flickr.make_photo_url(p,i)+'" />'+ '</a>'; return rv; }, build_html: function(photos,uti,utl) { var rv = ''; for(var i in photos) { var p = photos[i]; rv += this.photo_html(p,utl,uti)+'\n'; } return rv; }, popup_content: function(s) { window.openDialog( "chrome://fireflix/content/generated-content.xul", null, "dialog,chrome", this, s ); }, copy_to_clipboard: function(s) { var ch = Components.classes["@mozilla.org/widget/clipboardhelper;1"] .getService(Components.interfaces.nsIClipboardHelper); ch.copyString(s); }, openTab: function(l) { var wm = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService( Components.interfaces.nsIWindowMediator ); var bw = wm.getMostRecentWindow('navigator:browser'); var b = bw.getBrowser(); var t = b.addTab(l); b.selectedTab = t; }, build_menus: function() { this.append_html_menu( document.getElementById('sets_html_menu'), 'stm_','m_bop','cmdset_sets','cmd_sets_html' diff --git a/locale/en-US/fireflix.properties b/locale/en-US/fireflix.properties index 18300ff..f583040 100644 --- a/locale/en-US/fireflix.properties +++ b/locale/en-US/fireflix.properties @@ -1,13 +1,15 @@ postUploadPhotoset=Create a new photoset for uploaded photos (cancel if you don't want to create a photoset) menutitle_Images=Images menutitle_Links=Linked to… urltype_s=Small square (75x75) urltype_t=Thumbnail (fits in 100x100) urltype_m=Small (fits in 240x240) urltype__=Medium (fits in 500x500) urltype_b=Large (fits in 1024x1024) urltype_o=Original image urltype_p=Flickr photo URL search_page=Page %S of %S + +broken_description=Broken photo description |