X-Git-Url: http://these/git/?a=blobdiff_plain;f=ui%2Fsrc%2Futils.ts;h=89be9e2bfb781c828a2f74a7e820c1815975906b;hb=988eef2e6575f5e47b71489791ae0cb1b16730d8;hp=53d630ce8bc057ad8b980a822555a0a9aace53e8;hpb=9cb10f7258ece889262f30ff4f3d6642acbb6882;p=lemmy.git diff --git a/ui/src/utils.ts b/ui/src/utils.ts index 53d630ce..89be9e2b 100644 --- a/ui/src/utils.ts +++ b/ui/src/utils.ts @@ -1,3 +1,12 @@ +import 'moment/locale/es'; +import 'moment/locale/eo'; +import 'moment/locale/de'; +import 'moment/locale/zh-cn'; +import 'moment/locale/fr'; +import 'moment/locale/sv'; +import 'moment/locale/ru'; +import 'moment/locale/nl'; + import { UserOperation, Comment, User, SortType, ListingType } from './interfaces'; import * as markdown_it from 'markdown-it'; declare var markdownitEmoji: any; @@ -11,7 +20,7 @@ export function msgOp(msg: any): UserOperation { } var md = new markdown_it({ - html: true, + html: false, linkify: true, typographer: true }).use(markdown_it_container, 'spoiler', { @@ -85,6 +94,16 @@ export function isImage(url: string) { return imageRegex.test(url); } +export function validURL(str: string) { + var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name + '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path + '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string + '(\\#[-a-z\\d_]*)?$','i'); // fragment locator + return !!pattern.test(str); +} + export let fetchLimit: number = 20; export function capitalizeFirstLetter(str: string): string { @@ -118,3 +137,73 @@ export async function getPageTitle(url: string) { return data; } +export function debounce(func: any, wait: number = 500, immediate: boolean = false) { + // 'private' variable for instance + // The returned function will be able to reference this due to closure. + // Each call to the returned function will share this common timer. + let timeout: number; + + // Calling debounce returns a new anonymous function + return function() { + // reference the context and args for the setTimeout function + var context = this, + args = arguments; + + // Should the function be called now? If immediate is true + // and not already in a timeout then the answer is: Yes + var callNow = immediate && !timeout; + + // This is the basic debounce behaviour where you can call this + // function several times, but it will only execute once + // [before or after imposing a delay]. + // Each time the returned function is called, the timer starts over. + clearTimeout(timeout); + + // Set the new timeout + timeout = setTimeout(function() { + + // Inside the timeout function, clear the timeout variable + // which will let the next execution run when in 'immediate' mode + timeout = null; + + // Check if the function already ran with the immediate flag + if (!immediate) { + // Call the original function with apply + // apply lets you define the 'this' object as well as the arguments + // (both captured before setTimeout) + func.apply(context, args); + } + }, wait); + + // Immediate mode and no wait timer? Execute the function.. + if (callNow) func.apply(context, args); + } +} + +export function getLanguage(): string { + return (navigator.language || navigator.userLanguage); +} + +export function getMomentLanguage(): string { + let lang = getLanguage(); + if (lang.startsWith('zh')) { + lang = 'zh-cn'; + } else if (lang.startsWith('sv')) { + lang = 'sv'; + } else if (lang.startsWith('fr')) { + lang = 'fr'; + } else if (lang.startsWith('de')) { + lang = 'de'; + } else if (lang.startsWith('ru')) { + lang = 'ru'; + } else if (lang.startsWith('es')) { + lang = 'es'; + } else if (lang.startsWith('eo')) { + lang = 'eo'; + } else if (lang.startsWith('nl')) { + lang = 'nl'; + } else { + lang = 'en'; + } + return lang; +}