Skip to content

Instantly share code, notes, and snippets.

@agross
Created May 9, 2012 18:08
Show Gist options
  • Save agross/2647483 to your computer and use it in GitHub Desktop.
Save agross/2647483 to your computer and use it in GitHub Desktop.
#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