Jelajahi Sumber

feat: custom meta tags from md front-matter

ppoffice 9 tahun lalu
induk
melakukan
f2ed331917
2 mengubah file dengan 40 tambahan dan 0 penghapusan
  1. 1 0
      layout/common/head.ejs
  2. 39 0
      scripts/meta.js

+ 1 - 0
layout/common/head.ejs

@@ -27,6 +27,7 @@
         twitter_id:     theme.miscellaneous.open_graph.twitter_id,
         google_plus:    theme.miscellaneous.open_graph.google_plus,
     }) %>
+    <%- meta(page) %>
 
     <% if (theme.rss) { %>
         <link rel="alternative" href="<%- theme.rss %>" title="<%= config.title %>" type="application/atom+xml" />

+ 39 - 0
scripts/meta.js

@@ -0,0 +1,39 @@
+/**
+* Meta Helper
+* @description Generate meta tags for HTML header
+* @example
+*     <%- meta(post) %>
+*/
+function trim (str) {
+    return str.trim().replace(/^"(.*)"$/, '$1').replace(/^'(.*)'$/, '$1');
+}
+
+function split (str, sep) {
+    var result = [];
+    var matched = null;
+    while (matched = sep.exec(str)) {
+        result.push(matched[0]);
+    }
+    return result;
+}
+
+hexo.extend.helper.register('meta', function (post) {
+    var metas = post.meta || [];
+    var output = '';
+    var metaDOMArray = metas.map(function (meta) {
+        var entities = split(meta, /(?:[^\\;]+|\\.)+/g);
+        var entityArray = entities.map(function (entity) {
+            var keyValue = split(entity, /(?:[^\\=]+|\\.)+/g);
+            if (keyValue.length < 2) {
+                return null;
+            }
+            var key = trim(keyValue[0]);
+            var value = trim(keyValue[1]);
+            return key + '="' + value + '"';
+        }).filter(function (entity) {
+            return entity;
+        });
+        return '<meta ' + entityArray.join(' ') + ' />';
+    });
+    return metaDOMArray.join('\n');
+});