link_parser.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. function parse_link(data) {
  2. if (data == null) {
  3. return "";
  4. }
  5. var html = data;
  6. var recommendedWidth = 400;
  7. var recommendedHeight = 300;
  8. var extraViewClasses = "";
  9. var sourceLink = null;
  10. var plainText = false;
  11. var genericEmbedMatcher = /embed\:(https?\:\/\/[^ <]+)/;
  12. var genericUriMatcher = /(https?\:\/\/[^ <]+)/;
  13. var type = "unknown";
  14. var provider_name = "unknown";
  15. isDataFileUrl = function(url) {
  16. var file, suffix;
  17. try {
  18. if (url.split("/").length < 4) {
  19. return false;
  20. }
  21. file = _.last(url.split("/"));
  22. if (file.indexOf(".") < 0) {
  23. return false;
  24. }
  25. suffix = _.last(file.split("."));
  26. if (!suffix) {
  27. return false;
  28. }
  29. if (_.include(["png", "jpg", "jpeg", "gif", "zip", "rar", "7z", "tar", "tgz", "gz", "xls", "xlsx", "doc", "docx", "ppt", "pptx", "mp3", "ogg", "oga", "ogv", "pdf", "dmg", "exe", "iso", "dxf", "ipa", "mov", "wmv", "wma", "wav", "aiff", "mp4", "m4a", "prg", "bin", "dat", "psd", "ai", "eps", "key"], suffix)) {
  30. return true;
  31. }
  32. } catch (_error) {}
  33. return false;
  34. };
  35. if (m = data.match(genericEmbedMatcher)) {
  36. embedUri = m[1];
  37. html = "<iframe width='100%' height='100%' src=\"" + embedUri + "\" seamless=\"1\" allowfullscreen=\"1\"></iframe>";
  38. recommendedWidth = 640 / 2;
  39. recommendedHeight = 390 / 2;
  40. sourceLink = embedUri;
  41. extraViewClasses = "external-embed";
  42. } else if (data.match(/http/) && data.replace(/[^<]/g, "").length < 3) {
  43. youtubeMatcher = /youtube\.com\/.*v=([^&<]+)/;
  44. youtubeMatcher2 = /youtu\.be\/([^&<]+)/;
  45. soundcloudMatcher = /soundcloud\.com\/([^<]+)/;
  46. vimeoMatcher = /vimeo.com\/([^<]*)/;
  47. dailyMotionMatcher = /dailymotion.com\/video\/([^<]*)/;
  48. googleMapsMatcher = /google.com\/maps\?([^<]*)/;
  49. spacedeckMatcher = new RegExp(location.host + "\/(spaces|folders)\/([0-9a-f]{24})");
  50. if (m = data.match(youtubeMatcher) || (m = data.match(youtubeMatcher2))) {
  51. videoId = m[1];
  52. html = "<iframe src=\"https://www.youtube.com/embed/" + videoId + "?html5=1&rel=0&showinfo=0&autohide=1\" frameborder=\"0\" allowfullscreen=\"1\"></iframe>";
  53. recommendedWidth = 640 / 2;
  54. recommendedHeight = 390 / 2;
  55. provider_name = "youtube";
  56. type = "video";
  57. } else if (m = data.match(dailyMotionMatcher)) {
  58. videoId = m[1];
  59. html = "<iframe src=\"https://www.dailymotion.com/embed/video/" + videoId + "\" frameborder=\"0\"></iframe>";
  60. recommendedWidth = 536 / 2;
  61. recommendedHeight = 302 / 2;
  62. provider_name = "dailymotion";
  63. type = "video";
  64. } else if (m = data.match(vimeoMatcher)) {
  65. videoId = m[1];
  66. html = "<iframe src=\"https://player.vimeo.com/video/" + videoId + "\" frameborder=\"0\"></iframe>";
  67. recommendedWidth = 536 / 2;
  68. recommendedHeight = 302 / 2;
  69. provider_name = "vimeo";
  70. type = "video";
  71. } else if (m = data.match(soundcloudMatcher)) {
  72. var scurl = "https://" + m[0];
  73. var url;
  74. if (m[0].indexOf("soundcloud.com/player")>=0) {
  75. url = "https://w." + m[0];
  76. } else {
  77. url = "https://w.soundcloud.com/player/?url="+encodeURI(scurl);
  78. }
  79. html = "<iframe scrolling=\"no\" frameborder=\"no\" src=\"" + url + "\"></iframe>";
  80. recommendedWidth = 720 / 2;
  81. recommendedHeight = 184;
  82. sourceLink = scurl;
  83. provider_name = "soundcloud";
  84. type = "audio";
  85. } else if ((m = data.match(googleMapsMatcher))) {
  86. mapsParams = m[1];
  87. html = "<iframe src=\"https://maps-api-ssl.google.com/maps?" + mapsParams + "\" seamless=\"1\" allowfullscreen=\"1\"></iframe>";
  88. recommendedWidth = 640 / 2;
  89. recommendedHeight = 390 / 2;
  90. provider_name = "google";
  91. type = "map";
  92. } else if ((m = data.match(genericUriMatcher)) && !isDataFileUrl(m[1])) {
  93. uri = m[1];
  94. grabUri = uri;
  95. endPoint = "/api/webgrabber/" + (encodeURIComponent(btoa(grabUri)));
  96. html = data.replace(uri, " <img src=\"" + endPoint + "\" title=\"" + uri + "\"/> ");
  97. recommendedWidth = 300;
  98. recommendedHeight = 300;
  99. sourceLink = uri;
  100. } else {
  101. plainText = true;
  102. }
  103. } else {
  104. plainText = true;
  105. }
  106. if (plainText) {
  107. // replace links with clickable links
  108. return null;
  109. }
  110. result = {
  111. html: html,
  112. thumbnail_width: recommendedWidth,
  113. thumbnail_height: recommendedHeight,
  114. type: type,
  115. provider_name: provider_name,
  116. url: sourceLink
  117. };
  118. return result;
  119. };