在程式碼區塊上標記使用的語言。

前言

原先看到可以用 CSS 的 attr() 來拿 data-lang 的內容再用 :before:after 加在程式碼區塊,不過用起來有點受限 (只會出現在黑框內,無法如圖所示顯示在外面,且會影響到行數顯示)。因此還是暴力用 javascript 解決,目前還都是可以用就好,什麼寫法都來一點的狀態 (好險沒有維護的需求 OuO)。

另外,還是要給的警告,當然不是下面的程式貼到自己的 hugo 主題就可以動,還是需要用開發人員模式去觀察一下 code pre 的長相再去修改。

參考來源: https://github.com/highlightjs/highlight.js/issues/1108#issuecomment-608415953

程式碼

/* show the code label for code highlight block */
document.addEventListener('DOMContentLoaded', function() {
  let highlight = document.querySelectorAll('div.highlight');
  Array.prototype.forEach.call(highlight, function(block) {
    let code = block.querySelectorAll('pre code[data-lang]');
    let language = code[0].getAttribute('data-lang');
    block.insertAdjacentHTML("beforebegin",`<label class="code-label">${language}</label>`);
  });
})
label.code-label {
  font-size: 60%;
  color: #f6f6f6;
  background-color: var(--deep-blue);
  padding:1px 5px;
  border-radius: 7px 7px 0 0;
  display: table-cell;
  vertical-align: bottom;
  text-align: center;
  min-width: 1rem;
}

成果

成果

OuO

問題

目前還是有些缺點沒有解決,主要是 hugo 使用的 highlight 方法 ( chroma) 在擴充性上不太方便,例如我想要新增別名 (alias),而似乎只能改 code 達成,不太行。

Alias

上述問題已經 “利用額外設定屬性的方式” 繞過 OuO,將上面的 js 程式碼改用下面的版本即可。使用方式請參考 Features#code-block-alias

document.addEventListener('DOMContentLoaded', function() {
  let highlight = document.querySelectorAll('div.highlight');
  Array.prototype.forEach.call(highlight, function(block) {
    let code = block.querySelectorAll('pre code[data-lang]');
    let language = code[0].getAttribute('data-lang');
    let alias = block.getAttribute('name');
    if (alias != null) {
      language = alias;
    }
    block.insertAdjacentHTML("beforebegin",`<label class="code-label">${language}</label>`);
  });
})