5Mi / wumi_blog

for recording improvimg my experience
21 stars 0 forks source link

convertToValidEmbedCode #84

Open 5Mi opened 6 years ago

5Mi commented 6 years ago

嵌入第三方外链 (验证并处理成 iframe)

项目要实现发布的文章加外链的功能,从机核网上扒了段代码,帮大忙了

混淆过的代码真是太难读了

function () {
    "use strict";
    //e 规则
    var e = {
      bilibili: {
        source: /^(https?:)?\/\/www\.bilibili\.com\/video\/av(\d+)(\/?.*)?/,
        embedSrc: /^(https?:)?\/\/www\.bilibili\.com\/html\/player\.html/,
        isVideo: !0
      },
      bilibiliEmbed: {
        embedSrc: /^(https?:)?\/\/static\.hdslb\.com\/miniloader\.swf/,
        useFlash: !0,
        isVideo: !0
      },
      bilibiliBalckboard: {
        embedSrc: /^(https?:)?\/\/www\.bilibili\.com\/blackboard\/player\.html/,
        isVideo: !0
      },
      bilibiliAfterPlay: {
        embedSrc: /^(https?:)?\/\/player\.bilibili\.com\/player\.html.+/,
        isVideo: !0
      },
      steam: {
        source: /^(https?:)?\/\/store\.steampowered\.com\/app\/(\d+)/,
        embedSrc: /^(https?:)?\/\/store\.steampowered\.com\/widget\/.+/
      },
      "163music": {
        source: /^(https?:)?\/\/music\.163\.com\/#\/(playlist|song)\?id=(\d+)/,
        embedSrc: /^(https?:)?\/\/music\.163\.com\/outchain\/player\?.+/
      },
      youku: {
        source: /^(https?:)?\/\/v\.youku\.com\/v_show\/id_(.+)\.html/,
        embedSrc: /^(https?:)?\/\/player\.youku\.com\/embed\/.+/,
        isVideo: !0
      },
      miaopai: {
        source: /^(https?:)?\/\/www.miaopai.com\/show\/(.+)\.htm/,
        embedSrc: /^(https?:)?\/\/v\.miaopai\.com\/iframe\?.+/,
        onlyHttps: !0,
        isVideo: !0
      },
      qqvideo: {
        source: /^(https?:)?\/\/v\.qq\.com\/x\/page\/(.+)\.html/,
        embedSrc: /^(https?:)?\/\/v\.qq\.com\/iframe\/player\.html\?.+/,
        isVideo: !0
      },
      taptap: {
        source: /^(https?:)?\/\/www\.taptap\.com\/app\/(\d+)/,
        embedSrc: /^(https?:)?\/\/www\.taptap\.com\/widget\/(\d+)/
      },
      tudou: {
        source: /^(https?:)?\/\/www\.tudou\.com/,
        deprecated: !0,
        isVideo: !0
      },
      acfun: {
        source: /^(https?:)?\/\/www\.acfun\.cn/,
        deprecated: !0,
        isVideo: !0
      },
      twitchRecord: {
        source: /^(https?:)?\/\/www\.twitch\.tv\/videos\/(\d+)(\?t=.+)?/,
        embedSrc: /^(https?:)?\/\/player\.twitch\.tv\/\?.*video=v\d+/,
        isVideo: !0
      },
      twitch: {
        source: /^(https?:)?\/\/www\.twitch\.tv\/([^\/]+)$/,
        embedSrc: /^(https?:)?\/\/player\.twitch\.tv\/\?.*channel=.+/,
        isVideo: !0
      },
      taptapPlayer: {
        source: /^(https?:)?\/\/www\.taptap\.com\/video\/(\d+)\/embed.*/,
        embedSrc: /^(https?:)?\/\/www\.taptap\.com\/video\/(\d+)\/embed/,
        isVideo: !0
      }
    }
    // 规则 含name
    var t = Object.keys(e).map(function (t) {
      return e[t].name = t,
        e[t]
    })
    var i = function (e) {
      return e.trim()
    }
    //  i为 sourceUrl or embedSrc
    var n = function (e, i, n) {
      t.forEach(function (t) {
        var o = t[i];
        if (o) {
          var s = o.exec(e);
          if (s) {
            n(t, s)
            return false
          }
        }
        return true
      })
    }
    //是否以 http开头  
    var o = function (e) {
      return /^(https?:)?\/\//i.test(e)
    }
    //非http开头时  是哪种element  
    var s = function (e) {
      if ("undefined" == typeof document)
        return null;
      var t = document.createElement("div");
      if (t.innerHTML = e,
        1 === t.childNodes.length) {
        var i = t.childNodes[0];
        return /OBJECT|IFRAME|EMBED/.test(i.tagName) ? i : null
      }
      return null
    }
    //取element的src  
    var r = function (e) {
      var t = s(e);
      if (t) {
        var i = t.getAttribute("src");
        if (i)
          return i
      }
      return null
    }
    //embed时 获取规则类型
    var a = function (e) {
      var t = r(e)
      var i = null

      n(t, "embedSrc", function (e) {
        i = e.name
      })
      return t ? i : null
    }
    // 根据规则类型 和 匹配到的正则分组  返回统一iframe 
    var l = function (e, t) {
      var i = t[0]
        , n = void 0;
      switch (e) {
        case "bilibili":
          n = '<iframe src="https://www.bilibili.com/html/player.html?aid=$$aid$$&wmode=transparent&as_wide=1&autoplay=true&page=$$page$$" frameborder="0" width="646" height="190"></iframe>';
          var o = i.match(/p=(\d+)/) || i.match(/page=(\d+)/)
            , s = o ? o[1] : 1;
          return n.replace("$$aid$$", t[2]).replace("$$page$$", s);
        case "steam":
          return n = '<iframe src="//store.steampowered.com/widget/$$id$$/" frameborder="0" width="646" height="190"></iframe>',
            n.replace("$$id$$", t[2]);
        case "163music":
          n = '<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=$$height1$$ src="//music.163.com/outchain/player?type=$$type$$&id=$$id$$&auto=0&height=$$height2$$"></iframe>';
          var r = "playlist" === t[2] ? 0 : 2
            , a = "playlist" === t[2] ? 430 : 66;
          return n.replace("$$type$$", r).replace("$$id$$", t[3]).replace("$$height1$$", a + 20).replace("$$height2$$", a);
        case "youku":
          return n = '<iframe height="400" width="680" src="//player.youku.com/embed/$$id$$" frameborder="0" allowfullscreen=""></iframe>',
            n.replace("$$id$$", t[2]);
        case "qqvideo":
          return n = '<iframe frameborder="0" width="640" height="498" src="//v.qq.com/iframe/player.html?vid=$$id$$&tiny=0&auto=0" allowfullscreen></iframe>',
            n.replace("$$id$$", t[2]);
        case "taptap":
          return n = '<iframe src="https://www.taptap.com/widget/$$id$$" frameborder="0" width="100%" height="90px"></iframe>',
            n.replace("$$id$$", t[2]);
        case "twitchRecord":
          return n = '<iframe src="https://player.twitch.tv/?autoplay=false$$t$$&video=v$$id$$" frameborder="0" allowfullscreen="true" scrolling="no" height="378" width="100%"></iframe>',
            n.replace("$$id$$", t[2]).replace("$$t$$", t[3] || "");
        case "twitch":
          return n = '<iframe src="https://player.twitch.tv/?channel=$$channel$$" frameborder="0" allowfullscreen="true" scrolling="no" height="378" width="100%"></iframe>',
            n.replace("$$channel$$", t[2]);
        case "taptapPlayer":
          return n = '<iframe src="$$src$$" frameborder="0" allowfullscreen="true" scrolling="no" height="378" width="100%"></iframe>',
            n.replace("$$src$$", t[0]);
        case "miaopai":
          return n = '<iframe src="https://v.miaopai.com/iframe?scid=$$scid$$" frameborder="0" allowfullscreen="true" scrolling="no" height="378" width="100%"></iframe>',
            n.replace("$$scid$$", t[2]);
        default:
          return null
      }
    }

    // if以http开头return结果iframe
    // else 返回哪种element
    var c = function (e) {
      // 以http开头
      if (o(e)) {
        var t = null;
        n(e, "source", function (e, i) {
          t = l(e.name, i)
        })
        //返回 处理后的iframe
        return t
      }
      //embed
      return s(e) ? e : null
    }
    // deprecated  return 带name规则
    var u = function (e) {
      var t = null;
      o(e) && n(e, "source", function (e) {
        e.deprecated && (t = e)
      })
      return t
    }
    //  
    var d = function (t, n) {
      //i trim一下
      var o = i(t)
      var s = c(o, n);
      if (s) {
        var r = a(s);
        //r 为规则类型
        //s 为element元素
        if (r) {
          var l = e[r]
            , d = l.useFlash
            , h = l.isVideo
            , f = s.replace("'allowfullscreen'", "allowfullscreen").replace(/http:\/\//, "https://");
          return h && (f.indexOf("allowfullscreen") < 0 && (f = f.replace(/^<([^ ]+) /, "<$1 allowfullscreen ")),
            "bilibiliBalckboard" !== r && "bilibili" !== r || f.indexOf("as_wide=") < 0 && (f = f.replace(/src="([^"]+)"/, 'src="$1&as_wide=1"'))),
            {
              useFlash: d,
              isVideo: h,
              code: f
            }
        }
        return null
      }
      var p = u(o);
      return n && p ? {
        isVideo: !0,
        useFlash: !1,
        code: '<a class="embedJump" href="' + o + '" target="_blank">' + p.name + " \u63d0\u4f9b\u7684\u63a7\u4ef6\uff0c\u70b9\u51fb\u67e5\u770b</a>"
      } : null
    };
    window.EmbedMana = {
      //暴露出
      convertToValidEmbedCode: d,
      tip: "\u76ee\u524d bilibili\u3001steam\u3001\u7f51\u6613\u4e91\u97f3\u4e50\u3001\u4f18\u9177\u3001\u817e\u8baf\u89c6\u9891\u3001Twitch\u3001TapTap \u652f\u6301\u539f\u7f51\u5740\u89e3\u6790\uff1b\u79d2\u62cd\u4ec5\u652f\u6301 iframe \u5d4c\u5165\u3002"
    }
  }
//返回形如
{
useFlash: Boolean,
isVideo: Boolean,
code: '<iframe>'
}