Created
May 9, 2012 18:08
-
-
Save agross/2647483 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#target indesign | |
Array.prototype.each = function(fun){ | |
var result = []; | |
for(var i = 0; i < this.length; i++){ | |
var el = this[i]; | |
var r = fun(el); | |
if (r) result.push(r); | |
} | |
return result; | |
}; | |
Array.prototype.first = function(predicate){ | |
for(var i = 0; i < this.length; i++){ | |
var el = this[i]; | |
var found = predicate(el); | |
if (found) return el; | |
} | |
return null; | |
}; | |
Array.prototype.filter = function(predicate){ | |
var result = []; | |
this.each(function(el){ | |
var found = predicate(el); | |
if (found) result.push(el); | |
}); | |
return result; | |
}; | |
String.prototype.clean = function(){ | |
return this.replace(/[\r\n]+/g, " ").replace(/\u00AD/g, "").replace(/^\s+|\s+$/g, ""); | |
}; | |
var MarkdownExport = (function(app){ | |
var files = [ | |
{ title: /Model-View-Controller/, name: "trainings/basiswissen/aspnet-mvc.md" }, | |
{ title: /Expression Blend/, name: "trainings/basiswissen/expression-blend.md" }, | |
{ title: /Git/, name: "trainings/basiswissen/git.md" }, | |
{ title: /NHibernate/, name: "trainings/basiswissen/nhibernate.md" }, | |
{ title: /Software Design Patterns/, name: "trainings/basiswissen/patterns.md" }, | |
{ title: /ReSharper/, name: "trainings/basiswissen/resharper.md" }, | |
{ title: /SOLID/, name: "trainings/basiswissen/solid.md" }, | |
{ title: /Behavior Driven/, name: "trainings/basiswissen/bdd.md" }, | |
{ title: /BizTalk/, name: "trainings/advanced/biztalk.md" }, | |
{ title: /Castle/, name: "trainings/advanced/castle-windsor.md" }, | |
{ title: /REST/, name: "trainings/advanced/rest-web-api.md" }, | |
{ title: /Reactive/, name: "trainings/advanced/rx-linq.md" }, | |
{ title: /Spezifikation/, name: "trainings/advanced/spezifikation-durch-beispiele.md" }, | |
{ title: /Windows CE/, name: "trainings/advanced/windows-ce-mobile.md" }, | |
{ title: /Windows Phone/, name: "trainings/advanced/windows-phone.md" }, | |
{ title: /Application Lifecycle Management/, name: "trainings/strategie/alm.md" }, | |
{ title: /Rhetorik/, name: "trainings/strategie/rhetorik.md" }, | |
{ title: /TeamCity/, name: "trainings/strategie/teamcity-youtrack.md" } | |
]; | |
var formats = [ | |
{ name: /Überschrift 1/, prefix: "\r\n# " }, | |
{ name: /Überschrift 2/, prefix: "\r\n## " }, | |
{ name: /Liste Ebene 1/, prefix: "* " }, | |
{ name: /Liste Ebene 2/, prefix: " * " }, | |
{ name: /.*/, prefix: "" } | |
]; | |
var meta_types = [ | |
{ expr: /^MVP/, action: function(meta, item) { meta.training.tags.push('mvp'); } }, | |
{ expr: /^JB/, action: function(meta, item) { meta.training.tags.push('jb'); } }, | |
{ expr: /^Buch/, action: function(meta, item) { meta.training.tags.push('book_author'); } }, | |
{ expr: /^\d+\s+Tag/, action: function(meta, item) { meta.training.attend.push(item.contents.clean()); } }, | |
{ expr: /^für\s+\d+/, action: function(meta, item) { meta.training.attend.push(item.contents.clean()); } }, | |
{ expr: /^Lizenzen/, action: function(meta, item) { meta.training.extra.push(item.contents.clean()); } }, | |
{ expr: /\u2014/, action: function(meta, item) { | |
var text = item.paragraphs[0].contents.substring(1); | |
text = text.substring(0, text.length - 2); | |
var author_info = item.paragraphs[1].contents.clean().substring(2); | |
var info = author_info.replace(/^.+?,\s+/, ""); | |
var quote = { | |
quote: text.replace(/[\r\n]+/g, "<br>"), | |
author: author_info.replace(/,.*/g, "") | |
}; | |
if(quote.author !== info) { | |
quote.info = info; | |
} | |
meta.quotes.push(quote); | |
} | |
}, | |
{ expr: /.*/, action: function(meta, item) { | |
//alert("Unknown metadata: " + item.contents); | |
} | |
} | |
]; | |
var createCopy = function(){ | |
return app.documents.add(); | |
}; | |
var closeDocument = function(temp){ | |
temp.close(SaveOptions.NO); | |
}; | |
var copyPages = function(from, to){ | |
var pages = from.pages.itemByRange(10, 37); | |
pages.duplicate(LocationOptions.AFTER, to.pages.firstItem()); | |
// Remove default-empty first page of temp document. | |
to.pages.firstItem().remove(); | |
}; | |
var convertMetadata = function(story){ | |
var meta = { | |
training: { | |
attend: [], | |
tags: [], | |
extra: [], | |
}, | |
quotes: [] | |
}; | |
var adder_for = function(item){ | |
var match = meta_types.first(function(type){ | |
return type.expr.test(item.contents); | |
}); | |
return function(meta) { match.action(meta, item); }; | |
}; | |
var yaml = ["---", "menu_order: 0", ""]; | |
yaml.push("title: " + story.paragraphs.firstItem().contents.clean()); | |
yaml.push(""); | |
story.allPageItems.each(function(item){ | |
if(!(item instanceof TextFrame)) | |
{ | |
return; | |
} | |
adder = adder_for(item); | |
adder(meta); | |
}); | |
yaml.push("training:"); | |
if(meta.training.attend.length > 0) { | |
yaml.push(" attend:"); | |
meta.training.attend.each(function(e){ | |
yaml.push(" - " + e); | |
}); | |
} | |
if(meta.training.tags.length > 0) { | |
yaml.push(" tags:"); | |
meta.training.tags.each(function(e){ | |
yaml.push(" - " + e); | |
}); | |
} | |
if(meta.training.extra.length > 0) { | |
yaml.push(" extra:"); | |
meta.training.extra.each(function(e){ | |
yaml.push(" - " + e); | |
}); | |
} | |
if(meta.quotes.length > 0) { | |
yaml.push("quotes:"); | |
meta.quotes.each(function(e){ | |
yaml.push(" -"); | |
yaml.push(" author: " + e.author); | |
if(e.info) { | |
yaml.push(" info: " + e.info); | |
} | |
yaml.push(" quote: " + e.quote); | |
}); | |
} | |
yaml.push("---"); | |
return yaml.join("\r\n"); | |
}; | |
var convertToMarkdown = function(story){ | |
var markdown = ""; | |
story.paragraphs.everyItem().getElements().each(function(para){ | |
var format = formats.first(function(f){ | |
return f.name.test(para.appliedParagraphStyle.name); | |
}); | |
markdown += format.prefix + para.contents.clean() + "\r\n"; | |
}); | |
return markdown; | |
}; | |
var createFile = function(story, markdown){ | |
var title = story.paragraphs.firstItem().contents; | |
title = title.clean().replace(/[\/\t]+/g, " "); | |
var target = files.first(function(map) { | |
return map.title.test(title); | |
}); | |
target = Folder.temp + "/" + target.name; | |
directory = target.substring(0, target.lastIndexOf('/')); | |
if(!new Folder(directory).create()) alert("Could not create directory " + directory); | |
var file = new File(target); | |
file.encoding = "UTF8"; | |
file.open('w'); | |
if(!file.write(markdown)) alert("Could not write " + file.fsName); | |
file.close(); | |
}; | |
var api = {}; | |
api.init = function(){ | |
var doc = app.documents.everyItem().getElements().first(function(doc){ | |
return /^Katalog/.test(doc.name); | |
}); | |
var temp = createCopy(); | |
copyPages(doc, temp); | |
temp.stories.everyItem().getElements().filter(function(story) { | |
return story.paragraphs.length > 5 | |
}) | |
.each(function(story) { | |
var markdown = convertMetadata(story); | |
markdown += convertToMarkdown(story); | |
//var markdown = convertSidebar(story); | |
// Replace object placement markers. | |
markdown = markdown.replace(/\uFFFC+/g, ""); | |
createFile(story, markdown); | |
}); | |
closeDocument(temp); | |
}; | |
return api; | |
})(app); | |
MarkdownExport.init(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment