diff --git a/custom-jsdoc-template/README.md b/custom-jsdoc-template/README.md new file mode 100644 index 0000000..1946bef --- /dev/null +++ b/custom-jsdoc-template/README.md @@ -0,0 +1,12 @@ +The default template for JSDoc 3 uses: [the Taffy Database library](http://taffydb.com/) and the [Underscore Template library](http://underscorejs.org/). + + +## Generating Typeface Fonts + +The default template uses the [OpenSans](https://www.google.com/fonts/specimen/Open+Sans) typeface. The font files can be regenerated as follows: + +1. Open the [OpenSans page at Font Squirrel](). +2. Click on the 'Webfont Kit' tab. +3. Either leave the subset drop-down as 'Western Latin (Default)', or, if we decide we need more glyphs, than change it to 'No Subsetting'. +4. Click the 'DOWNLOAD @FONT-FACE KIT' button. +5. For each typeface variant we plan to use, copy the 'eot', 'svg' and 'woff' files into the 'templates/default/static/fonts' directory. diff --git a/custom-jsdoc-template/publish.js b/custom-jsdoc-template/publish.js new file mode 100644 index 0000000..27c27db --- /dev/null +++ b/custom-jsdoc-template/publish.js @@ -0,0 +1,772 @@ +const doop = require('jsdoc/util/doop'); +const env = require('jsdoc/env'); +const fs = require('jsdoc/fs'); +const helper = require('jsdoc/util/templateHelper'); +const logger = require('jsdoc/util/logger'); +const path = require('jsdoc/path'); +const taffy = require('taffydb').taffy; +const template = require('jsdoc/template'); +const util = require('util'); + +const htmlsafe = helper.htmlsafe; +const linkto = helper.linkto; +const resolveAuthorLinks = helper.resolveAuthorLinks; +const hasOwnProp = Object.prototype.hasOwnProperty; + +let data; +let view; + +let outdir = path.normalize(env.opts.destination); + +function find(spec) { + return helper.find(data, spec); +} + +function tutoriallink(tutorial) { + return helper.toTutorial(tutorial, null, { + tag: 'em', + classname: 'disabled', + prefix: 'Tutorial: ', + }); +} + +function getAncestorLinks(doclet) { + return helper.getAncestorLinks(data, doclet); +} + +function hashToLink(doclet, hash) { + let url; + + if (!/^(#.+)/.test(hash)) { + return hash; + } + + url = helper.createLink(doclet); + url = url.replace(/(#.+|$)/, hash); + + return `${hash}`; +} + +function needsSignature({ kind, type, meta }) { + let needsSig = false; + + // function and class definitions always get a signature + if (kind === 'function' || kind === 'class') { + needsSig = true; + } + // typedefs that contain functions get a signature, too + else if (kind === 'typedef' && type && type.names && type.names.length) { + for (let i = 0, l = type.names.length; i < l; i++) { + if (type.names[i].toLowerCase() === 'function') { + needsSig = true; + break; + } + } + } + // and namespaces that are functions get a signature (but finding them is a + // bit messy) + else if ( + kind === 'namespace' && + meta && + meta.code && + meta.code.type && + meta.code.type.match(/[Ff]unction/) + ) { + needsSig = true; + } + + return needsSig; +} + +function getSignatureAttributes({ optional, nullable }) { + const attributes = []; + + if (optional) { + attributes.push('opt'); + } + + if (nullable === true) { + attributes.push('nullable'); + } else if (nullable === false) { + attributes.push('non-null'); + } + + return attributes; +} + +function updateItemName(item) { + const attributes = getSignatureAttributes(item); + let itemName = item.name || ''; + + if (item.variable) { + itemName = `…${itemName}`; + } + + if (attributes && attributes.length) { + itemName = util.format( + '%s%s', + itemName, + attributes.join(', ') + ); + } + + return itemName; +} + +function addParamAttributes(params) { + return params + .filter(({ name }) => name && !name.includes('.')) + .map(updateItemName); +} + +function buildItemTypeStrings(item) { + const types = []; + + if (item && item.type && item.type.names) { + item.type.names.forEach((name) => { + types.push(linkto(name, htmlsafe(name))); + }); + } + + return types; +} + +function buildAttribsString(attribs) { + let attribsString = ''; + + if (attribs && attribs.length) { + attribsString = htmlsafe(util.format('(%s) ', attribs.join(', '))); + } + + return attribsString; +} + +function addNonParamAttributes(items) { + let types = []; + + items.forEach((item) => { + types = types.concat(buildItemTypeStrings(item)); + }); + + return types; +} + +function addSignatureParams(f) { + const params = f.params ? addParamAttributes(f.params) : []; + + f.signature = util.format('%s(%s)', f.signature || '', params.join(', ')); +} + +function addSignatureReturns(f) { + const attribs = []; + let attribsString = ''; + let returnTypes = []; + let returnTypesString = ''; + const source = f.yields || f.returns; + + // jam all the return-type attributes into an array. this could create odd results (for example, + // if there are both nullable and non-nullable return types), but let's assume that most people + // who use multiple @return tags aren't using Closure Compiler type annotations, and vice-versa. + if (source) { + source.forEach((item) => { + helper.getAttribs(item).forEach((attrib) => { + if (!attribs.includes(attrib)) { + attribs.push(attrib); + } + }); + }); + + attribsString = buildAttribsString(attribs); + } + + if (source) { + returnTypes = addNonParamAttributes(source); + } + if (returnTypes.length) { + returnTypesString = util.format( + ' → %s{%s}', + attribsString, + returnTypes.join('|') + ); + } + + f.signature = `${ + f.signature || '' + }${returnTypesString}`; +} + +function addSignatureTypes(f) { + const types = f.type ? buildItemTypeStrings(f) : []; + + f.signature = `${f.signature || ''}${ + types.length ? ` :${types.join('|')}` : '' + }`; +} + +function addAttribs(f) { + const attribs = helper.getAttribs(f); + const attribsString = buildAttribsString(attribs); + + f.attribs = util.format( + '%s', + attribsString + ); +} + +function shortenPaths(files, commonPrefix) { + Object.keys(files).forEach((file) => { + files[file].shortened = files[file].resolved + .replace(commonPrefix, '') + // always use forward slashes + .replace(/\\/g, '/'); + }); + + return files; +} + +function getPathFromDoclet({ meta }) { + if (!meta) { + return null; + } + + return meta.path && meta.path !== 'null' + ? path.join(meta.path, meta.filename) + : meta.filename; +} + +function generate(title, docs, filename, resolveLinks) { + let docData; + let html; + let outpath; + + resolveLinks = resolveLinks !== false; + + docData = { + env: env, + title: title, + docs: docs, + }; + + outpath = path.join(outdir, filename); + html = view.render('container.tmpl', docData); + + if (resolveLinks) { + html = helper.resolveLinks(html); // turn {@link foo} into foo + } + + fs.writeFileSync(outpath, html, 'utf8'); +} + +function generateSourceFiles(sourceFiles, encoding = 'utf8') { + Object.keys(sourceFiles).forEach((file) => { + let source; + // links are keyed to the shortened path in each doclet's `meta.shortpath` property + const sourceOutfile = helper.getUniqueFilename(sourceFiles[file].shortened); + + helper.registerLink(sourceFiles[file].shortened, sourceOutfile); + + try { + source = { + kind: 'source', + code: helper.htmlsafe( + fs.readFileSync(sourceFiles[file].resolved, encoding) + ), + }; + } catch (e) { + logger.error( + 'Error while generating source file %s: %s', + file, + e.message + ); + } + + generate( + `Source: ${sourceFiles[file].shortened}`, + [source], + sourceOutfile, + false + ); + }); +} + +/** + * Look for classes or functions with the same name as modules (which indicates that the module + * exports only that class or function), then attach the classes or functions to the `module` + * property of the appropriate module doclets. The name of each class or function is also updated + * for display purposes. This function mutates the original arrays. + * + * @private + * @param {Array.} doclets - The array of classes and functions to + * check. + * @param {Array.} modules - The array of module doclets to search. + */ +function attachModuleSymbols(doclets, modules) { + const symbols = {}; + + // build a lookup table + doclets.forEach((symbol) => { + symbols[symbol.longname] = symbols[symbol.longname] || []; + symbols[symbol.longname].push(symbol); + }); + + modules.forEach((module) => { + if (symbols[module.longname]) { + module.modules = symbols[module.longname] + // Only show symbols that have a description. Make an exception for classes, because + // we want to show the constructor-signature heading no matter what. + .filter(({ description, kind }) => description || kind === 'class') + .map((symbol) => { + symbol = doop(symbol); + + if (symbol.kind === 'class' || symbol.kind === 'function') { + symbol.name = `${symbol.name.replace('module:', '(require("')}"))`; + } + + return symbol; + }); + } + }); +} + +function buildMemberNav(items, itemHeading, itemsSeen, linktoFn) { + let nav = ''; + + if (items.length) { + let itemsNav = ''; + + items.forEach((item) => { + let displayName; + + if (!hasOwnProp.call(item, 'longname')) { + itemsNav += `
  • ${linktoFn('', item.name)}
  • `; + } else if (!hasOwnProp.call(itemsSeen, item.longname)) { + if (env.conf.templates.default.useLongnameInNav) { + displayName = item.longname; + } else { + displayName = item.name; + } + itemsNav += `
  • ${linktoFn( + item.longname, + displayName.replace(/\b(module|event):/g, '') + )}
  • `; + + itemsSeen[item.longname] = true; + } + }); + + if (itemsNav !== '') { + nav += `

    ${itemHeading}

      ${itemsNav}
    `; + } + } + + return nav; +} + +function linktoTutorial(longName, name) { + return tutoriallink(name); +} + +function linktoExternal(longName, name) { + return linkto(longName, name.replace(/(^"|"$)/g, '')); +} + +/** + * Create the navigation sidebar. + * @param {object} members The members that will be used to create the sidebar. + * @param {array} members.classes + * @param {array} members.externals + * @param {array} members.globals + * @param {array} members.mixins + * @param {array} members.modules + * @param {array} members.namespaces + * @param {array} members.tutorials + * @param {array} members.events + * @param {array} members.interfaces + * @return {string} The HTML for the navigation sidebar. + */ +function buildNav(members) { + let globalNav; + let nav = '

    TumblrX Frontend Documentation

    '; + const seen = {}; + const seenTutorials = {}; + + nav += buildMemberNav(members.modules, 'Modules', {}, linkto); + nav += buildMemberNav(members.externals, 'Externals', seen, linktoExternal); + nav += buildMemberNav(members.namespaces, 'Namespaces', seen, linkto); + nav += buildMemberNav(members.classes, 'Classes', seen, linkto); + nav += buildMemberNav(members.interfaces, 'Interfaces', seen, linkto); + nav += buildMemberNav(members.events, 'Events', seen, linkto); + nav += buildMemberNav(members.mixins, 'Mixins', seen, linkto); + nav += buildMemberNav( + members.tutorials, + 'Tutorials', + seenTutorials, + linktoTutorial + ); + + if (members.globals.length) { + globalNav = ''; + + members.globals.forEach(({ kind, longname, name }) => { + if (kind !== 'typedef' && !hasOwnProp.call(seen, longname)) { + globalNav += `
  • ${linkto(longname, name)}
  • `; + } + seen[longname] = true; + }); + + if (!globalNav) { + // turn the heading into a link so you can actually get to the global page + nav += `

    ${linkto('global', 'Global')}

    `; + } else { + nav += `

    Global

      ${globalNav}
    `; + } + } + + return nav; +} + +/** + @param {TAFFY} taffyData See . + @param {object} opts + @param {Tutorial} tutorials + */ +exports.publish = (taffyData, opts, tutorials) => { + let classes; + let conf; + let externals; + let files; + let fromDir; + let globalUrl; + let indexUrl; + let interfaces; + let members; + let mixins; + let modules; + let namespaces; + let outputSourceFiles; + let packageInfo; + let packages; + const sourceFilePaths = []; + let sourceFiles = {}; + let staticFileFilter; + let staticFilePaths; + let staticFiles; + let staticFileScanner; + let templatePath; + + data = taffyData; + + conf = env.conf.templates || {}; + conf.default = conf.default || {}; + + templatePath = path.normalize(opts.template); + view = new template.Template(path.join(templatePath, 'tmpl')); + + // claim some special filenames in advance, so the All-Powerful Overseer of Filename Uniqueness + // doesn't try to hand them out later + indexUrl = helper.getUniqueFilename('index'); + // don't call registerLink() on this one! 'index' is also a valid longname + + globalUrl = helper.getUniqueFilename('global'); + helper.registerLink('global', globalUrl); + + // set up templating + view.layout = conf.default.layoutFile + ? path.getResourcePath( + path.dirname(conf.default.layoutFile), + path.basename(conf.default.layoutFile) + ) + : 'layout.tmpl'; + + // set up tutorials for helper + helper.setTutorials(tutorials); + + data = helper.prune(data); + data.sort('longname, version, since'); + helper.addEventListeners(data); + + data().each((doclet) => { + let sourcePath; + + doclet.attribs = ''; + + if (doclet.examples) { + doclet.examples = doclet.examples.map((example) => { + let caption; + let code; + + if ( + example.match( + /^\s*([\s\S]+?)<\/caption>(\s*[\n\r])([\s\S]+)$/i + ) + ) { + caption = RegExp.$1; + code = RegExp.$3; + } + + return { + caption: caption || '', + code: code || example, + }; + }); + } + if (doclet.see) { + doclet.see.forEach((seeItem, i) => { + doclet.see[i] = hashToLink(doclet, seeItem); + }); + } + + // build a list of source files + if (doclet.meta) { + sourcePath = getPathFromDoclet(doclet); + sourceFiles[sourcePath] = { + resolved: sourcePath, + shortened: null, + }; + if (!sourceFilePaths.includes(sourcePath)) { + sourceFilePaths.push(sourcePath); + } + } + }); + + // update outdir if necessary, then create outdir + packageInfo = (find({ kind: 'package' }) || [])[0]; + if (packageInfo && packageInfo.name) { + outdir = path.join(outdir, packageInfo.name, packageInfo.version || ''); + } + fs.mkPath(outdir); + + // copy the template's static files to outdir + fromDir = path.join(templatePath, 'static'); + staticFiles = fs.ls(fromDir, 3); + + staticFiles.forEach((fileName) => { + const toDir = fs.toDir(fileName.replace(fromDir, outdir)); + + fs.mkPath(toDir); + fs.copyFileSync(fileName, toDir); + }); + + // copy user-specified static files to outdir + if (conf.default.staticFiles) { + // The canonical property name is `include`. We accept `paths` for backwards compatibility + // with a bug in JSDoc 3.2.x. + staticFilePaths = + conf.default.staticFiles.include || conf.default.staticFiles.paths || []; + staticFileFilter = new (require('jsdoc/src/filter').Filter)( + conf.default.staticFiles + ); + staticFileScanner = new (require('jsdoc/src/scanner').Scanner)(); + + staticFilePaths.forEach((filePath) => { + let extraStaticFiles; + + filePath = path.resolve(env.pwd, filePath); + extraStaticFiles = staticFileScanner.scan( + [filePath], + 10, + staticFileFilter + ); + + extraStaticFiles.forEach((fileName) => { + const sourcePath = fs.toDir(filePath); + const toDir = fs.toDir(fileName.replace(sourcePath, outdir)); + + fs.mkPath(toDir); + fs.copyFileSync(fileName, toDir); + }); + }); + } + + if (sourceFilePaths.length) { + sourceFiles = shortenPaths(sourceFiles, path.commonPrefix(sourceFilePaths)); + } + data().each((doclet) => { + let docletPath; + const url = helper.createLink(doclet); + + helper.registerLink(doclet.longname, url); + + // add a shortened version of the full path + if (doclet.meta) { + docletPath = getPathFromDoclet(doclet); + docletPath = sourceFiles[docletPath].shortened; + if (docletPath) { + doclet.meta.shortpath = docletPath; + } + } + }); + + data().each((doclet) => { + const url = helper.longnameToUrl[doclet.longname]; + + if (url.includes('#')) { + doclet.id = helper.longnameToUrl[doclet.longname].split(/#/).pop(); + } else { + doclet.id = doclet.name; + } + + if (needsSignature(doclet)) { + addSignatureParams(doclet); + addSignatureReturns(doclet); + addAttribs(doclet); + } + }); + + // do this after the urls have all been generated + data().each((doclet) => { + doclet.ancestors = getAncestorLinks(doclet); + + if (doclet.kind === 'member') { + addSignatureTypes(doclet); + addAttribs(doclet); + } + + if (doclet.kind === 'constant') { + addSignatureTypes(doclet); + addAttribs(doclet); + doclet.kind = 'member'; + } + }); + + members = helper.getMembers(data); + members.tutorials = tutorials.children; + + // output pretty-printed source files by default + outputSourceFiles = conf.default && conf.default.outputSourceFiles !== false; + + // add template helpers + view.find = find; + view.linkto = linkto; + view.resolveAuthorLinks = resolveAuthorLinks; + view.tutoriallink = tutoriallink; + view.htmlsafe = htmlsafe; + view.outputSourceFiles = outputSourceFiles; + + // once for all + view.nav = buildNav(members); + attachModuleSymbols(find({ longname: { left: 'module:' } }), members.modules); + + // generate the pretty-printed source files first so other pages can link to them + if (outputSourceFiles) { + generateSourceFiles(sourceFiles, opts.encoding); + } + + if (members.globals.length) { + generate('Global', [{ kind: 'globalobj' }], globalUrl); + } + + // index page displays information from package.json and lists files + files = find({ kind: 'file' }); + packages = find({ kind: 'package' }); + + generate( + 'TumblrX Frontend Documentation', + packages + .concat([ + { + kind: 'mainpage', + readme: opts.readme, + longname: opts.mainpagetitle ? opts.mainpagetitle : 'Main Page', + }, + ]) + .concat(files), + indexUrl + ); + + // set up the lists that we'll use to generate pages + classes = taffy(members.classes); + modules = taffy(members.modules); + namespaces = taffy(members.namespaces); + mixins = taffy(members.mixins); + externals = taffy(members.externals); + interfaces = taffy(members.interfaces); + + Object.keys(helper.longnameToUrl).forEach((longname) => { + const myClasses = helper.find(classes, { longname: longname }); + const myExternals = helper.find(externals, { longname: longname }); + const myInterfaces = helper.find(interfaces, { longname: longname }); + const myMixins = helper.find(mixins, { longname: longname }); + const myModules = helper.find(modules, { longname: longname }); + const myNamespaces = helper.find(namespaces, { longname: longname }); + + if (myModules.length) { + generate( + `Module: ${myModules[0].name}`, + myModules, + helper.longnameToUrl[longname] + ); + } + + if (myClasses.length) { + generate( + `Class: ${myClasses[0].name}`, + myClasses, + helper.longnameToUrl[longname] + ); + } + + if (myNamespaces.length) { + generate( + `Namespace: ${myNamespaces[0].name}`, + myNamespaces, + helper.longnameToUrl[longname] + ); + } + + if (myMixins.length) { + generate( + `Mixin: ${myMixins[0].name}`, + myMixins, + helper.longnameToUrl[longname] + ); + } + + if (myExternals.length) { + generate( + `External: ${myExternals[0].name}`, + myExternals, + helper.longnameToUrl[longname] + ); + } + + if (myInterfaces.length) { + generate( + `Interface: ${myInterfaces[0].name}`, + myInterfaces, + helper.longnameToUrl[longname] + ); + } + }); + + // TODO: move the tutorial functions to templateHelper.js + function generateTutorial(title, tutorial, filename) { + const tutorialData = { + title: title, + header: tutorial.title, + content: tutorial.parse(), + children: tutorial.children, + }; + const tutorialPath = path.join(outdir, filename); + let html = view.render('tutorial.tmpl', tutorialData); + + // yes, you can use {@link} in tutorials too! + html = helper.resolveLinks(html); // turn {@link foo} into foo + + fs.writeFileSync(tutorialPath, html, 'utf8'); + } + + // tutorials can have only one parent so there is no risk for loops + function saveChildren({ children }) { + children.forEach((child) => { + generateTutorial( + `Tutorial: ${child.title}`, + child, + helper.tutorialToUrl(child.name) + ); + saveChildren(child); + }); + } + + saveChildren(tutorials); +}; diff --git a/custom-jsdoc-template/static/fonts/OpenSans-Bold-webfont.eot b/custom-jsdoc-template/static/fonts/OpenSans-Bold-webfont.eot new file mode 100644 index 0000000..5d20d91 Binary files /dev/null and b/custom-jsdoc-template/static/fonts/OpenSans-Bold-webfont.eot differ diff --git a/custom-jsdoc-template/static/fonts/OpenSans-Bold-webfont.svg b/custom-jsdoc-template/static/fonts/OpenSans-Bold-webfont.svg new file mode 100644 index 0000000..3ed7be4 --- /dev/null +++ b/custom-jsdoc-template/static/fonts/OpenSans-Bold-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/custom-jsdoc-template/static/fonts/OpenSans-Bold-webfont.woff b/custom-jsdoc-template/static/fonts/OpenSans-Bold-webfont.woff new file mode 100644 index 0000000..1205787 Binary files /dev/null and b/custom-jsdoc-template/static/fonts/OpenSans-Bold-webfont.woff differ diff --git a/custom-jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.eot b/custom-jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.eot new file mode 100644 index 0000000..1f639a1 Binary files /dev/null and b/custom-jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.eot differ diff --git a/custom-jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.svg b/custom-jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.svg new file mode 100644 index 0000000..6a2607b --- /dev/null +++ b/custom-jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/custom-jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.woff b/custom-jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.woff new file mode 100644 index 0000000..ed760c0 Binary files /dev/null and b/custom-jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.woff differ diff --git a/custom-jsdoc-template/static/fonts/OpenSans-Italic-webfont.eot b/custom-jsdoc-template/static/fonts/OpenSans-Italic-webfont.eot new file mode 100644 index 0000000..0c8a0ae Binary files /dev/null and b/custom-jsdoc-template/static/fonts/OpenSans-Italic-webfont.eot differ diff --git a/custom-jsdoc-template/static/fonts/OpenSans-Italic-webfont.svg b/custom-jsdoc-template/static/fonts/OpenSans-Italic-webfont.svg new file mode 100644 index 0000000..e1075dc --- /dev/null +++ b/custom-jsdoc-template/static/fonts/OpenSans-Italic-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/custom-jsdoc-template/static/fonts/OpenSans-Italic-webfont.woff b/custom-jsdoc-template/static/fonts/OpenSans-Italic-webfont.woff new file mode 100644 index 0000000..ff652e6 Binary files /dev/null and b/custom-jsdoc-template/static/fonts/OpenSans-Italic-webfont.woff differ diff --git a/custom-jsdoc-template/static/fonts/OpenSans-Light-webfont.eot b/custom-jsdoc-template/static/fonts/OpenSans-Light-webfont.eot new file mode 100644 index 0000000..1486840 Binary files /dev/null and b/custom-jsdoc-template/static/fonts/OpenSans-Light-webfont.eot differ diff --git a/custom-jsdoc-template/static/fonts/OpenSans-Light-webfont.svg b/custom-jsdoc-template/static/fonts/OpenSans-Light-webfont.svg new file mode 100644 index 0000000..11a472c --- /dev/null +++ b/custom-jsdoc-template/static/fonts/OpenSans-Light-webfont.svg @@ -0,0 +1,1831 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/custom-jsdoc-template/static/fonts/OpenSans-Light-webfont.woff b/custom-jsdoc-template/static/fonts/OpenSans-Light-webfont.woff new file mode 100644 index 0000000..e786074 Binary files /dev/null and b/custom-jsdoc-template/static/fonts/OpenSans-Light-webfont.woff differ diff --git a/custom-jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.eot b/custom-jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.eot new file mode 100644 index 0000000..8f44592 Binary files /dev/null and b/custom-jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.eot differ diff --git a/custom-jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.svg b/custom-jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.svg new file mode 100644 index 0000000..431d7e3 --- /dev/null +++ b/custom-jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.svg @@ -0,0 +1,1835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/custom-jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.woff b/custom-jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.woff new file mode 100644 index 0000000..43e8b9e Binary files /dev/null and b/custom-jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.woff differ diff --git a/custom-jsdoc-template/static/fonts/OpenSans-Regular-webfont.eot b/custom-jsdoc-template/static/fonts/OpenSans-Regular-webfont.eot new file mode 100644 index 0000000..6bbc3cf Binary files /dev/null and b/custom-jsdoc-template/static/fonts/OpenSans-Regular-webfont.eot differ diff --git a/custom-jsdoc-template/static/fonts/OpenSans-Regular-webfont.svg b/custom-jsdoc-template/static/fonts/OpenSans-Regular-webfont.svg new file mode 100644 index 0000000..25a3952 --- /dev/null +++ b/custom-jsdoc-template/static/fonts/OpenSans-Regular-webfont.svg @@ -0,0 +1,1831 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/custom-jsdoc-template/static/fonts/OpenSans-Regular-webfont.woff b/custom-jsdoc-template/static/fonts/OpenSans-Regular-webfont.woff new file mode 100644 index 0000000..e231183 Binary files /dev/null and b/custom-jsdoc-template/static/fonts/OpenSans-Regular-webfont.woff differ diff --git a/custom-jsdoc-template/static/scripts/linenumber.js b/custom-jsdoc-template/static/scripts/linenumber.js new file mode 100644 index 0000000..4354785 --- /dev/null +++ b/custom-jsdoc-template/static/scripts/linenumber.js @@ -0,0 +1,25 @@ +/*global document */ +(() => { + const source = document.getElementsByClassName('prettyprint source linenums'); + let i = 0; + let lineNumber = 0; + let lineId; + let lines; + let totalLines; + let anchorHash; + + if (source && source[0]) { + anchorHash = document.location.hash.substring(1); + lines = source[0].getElementsByTagName('li'); + totalLines = lines.length; + + for (; i < totalLines; i++) { + lineNumber++; + lineId = `line${lineNumber}`; + lines[i].id = lineId; + if (lineId === anchorHash) { + lines[i].className += ' selected'; + } + } + } +})(); diff --git a/custom-jsdoc-template/static/scripts/prettify/Apache-License-2.0.txt b/custom-jsdoc-template/static/scripts/prettify/Apache-License-2.0.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/custom-jsdoc-template/static/scripts/prettify/Apache-License-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/custom-jsdoc-template/static/scripts/prettify/lang-css.js b/custom-jsdoc-template/static/scripts/prettify/lang-css.js new file mode 100644 index 0000000..041e1f5 --- /dev/null +++ b/custom-jsdoc-template/static/scripts/prettify/lang-css.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", +/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); diff --git a/custom-jsdoc-template/static/scripts/prettify/prettify.js b/custom-jsdoc-template/static/scripts/prettify/prettify.js new file mode 100644 index 0000000..eef5ad7 --- /dev/null +++ b/custom-jsdoc-template/static/scripts/prettify/prettify.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p th:last-child { border-right: 1px solid #ddd; } + +.ancestors, .attribs { color: #999; } +.ancestors a, .attribs a +{ + color: #999 !important; + text-decoration: none; +} + +.clear +{ + clear: both; +} + +.important +{ + font-weight: bold; + color: #950B02; +} + +.yes-def { + text-indent: -1000px; +} + +.type-signature { + color: #aaa; +} + +.name, .signature { + font-family: Consolas, Monaco, 'Andale Mono', monospace; +} + +.details { margin-top: 14px; border-left: 2px solid #DDD; } +.details dt { width: 120px; float: left; padding-left: 10px; padding-top: 6px; } +.details dd { margin-left: 70px; } +.details ul { margin: 0; } +.details ul { list-style-type: none; } +.details li { margin-left: 30px; padding-top: 6px; } +.details pre.prettyprint { margin: 0 } +.details .object-value { padding-top: 0; } + +.description { + margin-bottom: 1em; + margin-top: 1em; +} + +.code-caption +{ + font-style: italic; + font-size: 107%; + margin: 0; +} + +.source +{ + border: 1px solid #ddd; + width: 80%; + overflow: auto; +} + +.prettyprint.source { + width: inherit; +} + +.source code +{ + font-size: 100%; + line-height: 18px; + display: block; + padding: 4px 12px; + margin: 0; + background-color: #fff; + color: #4D4E53; +} + +.prettyprint code span.line +{ + display: inline-block; +} + +.prettyprint.linenums +{ + padding-left: 70px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.prettyprint.linenums ol +{ + padding-left: 0; +} + +.prettyprint.linenums li +{ + border-left: 3px #ddd solid; +} + +.prettyprint.linenums li.selected, +.prettyprint.linenums li.selected * +{ + background-color: lightyellow; +} + +.prettyprint.linenums li * +{ + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.params .name, .props .name, .name code { + color: #4D4E53; + font-family: Consolas, Monaco, 'Andale Mono', monospace; + font-size: 100%; +} + +.params td.description > p:first-child, +.props td.description > p:first-child +{ + margin-top: 0; + padding-top: 0; +} + +.params td.description > p:last-child, +.props td.description > p:last-child +{ + margin-bottom: 0; + padding-bottom: 0; +} + +.disabled { + color: #454545; +} diff --git a/custom-jsdoc-template/static/styles/prettify-jsdoc.css b/custom-jsdoc-template/static/styles/prettify-jsdoc.css new file mode 100644 index 0000000..5a2526e --- /dev/null +++ b/custom-jsdoc-template/static/styles/prettify-jsdoc.css @@ -0,0 +1,111 @@ +/* JSDoc prettify.js theme */ + +/* plain text */ +.pln { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* string content */ +.str { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a keyword */ +.kwd { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a comment */ +.com { + font-weight: normal; + font-style: italic; +} + +/* a type name */ +.typ { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* a literal value */ +.lit { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* punctuation */ +.pun { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* lisp open bracket */ +.opn { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* lisp close bracket */ +.clo { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a markup tag name */ +.tag { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a markup attribute name */ +.atn { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a markup attribute value */ +.atv { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a declaration */ +.dec { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a variable name */ +.var { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* a function name */ +.fun { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; +} diff --git a/custom-jsdoc-template/static/styles/prettify-tomorrow.css b/custom-jsdoc-template/static/styles/prettify-tomorrow.css new file mode 100644 index 0000000..b6f92a7 --- /dev/null +++ b/custom-jsdoc-template/static/styles/prettify-tomorrow.css @@ -0,0 +1,132 @@ +/* Tomorrow Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* Pretty printing styles. Used with prettify.js. */ +/* SPAN elements with the classes below are added by prettyprint. */ +/* plain text */ +.pln { + color: #4d4d4c; } + +@media screen { + /* string content */ + .str { + color: #718c00; } + + /* a keyword */ + .kwd { + color: #8959a8; } + + /* a comment */ + .com { + color: #8e908c; } + + /* a type name */ + .typ { + color: #4271ae; } + + /* a literal value */ + .lit { + color: #f5871f; } + + /* punctuation */ + .pun { + color: #4d4d4c; } + + /* lisp open bracket */ + .opn { + color: #4d4d4c; } + + /* lisp close bracket */ + .clo { + color: #4d4d4c; } + + /* a markup tag name */ + .tag { + color: #c82829; } + + /* a markup attribute name */ + .atn { + color: #f5871f; } + + /* a markup attribute value */ + .atv { + color: #3e999f; } + + /* a declaration */ + .dec { + color: #f5871f; } + + /* a variable name */ + .var { + color: #c82829; } + + /* a function name */ + .fun { + color: #4271ae; } } +/* Use higher contrast and text-weight for printable form. */ +@media print, projection { + .str { + color: #060; } + + .kwd { + color: #006; + font-weight: bold; } + + .com { + color: #600; + font-style: italic; } + + .typ { + color: #404; + font-weight: bold; } + + .lit { + color: #044; } + + .pun, .opn, .clo { + color: #440; } + + .tag { + color: #006; + font-weight: bold; } + + .atn { + color: #404; } + + .atv { + color: #060; } } +/* Style */ +/* +pre.prettyprint { + background: white; + font-family: Consolas, Monaco, 'Andale Mono', monospace; + font-size: 12px; + line-height: 1.5; + border: 1px solid #ccc; + padding: 10px; } +*/ + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; } + +/* IE indents via margin-left */ +li.L0, +li.L1, +li.L2, +li.L3, +li.L4, +li.L5, +li.L6, +li.L7, +li.L8, +li.L9 { + /* */ } + +/* Alternate shading for lines */ +li.L1, +li.L3, +li.L5, +li.L7, +li.L9 { + /* */ } diff --git a/custom-jsdoc-template/tmpl/augments.tmpl b/custom-jsdoc-template/tmpl/augments.tmpl new file mode 100644 index 0000000..446d28a --- /dev/null +++ b/custom-jsdoc-template/tmpl/augments.tmpl @@ -0,0 +1,10 @@ + + + +
      +
    • +
    + diff --git a/custom-jsdoc-template/tmpl/container.tmpl b/custom-jsdoc-template/tmpl/container.tmpl new file mode 100644 index 0000000..1b94004 --- /dev/null +++ b/custom-jsdoc-template/tmpl/container.tmpl @@ -0,0 +1,196 @@ + + + + + + + + + +
    + +
    + +

    + +

    + +
    + + + + +
    + + + +
    + +
    +
    + + +
    + + + + + + + + + +
    + + + + + +

    Example 1? 's':'' ?>

    + + + +
    + + +

    Extends

    + + + + + +

    Requires

    + +
      +
    • +
    + + + +

    Classes

    + +
    +
    +
    +
    + + + +

    Interfaces

    + +
    +
    +
    +
    + + + +

    Mixins

    + +
    +
    +
    +
    + + + +

    Namespaces

    + +
    +
    +
    +
    + + + +

    Members

    + + + + + + + +

    Methods

    + + + + + + + +

    Type Definitions

    + + + + + + + + + +

    Events

    + + + + + +
    + +
    + + + diff --git a/custom-jsdoc-template/tmpl/details.tmpl b/custom-jsdoc-template/tmpl/details.tmpl new file mode 100644 index 0000000..4a5bd49 --- /dev/null +++ b/custom-jsdoc-template/tmpl/details.tmpl @@ -0,0 +1,143 @@ +" + data.defaultvalue + ""; + defaultObjectClass = ' class="object-value"'; +} +?> + + +
    Properties:
    + + + + + +
    + + +
    Version:
    +
    + + + +
    Since:
    +
    + + + +
    Inherited From:
    +
    • + +
    + + + +
    Overrides:
    +
    • + +
    + + + +
    Implementations:
    +
      + +
    • + +
    + + + +
    Implements:
    +
      + +
    • + +
    + + + +
    Mixes In:
    + +
      + +
    • + +
    + + + +
    Deprecated:
    • Yes
    + + + +
    Author:
    +
    +
      +
    • +
    +
    + + + + + + + + +
    License:
    +
    + + + +
    Default Value:
    +
      + > +
    + + + +
    Source:
    +
    • + , +
    + + + +
    Tutorials:
    +
    +
      +
    • +
    +
    + + + +
    See:
    +
    +
      +
    • +
    +
    + + + +
    To Do:
    +
    +
      +
    • +
    +
    + +
    diff --git a/custom-jsdoc-template/tmpl/example.tmpl b/custom-jsdoc-template/tmpl/example.tmpl new file mode 100644 index 0000000..e87caa5 --- /dev/null +++ b/custom-jsdoc-template/tmpl/example.tmpl @@ -0,0 +1,2 @@ + +
    diff --git a/custom-jsdoc-template/tmpl/examples.tmpl b/custom-jsdoc-template/tmpl/examples.tmpl new file mode 100644 index 0000000..04d975e --- /dev/null +++ b/custom-jsdoc-template/tmpl/examples.tmpl @@ -0,0 +1,13 @@ + +

    + +
    + \ No newline at end of file diff --git a/custom-jsdoc-template/tmpl/exceptions.tmpl b/custom-jsdoc-template/tmpl/exceptions.tmpl new file mode 100644 index 0000000..9cef6c7 --- /dev/null +++ b/custom-jsdoc-template/tmpl/exceptions.tmpl @@ -0,0 +1,32 @@ + + +
    +
    +
    + +
    +
    +
    +
    +
    +
    + Type +
    +
    + +
    +
    +
    +
    +
    + +
    + + + + + +
    + diff --git a/custom-jsdoc-template/tmpl/layout.tmpl b/custom-jsdoc-template/tmpl/layout.tmpl new file mode 100644 index 0000000..bc7e335 --- /dev/null +++ b/custom-jsdoc-template/tmpl/layout.tmpl @@ -0,0 +1,38 @@ + + + + + JSDoc: <?js= title ?> + + + + + + + + + + +
    + +

    + + +
    + + + +
    + +
    + Documentation generated by JSDoc on +
    + + + + + diff --git a/custom-jsdoc-template/tmpl/mainpage.tmpl b/custom-jsdoc-template/tmpl/mainpage.tmpl new file mode 100644 index 0000000..64e9e59 --- /dev/null +++ b/custom-jsdoc-template/tmpl/mainpage.tmpl @@ -0,0 +1,14 @@ + + + +

    + + + +
    +
    +
    + diff --git a/custom-jsdoc-template/tmpl/members.tmpl b/custom-jsdoc-template/tmpl/members.tmpl new file mode 100644 index 0000000..154c17b --- /dev/null +++ b/custom-jsdoc-template/tmpl/members.tmpl @@ -0,0 +1,38 @@ + +

    + + +

    + + + +
    + +
    + + + +
    Type:
    +
      +
    • + +
    • +
    + + + + + +
    Fires:
    +
      +
    • +
    + + + +
    Example 1? 's':'' ?>
    + + diff --git a/custom-jsdoc-template/tmpl/method.tmpl b/custom-jsdoc-template/tmpl/method.tmpl new file mode 100644 index 0000000..0125fe2 --- /dev/null +++ b/custom-jsdoc-template/tmpl/method.tmpl @@ -0,0 +1,131 @@ + + + +

    Constructor

    + + + +

    + + + +

    + + + + +
    + +
    + + + +
    Extends:
    + + + + +
    Type:
    +
      +
    • + +
    • +
    + + + +
    This:
    +
    + + + +
    Parameters:
    + + + + + + +
    Requires:
    +
      +
    • +
    + + + +
    Fires:
    +
      +
    • +
    + + + +
    Listens to Events:
    +
      +
    • +
    + + + +
    Listeners of This Event:
    +
      +
    • +
    + + + +
    Modifies:
    + 1) { ?>
      +
    • +
    + + + + +
    Throws:
    + 1) { ?>
      +
    • +
    + + + + +
    Returns:
    + 1) { ?>
      +
    • +
    + + + + +
    Yields:
    + 1) { ?>
      +
    • +
    + + + + +
    Example 1? 's':'' ?>
    + + diff --git a/custom-jsdoc-template/tmpl/modifies.tmpl b/custom-jsdoc-template/tmpl/modifies.tmpl new file mode 100644 index 0000000..16ccbf8 --- /dev/null +++ b/custom-jsdoc-template/tmpl/modifies.tmpl @@ -0,0 +1,14 @@ + + + +
    +
    + Type +
    +
    + +
    +
    + diff --git a/custom-jsdoc-template/tmpl/params.tmpl b/custom-jsdoc-template/tmpl/params.tmpl new file mode 100644 index 0000000..1fb4049 --- /dev/null +++ b/custom-jsdoc-template/tmpl/params.tmpl @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeAttributesDefaultDescription
    + + + + + + <optional>
    + + + + <nullable>
    + + + + <repeatable>
    + +
    + + + + +
    Properties
    + +
    diff --git a/custom-jsdoc-template/tmpl/properties.tmpl b/custom-jsdoc-template/tmpl/properties.tmpl new file mode 100644 index 0000000..40e0909 --- /dev/null +++ b/custom-jsdoc-template/tmpl/properties.tmpl @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeAttributesDefaultDescription
    + + + + + + <optional>
    + + + + <nullable>
    + +
    + + + + +
    Properties
    +
    diff --git a/custom-jsdoc-template/tmpl/returns.tmpl b/custom-jsdoc-template/tmpl/returns.tmpl new file mode 100644 index 0000000..d070459 --- /dev/null +++ b/custom-jsdoc-template/tmpl/returns.tmpl @@ -0,0 +1,19 @@ + +
    + +
    + + + +
    +
    + Type +
    +
    + +
    +
    + \ No newline at end of file diff --git a/custom-jsdoc-template/tmpl/source.tmpl b/custom-jsdoc-template/tmpl/source.tmpl new file mode 100644 index 0000000..e559b5d --- /dev/null +++ b/custom-jsdoc-template/tmpl/source.tmpl @@ -0,0 +1,8 @@ + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/custom-jsdoc-template/tmpl/tutorial.tmpl b/custom-jsdoc-template/tmpl/tutorial.tmpl new file mode 100644 index 0000000..88a0ad5 --- /dev/null +++ b/custom-jsdoc-template/tmpl/tutorial.tmpl @@ -0,0 +1,19 @@ +
    + +
    + 0) { ?> +
      +
    • +
    + + +

    +
    + +
    + +
    + +
    diff --git a/custom-jsdoc-template/tmpl/type.tmpl b/custom-jsdoc-template/tmpl/type.tmpl new file mode 100644 index 0000000..ec2c6c0 --- /dev/null +++ b/custom-jsdoc-template/tmpl/type.tmpl @@ -0,0 +1,7 @@ + + +| + \ No newline at end of file diff --git a/data/db.json b/data/db.json new file mode 100644 index 0000000..70e45ce --- /dev/null +++ b/data/db.json @@ -0,0 +1,34 @@ +{ + "text": [ + { + "id": 6, + "title": "lkndfl", + "text": "", + "tags": "" + }, + { + "id": 8, + "title": "Taherrrr", + "text": "", + "tags": "" + }, + { + "id": 11, + "title": "Yousef Atef", + "text": "", + "tags": "" + }, + { + "id": 1, + "title": "d", + "text": "", + "tags": "" + } + ], + "quote": [], + "link": [], + "chat": [], + "photo": [], + "audio": [], + "video": [] +} \ No newline at end of file diff --git a/data/posts.json b/data/posts.json new file mode 100644 index 0000000..e0448da --- /dev/null +++ b/data/posts.json @@ -0,0 +1,16 @@ +{ + "posts": [ + { + "id": 1234567891234567, + "blog": { + "Standard API Short Blog Info object": "goes here" + }, + "content": [ + { + "type": "text", + "text": "Hello world!" + } + ] + } + ] +} diff --git a/docs/Audio_Audio.js.html b/docs/Audio_Audio.js.html new file mode 100644 index 0000000..da350d9 --- /dev/null +++ b/docs/Audio_Audio.js.html @@ -0,0 +1,139 @@ + + + + + JSDoc: Source: Audio/Audio.js + + + + + + + + + + +
    + +

    Source: Audio/Audio.js

    + + + + + + +
    +
    +
    /**
    + * This is the /new/audio page
    + * @module Audio
    + * @author Yousef Elshabrawy
    + */
    +
    +import React, { useState, useEffect } from 'react';
    +import classes from './Audio.module.scss';
    +import { ImHeadphones } from 'react-icons/im';
    +import api from '../../../api/api';
    +import FormCard from '../../../components/NewPost/FormCard';
    +import PostButton from '../../../components/NewPost/PostButton';
    +import CloseButton from '../../../components/NewPost/CloseButton';
    +import isValidHttpUrl from '../../../helpers/isValidHttpUrl';
    +
    +const Audio = (props) => {
    +  const [uploadedAudio, setUploadedAudio] = useState(null);
    +  const [link, setLink] = useState('');
    +  const [formIsValid, setFormIsValid] = useState(false);
    +  //To know the source of the Audio
    +  const [audioFromPC, setAudioFromPC] = useState(false);
    +
    +  useEffect(() => {
    +    if (uploadedAudio || isValidHttpUrl(link)) setFormIsValid(true);
    +    else setFormIsValid(false);
    +  }, [uploadedAudio, link]);
    +  const audioChangeHandler = (e) => {
    +    setUploadedAudio(e.target.files[0]);
    +  };
    +  const linkChangeHandler = (e) => {
    +    setLink(e.target.value);
    +  };
    +  const formSubmitHandler = async (e) => {
    +    console.log(uploadedAudio);
    +    //Submission will depend on the source of the Audio But how do you know the source ???
    +    e.preventDefault();
    +    if (!formIsValid) return;
    +    try {
    +      //Here audioFromPC is not gurentee that it's from the pc,
    +      if (audioFromPC) {
    +        //file
    +        const fd = new FormData();
    +        fd.append('id', 7);
    +        fd.append('audio', uploadedAudio);
    +        // console.log(Array.from(fd));
    +        // await api.post('/photo', fd);
    +        console.log(JSON.stringify(Array.from(fd)));
    +        await api.post('/photo', { photo: JSON.stringify(Array.from(fd)) });
    +      } else {
    +        //link
    +      }
    +    } catch (err) {
    +      if (err.response) {
    +        console.log(err.response);
    +      } else {
    +        console.log(err);
    +      }
    +    }
    +    setUploadedAudio(null);
    +    setLink('');
    +  };
    +  return (
    +    <FormCard>
    +      <form className={classes.form} onSubmit={formSubmitHandler}>
    +        <div className={classes.control}>
    +          <input
    +            type='url'
    +            placeholder='Paste a URL'
    +            onChange={linkChangeHandler}
    +          />
    +          <div className={classes.icon}>
    +            <ImHeadphones />
    +            <input
    +              type='file'
    +              accept='audio/mp3'
    +              onChange={audioChangeHandler}
    +            />
    +          </div>
    +        </div>
    +        <div className={classes.actions}>
    +          <CloseButton />
    +          <PostButton formIsValid={formIsValid} />
    +        </div>
    +      </form>
    +    </FormCard>
    +  );
    +};
    +export default Audio;
    +
    +
    +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + diff --git a/docs/Chat_Chat.js.html b/docs/Chat_Chat.js.html new file mode 100644 index 0000000..a215554 --- /dev/null +++ b/docs/Chat_Chat.js.html @@ -0,0 +1,123 @@ + + + + + JSDoc: Source: Chat/Chat.js + + + + + + + + + + +
    + +

    Source: Chat/Chat.js

    + + + + + + +
    +
    +
    /**
    + * This is the /new/chat page
    + * @module Chat
    + * @author Yousef Elshabrawy
    + */
    +
    +import React, { useState, useEffect } from 'react';
    +import classes from './Chat.module.scss';
    +import FormCard from '../../../components/NewPost/FormCard';
    +import PostButton from '../../../components/NewPost/PostButton';
    +import CloseButton from '../../../components/NewPost/CloseButton';
    +import api from '../../../api/api';
    +const Chat = (props) => {
    +  const [title, setTitle] = useState('');
    +  const [chat, setChat] = useState('How are you. mohamed: I,m fine.');
    +  const [tags, setTags] = useState('');
    +  const [formIsValid, setFormIsValid] = useState(false);
    +  useEffect(() => {
    +    if (chat.trim() === '') setFormIsValid(false);
    +    else setFormIsValid(true);
    +  }, [chat]);
    +  const titleChangeHandler = (e) => {
    +    setTitle(e.target.value);
    +  };
    +  const chatChangeHandler = (e) => {
    +    setChat(e.target.value);
    +  };
    +  const tagsChangeHandler = (e) => {
    +    setTags(e.target.value);
    +  };
    +  const formSubmitHandler = async (e) => {
    +    e.preventDefault();
    +    if (!formIsValid) return;
    +    try {
    +      await api.post('/chat', { id: chat.length, title, chat, tags });
    +      console.log('chat is added');
    +    } catch (err) {
    +      if (err.response) {
    +        console.log('NOT in the 200 range');
    +      } else {
    +        console.log('error');
    +      }
    +    }
    +    setTitle('');
    +    setChat('');
    +    setTags('');
    +  };
    +  return (
    +    <FormCard>
    +      <form className={classes.form} onSubmit={formSubmitHandler}>
    +        <input
    +          type='text'
    +          placeholder='Title'
    +          onChange={titleChangeHandler}
    +          value={title}
    +        />
    +        <textarea rows='6' onChange={chatChangeHandler} value={chat} />
    +        <input
    +          type='text'
    +          placeholder='#tags'
    +          onChange={tagsChangeHandler}
    +          value={tags}
    +        />
    +        <div className={classes.actions}>
    +          <CloseButton />
    +          <PostButton formIsValid={formIsValid} />
    +        </div>
    +      </form>
    +    </FormCard>
    +  );
    +};
    +export default Chat;
    +
    +
    +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + diff --git a/docs/Link_Link.js.html b/docs/Link_Link.js.html new file mode 100644 index 0000000..f8241da --- /dev/null +++ b/docs/Link_Link.js.html @@ -0,0 +1,105 @@ + + + + + JSDoc: Source: Link/Link.js + + + + + + + + + + +
    + +

    Source: Link/Link.js

    + + + + + + +
    +
    +
    /**
    + * This is the /new/link page
    + * @module Link
    + * @author Yousef Elshabrawy
    + */
    +import React, { useState, useEffect } from 'react';
    +import classes from './Link.module.scss';
    +import api from '../../../api/api';
    +import FormCard from '../../../components/NewPost/FormCard';
    +import PostButton from '../../../components/NewPost/PostButton';
    +import CloseButton from '../../../components/NewPost/CloseButton';
    +import isValidHttpUrl from '../../../helpers/isValidHttpUrl';
    +const Link = (props) => {
    +  const [link, setLink] = useState('');
    +  const [formIsValid, setFormIsValid] = useState(false);
    +  useEffect(() => {
    +    if (!isValidHttpUrl(link)) setFormIsValid(false);
    +    else setFormIsValid(true);
    +  }, [link]);
    +  const linkChangeHandler = (e) => {
    +    setLink(e.target.value);
    +  };
    +  const formSubmitHandler = async (e) => {
    +    e.preventDefault();
    +    if (!formIsValid) return;
    +    try {
    +      await api.post('/link', { id: link.length, link });
    +    } catch (err) {
    +      if (err.response) {
    +        console.log('NOT in the 200 range');
    +      } else {
    +        console.log('error');
    +      }
    +    }
    +    setLink('');
    +  };
    +  return (
    +    <FormCard>
    +      <form className={classes.form} onSubmit={formSubmitHandler}>
    +        <input
    +          type='url'
    +          placeholder='Type or paste URL'
    +          onChange={linkChangeHandler}
    +          value={link}
    +        />
    +        <div className={classes.actions}>
    +          <CloseButton />
    +          <PostButton formIsValid={formIsValid} />
    +        </div>
    +      </form>
    +    </FormCard>
    +  );
    +};
    +export default Link;
    +
    +
    +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + diff --git a/docs/New.js.html b/docs/New.js.html new file mode 100644 index 0000000..d54c1a6 --- /dev/null +++ b/docs/New.js.html @@ -0,0 +1,172 @@ + + + + + JSDoc: Source: New.js + + + + + + + + + + +
    + +

    Source: New.js

    + + + + + + +
    +
    +
    /**
    + * This is the /new page
    + * @module New
    + * @author Yousef Elshabrawy
    + */
    +
    +import React from 'react';
    +import { Route } from 'react-router-dom';
    +import { useHistory, Link } from 'react-router-dom';
    +import classes from './New.module.scss';
    +import NewText from './Text/Text';
    +import NewQuote from './Quote/Quote';
    +import NewLink from './Link/Link';
    +import NewChat from './Chat/Chat';
    +import NewPhoto from './Photo/Photo';
    +import NewAudio from './Audio/Audio';
    +import NewVideo from './Video/Video';
    +import { newPostIcons } from '../../components/UI/Icons';
    +const {
    +  IoText,
    +  AiFillCamera,
    +  ImQuotesLeft,
    +  FaLink,
    +  BsFillChatDotsFill,
    +  ImHeadphones,
    +  TiVideo,
    +} = newPostIcons;
    +const New = () => {
    +  const history = useHistory();
    +  const overlayClickHandler = () => {
    +    history.push('/dashboard');
    +  };
    +  return (
    +    <div className={classes.new}>
    +      <Route path='/new' exact>
    +        <div className={classes.overlay} onClick={overlayClickHandler}></div>
    +        <div className={classes.content}>
    +          <Link to='/new/text'>
    +            <div className={classes.text}>
    +              <div>
    +                <IoText />
    +              </div>
    +              <span>Text</span>
    +            </div>
    +          </Link>
    +          <Link to='/new/photo'>
    +            <div className={classes.photo}>
    +              <div>
    +                <AiFillCamera />
    +              </div>
    +              <span>Photo</span>
    +            </div>
    +          </Link>
    +          <Link to='/new/quote'>
    +            <div className={classes.quote}>
    +              <div>
    +                <ImQuotesLeft />
    +              </div>
    +              <span>Quote</span>
    +            </div>
    +          </Link>
    +          <Link to='/new/link'>
    +            <div className={classes.link}>
    +              <div>
    +                <FaLink />
    +              </div>
    +              <span>Link</span>
    +            </div>
    +          </Link>
    +          <Link to='/new/chat'>
    +            <div className={classes.chat}>
    +              <div>
    +                <BsFillChatDotsFill />
    +              </div>
    +              <span>Chat</span>
    +            </div>
    +          </Link>
    +          <Link to='/new/audio'>
    +            <div className={classes.audio}>
    +              <div>
    +                <ImHeadphones />
    +              </div>
    +              <span>Audio</span>
    +            </div>
    +          </Link>
    +          <Link to='/new/video'>
    +            <div className={classes.video}>
    +              <div>
    +                <TiVideo />
    +              </div>
    +              <span>Video</span>
    +            </div>
    +          </Link>
    +        </div>
    +      </Route>
    +      <Route path='/new/text'>
    +        <NewText />
    +      </Route>
    +      <Route path='/new/photo'>
    +        <NewPhoto />
    +      </Route>
    +      <Route path='/new/quote'>
    +        <NewQuote />
    +      </Route>
    +      <Route path='/new/link'>
    +        <NewLink />
    +      </Route>
    +      <Route path='/new/chat'>
    +        <NewChat />
    +      </Route>
    +      <Route path='/new/audio'>
    +        <NewAudio />
    +      </Route>
    +      <Route path='/new/video'>
    +        <NewVideo />
    +      </Route>
    +    </div>
    +  );
    +};
    +
    +export default New;
    +
    +
    +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + diff --git a/docs/Photo_Photo.js.html b/docs/Photo_Photo.js.html new file mode 100644 index 0000000..7eebe97 --- /dev/null +++ b/docs/Photo_Photo.js.html @@ -0,0 +1,153 @@ + + + + + JSDoc: Source: Photo/Photo.js + + + + + + + + + + +
    + +

    Source: Photo/Photo.js

    + + + + + + +
    +
    +
    /**
    + * This is the /new/photo page
    + * @module Photo
    + * @author Yousef Elshabrawy
    + */
    +import React, { useEffect, useState } from 'react';
    +import { MdOutlineAddAPhoto } from 'react-icons/md';
    +import { GiSpiderWeb } from 'react-icons/gi';
    +import { GrFormClose } from 'react-icons/gr';
    +import classes from './Photo.module.scss';
    +import api from '../../../api/api';
    +import FormCard from '../../../components/NewPost/FormCard';
    +import PostButton from '../../../components/NewPost/PostButton';
    +import CloseButton from '../../../components/NewPost/CloseButton';
    +import isValidHttpUrl from '../../../helpers/isValidHttpUrl';
    +
    +const Photo = (props) => {
    +  const [uploadedPhotos, setUploadedPhotos] = useState([]);
    +  const [link, setLink] = useState('');
    +  const [formIsValid, setFormIsValid] = useState(false);
    +  const [photoFromWeb, setPhotoFromWeb] = useState(false);
    +  useEffect(() => {
    +    if (uploadedPhotos.length || isValidHttpUrl(link)) setFormIsValid(true);
    +    else setFormIsValid(false);
    +  }, [uploadedPhotos.length, link]);
    +  const photosChangeHandler = (e) => {
    +    setUploadedPhotos(e.target.files);
    +  };
    +  const linkChangeHandler = (e) => {
    +    setLink(e.target.value);
    +  };
    +  const formSubmitHandler = async (e) => {
    +    //Submission will depend on the source of the image But how do you know the source ???
    +    e.preventDefault();
    +    if (!formIsValid) return;
    +    try {
    +      if (!photoFromWeb) {
    +        const fd = new FormData();
    +        fd.append('id', 7);
    +        fd.append('photo', uploadedPhotos[0]);
    +        // console.log(Array.from(fd));
    +        // await api.post('/photo', fd);
    +        console.log(JSON.stringify(Array.from(fd)));
    +        await api.post('/photo', { photo: JSON.stringify(Array.from(fd)) });
    +      } else {
    +      }
    +    } catch (err) {
    +      if (err.response) {
    +        console.log(err.response);
    +      } else {
    +        console.log(err);
    +      }
    +    }
    +    setUploadedPhotos([]);
    +    setLink('');
    +  };
    +  const togglePhotoFromWebHandler = () => {
    +    setPhotoFromWeb((x) => !x);
    +  };
    +  let content = !photoFromWeb ? (
    +    <div className={classes.group}>
    +      <span>
    +        <MdOutlineAddAPhoto />
    +        <p>Upload photos</p>
    +        <input
    +          type='file'
    +          accept='image/*'
    +          multiple
    +          onChange={photosChangeHandler}
    +        />
    +      </span>
    +      <span onClick={togglePhotoFromWebHandler}>
    +        <GiSpiderWeb />
    +        <p>Add photo from web</p>
    +      </span>
    +    </div>
    +  ) : (
    +    <div className={classes.fromweb}>
    +      <span onClick={togglePhotoFromWebHandler}>
    +        <GrFormClose />
    +      </span>
    +      <input
    +        type='url'
    +        placeholder='Type or paste URL'
    +        onChange={linkChangeHandler}
    +        value={link}
    +      />
    +    </div>
    +  );
    +  return (
    +    <FormCard>
    +      <form className={classes.form} onSubmit={formSubmitHandler}>
    +        {content}
    +        <div className={classes.actions}>
    +          <CloseButton />
    +          <PostButton formIsValid={formIsValid} />
    +        </div>
    +      </form>
    +    </FormCard>
    +  );
    +};
    +export default Photo;
    +
    +
    +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + diff --git a/docs/Quote_Quote.js.html b/docs/Quote_Quote.js.html new file mode 100644 index 0000000..cb8275d --- /dev/null +++ b/docs/Quote_Quote.js.html @@ -0,0 +1,127 @@ + + + + + JSDoc: Source: Quote/Quote.js + + + + + + + + + + +
    + +

    Source: Quote/Quote.js

    + + + + + + +
    +
    +
    /**
    + * This is the /new/quote page
    + * @module Quote
    + * @author Yousef Elshabrawy
    + */
    +import React, { useEffect, useState } from 'react';
    +import classes from './Quote.module.scss';
    +import api from '../../../api/api';
    +import FormCard from '../../../components/NewPost/FormCard';
    +import PostButton from '../../../components/NewPost/PostButton';
    +import CloseButton from '../../../components/NewPost/CloseButton';
    +const Quote = (props) => {
    +  const [quote, setQuote] = useState('');
    +  const [source, setSource] = useState('');
    +  const [tags, setTags] = useState('');
    +  const [formIsValid, setFormIsValid] = useState(false);
    +  useEffect(() => {
    +    if (quote.trim() === '' && source.trim() === '') setFormIsValid(false);
    +    else setFormIsValid(true);
    +  }, [quote, source]);
    +  const quoteChangeHandler = (e) => {
    +    setQuote(e.target.value);
    +  };
    +  const sourceChangeHandler = (e) => {
    +    setSource(e.target.value);
    +  };
    +  const tagsChangeHandler = (e) => {
    +    setTags(e.target.value);
    +  };
    +
    +  const formSubmitHandler = async (e) => {
    +    e.preventDefault();
    +    if (!formIsValid) return;
    +    try {
    +      await api.post('/quote', { id: quote.length, quote, source, tags });
    +    } catch (err) {
    +      if (err.response) {
    +        console.log('NOT in the 200 range');
    +      } else {
    +        console.log('error');
    +      }
    +    }
    +    setQuote('');
    +    setSource('');
    +    setTags('');
    +  };
    +  return (
    +    <FormCard>
    +      <form className={classes.form} onSubmit={formSubmitHandler}>
    +        <input
    +          type='text'
    +          placeholder='Quote'
    +          onChange={quoteChangeHandler}
    +          value={quote}
    +        />
    +        <input
    +          type='text'
    +          placeholder='-- Source'
    +          onChange={sourceChangeHandler}
    +          value={source}
    +        />
    +        <input
    +          type='text'
    +          placeholder='#tags'
    +          onChange={tagsChangeHandler}
    +          value={tags}
    +        />
    +        <div className={classes.actions}>
    +          <CloseButton />
    +          <PostButton formIsValid={formIsValid} />
    +        </div>
    +      </form>
    +    </FormCard>
    +  );
    +};
    +export default Quote;
    +
    +
    +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + diff --git a/docs/Text.js.html b/docs/Text.js.html new file mode 100644 index 0000000..6104354 --- /dev/null +++ b/docs/Text.js.html @@ -0,0 +1,164 @@ + + + + + JSDoc: Source: Text.js + + + + + + + + + + +
    + +

    Source: Text.js

    + + + + + + +
    +
    +
    /* TODO: */
    +// 1. edit the closeClickHandler
    +// 2. add the post button options
    +// 3. validate the inputs values(remember dealing with #)
    +// 4. install uuid to generate ids
    +// 5. redirect after post
    +
    +/**
    + * /new/text module
    + * @module Text
    + */
    +import React, { useEffect, useState } from 'react';
    +import classes from './Text.module.scss';
    +import FormCard from '../../../components/NewPost/FormCard';
    +import PostButton from '../../../components/NewPost/PostButton';
    +import CloseButton from '../../../components/NewPost/CloseButton';
    +import api from '../../../api/api';
    +// import EditorJs from '@editorjs/editorjs';
    +// import Header from '@editorjs/header';
    +// import List from '@editorjs/list';
    +const NewText = (props) => {
    +  // const config = {
    +  //   holder: 'text',
    +  //   tools: {
    +  //     header: {
    +  //       class: Header,
    +  //       inlineToolbar: ['link'],
    +  //     },
    +  //     list: {
    +  //       class: List,
    +  //       inlineToolbar: true,
    +  //     },
    +  //   },
    +  // };
    +  // const textEditor = new EditorJs(config);
    +  const [title, setTitle] = useState('');
    +  const [text, setText] = useState('');
    +  const [tags, setTags] = useState('');
    +  const [formIsValid, setFormIsValid] = useState(false);
    +  useEffect(() => {
    +    if (title.trim() === '' && text.trim() === '') setFormIsValid(false);
    +    else setFormIsValid(true);
    +  }, [title, text]);
    +  const titleChangeHandler = (e) => {
    +    setTitle(e.target.value);
    +  };
    +  const textChangeHandler = (e) => {
    +    setText(e.target.value);
    +  };
    +  const tagsChangeHandler = (e) => {
    +    setTags(e.target.value);
    +  };
    +  const formSubmitHandler = async (e) => {
    +    e.preventDefault();
    +    if (!formIsValid) return;
    +    try {
    +      await api.post('/text', { id: title.length, title, text, tags });
    +    } catch (err) {
    +      if (err.response) {
    +        console.log('NOT in the 200 range');
    +      } else {
    +        console.log('error');
    +      }
    +    }
    +    setTitle('');
    +    setText('');
    +    setTags('');
    +  };
    +  return (
    +    <FormCard>
    +      <form className={classes.form} onSubmit={formSubmitHandler}>
    +        <input
    +          type='text'
    +          placeholder='Title'
    +          onChange={titleChangeHandler}
    +          value={title}
    +        />
    +        <input
    +          type='text'
    +          placeholder='Your text here'
    +          onChange={textChangeHandler}
    +          value={text}
    +        />
    +        {/* <div id='text'></div> */}
    +        {/* <button
    +        onClick={() => {
    +          textEditor
    +            .save()
    +            .then((outputData) => {
    +              console.log('Text data: ', outputData);
    +            })
    +            .catch((error) => {
    +              console.log('Saving failed: ', error);
    +            });
    +        }}
    +      >
    +        Submit
    +      </button> */}
    +        <input
    +          type='text'
    +          placeholder='#tags'
    +          onChange={tagsChangeHandler}
    +          value={tags}
    +        />
    +        <div className={classes.actions}>
    +          <CloseButton />
    +          <PostButton formIsValid={formIsValid} />
    +        </div>
    +      </form>
    +    </FormCard>
    +  );
    +};
    +export default NewText;
    +
    +
    +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 15:46:01 GMT+0200 (Eastern European Standard Time) +
    + + + + + diff --git a/docs/Text_Text.js.html b/docs/Text_Text.js.html new file mode 100644 index 0000000..22d421d --- /dev/null +++ b/docs/Text_Text.js.html @@ -0,0 +1,135 @@ + + + + + JSDoc: Source: Text/Text.js + + + + + + + + + + +
    + +

    Source: Text/Text.js

    + + + + + + +
    +
    +
    /* TODO: */
    +// 1. edit the closeClickHandler
    +// 2. add the post button options
    +// 3. validate the inputs values(remember dealing with #)
    +// 4. install uuid to generate ids
    +// 5. redirect after post
    +
    +/**
    + * This is the /new/text page
    + * @module Text
    + * @author Yousef Elshabrawy
    + */
    +
    +import React, { useEffect, useState } from 'react';
    +import classes from './Text.module.scss';
    +import FormCard from '../../../components/NewPost/FormCard';
    +import PostButton from '../../../components/NewPost/PostButton';
    +import CloseButton from '../../../components/NewPost/CloseButton';
    +import api from '../../../api/api';
    +
    +const NewText = () => {
    +  const [title, setTitle] = useState('');
    +  const [text, setText] = useState('');
    +  const [tags, setTags] = useState('');
    +  const [formIsValid, setFormIsValid] = useState(false);
    +  useEffect(() => {
    +    if (title.trim() === '' && text.trim() === '') setFormIsValid(false);
    +    else setFormIsValid(true);
    +  }, [title, text]);
    +  const titleChangeHandler = (e) => {
    +    setTitle(e.target.value);
    +  };
    +  const textChangeHandler = (e) => {
    +    setText(e.target.value);
    +  };
    +  const tagsChangeHandler = (e) => {
    +    setTags(e.target.value);
    +  };
    +  const formSubmitHandler = async (e) => {
    +    e.preventDefault();
    +    if (!formIsValid) return;
    +    try {
    +      await api.post('/text', { id: title.length, title, text, tags });
    +    } catch (err) {
    +      if (err.response) {
    +        console.log('NOT in the 200 range');
    +      } else {
    +        console.log('error');
    +      }
    +    }
    +    setTitle('');
    +    setText('');
    +    setTags('');
    +  };
    +  return (
    +    <FormCard>
    +      <form className={classes.form} onSubmit={formSubmitHandler}>
    +        <input
    +          type='text'
    +          placeholder='Title'
    +          onChange={titleChangeHandler}
    +          value={title}
    +        />
    +        <input
    +          type='text'
    +          placeholder='Your text here'
    +          onChange={textChangeHandler}
    +          value={text}
    +        />
    +        <input
    +          type='text'
    +          placeholder='#tags'
    +          onChange={tagsChangeHandler}
    +          value={tags}
    +        />
    +        <div className={classes.actions}>
    +          <CloseButton />
    +          <PostButton formIsValid={formIsValid} />
    +        </div>
    +      </form>
    +    </FormCard>
    +  );
    +};
    +export default NewText;
    +
    +
    +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + diff --git a/docs/Video_Video.js.html b/docs/Video_Video.js.html new file mode 100644 index 0000000..420d14f --- /dev/null +++ b/docs/Video_Video.js.html @@ -0,0 +1,149 @@ + + + + + JSDoc: Source: Video/Video.js + + + + + + + + + + +
    + +

    Source: Video/Video.js

    + + + + + + +
    +
    +
    /**
    + * This is the /new/video page
    + * @module Video
    + * @author Yousef Elshabrawy
    + */
    +import React, { useEffect, useState } from 'react';
    +import { RiVideoAddFill } from 'react-icons/ri';
    +import { GiSpiderWeb } from 'react-icons/gi';
    +import { GrFormClose } from 'react-icons/gr';
    +import classes from './Video.module.scss';
    +import api from '../../../api/api';
    +import FormCard from '../../../components/NewPost/FormCard';
    +import PostButton from '../../../components/NewPost/PostButton';
    +import CloseButton from '../../../components/NewPost/CloseButton';
    +import isValidHttpUrl from '../../../helpers/isValidHttpUrl';
    +
    +const Video = (props) => {
    +  const [uploadedVideo, setUploadedVideo] = useState();
    +  const [link, setLink] = useState('');
    +  const [formIsValid, setFormIsValid] = useState(false);
    +  const [videoFromWeb, setVideoFromWeb] = useState(false);
    +  useEffect(() => {
    +    if (uploadedVideo || isValidHttpUrl(link)) setFormIsValid(true);
    +    else setFormIsValid(false);
    +  }, [uploadedVideo, link]);
    +  const videoChangeHandler = (e) => {
    +    setUploadedVideo(e.target.files[0]);
    +  };
    +  const linkChangeHandler = (e) => {
    +    setLink(e.target.value);
    +  };
    +  const formSubmitHandler = async (e) => {
    +    console.log(uploadedVideo);
    +    //Submission will depend on the source of the image But how do you know the source ???
    +    e.preventDefault();
    +    if (!formIsValid) return;
    +    try {
    +      if (!videoFromWeb) {
    +        const fd = new FormData();
    +        fd.append('id', 7);
    +        fd.append('video', uploadedVideo);
    +        // console.log(Array.from(fd));
    +        // await api.post('/photo', fd);
    +        console.log(JSON.stringify(Array.from(fd)));
    +        await api.post('/photo', { photo: JSON.stringify(Array.from(fd)) });
    +      } else {
    +      }
    +    } catch (err) {
    +      if (err.response) {
    +        console.log(err.response);
    +      } else {
    +        console.log(err);
    +      }
    +    }
    +    setUploadedVideo(null);
    +    setLink('');
    +  };
    +  const toggleVideoFromWebHandler = () => {
    +    setVideoFromWeb((x) => !x);
    +  };
    +  let content = !videoFromWeb ? (
    +    <div className={classes.group}>
    +      <span>
    +        <RiVideoAddFill />
    +        <p>Upload a video</p>
    +        <input type='file' accept='video/*' onChange={videoChangeHandler} />
    +      </span>
    +      <span onClick={toggleVideoFromWebHandler}>
    +        <GiSpiderWeb />
    +        <p>Add video from web</p>
    +      </span>
    +    </div>
    +  ) : (
    +    <div className={classes.fromweb}>
    +      <span onClick={toggleVideoFromWebHandler}>
    +        <GrFormClose />
    +      </span>
    +      <input
    +        type='url'
    +        placeholder='Type or paste URL'
    +        onChange={linkChangeHandler}
    +        value={link}
    +      />
    +    </div>
    +  );
    +  return (
    +    <FormCard>
    +      <form className={classes.form} onSubmit={formSubmitHandler}>
    +        {content}
    +        <div className={classes.actions}>
    +          <CloseButton />
    +          <PostButton formIsValid={formIsValid} />
    +        </div>
    +      </form>
    +    </FormCard>
    +  );
    +};
    +export default Video;
    +
    +
    +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + diff --git a/docs/fonts/OpenSans-Bold-webfont.eot b/docs/fonts/OpenSans-Bold-webfont.eot new file mode 100644 index 0000000..5d20d91 Binary files /dev/null and b/docs/fonts/OpenSans-Bold-webfont.eot differ diff --git a/docs/fonts/OpenSans-Bold-webfont.svg b/docs/fonts/OpenSans-Bold-webfont.svg new file mode 100644 index 0000000..3ed7be4 --- /dev/null +++ b/docs/fonts/OpenSans-Bold-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/fonts/OpenSans-Bold-webfont.woff b/docs/fonts/OpenSans-Bold-webfont.woff new file mode 100644 index 0000000..1205787 Binary files /dev/null and b/docs/fonts/OpenSans-Bold-webfont.woff differ diff --git a/docs/fonts/OpenSans-BoldItalic-webfont.eot b/docs/fonts/OpenSans-BoldItalic-webfont.eot new file mode 100644 index 0000000..1f639a1 Binary files /dev/null and b/docs/fonts/OpenSans-BoldItalic-webfont.eot differ diff --git a/docs/fonts/OpenSans-BoldItalic-webfont.svg b/docs/fonts/OpenSans-BoldItalic-webfont.svg new file mode 100644 index 0000000..6a2607b --- /dev/null +++ b/docs/fonts/OpenSans-BoldItalic-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/fonts/OpenSans-BoldItalic-webfont.woff b/docs/fonts/OpenSans-BoldItalic-webfont.woff new file mode 100644 index 0000000..ed760c0 Binary files /dev/null and b/docs/fonts/OpenSans-BoldItalic-webfont.woff differ diff --git a/docs/fonts/OpenSans-Italic-webfont.eot b/docs/fonts/OpenSans-Italic-webfont.eot new file mode 100644 index 0000000..0c8a0ae Binary files /dev/null and b/docs/fonts/OpenSans-Italic-webfont.eot differ diff --git a/docs/fonts/OpenSans-Italic-webfont.svg b/docs/fonts/OpenSans-Italic-webfont.svg new file mode 100644 index 0000000..e1075dc --- /dev/null +++ b/docs/fonts/OpenSans-Italic-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/fonts/OpenSans-Italic-webfont.woff b/docs/fonts/OpenSans-Italic-webfont.woff new file mode 100644 index 0000000..ff652e6 Binary files /dev/null and b/docs/fonts/OpenSans-Italic-webfont.woff differ diff --git a/docs/fonts/OpenSans-Light-webfont.eot b/docs/fonts/OpenSans-Light-webfont.eot new file mode 100644 index 0000000..1486840 Binary files /dev/null and b/docs/fonts/OpenSans-Light-webfont.eot differ diff --git a/docs/fonts/OpenSans-Light-webfont.svg b/docs/fonts/OpenSans-Light-webfont.svg new file mode 100644 index 0000000..11a472c --- /dev/null +++ b/docs/fonts/OpenSans-Light-webfont.svg @@ -0,0 +1,1831 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/fonts/OpenSans-Light-webfont.woff b/docs/fonts/OpenSans-Light-webfont.woff new file mode 100644 index 0000000..e786074 Binary files /dev/null and b/docs/fonts/OpenSans-Light-webfont.woff differ diff --git a/docs/fonts/OpenSans-LightItalic-webfont.eot b/docs/fonts/OpenSans-LightItalic-webfont.eot new file mode 100644 index 0000000..8f44592 Binary files /dev/null and b/docs/fonts/OpenSans-LightItalic-webfont.eot differ diff --git a/docs/fonts/OpenSans-LightItalic-webfont.svg b/docs/fonts/OpenSans-LightItalic-webfont.svg new file mode 100644 index 0000000..431d7e3 --- /dev/null +++ b/docs/fonts/OpenSans-LightItalic-webfont.svg @@ -0,0 +1,1835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/fonts/OpenSans-LightItalic-webfont.woff b/docs/fonts/OpenSans-LightItalic-webfont.woff new file mode 100644 index 0000000..43e8b9e Binary files /dev/null and b/docs/fonts/OpenSans-LightItalic-webfont.woff differ diff --git a/docs/fonts/OpenSans-Regular-webfont.eot b/docs/fonts/OpenSans-Regular-webfont.eot new file mode 100644 index 0000000..6bbc3cf Binary files /dev/null and b/docs/fonts/OpenSans-Regular-webfont.eot differ diff --git a/docs/fonts/OpenSans-Regular-webfont.svg b/docs/fonts/OpenSans-Regular-webfont.svg new file mode 100644 index 0000000..25a3952 --- /dev/null +++ b/docs/fonts/OpenSans-Regular-webfont.svg @@ -0,0 +1,1831 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/fonts/OpenSans-Regular-webfont.woff b/docs/fonts/OpenSans-Regular-webfont.woff new file mode 100644 index 0000000..e231183 Binary files /dev/null and b/docs/fonts/OpenSans-Regular-webfont.woff differ diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..d0f674e --- /dev/null +++ b/docs/index.html @@ -0,0 +1,65 @@ + + + + + JSDoc: TumblrX Frontend Documentation + + + + + + + + + + +
    + +

    TumblrX Frontend Documentation

    + + + + + + + + +

    + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + \ No newline at end of file diff --git a/docs/module-Audio.html b/docs/module-Audio.html new file mode 100644 index 0000000..5c63c19 --- /dev/null +++ b/docs/module-Audio.html @@ -0,0 +1,172 @@ + + + + + JSDoc: Module: Audio + + + + + + + + + + +
    + +

    Module: Audio

    + + + + + + +
    + +
    + + + + + +
    + +
    +
    + + +

    This is the /new/audio page

    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    Author:
    +
    +
      +
    • Yousef Elshabrawy
    • +
    +
    + + + + + + + + + +
    Source:
    +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + \ No newline at end of file diff --git a/docs/module-Chat.html b/docs/module-Chat.html new file mode 100644 index 0000000..0416c4d --- /dev/null +++ b/docs/module-Chat.html @@ -0,0 +1,172 @@ + + + + + JSDoc: Module: Chat + + + + + + + + + + +
    + +

    Module: Chat

    + + + + + + +
    + +
    + + + + + +
    + +
    +
    + + +

    This is the /new/chat page

    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    Author:
    +
    +
      +
    • Yousef Elshabrawy
    • +
    +
    + + + + + + + + + +
    Source:
    +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + \ No newline at end of file diff --git a/docs/module-Link.html b/docs/module-Link.html new file mode 100644 index 0000000..c9789e8 --- /dev/null +++ b/docs/module-Link.html @@ -0,0 +1,172 @@ + + + + + JSDoc: Module: Link + + + + + + + + + + +
    + +

    Module: Link

    + + + + + + +
    + +
    + + + + + +
    + +
    +
    + + +

    This is the /new/link page

    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    Author:
    +
    +
      +
    • Yousef Elshabrawy
    • +
    +
    + + + + + + + + + +
    Source:
    +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + \ No newline at end of file diff --git a/docs/module-New.html b/docs/module-New.html new file mode 100644 index 0000000..ce59a94 --- /dev/null +++ b/docs/module-New.html @@ -0,0 +1,172 @@ + + + + + JSDoc: Module: New + + + + + + + + + + +
    + +

    Module: New

    + + + + + + +
    + +
    + + + + + +
    + +
    +
    + + +

    This is the /new page

    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    Author:
    +
    +
      +
    • Yousef Elshabrawy
    • +
    +
    + + + + + + + + + +
    Source:
    +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + \ No newline at end of file diff --git a/docs/module-Photo.html b/docs/module-Photo.html new file mode 100644 index 0000000..cdb0c36 --- /dev/null +++ b/docs/module-Photo.html @@ -0,0 +1,172 @@ + + + + + JSDoc: Module: Photo + + + + + + + + + + +
    + +

    Module: Photo

    + + + + + + +
    + +
    + + + + + +
    + +
    +
    + + +

    This is the /new/photo page

    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    Author:
    +
    +
      +
    • Yousef Elshabrawy
    • +
    +
    + + + + + + + + + +
    Source:
    +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + \ No newline at end of file diff --git a/docs/module-Quote.html b/docs/module-Quote.html new file mode 100644 index 0000000..9f09444 --- /dev/null +++ b/docs/module-Quote.html @@ -0,0 +1,172 @@ + + + + + JSDoc: Module: Quote + + + + + + + + + + +
    + +

    Module: Quote

    + + + + + + +
    + +
    + + + + + +
    + +
    +
    + + +

    This is the /new/quote page

    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    Author:
    +
    +
      +
    • Yousef Elshabrawy
    • +
    +
    + + + + + + + + + +
    Source:
    +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + \ No newline at end of file diff --git a/docs/module-Text.html b/docs/module-Text.html new file mode 100644 index 0000000..c8bde6b --- /dev/null +++ b/docs/module-Text.html @@ -0,0 +1,172 @@ + + + + + JSDoc: Module: Text + + + + + + + + + + +
    + +

    Module: Text

    + + + + + + +
    + +
    + + + + + +
    + +
    +
    + + +

    This is the /new/text page

    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    Author:
    +
    +
      +
    • Yousef Elshabrawy
    • +
    +
    + + + + + + + + + +
    Source:
    +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + \ No newline at end of file diff --git a/docs/module-Video.html b/docs/module-Video.html new file mode 100644 index 0000000..0bc0116 --- /dev/null +++ b/docs/module-Video.html @@ -0,0 +1,172 @@ + + + + + JSDoc: Module: Video + + + + + + + + + + +
    + +

    Module: Video

    + + + + + + +
    + +
    + + + + + +
    + +
    +
    + + +

    This is the /new/video page

    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    Author:
    +
    +
      +
    • Yousef Elshabrawy
    • +
    +
    + + + + + + + + + +
    Source:
    +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + + +
    + +
    + Documentation generated by JSDoc 3.6.7 on Fri Nov 19 2021 16:29:44 GMT+0200 (Eastern European Standard Time) +
    + + + + + \ No newline at end of file diff --git a/docs/scripts/linenumber.js b/docs/scripts/linenumber.js new file mode 100644 index 0000000..4354785 --- /dev/null +++ b/docs/scripts/linenumber.js @@ -0,0 +1,25 @@ +/*global document */ +(() => { + const source = document.getElementsByClassName('prettyprint source linenums'); + let i = 0; + let lineNumber = 0; + let lineId; + let lines; + let totalLines; + let anchorHash; + + if (source && source[0]) { + anchorHash = document.location.hash.substring(1); + lines = source[0].getElementsByTagName('li'); + totalLines = lines.length; + + for (; i < totalLines; i++) { + lineNumber++; + lineId = `line${lineNumber}`; + lines[i].id = lineId; + if (lineId === anchorHash) { + lines[i].className += ' selected'; + } + } + } +})(); diff --git a/docs/scripts/prettify/Apache-License-2.0.txt b/docs/scripts/prettify/Apache-License-2.0.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/docs/scripts/prettify/Apache-License-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/docs/scripts/prettify/lang-css.js b/docs/scripts/prettify/lang-css.js new file mode 100644 index 0000000..041e1f5 --- /dev/null +++ b/docs/scripts/prettify/lang-css.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", +/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); diff --git a/docs/scripts/prettify/prettify.js b/docs/scripts/prettify/prettify.js new file mode 100644 index 0000000..eef5ad7 --- /dev/null +++ b/docs/scripts/prettify/prettify.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p th:last-child { border-right: 1px solid #ddd; } + +.ancestors, .attribs { color: #999; } +.ancestors a, .attribs a +{ + color: #999 !important; + text-decoration: none; +} + +.clear +{ + clear: both; +} + +.important +{ + font-weight: bold; + color: #950B02; +} + +.yes-def { + text-indent: -1000px; +} + +.type-signature { + color: #aaa; +} + +.name, .signature { + font-family: Consolas, Monaco, 'Andale Mono', monospace; +} + +.details { margin-top: 14px; border-left: 2px solid #DDD; } +.details dt { width: 120px; float: left; padding-left: 10px; padding-top: 6px; } +.details dd { margin-left: 70px; } +.details ul { margin: 0; } +.details ul { list-style-type: none; } +.details li { margin-left: 30px; padding-top: 6px; } +.details pre.prettyprint { margin: 0 } +.details .object-value { padding-top: 0; } + +.description { + margin-bottom: 1em; + margin-top: 1em; +} + +.code-caption +{ + font-style: italic; + font-size: 107%; + margin: 0; +} + +.source +{ + border: 1px solid #ddd; + width: 80%; + overflow: auto; +} + +.prettyprint.source { + width: inherit; +} + +.source code +{ + font-size: 100%; + line-height: 18px; + display: block; + padding: 4px 12px; + margin: 0; + background-color: #fff; + color: #4D4E53; +} + +.prettyprint code span.line +{ + display: inline-block; +} + +.prettyprint.linenums +{ + padding-left: 70px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.prettyprint.linenums ol +{ + padding-left: 0; +} + +.prettyprint.linenums li +{ + border-left: 3px #ddd solid; +} + +.prettyprint.linenums li.selected, +.prettyprint.linenums li.selected * +{ + background-color: lightyellow; +} + +.prettyprint.linenums li * +{ + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.params .name, .props .name, .name code { + color: #4D4E53; + font-family: Consolas, Monaco, 'Andale Mono', monospace; + font-size: 100%; +} + +.params td.description > p:first-child, +.props td.description > p:first-child +{ + margin-top: 0; + padding-top: 0; +} + +.params td.description > p:last-child, +.props td.description > p:last-child +{ + margin-bottom: 0; + padding-bottom: 0; +} + +.disabled { + color: #454545; +} diff --git a/docs/styles/prettify-jsdoc.css b/docs/styles/prettify-jsdoc.css new file mode 100644 index 0000000..5a2526e --- /dev/null +++ b/docs/styles/prettify-jsdoc.css @@ -0,0 +1,111 @@ +/* JSDoc prettify.js theme */ + +/* plain text */ +.pln { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* string content */ +.str { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a keyword */ +.kwd { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a comment */ +.com { + font-weight: normal; + font-style: italic; +} + +/* a type name */ +.typ { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* a literal value */ +.lit { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* punctuation */ +.pun { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* lisp open bracket */ +.opn { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* lisp close bracket */ +.clo { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a markup tag name */ +.tag { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a markup attribute name */ +.atn { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a markup attribute value */ +.atv { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a declaration */ +.dec { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a variable name */ +.var { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* a function name */ +.fun { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; +} diff --git a/docs/styles/prettify-tomorrow.css b/docs/styles/prettify-tomorrow.css new file mode 100644 index 0000000..b6f92a7 --- /dev/null +++ b/docs/styles/prettify-tomorrow.css @@ -0,0 +1,132 @@ +/* Tomorrow Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* Pretty printing styles. Used with prettify.js. */ +/* SPAN elements with the classes below are added by prettyprint. */ +/* plain text */ +.pln { + color: #4d4d4c; } + +@media screen { + /* string content */ + .str { + color: #718c00; } + + /* a keyword */ + .kwd { + color: #8959a8; } + + /* a comment */ + .com { + color: #8e908c; } + + /* a type name */ + .typ { + color: #4271ae; } + + /* a literal value */ + .lit { + color: #f5871f; } + + /* punctuation */ + .pun { + color: #4d4d4c; } + + /* lisp open bracket */ + .opn { + color: #4d4d4c; } + + /* lisp close bracket */ + .clo { + color: #4d4d4c; } + + /* a markup tag name */ + .tag { + color: #c82829; } + + /* a markup attribute name */ + .atn { + color: #f5871f; } + + /* a markup attribute value */ + .atv { + color: #3e999f; } + + /* a declaration */ + .dec { + color: #f5871f; } + + /* a variable name */ + .var { + color: #c82829; } + + /* a function name */ + .fun { + color: #4271ae; } } +/* Use higher contrast and text-weight for printable form. */ +@media print, projection { + .str { + color: #060; } + + .kwd { + color: #006; + font-weight: bold; } + + .com { + color: #600; + font-style: italic; } + + .typ { + color: #404; + font-weight: bold; } + + .lit { + color: #044; } + + .pun, .opn, .clo { + color: #440; } + + .tag { + color: #006; + font-weight: bold; } + + .atn { + color: #404; } + + .atv { + color: #060; } } +/* Style */ +/* +pre.prettyprint { + background: white; + font-family: Consolas, Monaco, 'Andale Mono', monospace; + font-size: 12px; + line-height: 1.5; + border: 1px solid #ccc; + padding: 10px; } +*/ + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; } + +/* IE indents via margin-left */ +li.L0, +li.L1, +li.L2, +li.L3, +li.L4, +li.L5, +li.L6, +li.L7, +li.L8, +li.L9 { + /* */ } + +/* Alternate shading for lines */ +li.L1, +li.L3, +li.L5, +li.L7, +li.L9 { + /* */ } diff --git a/jsdoc.json b/jsdoc.json new file mode 100644 index 0000000..22f598a --- /dev/null +++ b/jsdoc.json @@ -0,0 +1,17 @@ +{ + "source": { + "include": ["./src/"], + "includePattern": ".js$", + "excludePattern": "(node_modules/|docs)" + }, + "plugins": ["plugins/markdown"], + "templates": { + "cleverLinks": true, + "monospaceLinks": true + }, + "opts": { + "recurse": true, + "destination": "./docs/", + "template": "./custom-jsdoc-template/" + } +} diff --git a/package-lock.json b/package-lock.json index fd7d582..29259a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4257,6 +4257,15 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -9771,11 +9780,56 @@ "esprima": "^4.0.0" } }, + "js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "dev": true, + "requires": { + "xmlcreate": "^2.0.4" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, + "jsdoc": { + "version": "3.6.7", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.7.tgz", + "integrity": "sha512-sxKt7h0vzCd+3Y81Ey2qinupL6DpRSZJclS04ugHDNmRUXGzqicMJ6iwayhSA0S0DwwX30c5ozyUthr1QKF6uw==", + "dev": true, + "requires": { + "@babel/parser": "^7.9.4", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.1", + "klaw": "^3.0.0", + "markdown-it": "^10.0.0", + "markdown-it-anchor": "^5.2.7", + "marked": "^2.0.3", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "taffydb": "2.6.2", + "underscore": "~1.13.1" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, "jsdom": { "version": "16.7.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", @@ -9904,6 +9958,15 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -9955,6 +10018,15 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -10126,6 +10198,39 @@ "object-visit": "^1.0.0" } }, + "markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + } + } + }, + "markdown-it-anchor": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", + "dev": true + }, + "marked": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz", + "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==", + "dev": true + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -10141,6 +10246,12 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -13378,6 +13489,15 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "requizzle": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", + "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, "reselect": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.1.tgz", @@ -14944,6 +15064,12 @@ } } }, + "taffydb": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", + "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", + "dev": true + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -15375,6 +15501,12 @@ "is-typedarray": "^1.0.0" } }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -15386,6 +15518,12 @@ "which-boxed-primitive": "^1.0.2" } }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==", + "dev": true + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -17112,6 +17250,12 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, + "xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", + "dev": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index b51c0a6..edb7923 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,8 @@ "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", - "eject": "react-scripts eject" + "eject": "react-scripts eject", + "doc": "jsdoc -c jsdoc.json" }, "eslintConfig": { "extends": [ @@ -41,5 +42,8 @@ "last 1 firefox version", "last 1 safari version" ] + }, + "devDependencies": { + "jsdoc": "^3.6.7" } } diff --git a/src/App.js b/src/App.js index 10a3f2a..be41d06 100644 --- a/src/App.js +++ b/src/App.js @@ -1,14 +1,7 @@ import React, { Fragment } from 'react'; import { Route, Switch, Redirect } from 'react-router-dom'; -import { - NotFound, - Dashboard, - Explore, - Inbox, - New, - LoginPage, -} from './pages/pages'; +import { NotFound, Dashboard, Explore, Inbox, New } from './pages/pages'; import { NavBar, ExploreLayout } from './components/Layouts/Layouts'; const App = () => { return ( @@ -31,7 +24,7 @@ const App = () => { - + diff --git a/src/api/api.js b/src/api/api.js index bda9425..a10383f 100644 --- a/src/api/api.js +++ b/src/api/api.js @@ -1,5 +1,5 @@ import axios from 'axios'; -const { REACT_APP_API_URL: url, REACT_APP_API_KEY: key } = process.env; +//const { REACT_APP_API_URL: url, REACT_APP_API_KEY: key } = process.env; export default axios.create({ - baseURL: `${url}`, + baseURL: 'http://localhost:3000', }); diff --git a/src/assets/Images/.gitignore b/src/assets/Images/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/src/assets/Images/avatar.png b/src/assets/Images/avatar.png new file mode 100644 index 0000000..aa80b89 Binary files /dev/null and b/src/assets/Images/avatar.png differ diff --git a/src/components/Layouts/Explore/Explore.js b/src/components/Layouts/Explore/Explore.js index e8ea331..287b34b 100644 --- a/src/components/Layouts/Explore/Explore.js +++ b/src/components/Layouts/Explore/Explore.js @@ -1,4 +1,4 @@ -import React, { Fragment } from 'react'; +import React from 'react'; import classes from './Explore.module.scss'; const Explore = (props) => { return
    {props.children}
    ; diff --git a/src/components/NewPost/CloseButton.js b/src/components/NewPost/CloseButton.js new file mode 100644 index 0000000..2464184 --- /dev/null +++ b/src/components/NewPost/CloseButton.js @@ -0,0 +1,16 @@ +import React from 'react'; +import { useHistory } from 'react-router-dom'; +import classes from './CloseButton.module.scss'; +const CloseButton = (props) => { + const history = useHistory(); + const closeClickHandler = () => { + history.push('/new'); + }; + return ( + + ); +}; + +export default CloseButton; diff --git a/src/components/NewPost/CloseButton.module.scss b/src/components/NewPost/CloseButton.module.scss new file mode 100644 index 0000000..f0faf47 --- /dev/null +++ b/src/components/NewPost/CloseButton.module.scss @@ -0,0 +1,10 @@ +@import '../../index'; +.close { + color: $color-white; + font-size: 1.3rem; + font-weight: 600; + padding: 0.6rem; + border-radius: 0.2rem; + cursor: pointer; + background-color: rgb(157, 166, 175); +} diff --git a/src/components/NewPost/FormCard.js b/src/components/NewPost/FormCard.js new file mode 100644 index 0000000..f58508b --- /dev/null +++ b/src/components/NewPost/FormCard.js @@ -0,0 +1,39 @@ +import React, { useState } from 'react'; +import classes from './FormCard.module.scss'; +import avatar from '../../assets/Images/avatar.png'; +import { MdSettings } from 'react-icons/md'; +import { IoIosArrowDown } from 'react-icons/io'; + +const FormCard = (props) => { + const [selectedOption, setSelectedOption] = useState('lyousefelshabrawy'); + const [showOptions, setShowOptions] = useState(false); + const toggleOptionsHandler = () => { + setShowOptions((showOptions) => !showOptions); + }; + const selectOptionHandler = (e) => { + setSelectedOption(e.target.getAttribute('value')); + }; + return ( +
    +
    + avatar +
    +
    +
    +
    + {selectedOption} + {showOptions && ( +
      +
    • lyousefelshabrawy
    • +
    • llyousefelshabrawy
    • +
    + )} +
    + +
    + {props.children} +
    +
    + ); +}; +export default FormCard; diff --git a/src/components/NewPost/FormCard.module.scss b/src/components/NewPost/FormCard.module.scss new file mode 100644 index 0000000..3709d80 --- /dev/null +++ b/src/components/NewPost/FormCard.module.scss @@ -0,0 +1,56 @@ +@import '../../index'; +.text { + color: rgb(89, 89, 89); + display: flex; +} +.avatar { + margin-right: 3rem; + border-radius: 0.3rem; + width: 6rem; + height: 6rem; + border-radius: 0.3rem; + overflow: hidden; +} +.form { + background-color: $color-white; + border-radius: 0.3rem; + padding: 1.5rem; + min-height: 14rem; + min-width: 50rem; + header { + display: flex; + justify-content: space-between; + font-weight: 500; + margin-bottom: 1.5rem; + div { + color: $color-black; + font-size: 1.6rem; + cursor: pointer; + display: flex; + align-items: center; + position: relative; + svg { + margin-left: 0.5rem; + margin-bottom: -0.5rem; + } + ul { + color: $color-black; + width: 20rem; + font-size: 1.4rem; + background-color: $color-white; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + box-shadow: 0 3px 10px rgba(0, 0, 0, 0.2); + position: absolute; + left: 0%; + top: 110%; + li { + padding: 0.8rem; + &:hover { + background-color: #eee; + } + } + } + } + } +} diff --git a/src/components/NewPost/PostButton.js b/src/components/NewPost/PostButton.js new file mode 100644 index 0000000..fca11e4 --- /dev/null +++ b/src/components/NewPost/PostButton.js @@ -0,0 +1,30 @@ +import React, { useState } from 'react'; +import { IoIosArrowDown } from 'react-icons/io'; +import classes from './PostButton.module.scss'; +const PostButton = (props) => { + const [selectedOption, setSelectedOption] = useState('Post'); + const [showOptions, setShowOptions] = useState(false); + const toggleOptionsHandler = () => { + setShowOptions((showOptions) => !showOptions); + }; + const selectOptionHandler = (e) => { + setSelectedOption(e.target.getAttribute('value')); + }; + return ( +
    + +
    + + {showOptions && ( +
      +
    • Post now
    • +
    • Save as draft
    • +
    • Post privately
    • +
    + )} +
    +
    + ); +}; + +export default PostButton; diff --git a/src/components/NewPost/PostButton.module.scss b/src/components/NewPost/PostButton.module.scss new file mode 100644 index 0000000..0fcbe8f --- /dev/null +++ b/src/components/NewPost/PostButton.module.scss @@ -0,0 +1,54 @@ +@import '../../index'; +.post { + color: $color-white; + font-size: 1.3rem; + font-weight: 600; + border-radius: 0.2rem; + background-color: rgb(0, 184, 255); + display: flex; + position: relative; + + button { + padding: 0.6rem; + border-radius: 0.2rem; + cursor: pointer; + background-color: inherit; + font-size: inherit; + color: inherit; + font-weight: inherit; + border-right: 1.5px solid rgba($color-white, 0.6); + &:disabled { + cursor: default; + color: rgba($color-white, 0.6); + } + } + div { + padding: 0 0.6rem; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + &:active { + background-color: rgb(33, 129, 167); + } + ul { + color: $color-black; + width: 12rem; + font-weight: 400; + font-size: 1.4rem; + background-color: $color-white; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + box-shadow: 0 3px 10px rgba(0, 0, 0, 0.2); + position: absolute; + left: 0%; + top: 110%; + li { + padding: 0.6rem; + &:hover { + background-color: #eee; + } + } + } + } +} diff --git a/src/helpers/.gitignore b/src/helpers/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/src/helpers/isValidHttpUrl.js b/src/helpers/isValidHttpUrl.js new file mode 100644 index 0000000..8b54233 --- /dev/null +++ b/src/helpers/isValidHttpUrl.js @@ -0,0 +1,12 @@ +const isValidHttpUrl = (string) => { + let url; + + try { + url = new URL(string); + } catch (_) { + return false; + } + + return url.protocol === 'http:' || url.protocol === 'https:'; +}; +export default isValidHttpUrl; diff --git a/src/index.scss b/src/index.scss index a554bf4..a195a09 100644 --- a/src/index.scss +++ b/src/index.scss @@ -1,10 +1,10 @@ -// TODOs -// Get the real fonts and colors or of the real tumblr +// TODO: Get the real fonts and colors or of the real tumblr + @import url('https://fonts.googleapis.com/css2?family=Rubik:wght@300;400;500;600;700;800;900&display=swap'); /*****************************************Variables********************************************/ //RGB Colors -$color-primary: rgb(28, 231, 131); +$color-primary: rgb(0, 25, 53); $color-primary-light: lighten($color-primary, 0.15); $color-primary-dark: darken($color-primary, 0.15); $color-secondary: #ffb900; @@ -25,7 +25,14 @@ $color-black: #000; $default-font-size: 1.6rem; $default-font-color: $color-black; $default-font-weight: 500; - +//Post Colors +$bg-color-text: rgb(255, 255, 255); +$bg-color-photo: rgb(255, 73, 47); +$bg-color-quote: rgb(255, 138, 0); +$bg-color-link: rgb(0, 207, 53); +$bg-color-chat: rgb(0, 184, 255); +$bg-color-audio: rgb(124, 92, 255); +$bg-color-video: rgb(255, 98, 206); /*****************************************Useful Mixins******************************************/ @mixin clearfix { &::after { @@ -123,12 +130,14 @@ a { outline: none; } } + button { border: none; &:focus { outline: none; } } + ul { list-style-type: none; } diff --git a/src/pages/New/Audio/Audio.js b/src/pages/New/Audio/Audio.js new file mode 100644 index 0000000..c29f4a4 --- /dev/null +++ b/src/pages/New/Audio/Audio.js @@ -0,0 +1,88 @@ +/** + * This is the /new/audio page + * @module Audio + * @author Yousef Elshabrawy + */ + +import React, { useState, useEffect } from 'react'; +import classes from './Audio.module.scss'; +import { ImHeadphones } from 'react-icons/im'; +import api from '../../../api/api'; +import FormCard from '../../../components/NewPost/FormCard'; +import PostButton from '../../../components/NewPost/PostButton'; +import CloseButton from '../../../components/NewPost/CloseButton'; +import isValidHttpUrl from '../../../helpers/isValidHttpUrl'; + +const Audio = (props) => { + const [uploadedAudio, setUploadedAudio] = useState(null); + const [link, setLink] = useState(''); + const [formIsValid, setFormIsValid] = useState(false); + //To know the source of the Audio + const [audioFromPC, setAudioFromPC] = useState(false); + + useEffect(() => { + if (uploadedAudio || isValidHttpUrl(link)) setFormIsValid(true); + else setFormIsValid(false); + }, [uploadedAudio, link]); + const audioChangeHandler = (e) => { + setUploadedAudio(e.target.files[0]); + }; + const linkChangeHandler = (e) => { + setLink(e.target.value); + }; + const formSubmitHandler = async (e) => { + console.log(uploadedAudio); + //Submission will depend on the source of the Audio But how do you know the source ??? + e.preventDefault(); + if (!formIsValid) return; + try { + //Here audioFromPC is not gurentee that it's from the pc, + if (audioFromPC) { + //file + const fd = new FormData(); + fd.append('id', 7); + fd.append('audio', uploadedAudio); + // console.log(Array.from(fd)); + // await api.post('/photo', fd); + console.log(JSON.stringify(Array.from(fd))); + await api.post('/photo', { photo: JSON.stringify(Array.from(fd)) }); + } else { + //link + } + } catch (err) { + if (err.response) { + console.log(err.response); + } else { + console.log(err); + } + } + setUploadedAudio(null); + setLink(''); + }; + return ( + +
    +
    + +
    + + +
    +
    +
    + + +
    +
    +
    + ); +}; +export default Audio; diff --git a/src/pages/New/Audio/Audio.module.scss b/src/pages/New/Audio/Audio.module.scss new file mode 100644 index 0000000..35321a9 --- /dev/null +++ b/src/pages/New/Audio/Audio.module.scss @@ -0,0 +1,37 @@ +@import '../../../index.scss'; + +.form { + display: flex; + flex-direction: column; + + .control { + display: flex; + justify-content: space-between; + align-items: center; + input { + outline: none; + border: none; + margin: 1.5rem 0; + font-size: 1.6rem; + width: 95%; + } + .icon { + position: relative; + width: 5%; + input { + position: absolute; + top: -50%; + left: 0; + width: 100%; + opacity: 0; + } + } + } + .actions { + border-top: 1px solid rgb(233, 232, 232); + padding-top: 1rem; + display: flex; + justify-content: space-between; + align-items: center; + } +} diff --git a/src/pages/New/Chat/Chat.js b/src/pages/New/Chat/Chat.js new file mode 100644 index 0000000..3d3231c --- /dev/null +++ b/src/pages/New/Chat/Chat.js @@ -0,0 +1,72 @@ +/** + * This is the /new/chat page + * @module Chat + * @author Yousef Elshabrawy + */ + +import React, { useState, useEffect } from 'react'; +import classes from './Chat.module.scss'; +import FormCard from '../../../components/NewPost/FormCard'; +import PostButton from '../../../components/NewPost/PostButton'; +import CloseButton from '../../../components/NewPost/CloseButton'; +import api from '../../../api/api'; +const Chat = (props) => { + const [title, setTitle] = useState(''); + const [chat, setChat] = useState('How are you. mohamed: I,m fine.'); + const [tags, setTags] = useState(''); + const [formIsValid, setFormIsValid] = useState(false); + useEffect(() => { + if (chat.trim() === '') setFormIsValid(false); + else setFormIsValid(true); + }, [chat]); + const titleChangeHandler = (e) => { + setTitle(e.target.value); + }; + const chatChangeHandler = (e) => { + setChat(e.target.value); + }; + const tagsChangeHandler = (e) => { + setTags(e.target.value); + }; + const formSubmitHandler = async (e) => { + e.preventDefault(); + if (!formIsValid) return; + try { + await api.post('/chat', { id: chat.length, title, chat, tags }); + console.log('chat is added'); + } catch (err) { + if (err.response) { + console.log('NOT in the 200 range'); + } else { + console.log('error'); + } + } + setTitle(''); + setChat(''); + setTags(''); + }; + return ( + +
    + +