1 // The Antville Project 2 // http://code.google.com/p/antville 3 // 4 // Copyright 2007-2011 by Tobi Schäfer. 5 // 6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer, 7 // Matthias & Michael Platzer, Christoph Lincke. 8 // 9 // Licensed under the Apache License, Version 2.0 (the ``License''); 10 // you may not use this file except in compliance with the License. 11 // You may obtain a copy of the License at 12 // 13 // http://www.apache.org/licenses/LICENSE-2.0 14 // 15 // Unless required by applicable law or agreed to in writing, software 16 // distributed under the License is distributed on an ``AS IS'' BASIS, 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 // See the License for the specific language governing permissions and 19 // limitations under the License. 20 // 21 // $Revision$ 22 // $LastChangedBy$ 23 // $LastChangedDate$ 24 // $URL$ 25 26 /** 27 * @fileOverview Defines the Exporter namespace. 28 */ 29 30 /** 31 * The Exporter namespace provides methods for exporting a site. 32 * @namespace 33 */ 34 var Exporter = {} 35 36 /** 37 * Exports a site with the specified user’s content 38 * The created XML file will be added to the site’s file collection. 39 * @param {Site} site The site to export. 40 * @param {User} user The user whose content will be exported. 41 */ 42 Exporter.run = function(site, user) { 43 try { 44 var file; 45 if (site.export_id && (file = File.getById(site.export_id))) { 46 File.remove.call(file); 47 } 48 49 var rssUrl = site.href("rss.xml"); 50 var baseDir = site.getStaticFile(); 51 var member = site.members.get(user.name); 52 53 var xml = new helma.File(baseDir, "export.xml"); 54 xml.remove(); 55 xml.open(); 56 57 var add = function(s) { 58 return xml.write(s); 59 } 60 61 add('<?xml version="1.0" encoding="UTF-8"?>'); 62 add('<?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?>'); 63 add('<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0">'); 64 add('<id>tag:blogger.com,1999:blog-' + site._id + '.archive</id>'); 65 add('<updated>' + site.modified.format(Date.ISOFORMAT) + '</updated>'); 66 add('<title type="text">' + encodeXml(site.title) + '</title>'); 67 add('<link rel="http://schemas.google.com/g/2005#feed" type="application/rss+xml" href="' + rssUrl + '"/>'); 68 add('<link rel="self" type="application/rss+xml" href="' + rssUrl + '"/>'); 69 add('<link rel="http://schemas.google.com/g/2005#post" type="application/rss+xml" href="' + rssUrl + '"/>'); 70 add('<link rel="alternate" type="text/html" href="' + site.href() + '"/>'); 71 add('<author>'); 72 add('<name>' + site.creator.name + '</name>'); 73 add('<email>' + site.creator.email + '</email>'); 74 add('</author>'); 75 // Currently, blogger.com does not accept other generators 76 //add('<generator version="' + Root.VERSION + '" uri="' + root.href() + '">Antville</generator>'); 77 add('<generator version="7.00" uri="http://www.blogger.com">Blogger</generator>'); 78 member.stories.forEach(function() { 79 add('<entry>'); 80 add('<id>tag:blogger.com,1999:blog-' + site._id + '.post-' + this._id + '</id>'); 81 add('<published>' + this.created.format(Date.ISOFORMAT) + '</published>'); 82 add('<updated>' + this.modified.format(Date.ISOFORMAT) + '</updated>'); 83 add('<title type="text">' + (this.title ? encodeXml(this.title.stripTags()) : '') + '</title>'); 84 add('<content type="html">' + encodeXml(this.format_filter(this.text, {})) + '</content>'); 85 add('<link rel="alternate" type="text/html" href="' + this.href() + '"></link>'); 86 add('<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/blogger/2008/kind#post"/>'); 87 add('<author>'); 88 add('<name>' + this.creator.name + '</name>'); 89 this.creator.url && add('<uri>' + this.creator.url + '</uri>'); 90 add('<email>' + this.creator.email + '</email>'); 91 add('</author>'); 92 add('</entry>'); 93 }); 94 add('</feed>'); 95 96 xml.close(); 97 // Provide the exported data as downloadable file 98 // FIXME: Adding a file to a site could be a little bit simpler :/ 99 file = new File; 100 file.site = site; 101 file.update({file: {contentLength: 0}, file_origin: "file://" + 102 xml.getPath(), name: site.name + "-export"}); 103 site.files.add(file); 104 file.creator = user; 105 site.export_id = file._id; 106 } catch (ex) { 107 app.log(ex); 108 } finally { 109 xml.close(); 110 xml.remove(); 111 } 112 113 // Reset the site’s export status 114 site.job = null; 115 return; 116 } 117