Suche

Von $1

    Inhaltsverzeichnis
    keine Gliederung
    (function() {
    
        /* ============================================================
         * HELIKON - MINDTOUCH SEARCH ADD-ON v1.7.2 — 2026-09-30
         * --- firnCore customization ---
         * Suche via /@api/deki/site/query?parser=bestguess
         * (gleiche Engine wie die MindTouch-Hauptsuche)
         * ============================================================ */
    
        /* --- firnCore customization --- v1.7.1: Guard gegen Mehrfach-Rendering */
        if (window.helikonSearchAddonLoaded) return;
        window.helikonSearchAddonLoaded = true;
    
        var PF = '"Press Start 2P","Courier New",Courier,monospace';
        var SITE = 'https://docs.trialanderror.tech';
        var AT = String.fromCharCode(64);
    
        /* ============================================================
         * KONFIGURATION — hier anpassen (Doku siehe Header)
         * ============================================================ */
        var MAX_PAGE_RESULTS = 1;
        var MAX_FILE_RESULTS = 1;
        var MAX_TAGS = 5;
        var FETCH_LIMIT = 25;
        var INCLUDE_USER_PAGES = false;
        var PREFIX_FALLBACK = true;
        var TAG_MIN_WORD = 3;
        var SNIPPET_LEN = 200;
        var SNIPPET_LEAD = 60;
        var DEBUG = true;
        /* --- firnCore customization --- v1.7.2: _internal_-Filter */
        var HIDE_PREFIX = '_internal_';
    
        /* === CSS === */
        var css = ''
        + '.mtSearch { margin:0; border:2px solid #0077aa; border-radius:8px; background:#f0f8ff; overflow:hidden; font-family:' + PF + '; }'
        + '.mtSearch .hdr { background:linear-gradient(135deg,#005580,#0077aa); color:#fff; padding:10px 14px; font-size:12px; line-height:1.6; display:flex; justify-content:space-between; align-items:center; }'
        + '.mtSearch .hdr .badge { background:rgba(255,255,255,0.2); padding:2px 8px; border-radius:10px; font-size:11px; }'
        + '.mtSearch .sec { padding:6px 14px; background:#e0ecf4; font-size:11px; font-weight:bold; color:#005580; border-top:1px solid #cce0ee; }'
        + '.mtSearch .item { padding:10px 14px; border-top:1px solid #e0ecf4; font-size:11px; line-height:1.6; transition:background 0.1s; }'
        + '.mtSearch .item:hover { background:#e8f4fd; }'
        + '.mtSearch .item a { color:#0077aa; text-decoration:none; font-size:13px; font-weight:bold; display:block; }'
        + '.mtSearch .item a:hover { text-decoration:underline; color:#005580; }'
        + '.mtSearch .item .path { color:#999; font-size:10px; display:block; margin-top:2px; word-break:break-all; }'
        + '.mtSearch .item .snippet { color:#444; font-size:10px; display:block; margin-top:5px; line-height:1.6; border-left:2px solid #b0d4e8; padding-left:8px; font-family:"Courier New",Courier,monospace; }'
        + '.mtSearch .item .snippet .hit { background:#fff3b0; color:#333; border-radius:2px; padding:0 2px; }'
        + '.mtSearch .item .meta { color:#777; font-size:10px; margin-top:4px; }'
        + '.mtSearch .item .via { color:#cc8800; font-size:10px; font-style:italic; }'
        + '.mtSearch .file-item { padding:8px 14px; border-top:1px solid #e0ecf4; font-size:11px; display:flex; align-items:center; gap:10px; transition:background 0.1s; }'
        + '.mtSearch .file-item:hover { background:#e8f4fd; }'
        + '.mtSearch .file-item a { color:#0077aa; text-decoration:none; font-weight:bold; }'
        + '.mtSearch .file-item a:hover { text-decoration:underline; }'
        + '.mtSearch .file-thumb { width:60px; height:60px; object-fit:cover; border:1px solid #cce0ee; border-radius:4px; cursor:pointer; background:#fff; }'
        + '.mtSearch .file-info { flex:1; }'
        + '.mtSearch .file-info .fname { font-size:12px; font-weight:bold; display:block; }'
        + '.mtSearch .file-info .fmeta { font-size:10px; color:#999; }'
        + '.mtSearch .tags { padding:8px 14px 12px; border-top:1px solid #cce0ee; }'
        + '.mtSearch .tags .lbl { font-size:10px; color:#999; margin-bottom:4px; }'
        + '.mtSearch .tag { display:inline-block; background:#0077aa; color:#fff; padding:3px 10px; border-radius:12px; font-size:10px; margin:3px 4px 3px 0; text-decoration:none; transition:background 0.15s; }'
        + '.mtSearch .tag:hover { background:#005580; }'
        + '.mtSearch .empty { padding:14px; color:#999; font-size:12px; text-align:center; line-height:1.6; }'
        + '.mtSearch .ld { padding:14px; color:#0077aa; font-size:11px; text-align:center; }'
        + AT + 'keyframes mtP { 0%,100% { opacity:1; } 50% { opacity:0.4; } }'
        + '.mtSearch .ld { animation:mtP 1.2s ease-in-out infinite; }'
        + AT + 'keyframes mtFadeOut { from { opacity:1; max-height:60px; } to { opacity:0; max-height:0; padding:0; margin:0; border-width:0; } }'
        + '.mtSearch.fadeout { animation:mtFadeOut 0.6s ease-out forwards; overflow:hidden; }'
        + '.mt-autolink { color:#0077aa; text-decoration:none; border-bottom:1px dotted #0077aa; font-family:' + PF + '; font-size:inherit; }'
        + '.mt-autolink:hover { color:#005580; border-bottom-style:solid; }';
    
        var sEl = document.createElement('style');
        sEl.type = 'text/css';
        sEl.appendChild(document.createTextNode(css));
        document.getElementsByTagName('head')[0].appendChild(sEl);
    
        /* === HTML TAG HELPERS (wie Buddy Chat) === */
        var T = String.fromCharCode(60);
        var TC = String.fromCharCode(60) + '/';
        var G = String.fromCharCode(62);
    
        /* === DEBUG LOG === */
        function dbg(msg) {
            if (DEBUG && window.console) console.log('[MT Search v1.7.2] ' + msg);
        }
    
        /* === HTML ESCAPE === */
        function esc(s) {
            if (!s && s !== 0) return '';
            var out = '' + s;
            out = out.replace(/&/g, '&');
            out = out.replace(new RegExp(T, 'g'), '<');
            out = out.replace(new RegExp(G, 'g'), '>');
            return out;
        }
        function escA(s) {
            if (!s && s !== 0) return '';
            return esc('' + s).replace(/"/g, '"');
        }
    
        /* === DATE FORMAT === */
        function fmtDate(d) {
            if (!d) return '';
            try {
                var dt = new Date(d);
                if (isNaN(dt.getTime())) return '';
                var dd = dt.getDate(); var mm = dt.getMonth() + 1; var yy = dt.getFullYear();
                return (dd < 10 ? '0' : '') + dd + '.' + (mm < 10 ? '0' : '') + mm + '.' + yy;
            } catch(e) { return ''; }
        }
    
        /* === GREETING CHECK === */
        var GREETINGS = new Array('hi','hallo','hey','moin','servus','grüezi','grüzi','salü','yo','guten tag','guten morgen','guten abend','hoi');
        function isGreeting(msg) {
            var m = msg.toLowerCase().replace(/[?.,:;!]+/g, '').replace(/^\s+|\s+$/g, '');
            var i;
            for (i = 0; i < GREETINGS.length; i++) { if (m === GREETINGS[i]) return true; }
            return false;
        }
    
        /* === STOPWORDS === */
        var STOP_WORDS = new Array(
            /* DE: Fragen / Aufforderungen */
            'kennst','kennt','weisst','weißt','was','ist','sind','war','waren','wer','wie','wo','wann','warum','wieso','weshalb','welche','welcher','welches','welchen','wieviel','wieviele',
            'kannst','koennte','könnte','kann','soll','sollte','will','willst','moechte','möchte','hast','habt','haben','hat','gibt','gib','gibts',
            'sagen','sag','zeig','zeige','zeigen','finde','finden','suche','suchen','such','erzaehl','erzähl','erzaehle','erzähle','erklaer','erklär','erklaere','erkläre','nenn','nenne',
            /* DE: Artikel / Pronomen / Praepositionen / Fuellwoerter */
            'ein','eine','einen','einem','einer','eines','der','die','das','den','dem','des',
            'und','oder','aber','ich','mich','mir','du','dir','es','er','sie','wir','uns','ihr','euch','mein','meine','dein','deine','unser','unsere',
            'von','vom','zu','zum','zur','im','in','am','an','auf','aus','bei','mit','nach','ueber','über','unter','fuer','für','ohne','um','bis','seit',
            'bitte','mal','denn','auch','noch','schon','ja','nein','alle','allen','alles','etwas','viel','viele','mehr','nur','sehr','so','da','dazu','darueber','darüber','hier','dort','gerne','gern',
            'info','infos','information','informationen','irgendwas','irgendwelche',
            'danke','merci','ok','okay','thx','super','prima','genau',
            /* EN */
            'do','does','you','know','what','is','are','was','were','the','a','an','can','could','show','me','my','your','i',
            'find','search','for','tell','about','where','when','who','how','which','of','on','with','to','and','or',
            'give','any','some','all','please','have','has','there','anything','thanks'
        );
        function isStopWord(w) {
            var s;
            for (s = 0; s < STOP_WORDS.length; s++) { if (w === STOP_WORDS[s]) return true; }
            return false;
        }
    
        /* === CLEAN QUERY (Lucene-Sonderzeichen neutralisiert) === */
        function cleanQuery(msg) {
            var q = ('' + msg)
                .replace(/[?.,:;!'"()\[\]\u007B\u007D+\-&|^~*\\\/]+/g, ' ')
                .replace(/\s+/g, ' ')
                .replace(/^\s+|\s+$/g, '');
            if (!q) return '';
            var words = q.split(' ');
            var kept = new Array();
            var i;
            for (i = 0; i < words.length; i++) {
                var w = words[i].toLowerCase();
                if (w.length > 1 && !isStopWord(w)) kept.push(words[i]);
            }
            return kept.join(' ');
        }
    
        /* === QUERY WORDS (Highlight + Tag-Match) === */
        function queryWords(q) {
            var parts = q.toLowerCase().split(/\s+/);
            var seen = new Object();
            var out = new Array();
            var i;
            for (i = 0; i < parts.length; i++) {
                var w = parts[i];
                if (w.length >= TAG_MIN_WORD && !seen[w]) { seen[w] = true; out.push(w); }
            }
            return out;
        }
    
        /* === FILE SIZE FORMAT === */
        function fmtSize(bytes) {
            if (!bytes) return '';
            var n = parseInt(bytes, 10);
            if (isNaN(n)) return '';
            if (n < 1024) return n + ' B';
            if (n < 1048576) return Math.round(n / 1024) + ' KB';
            return (n / 1048576).toFixed(1) + ' MB';
        }
    
        function isImage(type) {
            if (!type) return false;
            return type.indexOf('image/') === 0;
        }
    
        /* === JUNK FILTERS (Namespace-Filter wie Hauptsuche) === */
        /* --- firnCore customization --- v1.7.2: _internal_-Check (case-insensitive) */
        function isHidden(s) {
            if (!HIDE_PREFIX) return false;
            return ('' + (s || '')).toLowerCase().indexOf(HIDE_PREFIX.toLowerCase()) !== -1;
        }
        function isJunkPath(path) {
            var p = '' + (path || '');
            if (p.indexOf('Template:') === 0) return true;
            if (p.indexOf('Special:') === 0) return true;
            if (!INCLUDE_USER_PAGES && p.indexOf('User:') === 0) return true;
            if (p.indexOf('[object') !== -1) return true;
            if (isHidden(p)) return true;
            return false;
        }
        function isJunkFile(fn) {
            fn = ('' + (fn || '')).toLowerCase();
            if (isHidden(fn)) return true;
            if (fn.indexOf('mindtouch.import') !== -1) return true;
            if (fn.indexOf('mindtouch#') !== -1) return true;
            if (fn === 'element.js') return true;
            if (fn.length < 20 && fn.indexOf('.js') === fn.length - 3) return true;
            if (fn.length < 20 && fn.indexOf('.css') === fn.length - 4) return true;
            return false;
        }
    
        /* === SNIPPET: Ausschnitt rund um ersten Treffer === */
        function makeSnippet(content, words) {
            if (!content) return '';
            var plain = ('' + content).replace(/[\s ]+/g, ' ').replace(/^\s+|\s+$/g, '');
            if (!plain) return '';
            var lower = plain.toLowerCase();
            var idx = -1;
            var i;
            for (i = 0; i < words.length; i++) {
                var p = lower.indexOf(words[i]);
                if (p !== -1 && (idx === -1 || p < idx)) idx = p;
            }
            var start = 0;
            if (idx > SNIPPET_LEAD) {
                start = idx - SNIPPET_LEAD;
                var sp = plain.indexOf(' ', start);
                if (sp !== -1 && sp < idx) start = sp + 1;
            }
            var end = start + SNIPPET_LEN;
            if (end >= plain.length) {
                end = plain.length;
            } else {
                var sp2 = plain.lastIndexOf(' ', end);
                if (sp2 > start + Math.floor(SNIPPET_LEN / 2)) end = sp2;
            }
            return (start > 0 ? '… ' : '') + plain.substring(start, end) + (end < plain.length ? ' …' : '');
        }
    
        /* === SNIPPET HIGHLIGHT (alle Vorkommen, sicher escaped) === */
        var HIT_OPEN = T + 'span class="hit"' + G;
        var HIT_CLOSE = TC + 'span' + G;
        function highlightSnippet(text, words) {
            if (!text) return '';
            if (!words || words.length === 0) return esc(text);
            var lower = text.toLowerCase();
            var mark = new Array();
            var i, w, k;
            for (i = 0; i < text.length; i++) mark.push(false);
            for (w = 0; w < words.length; w++) {
                var word = words[w];
                var pos = lower.indexOf(word);
                while (pos !== -1) {
                    for (k = pos; k < pos + word.length; k++) mark[k] = true;
                    pos = lower.indexOf(word, pos + word.length);
                }
            }
            var out = '';
            var run = '';
            var runHit = false;
            for (i = 0; i < text.length; i++) {
                if (i > 0 && mark[i] !== runHit) {
                    out += runHit ? HIT_OPEN + esc(run) + HIT_CLOSE : esc(run);
                    run = '';
                }
                runHit = mark[i];
                run += text.charAt(i);
            }
            if (run.length > 0) out += runHit ? HIT_OPEN + esc(run) + HIT_CLOSE : esc(run);
            return out;
        }
    
        /* === API HELPER === */
        function mtJson(path, cb) {
            var url = '/' + AT + 'api/deki' + path;
            url += (url.indexOf('?') === -1 ? '?' : '&') + 'dream.out.format=json';
            dbg('GET ' + url);
            var x = new XMLHttpRequest();
            x.open('GET', url, true);
            x.onload = function() {
                if (x.status >= 200 && x.status < 300) {
                    try { cb(null, JSON.parse(x.responseText)); }
                    catch(e) { cb('parse'); }
                } else { cb('http ' + x.status); }
            };
            x.onerror = function() { cb('net'); };
            x.send();
        }
    
        function fix(u) {
            if (!u) return '';
            return ('' + u).replace('http://docs.trialanderror.tech', SITE)
                    .replace(/^http:\/\/172\.\d+\.\d+\.\d+/, SITE);
        }
    
        function asArray(v) {
            var out = new Array();
            if (!v) return out;
            if (typeof v.length === 'number' && typeof v !== 'string') return v;
            out.push(v);
            return out;
        }
    
        /* === SEARCH: /site/query (bestguess) === */
        function runQuery(q, words, cb) {
            var path = '/site/query?q=' + encodeURIComponent(q)
                     + '&parser=bestguess&limit=' + FETCH_LIMIT;
            mtJson(path, function(err, data) {
                var res = new Object();
                res.pages = new Array();
                res.files = new Array();
                res.tags = new Array();
                if (err || !data) { dbg('Fehler: ' + err); cb(res); return; }
    
                dbg('count=' + (data[AT + 'count'] || 0) + ' parsedQuery=' + (data.parsedQuery || ''));
    
                var arr = asArray(data.result);
                var seenPage = new Object();
                var seenFile = new Object();
                var tagSeen = new Object();
                var i, t, w;
    
                for (i = 0; i < arr.length; i++) {
                    var r = arr[i] || new Object();
                    var type = r.type || '';
                    var pi = r.page || new Object();
                    var ppath = '' + (pi.path || '');
    
                    if (isJunkPath(ppath)) continue;
    
                    if (type === 'file') {
                        var fname = r.title || '';
                        if (!fname || isJunkFile(fname)) { if (isHidden(fname)) dbg('versteckt: ' + fname); continue; }
                        var fid = r.id || fname;
                        if (seenFile[fid]) continue;
                        seenFile[fid] = true;
                        var fe = new Object();
                        fe.id = fid;
                        fe.filename = fname;
                        fe.type = r.mime || '';
                        fe.size = r.size || '';
                        fe.href = fix(r.uri || '');
                        fe.parentTitle = pi.title || '';
                        fe.parentUri = ppath ? SITE + '/' + ppath : '';
                        res.files.push(fe);
                    } else if (type === 'page' || type === 'comment') {
                        if (seenPage[ppath]) continue;
                        seenPage[ppath] = true;
                        var pe = new Object();
                        pe.id = r.id || '';
                        pe.title = (type === 'page' ? r.title : pi.title) || ppath;
                        pe.path = ppath;
                        pe.uri = type === 'page' ? fix(r.uri || '') : SITE + '/' + ppath;
                        pe.date = r['date.modified'] || '';
                        pe.source = type;
                        pe.snippet = makeSnippet(r.content || '', words);
                        res.pages.push(pe);
    
                        /* Passende Tags aus dem tag-Feld ableiten */
                        var tl = ('' + (r.tag || '')).split('\n');
                        for (t = 0; t < tl.length; t++) {
                            var tg = tl[t].replace(/^\s+|\s+$/g, '');
                            var tgl = tg.toLowerCase();
                            if (!tg || tagSeen[tgl]) continue;
                            for (w = 0; w < words.length; w++) {
                                if (tgl.indexOf(words[w]) !== -1) {
                                    tagSeen[tgl] = true;
                                    res.tags.push(tg);
                                    break;
                                }
                            }
                        }
                    }
                }
                dbg('nach Filter: pages=' + res.pages.length + ' files=' + res.files.length + ' tags=' + res.tags.length);
                cb(res);
            });
        }
    
        /* === RENDER === */
        function openTag(el, cls) { return T + el + ' class="' + cls + '"' + G; }
        function closeTag(el) { return TC + el + G; }
        function link(cls, href, inner) {
            return T + 'a' + (cls ? ' class="' + cls + '"' : '') + ' href="' + escA(href) + '" target="_blank"' + G + inner + TC + 'a' + G;
        }
    
        function render(query, words, pages, files, tags) {
            var total = pages.length + files.length;
            var h = '';
            var i, fi, t;
            h += openTag('div', 'mtSearch');
            h += openTag('div', 'hdr');
            h += T + 'span' + G + '\uD83D\uDD0D "' + esc(query) + '"' + closeTag('span');
            h += openTag('span', 'badge') + total + ' Treffer' + closeTag('span');
            h += closeTag('div');
    
            if (pages.length > 0) {
                h += openTag('div', 'sec') + '\uD83D\uDCC4 Seiten (' + pages.length + ')' + closeTag('div');
                for (i = 0; i < pages.length; i++) {
                    var pg = pages[i];
                    var url = pg.uri || (SITE + '/' + pg.path);
                    h += openTag('div', 'item');
                    h += link('', url, esc(pg.title || pg.path));
                    if (pg.path) h += openTag('span', 'path') + '/' + esc(pg.path) + closeTag('span');
                    if (pg.snippet) h += openTag('span', 'snippet') + highlightSnippet(pg.snippet, words) + closeTag('span');
                    var meta = new Array();
                    var dt = fmtDate(pg.date);
                    if (dt) meta.push(dt);
                    if (pg.source === 'comment') meta.push(openTag('span', 'via') + 'via Kommentar' + closeTag('span'));
                    if (meta.length > 0) h += openTag('span', 'meta') + meta.join(' • ') + closeTag('span');
                    h += closeTag('div');
                }
            }
    
            if (files.length > 0) {
                h += openTag('div', 'sec') + '\uD83D\uDCCE Dateien (' + files.length + ')' + closeTag('div');
                for (fi = 0; fi < files.length; fi++) {
                    var f = files[fi];
                    h += openTag('div', 'file-item');
                    if (isImage(f.type) && f.href) {
                        var img = T + 'img class="file-thumb" src="' + escA(f.href + '?size=thumb') + '" alt="' + escA(f.filename) + '" /' + G;
                        h += link('', f.parentUri || f.href, img);
                    }
                    h += openTag('div', 'file-info');
                    h += link('fname', f.href || '#', esc(f.filename));
                    var fmeta = new Array();
                    if (f.parentTitle) fmeta.push('auf: ' + esc(f.parentTitle));
                    var sz = fmtSize(f.size);
                    if (sz) fmeta.push(sz);
                    if (fmeta.length > 0) h += openTag('span', 'fmeta') + fmeta.join(' • ') + closeTag('span');
                    h += closeTag('div');
                    h += closeTag('div');
                }
            }
    
            if (tags.length > 0) {
                h += openTag('div', 'tags');
                h += openTag('div', 'lbl') + 'Passende Tags:' + closeTag('div');
                for (t = 0; t < tags.length; t++) {
                    h += link('tag', SITE + '/Special:Tags?tag=' + encodeURIComponent(tags[t]), esc(tags[t]));
                }
                h += closeTag('div');
            }
    
            h += closeTag('div');
            return h;
        }
    
        /* === AUTOLINKER (v1.6.2 / v1.6.6, Logik unveraendert) === */
        var WIKI_SECTIONS = new Array('Bereiche','Special','FILM','GAMES','INTERN','LABOR','MINAKTIV','MUSEUM','MUSIK','TAET','Template');
        function looksLikeWikiPath(raw) {
            var i;
            for (i = 0; i < WIKI_SECTIONS.length; i++) { if (raw.indexOf(WIKI_SECTIONS[i]) === 0) return true; }
            return false;
        }
        function extractWikiPath(s) {
            if (!s || s.length === 0) return null;
            var first = s.charAt(0);
            if (!((first >= 'A' && first <= 'Z') || (first >= 'a' && first <= 'z') || first === '_')) return null;
            var i = 0;
            while (i < s.length) {
                var c = s.charAt(i);
                if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
                    c === '_' || c === ':' || c === '?' || c === '=' || c === '&' || c === '%' ||
                    c === '-' || c === '/' || c === String.fromCharCode(35) || c === '.') { i++; }
                else { break; }
            }
            if (i < 2) return null;
            var path = s.substring(0, i);
            while (path.length > 0 && path.charAt(path.length - 1) === '.') {
                path = path.substring(0, path.length - 1);
            }
            if (path.length < 2) return null;
            return path;
        }
        function makePart(type, val) { var p = new Object(); p.type = type; p.val = val; return p; }
        function autolinkNode(el) {
            var walker = document.createTreeWalker(el, 4, null, false);
            var textNodes = new Array();
            var node = walker.nextNode();
            var ti, pi;
            while (node) {
                var parent = node.parentNode; var skip = false;
                while (parent && parent !== el) {
                    if (parent.tagName && parent.tagName.toLowerCase() === 'a') { skip = true; break; }
                    parent = parent.parentNode;
                }
                if (!skip) textNodes.push(node);
                node = walker.nextNode();
            }
            for (ti = 0; ti < textNodes.length; ti++) {
                var tn = textNodes[ti];
                var text = tn.nodeValue;
                if (text.indexOf('/') === -1) continue;
                var parts = new Array();
                var pos = 0; var fragStart = 0; var found = false;
                while (pos < text.length) {
                    if (text.charAt(pos) === '/') {
                        var pathMatch = extractWikiPath(text.substring(pos + 1));
                        if (pathMatch !== null && looksLikeWikiPath(pathMatch)) {
                            parts.push(makePart('text', text.substring(fragStart, pos)));
                            parts.push(makePart('link', '/' + pathMatch));
                            pos = pos + 1 + pathMatch.length;
                            fragStart = pos; found = true; continue;
                        }
                    }
                    pos++;
                }
                if (!found) continue;
                parts.push(makePart('text', text.substring(fragStart)));
                var frag = document.createDocumentFragment();
                for (pi = 0; pi < parts.length; pi++) {
                    var part = parts[pi];
                    if (part.type === 'text') { if (part.val.length > 0) frag.appendChild(document.createTextNode(part.val)); }
                    else {
                        var a = document.createElement('a');
                        a.href = SITE + part.val; a.target = '_blank'; a.className = 'mt-autolink';
                        a.appendChild(document.createTextNode(part.val)); frag.appendChild(a);
                    }
                }
                tn.parentNode.replaceChild(frag, tn);
            }
        }
    
        /* === OBSERVER === */
        function init() {
            var chatLog = document.getElementById('chatLog');
            if (!chatLog) { setTimeout(init, 300); return; }
            var lastMsg = '';
            var obs = new MutationObserver(function(muts) {
                var mi, ni, li;
                for (mi = 0; mi < muts.length; mi++) {
                    var added = muts[mi].addedNodes;
                    for (ni = 0; ni < added.length; ni++) {
                        var n = added[ni];
                        if (n.nodeType !== 1) continue;
                        var links = n.getElementsByTagName('a');
                        for (li = 0; li < links.length; li++) { links[li].setAttribute('target', '_blank'); }
                        var cn = n.className || '';
                        if (cn.indexOf('chatMsg') !== -1 && cn.indexOf('user') === -1) {
                            (function(nd) { setTimeout(function() { autolinkNode(nd); }, 80); })(n);
                        }
                        if (cn.indexOf('chatMsg') !== -1 && cn.indexOf('user') !== -1) {
                            var msg = (n.textContent || '').replace(/^\s+|\s+$/g, '');
                            if (msg && msg !== lastMsg && !isGreeting(msg)) {
                                lastMsg = msg;
                                if (typeof window.helikonSearchEnabled !== 'undefined' && !window.helikonSearchEnabled) { return; }
                                doSearch(msg, chatLog);
                            }
                        }
                    }
                }
            });
            var obsCfg = new Object();
            obsCfg.childList = true;
            obs.observe(chatLog, obsCfg);
            if (window.console) console.log('[MT Search Add-on v1.7.2] Aktiv — /site/query bestguess, MAX_PAGE_RESULTS=' + MAX_PAGE_RESULTS + ' MAX_FILE_RESULTS=' + MAX_FILE_RESULTS + ' DEBUG=' + DEBUG);
        }
    
        /* === SEARCH FLOW === */
        function doSearch(rawQuery, chatLog) {
            var query = cleanQuery(rawQuery);
            if (!query || query.length < 2) { dbg('keine Suche (nur Fuellwoerter): "' + rawQuery + '"'); return; }
            var words = queryWords(query);
            dbg('Prompt: "' + rawQuery + '" -> Query: "' + query + '"');
    
            var ph = document.createElement('div');
            ph.className = 'mtSearch';
            ph.innerHTML = openTag('div', 'ld') + '\uD83D\uDD0D Durchsuche MindTouch...' + closeTag('div');
            var typing = null;
            var ch = chatLog.children;
            var i;
            for (i = ch.length - 1; i >= 0; i--) {
                if (ch[i].className && ch[i].className.indexOf('typing') !== -1) { typing = ch[i]; break; }
            }
            if (typing) chatLog.insertBefore(ph, typing);
            else chatLog.appendChild(ph);
            chatLog.scrollTop = chatLog.scrollHeight;
    
            function finish(res) {
                var pages = res.pages;
                var files = res.files;
                var tags = res.tags;
                if (pages.length > MAX_PAGE_RESULTS) pages = pages.slice(0, MAX_PAGE_RESULTS);
                if (files.length > MAX_FILE_RESULTS) files = files.slice(0, MAX_FILE_RESULTS);
                if (tags.length > MAX_TAGS) tags = tags.slice(0, MAX_TAGS);
                if (pages.length === 0 && files.length === 0 && tags.length === 0) {
                    ph.className = 'mtSearch fadeout';
                    setTimeout(function() { if (ph.parentNode) ph.parentNode.removeChild(ph); }, 650);
                    return;
                }
                ph.outerHTML = render(query, words, pages, files, tags);
                chatLog.scrollTop = chatLog.scrollHeight;
            }
    
            runQuery(query, words, function(res) {
                var empty = res.pages.length === 0 && res.files.length === 0;
                if (empty && PREFIX_FALLBACK && words.length > 0) {
                    var pq = words.join('* ') + '*';
                    dbg('0 Treffer -> Prefix-Fallback: "' + pq + '"');
                    runQuery(pq, words, finish);
                } else {
                    finish(res);
                }
            });
        }
    
        /* === START === */
        if (document.readyState === 'complete' || document.readyState === 'interactive') {
            setTimeout(init, 500);
        } else {
            document.addEventListener('DOMContentLoaded', function() { setTimeout(init, 500); });
        }
    
    })();
    
    Tags: (Schlagworte bearbeiten)
    • No tags
     
    Kommentare (0)
    Um einen Kommentar zu schreiben, müssen Sie sich anmelden.

     
    Use the language selection below for English Utilise le sélecteur de langue ci-dessous pour français Per l'italiano, utilizzare la selezione della lingua qui sotto Schön sprichst du deutsch :-)