/* -*- Mode: JS2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- */ /* vim: set et ts=4 sw=4: */ /* * Copyright (c) 2013 Mattias Bengtsson. * * GNOME Maps is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * GNOME Maps is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along * with GNOME Maps; if not, see . * * Author: Mattias Bengtsson */ import GLib from 'gi://GLib'; function encode(data) { if(data === null) return null; return GLib.uri_escape_string(data.toString(), null, false); } export class Query { constructor(obj) { this._query = {}; for(let key in obj) { this.add(key, obj[key]); } } // a value === null represents an empty value add(key, value) { // Initialize query field if it isn't already let queryValue = this._query[key]; if(!Array.isArray(queryValue)) this._query[key] = []; if(Array.isArray(value)) this._query[key] = this._query[key].concat(value); else this._query[key].push(value); } /** * Get the query parameters in string form. * If useArrayNotation is given, and true, use array notation adding [] * after key if there's multiple values for that key. */ toString(useArrayNotation = false) { let vars = []; for(let key in this._query) { let values = this._query[key]; let multipleValues = values.length > 1; let encKey = encode(key) + (multipleValues && useArrayNotation ? '[]' : ''); values.forEach(function(value) { let encValue = encode(value); if(encValue !== null) vars.push([encKey, encValue].join('=')); else vars.push(encKey); }); } return vars.join('&'); } }