    /*
    author: @fabiantheblind  
    With styles you can controll your text
    this script has to be saved somewhere or this wont work
    It loads itself to build some syntax highlighted text
    The syntax highlite is rough and not rock solid but it gives a look into nested GREP styles
    */


main();
function main(){

    // make a doc
    var pw = 210;
    var ph = 500;
    var doc = app.documents.add({
  documentPreferences:{
      pageWidth:pw,pageHeight:ph
      }
  });

    // build a style with nested grep styles
    var code = build_code_paragraphStyle (doc);
    // get the page
    var page = doc.pages[0];
    // make a frame
    var tf = page.textFrames.add({geometricBounds:[10,10,ph-10,pw-10]});
// load the content of the script

var scriptfile = File($.fileName);
alert(scriptfile);
var content;
if(scriptfile != false){
    scriptfile.open('r');
    content = scriptfile.read();
    }else{
    alert("Bah!");    
    }

    // add the content to the frame
    tf.contents  = content;
    scriptfile.close(); // always close files after reading
    // apply the style
    tf.paragraphs.everyItem().appliedParagraphStyle = code;

	}


// build a lot of styles
function build_code_paragraphStyle(d){
var charStyles = new Array();
var keywords = d.characterStyles.add({name:"keywords",fillColor:d.swatches.item(5)});
var comments = d.characterStyles.add({name:"comments",fillColor:d.swatches.item(3),fillTint: 70});
var operators = d.characterStyles.add({name:"operators",fillColor:d.swatches.item(7)});
var separators = d.characterStyles.add({name:"separators",fillColor:d.swatches.item(8)});
var numbers = d.characterStyles.add({name:"numbers",fillColor:d.swatches.item(9)});
var comment = d.characterStyles.add({name:"comment",fillColor:d.swatches.item(9)});
var string = d.characterStyles.add({name:"strings",fillColor:d.swatches.item(5)});


var code = d.paragraphStyles.add({name:"code",appliedFont:"Andale Mono",pointSize:10});
//change language (only in the paragraphStyle) to get the right "" for the code
		code.appliedLanguage = app.languagesWithVendors.item("English: USA");
        // do some nested grep styles
    var grp = code.nestedGrepStyles.add();
        grp.appliedCharacterStyle = keywords;
        grp.grepExpression = "abstract|boolean|break|byte|case|catch|char\ |class|const|continue|debugger|default|delete|do\ |double|else|enum|export|extends|false|final|finally|float|for|function|goto|if|implements|import|in\ |instanceof|int\ |interface|long|native|new|null|package|private|protected|public|return|short|static|super|switch|synchronized|this|throw|throws|transient|true|try|typeof|var|void|volatile|while|with";
        
        grp = code.nestedGrepStyles.add();
        grp.appliedCharacterStyle = operators;
        grp.grepExpression = "is|new|sizeof|typeof";
        
        grp = code.nestedGrepStyles.add();
        grp.appliedCharacterStyle = operators;
        grp.grepExpression = "[-~\\[\\]!$%&*+/:<=>?^|]+";
        
        grp = code.nestedGrepStyles.add();
        grp.appliedCharacterStyle = separators;
        grp.grepExpression = "[(){},;\\s]+";
        
        grp = code.nestedGrepStyles.add();
        grp.appliedCharacterStyle = numbers;
        grp.grepExpression = "\\<[0-9]+(\\.[0-9]+)?([eE][-+]?[0-9]+)?";
        
        grp = code.nestedGrepStyles.add();
        grp.appliedCharacterStyle = comments;
        grp.grepExpression = "/\\*+[^*]*\\*+([^/*][^*]*\\*+)*/";        
        
        
        grp = code.nestedGrepStyles.add();
        grp.appliedCharacterStyle = comment;
        grp.grepExpression = "//.*";        
        
        grp = code.nestedGrepStyles.add();
        grp.appliedCharacterStyle = string;
        grp.grepExpression = "\".*?\"";           
        
return code;        
        }