package com.odelia.groovys5 import groovy.xml.StreamingMarkupBuilder import groovy.xml.MarkupBuilder class GroovyS5 { def meta def slides def smb = new StreamingMarkupBuilder() def build(File presentation, File file) { meta = [:] slides = [] def binding = new Binding([S5: processS5, meta: processMeta, slide: processSlide]) def shell = new GroovyShell(binding) shell.evaluate(presentation) buildPage(file) } def processS5 = { Closure s5 -> s5() } def processMeta = { it() meta.title = it.title meta.author = it.author meta.company = it.company meta.theme = it.theme meta.shBrushes = it.binding.variables.shBrushes ? it.shBrushes : [''] meta.header = it.header meta.content = smb.bind(it.content).toString() meta.footer = it.footer } def processSlide = { String title, Closure content, Closure notes = null -> def elm = [title: title, content: smb.bind(content).toString()] if (notes) { elm.notes = smb.bind(notes).toString() } slides << elm } def buildPage(File file) { def stringWriter = new StringWriter() def builder = new MarkupBuilder(stringWriter) builder.html() { head() { title(meta.title) mkp.yieldUnescaped('') meta(name: 'generator', content: 'GroovyS5') meta(name: 'version', content: 'GroovyS5 1.0') // TODO //meta(name: 'presdate', content: '20050728') meta(name: 'author', content: meta.author) meta(name: 'company', content: meta.company) mkp.yieldUnescaped('') meta(name: 'defaultView', content: 'slideshow') meta(name: 'controlVis', content: 'hidden') mkp.yieldUnescaped('') link(rel: 'stylesheet', href: "ui/${meta.theme}/slides.css", type: 'text/css', media: 'projection', id: 'slideProj') link(rel: 'stylesheet', href: 'ui/default/outline.css', type: 'text/css', media: 'screen', id: 'outlineStyle') link(rel: 'stylesheet', href: 'ui/default/print.css', type: 'text/css', media: 'print', id: 'slidePrint') link(rel: 'stylesheet', href: 'ui/default/opera.css', type: 'text/css', media: 'projection', id: 'operaFix') mkp.yieldUnescaped('') script(src: 'ui/default/slides.js', type: 'text/javascript') { mkp.yield('') } if (meta.shBrushes.size() > 0) { mkp.yieldUnescaped('') script(src: 'sh/scripts/shCore.js', type: 'text/javascript') { mkp.yield('') } meta.shBrushes.each { script(src: "sh/scripts/${it}.js", type: 'text/javascript') { mkp.yield('') } } link(rel: 'stylesheet', href: 'sh/styles/shCore.css', type: 'text/css') link(rel: 'stylesheet', href: 'sh/styles/shThemeDefault.css', type: 'text/css') script(type: 'text/javascript') { mkp.yield("SyntaxHighlighter.config.clipboardSwf = 'sh/scripts/clipboard.swf'; SyntaxHighlighter.all();") } } } body { div(class: 'layout') { div(id: 'controls') { mkp.yieldUnescaped('') } div(id: 'currentSlide') { mkp.yieldUnescaped('') } div(id: 'header') { mkp.yieldUnescaped(meta.header) } div(id: 'footer') { mkp.yieldUnescaped(meta.footer) } } div(class: 'presentation') { div(class: 'slide') { h1(meta.title) mkp.yieldUnescaped(meta.content) } slides.each { slide -> div(class: 'slide') { h1(slide.title) mkp.yieldUnescaped(slide.content) if (slide.notes) { div(class: 'handout') { mkp.yieldUnescaped(slide.notes) } } } } } } } def src = stringWriter.toString() def writer = new FileWriter(file) writer << '' << '\r\n' writer << src writer.close() } static void main(String[] args) { if (args.size() != 2) { println 'Usage: com.odelia.groovys5.GroovyS5 ' return } new GroovyS5().build(new File(args[0]), new File(args[1])) } }