define(function(require) {

    var Protoplast = require('protoplast');

    /**
     * @alias LastUsedInfo
     */
    var LastUsedInfo = Protoplast.Model.extend({

        /**
         * @type {string}
         */
        script: null,

        /**
         * @type {Date}
         */
        date: null,

        /**
         * @type {string}
         */
        title: null
    });

    return LastUsedInfo;
});
define(function(require) {

    var Protoplast = require('protoplast');

    var SettingEntry = Protoplast.Model.extend({

        key: null,

        label: null,

        /**
         * Instance of control use to modify the value
         */
        control: null,

        $create: function(key, label, control) {
            this.key = key;
            this.label = label;
            this.control = control;
        }

    });

    return SettingEntry;
});
define(function(require) {

    var Protoplast = require('protoplast');

    var SettingsWidgetModel = Protoplast.Model.extend({
        
        /**
         * @type {SettingsGroup[]}
         */
        groups: null,

        $create: function() {
            this.groups = Protoplast.Collection.create([]);
        },

        getSettingEntry: function(key) {
            var result = null;
            this.groups.forEach(function(group) {
                group.entries.forEach(function(entry) {
                    if (entry.key === key) {
                        result = entry;
                    }
                });
            });
            return result;
        }

    });

    return SettingsWidgetModel;
});
Example #4
0
define(function(require) {

    var Protoplast = require('protoplast');

    var TooltipModel = Protoplast.Model.extend({
        
        text: null,
        
        x: 0,
        
        y: 0
        
    });

    return TooltipModel;
});
define(function(require) {

    var Protoplast = require('protoplast');

    var SettingsGroup = Protoplast.Model.extend({

        title: null,

        entries: null,

        $create: function(title) {
            this.title = title;
            this.entries = Protoplast.Collection.create([]);
        },

        addEntry: function(entry) {
            this.entries.add(entry);
        }

    });

    return SettingsGroup;
});
define(function(require) {

    var Protoplast = require('protoplast'),
        PrintProfileUtil = require('utils/print-profile-util');

    /**
     * Mobile friendly PDF layout with increased font size
     */
    var MobileScriptSettings = Protoplast.Model.extend({
        
        settings: {
            inject: 'settings'
        },
        
        print: {
            get: function() {
                return PrintProfileUtil.withNewFontSize(this.settings.print, 20);
            }
        }
        
    });

    return MobileScriptSettings;
});
Example #7
0
define(function(require) {

    var Protoplast = require('protoplast'),
        fquery = require('utils/fountain/query'),
        fhelpers = require('utils/fountain/helpers'),
        fparser = require('aw-parser'),
        fliner = require('aw-liner'),
        converter = require('utils/converters/scriptconverter'),
        preprocessor = require('utils/fountain/preprocessor');

    var h = fhelpers.fq;
    
    var ScriptModel = Protoplast.Model.extend({

        settings: {
            inject: 'settings'
        },

        /**
         * Basic stats query
         */
        _basicStats: null,

        format: null,
        
        liner: null,

        parser: null,
        
        $create: function() {
            this.parser = fparser.parser;
            this.liner = new fliner.Liner(fparser.helpers);
        },
        
        parsed: {
            computed: ['script'],
            lazy: true,
            value: function() {
                var parsed;

                parsed = this.parser.parse(this.script, {
                    print_headers: this.settings.print_headers,
                    print_actions: this.settings.print_actions,
                    print_dialogues: this.settings.print_dialogues,
                    print_notes: this.settings.print_notes,
                    print_sections: this.settings.print_sections,
                    print_synopsis: this.settings.print_synopsis,
                    each_scene_on_new_page: this.settings.each_scene_on_new_page,
                    double_space_between_scenes: this.settings.double_space_between_scenes,
                    use_dual_dialogue: this.settings.use_dual_dialogue,
                    merge_multiple_empty_lines: this.settings.merge_empty_lines
                });

                parsed.lines = this.liner.line(parsed.tokens, {
                    print: this.settings.print,
                    text_more: this.settings.text_more,
                    text_contd: this.settings.text_contd,
                    split_dialogue: this.settings.split_dialogue
                });
                
                return parsed;
            }
        },

        parsed_stats: {
            computed: ['parsed'],
            lazy: true,
            value: function() {
                var parsed_stats;

                if (this.settings.use_print_settings_for_stats) {
                    parsed_stats = this.parsed;
                } else {
                    var stats_config = Object.create(this.settings);
                    stats_config.print_actions = true;
                    stats_config.print_headers = true;
                    stats_config.print_dialogues = true;
                    stats_config.print_sections = false;
                    stats_config.print_notes = false;
                    stats_config.print_synopsis = false;
                    parsed_stats = this.parser.parse(this.script, stats_config);
                    parsed_stats.lines = this.liner.line(parsed_stats.tokens, stats_config);
                }

                return parsed_stats;
            }
        },

        script: {
            set: function(value) {
                var result = converter.to_fountain(value);
                result.value = preprocessor.process_snippets(result.value, this.settings.snippets);
                this.format = this.format || result.format;
                this._script = result.value;
                this.dispatch('script_changed');
            },
            get: function() {
                return this._script;
            }
        },

        getBasicStats: function() {
            this._createStatsQuery(); // to refresh config-related properties
            return this._basicStats.run(this.parsed_stats.lines);
        },

        _createStatsQuery: function() {
            var print = this.settings.print;
            var basic = fquery(null, {
                last_page_lines: 0,
                scenes: 0,
                pages: 0,
                filled_pages: 0,
                action_lines: 0,
                dialogue_lines: 0,
                action_scenes: 0,
                dialogue_scenes: 0
            });
            basic.prepare(function(fq) {
                fq.current_scene_heading_token = null;
                fq.dialogue_in_the_scene = false;
            });
            basic.count('action_lines', h.is('action', 'scene_heading', 'shot'));
            basic.count('dialogue_lines', h.is_dialogue());
            basic.count('pages', h.is('page_break'));
            basic.enter(h.is_dialogue(), function(item, fq) {
                fq.dialogue_in_the_scene = true;
            });
            basic.enter(h.is('scene_heading'), function(item, fq) {
                if (fq.current_scene_heading_token !== item.token) {
                    fq.select().scenes++;
                    fq.current_scene_heading_token = item.token;
                    if (fq.select().scenes > 1) {
                        if (fq.dialogue_in_the_scene) {
                            fq.select().dialogue_scenes += 1;
                        } else {
                            fq.select().action_scenes += 1;
                        }
                        fq.dialogue_in_the_scene = false;
                    }
                }
            });
            basic.enter(true, function(item, fq) {
                var selector = fq.select();
                if (item.is('page_break')) {
                    selector.filled_pages += (selector.last_page_lines + 1) / print.lines_per_page;
                    selector.last_page_lines = 0;
                } else {
                    selector.last_page_lines++;
                }
            });
            basic.exit(function(item, fq) {
                // last scene
                if (fq.dialogue_in_the_scene) {
                    fq.select().dialogue_scenes++;
                } else {
                    fq.select().action_scenes++;
                }

                var all = item.action_lines + item.dialogue_lines;
                item.pages = item.pages + item.last_page_lines / print.lines_per_page;
                item.filled_pages += item.last_page_lines / print.lines_per_page;
                item.action_time = (item.action_lines / all) * item.filled_pages;
                item.dialogue_time = (item.dialogue_lines / all) * item.filled_pages;
            });
            basic.end(function(result) {
                if (result.length === 0) {
                    result.push({
                        pages: 0.0,
                        filled_pages: 0.0,
                        scenes: 0,
                        action_time: 0.0,
                        dialogue_time: 0.0,
                        dialogue_lines: 0,
                        characters: [],
                        locations: []
                    });
                }
            });

            this._basicStats = basic;
        }

    });

    return ScriptModel;
});