【问题标题】:Display HTML badge on GitHub README在 GitHub README 上显示 HTML 徽章
【发布时间】:2021-12-04 05:37:00
【问题描述】:

我有一个超链接的 Strava 徽章,我想将它嵌入到 GitHub README 中。但是,它不会在 GitHub 上正常显示,但它可以在在线 HTML 编辑器上运行(例如,https://html-online.com/editor/)。我不确定这个问题是否特定于 GitHub Flavored Markdown (GFM) 格式,为此我可能需要将我的 HTML 源代码转换为 GFM 版本。怎么了?

这是我直接从我的 Strava 个人资料设置中复制的 Strava 徽章的 HTML 源代码:

<a style="display:inline-block;background-color:#FC5200;color:#fff;padding:5px 10px 5px 30px;font-size:11px;font-family:Helvetica, Arial, sans-serif;white-space:nowrap;text-decoration:none;background-repeat:no-repeat;background-position:10px center;border-radius:3px;background-image:url('http://badges.strava.com/logo-strava-echelon.png')" href='http://strava.com/athletes/8882041/badge' target="_clean">
  Follow me on
  <img src='http://badges.strava.com/logo-strava.png' alt='Strava' style='margin-left:2px;vertical-align:text-bottom' height=13 width=51 />
</a>

当前错误输出:
https://github.com/hmhuang0501/Strava-Tool/blob/master/README.md

【问题讨论】:

    标签: html github


    【解决方案1】:

    上面的答案是正确的,stylescript 标签会在渲染之前被剥离。但是有一个技巧:你可以使用支持&lt;foreignObject&gt;标签的svg来渲染html,它支持&lt;style&gt;

    Checkout this repo 使用这个技巧来渲染 css,这个 repo 还提供了额外的解释

    由于您的 html 代码使用外部图像,因此您需要将这些图像转换为 base64 以将其直接嵌入到 svg 中,如下所示用于 css:

    background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAATCAYAAACgADyUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAUdEVYdENyZWF0aW9uIFRpbWUANi80LzE0kRMgQQAAAN1JREFUOI2VkbENAjEMRb/p6GCDk1iAhhKJil2YgYYBGOJaVqDhJEpuBcQGiI7yUeCgEHwHuIkc/+cXKVJQwAYYdcwEhIOKZ23+BWsHb5E1BDMbXdYusC7AG1D1gsCUuOpvYJOFLwVchSCwKIPAIbKWYFOGgmXTNzCyZdtza1OCH7ae71kk2Mp/8sFE0srbnZmd/H4taSypHUSgmZ0ltd4uHZo5JEn7EExDP8cOLb1vJV07QTO7Jqs/9WWTpD7jKwRsk80X9oMeOnp7z57/1Zisd0nHZPu5gDkwzHo9ADWCdl4uXrJLAAAAAElFTkSuQmCC')
    

    对于img

    <img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAANCAYAAAAE0Vb3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAUdEVYdENyZWF0aW9uIFRpbWUANi80LzE0kRMgQQAAAoZJREFUSIndll9ojXEYx7+vkW1NlGgrWnYu/GcaIvlzYw2llJtJCIkbblwqEq7WtrRE/pyyCKHN8jdTwy7masO2ooULuXHjz9RwzsfF+7zOc17HMTe72FNvv/f3+X2f8zzP7/09v04AaFQaUAXsBrYBi0cg3nobi4apL7axBhhj77+fwECZpNOSVkuaIAlJg5L6JJ2SVCWpOk+cl5K+SlrmY0tKSXonqTUIgnOxxGZLui2pUlKFpGuSfkp6GgTBHqerl1QjaaykXZK6LK8tQRA8yzpZwDjgIRkbItsuAnfIb2+Ajn9ommPFXDXeaPNOp11pbKFjz40dsfm9+JcRsAT4ZIIUsBOYBewALpnDdqAJOAMMugCXgZPAQaDd8W6gzhL2mzPTfm+RY0PAVGCBYx2mu+XYKqAE+BJjWcWUEu5sZGlgAGgGNuc4t++dttTxR44fd7zP8Spjd8m2pPFWxxqAH7HiGmJ+nVnFmGgF0EtuawfGm64E+ODW5vylmAHgOtBlmxOxAmB5jhgpYAaQcHpvlcAU/mwBgA3xYgqtoKXAAaAF+O4c1v5nMXHrBBKme2JsCKh3mpu23hzzbTN+wbFG4LO9d+OO2XQy5/0GsA/YS6aPINOQwy3mLPDYzVtMU50jed/4c4EysjcyAZQTfj2AHvNLOs2mqJgT5LcHQIEr5qMP7orxydcCk4Fvjh2NJT7P/NY4FvVGk82jC6jNaTYaqyDTUz1ASZRIOXDInLqBF8B9YH9UiOmKCa/gPnsSbi3p+FZjtYS92Au8BV7bel3sUjlv/BUwH5hE2GPTLOl+W78S8ztsvB84ppEywuYvGIauyMZ1Nham0+kgj17V4TgxYBT9N/sF4HNz+m6JZH4AAAAASUVORK5CYII='/>
    

    那么您的 svg 将如下所示:

    徽章.svg

    <svg fill="none" viewBox="0 0 160 23" width="160" height="23" xmlns="http://www.w3.org/2000/svg">
        <foreignObject width="100%" height="100%">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <style>
                    a {
                        display:inline-block;
                        background-color:#FC5200;
                        color:#fff;
                        padding:5px 10px 5px 30px;
                        font-size:11px;
                        font-family:Helvetica, Arial, sans-serif;
                        white-space:nowrap;
                        text-decoration:none;
                        background-repeat:no-repeat;
                        background-position:10px center;
                        border-radius:3px;
                        background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAATCAYAAACgADyUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAUdEVYdENyZWF0aW9uIFRpbWUANi80LzE0kRMgQQAAAN1JREFUOI2VkbENAjEMRb/p6GCDk1iAhhKJil2YgYYBGOJaVqDhJEpuBcQGiI7yUeCgEHwHuIkc/+cXKVJQwAYYdcwEhIOKZ23+BWsHb5E1BDMbXdYusC7AG1D1gsCUuOpvYJOFLwVchSCwKIPAIbKWYFOGgmXTNzCyZdtza1OCH7ae71kk2Mp/8sFE0srbnZmd/H4taSypHUSgmZ0ltd4uHZo5JEn7EExDP8cOLb1vJV07QTO7Jqs/9WWTpD7jKwRsk80X9oMeOnp7z57/1Zisd0nHZPu5gDkwzHo9ADWCdl4uXrJLAAAAAElFTkSuQmCC')
                    }
                    img {
                        margin-left:2px;
                        vertical-align:text-bottom
                    }
                </style>
                    <a> Follow me on
                    <img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAANCAYAAAAE0Vb3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAUdEVYdENyZWF0aW9uIFRpbWUANi80LzE0kRMgQQAAAoZJREFUSIndll9ojXEYx7+vkW1NlGgrWnYu/GcaIvlzYw2llJtJCIkbblwqEq7WtrRE/pyyCKHN8jdTwy7masO2ooULuXHjz9RwzsfF+7zOc17HMTe72FNvv/f3+X2f8zzP7/09v04AaFQaUAXsBrYBi0cg3nobi4apL7axBhhj77+fwECZpNOSVkuaIAlJg5L6JJ2SVCWpOk+cl5K+SlrmY0tKSXonqTUIgnOxxGZLui2pUlKFpGuSfkp6GgTBHqerl1QjaaykXZK6LK8tQRA8yzpZwDjgIRkbItsuAnfIb2+Ajn9ommPFXDXeaPNOp11pbKFjz40dsfm9+JcRsAT4ZIIUsBOYBewALpnDdqAJOAMMugCXgZPAQaDd8W6gzhL2mzPTfm+RY0PAVGCBYx2mu+XYKqAE+BJjWcWUEu5sZGlgAGgGNuc4t++dttTxR44fd7zP8Spjd8m2pPFWxxqAH7HiGmJ+nVnFmGgF0EtuawfGm64E+ODW5vylmAHgOtBlmxOxAmB5jhgpYAaQcHpvlcAU/mwBgA3xYgqtoKXAAaAF+O4c1v5nMXHrBBKme2JsCKh3mpu23hzzbTN+wbFG4LO9d+OO2XQy5/0GsA/YS6aPINOQwy3mLPDYzVtMU50jed/4c4EysjcyAZQTfj2AHvNLOs2mqJgT5LcHQIEr5qMP7orxydcCk4Fvjh2NJT7P/NY4FvVGk82jC6jNaTYaqyDTUz1ASZRIOXDInLqBF8B9YH9UiOmKCa/gPnsSbi3p+FZjtYS92Au8BV7bel3sUjlv/BUwH5hE2GPTLOl+W78S8ztsvB84ppEywuYvGIauyMZ1Nham0+kgj17V4TgxYBT9N/sF4HNz+m6JZH4AAAAASUVORK5CYII='/>
                    </a>
            </div>
        </foreignObject>
    </svg>
    

    然后在您的自述文件中,使用&lt;img&gt; 标签来呈现 svg,并将其包含在 &lt;a&gt; 标签中:

    README.md

    # test-repo
    
    <a href="https://www.strava.com/athletes/94166049"><img src="badge.svg"></a>
    
    Description of the repo
    

    我在这个 repo 中设置了这个例子:https://github.com/bertrandmartel/css-readme

    【讨论】:

      【解决方案2】:

      您在 style 属性中使用 CSS,而 GitHub 不支持。

      当 GitHub 呈现 HTML 时,无论是来自 Markdown、AsciiDoc、另一种文本格式还是 HTML 本身,它都会清理 HTML 以删除 CSS 和 JavaScript。这是因为这两种格式会导致各种问题:

      • 在各种背景和大小的情况下,内容可能难以阅读,这可能会导致可访问性问题。法律要求 GitHub 必须可供访问。
      • 内容可能会尝试隐藏自身,以包含对计算机(例如搜索引擎)可见但对人类不可见的垃圾内容或辱骂性内容。 GitHub 不希望在其平台上允许垃圾邮件和滥用行为。
      • 内容可能会尝试加载 GitHub 不想托管的恶意代码或跟踪内容或跟踪用户。

      GitHub 有一个 Content-Security-Policy 标头,即使清理失败,它也会要求浏览器执行其中的许多策略。

      如果你的徽章是纯图片,即使是 SVG,那么它可以正确显示,但只要你尝试使用 CSS 或 JavaScript,它就行不通。

      【讨论】:

      • 感谢您的解释。那么在这种情况下是不是就不可能在 GitHub README 上达到想要的结果呢?
      • 是的,如果您使用 HTML 和 CSS 进行渲染。如果 Strava 为您提供了一个简单的图像和链接,那么您就可以做到。
      猜你喜欢
      • 2020-03-13
      • 2021-09-24
      • 2022-07-01
      • 2019-05-29
      • 2022-06-14
      • 2017-01-25
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多