NodeBB/NodeBB

View on GitHub
src/controllers/osd.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';

const xml = require('xml');
const nconf = require('nconf');

const plugins = require('../plugins');
const meta = require('../meta');

module.exports.handle = function (req, res, next) {
    if (plugins.hooks.hasListeners('filter:search.query')) {
        res.type('application/opensearchdescription+xml').send(generateXML());
    } else {
        next();
    }
};

function generateXML() {
    return xml([{
        OpenSearchDescription: [
            {
                _attr: {
                    xmlns: 'http://a9.com/-/spec/opensearch/1.1/',
                    'xmlns:moz': 'http://www.mozilla.org/2006/browser/search/',
                },
            },
            { ShortName: trimToLength(String(meta.config.title || meta.config.browserTitle || 'NodeBB'), 16) },
            { Description: trimToLength(String(meta.config.description || ''), 1024) },
            { InputEncoding: 'UTF-8' },
            {
                Image: [
                    {
                        _attr: {
                            width: '16',
                            height: '16',
                            type: 'image/x-icon',
                        },
                    },
                    `${nconf.get('url')}/favicon.ico`,
                ],
            },
            {
                Url: {
                    _attr: {
                        type: 'text/html',
                        method: 'get',
                        template: `${nconf.get('url')}/search?term={searchTerms}&in=titlesposts`,
                    },
                },
            },
            { 'moz:SearchForm': `${nconf.get('url')}/search` },
        ],
    }], { declaration: true, indent: '\t' });
}

function trimToLength(string, length) {
    return string.trim().substring(0, length).trim();
}