diff --git a/index.js b/index.js index f92f6c3..c26352a 100644 --- a/index.js +++ b/index.js @@ -36,7 +36,16 @@ window.css = function css(cssString) { window.html = function html(elementString) { let parser = new DOMParser(); let doc = parser.parseFromString(elementString, 'text/html'); - return doc.body.firstChild; + let parsedElements = Array.from(doc.body.children); + if(parsedElements.length === 1) { + return parsedElements[0] + } else { + let fragment = document.createDocumentFragment(); + parsedElements.forEach(node => { + fragment.appendChild(node); + }); + return fragment; + } } function trailingSlash(url) { diff --git a/path.js b/path.js new file mode 100644 index 0000000..75d4cdc --- /dev/null +++ b/path.js @@ -0,0 +1,139 @@ +class PathProcessor { + path; + trailingSlash = false; + node = (typeof module !== 'undefined' && module.exports) ? true : false; + + constructor(path) { + this.path = path; + } + + #removeTrailingSlash(path) { + if(path === "/") { + return path; + } + return path.endsWith("/") ? path.slice(0, -1) : path + } + + full() { + if(!this.node) return; + const os = require('os') + const paths = require('path') + this.path = paths.join(os.homedir(), this.path) + return this; + } + + web() { + if(!this.node) return; + const os = require('os') + this.path = this.path.replace(this.#removeTrailingSlash(os.homedir()), "") + if(this.path === "") { + this.path = "/" + } + return this; + } + + encode() { // Uses the built in encodeURI and also encodes certain characters that are't covered by it + this.path = encodeURI(this.path).replace(/[!'()*]/g, function(c) { + return '%' + c.charCodeAt(0).toString(16); + }); + return this; + } + + decoded() { + this.path = decodeURIComponent(this.path); + return this; + } + + parent() { + const parts = this.path.split('/').filter(Boolean); + parts.pop(); + this.path = '/' + parts.join('/'); + return this; + } + + end() { + const parts = this.path.split('/').filter(Boolean); + this.path = parts.pop() || ''; + return this; + } + + trailingSlash() { + this.path = this.path.endsWith("/") ? this.path : this.path+"/"; + this.trailingSlash = true; + return this; + } + + noTrailingSlash() { + this.path = this.#removeTrailingSlash(this.path) + return this; + } + + join(...segments) { + if (this.path) { + segments.unshift(this.path); + } + + this.path = segments + .map((part, index) => { + if (index === 0) { + return part.trim().replace(/[/]*$/g, ''); + } else { + return part.trim().replace(/(^[/]*|[/]*$)/g, ''); + } + }) + .filter(Boolean) // Remove empty segments + .join('/'); + + return this; + } + + components() { + return this.path.split('/').filter(Boolean); + } + + build() { + return this.trailingSlash ? this.path : this.#removeTrailingSlash(this.path) + } +} + +export default class Path { + static full(path) { + return new PathProcessor(path).full(); + } + + static web(path) { + return new PathProcessor(path).web(); + } + + static decoded(path) { + return new PathProcessor(path).decoded() + } + + static encode(path) { + return new PathProcessor(path).encode() + } + + static parent(path) { + return new PathProcessor(path).parent(); + } + + static end(path) { + return new PathProcessor(path).end(); + } + + static trailingSlash(path) { + return new PathProcessor(path).trailingSlash(); + } + + static noTrailingSlash(path) { + return new PathProcessor(path).noTrailingSlash(); + } + + static components(path) { + return new PathProcessor(path).components(); + } + + static join(...segments) { + return new PathProcessor(null).join(...segments); + } +} \ No newline at end of file