]> Untitled Git - lemmy.git/blobdiff - ui/src/utils.ts
Adding emoji support.
[lemmy.git] / ui / src / utils.ts
index 53d630ce8bc057ad8b980a822555a0a9aace53e8..89be9e2bfb781c828a2f74a7e820c1815975906b 100644 (file)
@@ -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;
+}