Benutzer:Sphinx/uk design.js

aus FreewarWiki, der Referenz für Freewar
Zur Navigation springen Zur Suche springen
Hinweis
Nach dem Speichern sollte zunächst der Browser-Cache geleert werden, bevor man die Auswirkungen der Änderung sehen kann.
  • Mozilla/Firefox/Safari: Strg + R (Mactaste + R bei Macintosh) drücken
  • Konqueror: F5 drücken
  • Opera: kompletten Cache unter Extras → Internetspuren löschen → Individuelle Auswahl leeren
  • Internet Explorer: Strg + F5


/*
 * Erfasst die Tabelle fürs Gegenstandsdesign und bietet dem Benutzer die 
 * Möglichkeit Durchgänge nachzubilden und sich deren Chattexte etc anzeigen 
 * zu lassen.
 * TODO: Ausnahmen bei Gerundivum/Deklination? 
 */
(function (window, $, undefined) {
    'use strict';
    var document = window.document,
        articles = {
            'mixed': [
                {
                    'm': 'ein',
                    'w': 'eine',
                    'n': 'ein'
                }, {
                    'm': 'eines',
                    'w': 'einer',
                    'n': 'eines'
                }, {
                    'm': 'einem',
                    'w': 'einer',
                    'n': 'einem'
                }, {
                    'm': 'einen',
                    'w': 'eine',
                    'n': 'ein'
                }
            ],
            'strong': [
                {
                    'm': '',
                    'w': '',
                    'n': ''
                }, {
                    'm': '',
                    'w': '',
                    'n': ''
                }, {
                    'm': '',
                    'w': '',
                    'n': ''
                }, {
                    'm': '',
                    'w': '',
                    'n': ''
                }
            ],
            'weak': [
                {
                    'm': 'der',
                    'w': 'die',
                    'n': 'das'
                }, {
                    'm': 'des',
                    'w': 'der',
                    'n': 'des'
                }, {
                    'm': 'dem',
                    'w': 'der',
                    'n': 'dem'
                }, {
                    'm': 'den',
                    'w': 'die',
                    'n': 'das'
                }
            ]
        },
        selected_std = {
            'uk_design_gateway_type': 0
        },
        texts = {},
        design_onchange = function () {
            var options = [ // relevante options
                    $('#uk_design_gateway_type option:selected'), // Durchgangsart
                    $('#uk_design_look option:selected'), // Aussehen
                    $('#uk_design_decoration_type option:selected'), // DekoTyp
                    $('#uk_design_decoration_matter option:selected') // DekoStoff
                ],
                strings = [];
            
            // Texte erstellen
            strings = build_relevant_texts(options[0], options[1], options[2], options[3]);
            //console.log(strings);
            
            // Chattexte anzeigen
            $('#uk_design_tester').empty().append(
                $('<p><b>Chattext</b></p>'),
                $('<p>' + strings[0] + '</p>'),
                $('<p>' + strings[1] + '</p>'),
                $('<p><b>Angezeigter Text auf Feld</b></p>'),
                $('<p>' + strings[2] + ' (' + get_gateway_action(options[0]) + ')</p>')
            );
        },
        build_relevant_texts = function (gateway, look, decoration_type, decoration_matter) {
            var gateway_string = '',
                gateway_s = gateway.val().split(' ')[0],
                gateway_texts = [
                   'Chattext noch nicht eingetragen',
                   '',
                   ''
                ],
                gr_case = 3;
                
            // grammatikalischen Fall anpassen    
            switch (gateway_s) {
                case '':
                    break;
            }
            
            // Türtext für Chattext erzeugen
            gateway_string = build_gateway_string(gateway, look, decoration_type, decoration_matter, gr_case, 'mixed');
            //console.log('"', gateway_string, '"');
            
            // Türtext in Nominativ
            gateway_texts[2] = build_gateway_string(gateway, look, decoration_type, decoration_matter, 0, 'mixed');
            
            //console.log(texts[gateway_s], !texts[gateway_s].length)
            if (texts[gateway_s][0] !== '') { // kein Chattext erfasst
                // chattexte erstellen
                gateway_texts[0] = texts[gateway_s][0].replace(/%gateway_string%/, gateway_string);
                gateway_texts[1] = texts[gateway_s][1].replace(/%gateway_string%/, gateway_string);
            }
            
            return gateway_texts;
        },
        build_gateway_string = function (gateway, look, decoration_type, decoration_matter, gr_case, flexion) {
            var gateway_gender = gateway.attr('data-gender'), // Geschlecht des Durchgangs
                parts = [];
                
            // ein/der/-
            parts.push(articles[flexion][gr_case][gateway_gender]);
            
            // Dekoration Aussehen Durchgangsart
            parts.push(build_decoration(decoration_type, decoration_matter, gateway_gender, gr_case));
            parts.push(build_look(look, gateway_gender, flexion, gr_case));
            parts.push(build_gateway(gateway, gateway_gender, gr_case));
            
            // leere Teile löschen
            return $.grep(parts, function (s) { // filter
                return !!$.trim(s).length; // true für length > 0
            }).join(' ');
        },
        build_look = function (look, gender, suffix_type, gr_case) {
            if (look.length) { // keine leere option
                // adjektiv deklinieren
                return adjective_declense($(look).val().trim(), gender, suffix_type, gr_case);
            } else {
                return '';
            }
        },
        build_decoration = function(type, matter, gender) {
            var words = [];
            
            // deko-art übergeben
            if (type.length && type.val() !== 'keine')  {
                words = type.val().trim().split(' '); // wörter
                
                words[1] = matter.val().trim(); // Material ersetzen
                words[2] = verb_gerund(words[2], gender); // Gerundivum des Verbs bilden
                
                return words.join(' ');
            } else {
                return '';
            }
        },
        build_gateway = function(gateway) {
            if (gateway.length) { // Durchgangsart gegeben
                /*
                 *  Durchgangsarten sind mit "Durchgang (Tätigkeit)" gegeben.
                 *  Daher nur erstes Wort matchen
                 */
                return $(gateway).val().trim().match(/^([a-zä-üß\-]+)/i)[1];
            } else {
                return '';
            }
        },
        get_gateway_action = function (gateway) {
            if (gateway.length) { // Durchgangsart gegeben
                return $(gateway).val().trim().match(/\(([a-zä-üß\-]+)\)/i)[1]
            } else {
                return '';
            }
        },
        adjective_declense = function (adjective, gender, suffix_type, gr_case) {
            gr_case = gr_case || 0;
            // suffixe nach geschlecht, flexionsart und grammatikalischem fall
            var suffixe = {
                'mixed': [
                    {
                        'm': 'er',
                        'w': 'e',
                        'n': 'es'
                    }, {
                        'm': 'en',
                        'w': 'en',
                        'n': 'en'
                    }, {
                        'm': 'en',
                        'w': 'en',
                        'n': 'en'
                    }, {
                        'm': 'en',
                        'w': 'e',
                        'n': 'es'
                    }
                ],
                'strong': [
                    {
                        'm': 'er',
                        'w': 'e',
                        'n': 'es'
                    }, {
                        'm': 'en',
                        'w': 'er',
                        'n': 'en'
                    }, {
                        'm': 'em',
                        'w': 'er',
                        'n': 'em'
                    }, {
                        'm': 'en',
                        'w': 'e',
                        'n': 'es'
                    }
                ],
                'weak': [
                    {
                        'm': 'e',
                        'w': 'e',
                        'n': 'e'
                    }, {
                        'm': 'en',
                        'w': 'en',
                        'n': 'en'
                    }, {
                        'm': 'en',
                        'w': 'en',
                        'n': 'en'
                    }, {
                        'm': 'en',
                        'w': 'e',
                        'n': 'e'
                    }
                ]
            };
            
            return adjective.toLowerCase() + suffixe[suffix_type][gr_case][gender];
        },
        // Gerundivum
        verb_gerund = function (verb, gender) {
            var suffixe = {
                'm': 'er',
                'w': 'e',
                'n': 'es'
            };
            
            return verb + suffixe[gender];
        };
        
    $(document).ready(function () {
        var uk_design_table = $('table#uk_design');
        
        // chattexte erfassen
        $('#uk_design_gateway_type li').each(function (i, entry) {
            // siehe build_gateway()
            var gateway = $(entry).text().match(/^[a-zä-üß]+/i)[0];

            texts[gateway] = [
                $('.uk_design_chattext_src', entry).text().trim(),
                $('.uk_design_chattext_des', entry).text().trim()
            ];
        });
        //console.log(texts);
        
        if (uk_design_table.length > 0) { // design table erfasst
            $('td', uk_design_table).each(function (i, cell) {
                // select menü für auswahl
                var select = $('<select/>', {
                    change: design_onchange,
                    size: $('li', cell).length
                });
                
                // jeden Listeneintrag in select überführen
                $('li', cell).each(function (i, entry) {
                    var option = null,
                        // versteckten Text später abschneiden
                        slice_length = $(':hidden', entry).text().length, 
                        text = $(entry).text().trim();
                    
                    /*
                     * ausgeblendete Elemente werden mit text() erfasst und
                     * muessen wieder entfernt werden. Daher per Konvention
                     * ausgeblendeten Text ans Ende setzen
                     */
                    if (slice_length) { 
                        text = text.slice(0, -slice_length);
                    }
                    
                    // option erstellen
                    option = $('<option/>', {
                        'data-gender': $('.uk_design_gender', entry).text(),
                        html: text,
                        value: text
                    });
                    
                    // Standardoption gegeben
                    if (selected_std[cell.id] === i) {
                        option.attr('selected', 'selected');
                    }
                    
                    // anfügen
                    option.appendTo(select);
                });
                
                // select anzeigen
                select.appendTo(cell);
                // Liste ausblenden
                $('ul', cell).hide();
            });
            
            // init
            $('select:first').change();
        }
    });
}(window, $));