本文續接 Hexo 文檔講解篇javascript
建立 Hexo 主題很是容易,您只要在 themes 文件夾內,新增一個任意名稱的文件夾,並修改 _config.yml 內的 theme 設定,便可切換主題。一個主題可能會有如下的結構:css
. ├── _config.yml //這個是主題配置項文件 ├── languages //這個是語言文件 ├── layout //這個是模板文件 ├── scripts └── source
盛年不重來,一日難再晨。及時當勉勵,歲月不待人html
Layout前端
佈局文件夾。用於存放主題的模板文件,決定了網站內容的呈現方式,Hexo 內建 Swig 模板引擎,您能夠另外安裝插件來得到 `EJS`、`Haml` 或 `Jade` 支持,Hexo 根據模板文件的擴展名來決定所使用的模板引擎,例如:
layout.ejs - 使用 EJS layout.swig - 使用 Swig
yelle主題採用的是EJS模板,EJS模板能夠參考 ejs中文文檔java
sourcenode
資源文件夾,除了模板之外的 Asset,例如 CSS、JavaScript 文件等,都應該放在這個文件夾中。文件或文件夾開頭名稱爲 _(下劃線線)或隱藏的文件會被忽略。
若是文件能夠被渲染的話,會通過解析而後儲存到 public 文件夾,不然會直接拷貝到 public 文件夾。git
模板決定了網站內容的呈現方式,每一個主題至少都應包含一個 index 模板,如下是各頁面相對應的模板名稱:程序員
模板 | 用途 | 回調 |
---|---|---|
index | 首頁 | |
post | 文章 | index |
page | 分頁 | index |
archive | 歸檔 | index |
category | 分類歸檔 | archive |
tag | 標籤歸檔 | archive |
若是頁面結構相似,例如兩個模板都有頁首(Header)和頁腳(Footer),您可考慮經過「佈局」讓兩個模板共享相同的結構。一個佈局文件必需要能顯示 body 變量的內容,如此一來模板的內容纔會被顯示,舉例來講:github
{% codeblock index,ejs %}
index
{% endcodeblock %}npm
{% codeblock layout.ejs %}
<!DOCTYPE html>
<html>
<body><%- body %></body>
</html>
{% endcodeblock %}
生成 :
<!DOCTYPE html>
<html>
<body>index</body>
</html>
每一個模板都默認使用 layout 佈局,您可在 front-matter 指定其餘佈局,或是設爲 false 來關閉佈局功能,您甚至可在佈局中再使用其餘佈局來創建嵌套佈局。
局部模板讓您在不一樣模板之間共享相同的組件,例如頁首(Header)、頁腳(Footer)或側邊欄(Sidebar)等,可利用局部模板功能分割爲個別文件,讓維護更加便利。舉例來講:
{% codeblock partial/header.ejs %}
<h1 id="logo"><%= config.title %></h1>
{% endcodeblock %}
{% codeblock index.ejs %}
<%- partial('partial/header') %>
<div id="content">Home page</div>
{% endcodeblock %}
生成:
<h1 id="logo">My Site</h1> <div id="content">Home page</div>
您能夠在局部模板中指定局部變量並使用。
{% codeblock partial/header.ejs %}
<h1 id="logo"><%= title></h1>
{% endcodeblock %}
{% codeblock index.ejs %}
<%- partial('partial/header', {title: 'Hello World'}) %>
<div id="content">Home page</div>
{% endcodeblock %}
生成:
<h1 id="logo">Hello World</h1> <div id="content">Home page</div>
若是您的主題太過於複雜,或是須要生成的文件量太過於龐大,可能會大幅下降性能,除了簡化主題外,您能夠考慮 Hexo 2.7 新增的局部緩存(Fragment Caching) 功能。
本功能借鑑於 Ruby on Rails,它儲存局部內容,下次便能直接使用緩存內容,能夠減小文件夾查詢並使生成速度更快。
它可用於頁首、頁腳、側邊欄等文件不常變更的位置,舉例來講:
<%- fragment_cache('header', function(){ return '<header></header>'; });
若是您使用局部模板的話,能夠更簡單:
<%- partial('header', {}, {cache: true});
可是,若是您開啓了 relative_link 參數的話,請勿使用局部緩存功能,由於相對連接在每一個頁面可能不一樣。
這些變量很重要,由於未來自定義ejs,加入新的頁面的時候,都須要瞭解這些變量
變量 | 描述 |
---|---|
site | 網站變量 |
page | 針對該頁面的內容以及 front-matter 所設定的變量。 |
config | 網站配置 |
theme | 主題配置。繼承自網站配置。 |
_ (單下劃線) | Lodash 函數庫 |
path | 當前頁面的路徑(不含根路徑) |
url | 當前頁面的完整網址 |
env | 環境變量 |
變量 | 描述 |
---|---|
site.posts | 全部文章 |
site.pages | 全部分頁 |
site.categories | 全部分類 |
site.tags | 全部標籤 |
變量 | 描述 |
---|---|
site.posts | 全部文章 |
site.pages | 全部分頁 |
site.categories | 全部分類 |
site.tags | 全部標籤 |
A、頁面
變量 | 描述 |
---|---|
page.title | 頁面標題 |
page.date | 頁面創建日期(Moment.js 對象) |
page.updated | 頁面更新日期(Moment.js 對象) |
page.comments | 留言是否開啓 |
page.layout | 佈局名稱 |
page.content | 頁面的完整內容 |
page.excerpt | 頁面摘要 |
page.more | 除了頁面摘要的其他內容 |
page.source | 頁面原始路徑 |
page.full_source | 頁面的完整原始路徑 |
page.path | 頁面網址(不含根路徑)。咱們一般在主題中使用 url_for(page.path)。 |
page.permalink | 頁面的完整網址 |
page.prev | 上一個頁面。若是此爲第一個頁面則爲 null。 |
page.next | 下一個頁面。若是此爲最後一個頁面則爲 null。 |
page.raw | 文章的原始內容 |
page.photos | 文章的照片(用於相簿) |
page.link | 文章的外部連接(用於連接文章) |
B、文章
變量 | 描述 |
---|---|
page.published | 若是該文章已發佈則爲True |
page.categories | 該文章的全部分類 |
page.tags | 該文章的全部標籤 |
C、首頁
變量 | 描述 |
---|---|
page.per_page | 每頁顯示的文章數量 |
page.total | 總文章數 |
page.current | 目前頁數 |
page.current_url | 目前分頁的網址 |
page.posts | 本頁文章 |
page.prev | 上一頁的頁數。若是此頁是第一頁的話則爲 0。 |
page.prev_link | 上一頁的網址。若是此頁是第一頁的話則爲 ''。 |
page.next | 下一頁的頁數。若是此頁是最後一頁的話則爲 0。 |
page.next_link | 下一頁的網址。若是此頁是最後一頁的話則爲 ''。 |
page.path | 當前頁面的路徑(不含根目錄)。咱們一般在主題中使用 url_for(page.path)。 |
D、歸檔
變量 | 描述 |
---|---|
page.archive | 等於 true |
page.year | 年份歸檔 (4位) |
page.month | 月份歸檔 (沒有前導零的2位數) |
E、分類
變量 | 描述 |
---|---|
page.category | 分類名稱 |
F、標籤
變量 | 描述 |
---|---|
page.tag | 標籤名稱 |
輔助函數幫助您在模版中快速插入內容。輔助函數不能在源文件中使用。
A、url_for
在路徑前加上根路徑,從 Hexo 2.7 開始您應該使用此函數而不是 config.root + path
。
<%- url_for(path) %>
<%- url_for(/2017/02/20/HexoBlog/) %>
B、relative_url
取得與 from 相對的 to 路徑。
<%- relative_url(from, to) %>
C、gravatar
插入 Gravatar 圖片。
若是你不指定 options 參數,將會應用默認參數。不然,你能夠將其設置爲一個數字,這個數字將會做爲 Gravatar 的大小參數。最後,若是你設置它一個對象,它將會被轉換爲 Gravatar 的一個查詢字符串參數。
<%- gravatar(email, [options]) %>;
示例:
<%- gravatar('a@abc.com') %> // http://www.gravatar.com/avatar/b9b00e66c6b8a70f88c73cb6bdb06787 <%- gravatar('a@abc.com', 40) %> // http://www.gravatar.com/avatar/b9b00e66c6b8a70f88c73cb6bdb06787?s=40 <%- gravatar('a@abc.com' {s: 40, d: 'http://example.com/image.png'}) %> // http://www.gravatar.com/avatar/b9b00e66c6b8a70f88c73cb6bdb06787?s=40&d=http%3A%2F%2Fexample.com%2Fimage.png
<%- gravatar('a@abc.com') %>
<%- gravatar('a@abc.com', 40) %>
<%- gravatar('a@abc.com' {s: 40, d: 'http://example.com/image.png'}) %>
注意了沒,這個不是在文中中使用的哦,這個是ejs模板語法,要在ejs模板文件中使用
A、css
載入 CSS 文件。path 能夠是數組或字符串,若是 path 開頭不是 / 或任何協議,則會自動加上根路徑;若是後面沒有加上 .css 擴展名的話,也會自動加上。
<%- css(path, ...) %>
示例:
<%- css('style.css') %> // <link rel="stylesheet" href="/style.css" type="text/css"> <%- css(['style.css', 'screen.css']) %> // <link rel="stylesheet" href="/style.css" type="text/css"> // <link rel="stylesheet" href="/screen.css" type="text/css">
B、js
載入 JavaScript 文件。path 能夠是數組或字符串,若是 path 開頭不是 / 或任何協議,則會自動加上根路徑;若是後面沒有加上 .js 擴展名的話,也會自動加上。
<%- js(path, ...) %>
示例:
<%- js('script.js') %> // <script type="text/javascript" src="/script.js"></script> <%- js(['script.js', 'gallery.js']) %> // <script type="text/javascript" src="/script.js"></script> // <script type="text/javascript" src="/gallery.js"></script>
C、link_to
插入連接。
<%- link_to(path, [text], [options]) %>
參數 | 描述 | 默認值 |
---|---|---|
external | 在新視窗打開連接 | false |
class | Class 名稱 | |
id | ID |
示例:
<%- link_to('http://www.google.com') %> // <a href="http://www.google.com" title="http://www.google.com">http://www.google.com</a> <%- link_to('http://www.google.com', 'Google') %> // <a href="http://www.google.com" title="Google">Google</a> <%- link_to('http://www.google.com', 'Google', {external: true}) %> // <a href="http://www.google.com" title="Google" target="_blank" rel="external">Google</a>
D、mail_to
插入電子郵箱連接。
<%- mail_to(path, [text], [options]) %>
參數 | 描述 |
---|---|
class | Class 名稱 |
id | ID |
subject | 郵件主題 |
cc | 抄送(CC) |
bcc | 密送(BCC) |
body | 郵件內容 |
示例:
<%- mail_to('a@abc.com') %> // <a href="mailto:a@abc.com" title="a@abc.com">a@abc.com</a> <%- mail_to('a@abc.com', 'Email') %> // <a href="mailto:a@abc.com" title="Email">Email</a>
E、image_tag
插入圖片。
<%- image_tag(path, [options]) %>
參數 | 描述 |
---|---|
alt | 圖片的替代文字 |
class | Class 名稱 |
id | ID |
width | 圖片寬度 |
height | 圖片高度 |
F、favicon_tag
插入favicon。
<%- favicon_tag(path) %>
G、feed_tag
插入 feed 連接。
<%- feed_tag(path, [options]) %>
參數 | 描述 | 默認值 |
---|---|---|
title | Feed | 標題 |
type | Feed | 類型 atom |
A、is_current
檢查 path 是否符合目前頁面的網址。開啓 strict 選項啓用嚴格比對。
<%- is_current(path, [strict]) %>
B、is_home
檢查目前是否爲首頁。
<%- is_home() %>
C、is_post
檢查目前是否爲文章。
<%- is_post() %>
D、is_archive
檢查目前是否爲存檔頁面。
<%- is_archive() %>
E、is_year
檢查目前是否爲年度歸檔頁面。
<%- is_year() %>
F、is_month
檢查目前是否爲月度歸檔頁面。
<%- is_month() %>
G、is_category
檢查目前是否爲分類歸檔頁面。
若是給定一個字符串做爲參數,將會檢查目前是否爲指定分類。
<%- is_category() %> <%- is_category('hobby') %>
H、is_tag
檢查目前是否爲標籤歸檔頁面。
若是給定一個字符串做爲參數,將會檢查目前是否爲指定標籤。
<%- is_tag() %> <%- is_tag('hobby') %>
A、trim
清除字符串開頭和結尾的空格。
<%- trim(string) %>
B、strip_html
清除字符串中的 HTML 標籤。
<%- strip_html(string) %>
示例:
<%- strip_html('It's not <b>important</b> anymore!') %> // It's not important anymore!
C、titlecase
把字符串轉換爲正確的 Title case。
<%- titlecase(string) %>
示例:
<%- titlecase('this is an apple') %> # This is an Apple
D、markdown
使用 Markdown 解析字符串。
<%- markdown(str) %>
示例:
<%- markdown('make me **strong**') %> // make me <strong>strong</strong>
E、render
解析字符串。
<%- render(str, engine, [options]) %>
F、word_wrap
使每行的字符串長度不超過 length。length 預設爲 80。
<%- word_wrap(str, [length]) %>
示例:
<%- word_wrap('Once upon a time', 8) %> // Once upon\n a time
G、truncate
移除超過 length 長度的字符串。
<%- truncate(text, length) %>
示例:
<%- truncate('Once upon a time in a world far far away', {length: 17}) %> // Once upon a ti... <%- truncate('Once upon a time in a world far far away', {length: 17, separator: ' '}) %> // Once upon a... <%- truncate('And they found that many people were sleeping better.', {length: 25, omission: '... (continued)'}) %> // And they f... (continued)
A、partial
載入其餘模板文件,您可在 locals 設定區域變量。
<%- partial(layout, [locals], [options]) %>
參數 | 描述 | 默認值 |
---|---|---|
cache | 緩存(使用 Fragment cache) | false |
only | 限制局部變量。在模板中只能使用 locals 中設定的變量。 | false |
B、fragment_cache
局部緩存。它儲存局部內容,下次使用時就能直接使用緩存。
<%- fragment_cache(id, fn);
示例:
<%- fragment_cache('header', function(){ return '<header></header>'; }) %>
插入格式化的日期。date
能夠是 UNIX
時間、ISO 字符串、Date 對象或 Moment.js 對象。format
默認爲 date_format
配置信息。
<%- date(date, [format]) %>
示例:
<%- date(Date.now()) %> // 2013-01-01 <%- date(Date.now(), 'YYYY/M/D') %> // Jan 1 2013
插入 XML 格式的日期。date 能夠是 UNIX 時間、ISO 字符串、Date 對象或 Moment.js 對象。
<%- date_xml(date) %>
示例:
<%- date_xml(Date.now()) %> // 2013-01-01T00:00:00.000Z
插入格式化的時間。date 能夠是 UNIX 時間、ISO 字符串、Date 對象或 Moment.js 對象。format 默認爲 time_format 配置信息。
<%- time(date, [format]) %>
示例:
<%- time(Date.now()) %> // 13:05:12 <%- time(Date.now(), 'h:mm:ss a') %> // 1:05:12 pm
插入格式化的日期和時間。date 能夠是 UNIX 時間、ISO 字符串、Date 對象或 Moment.js 對象。format 默認爲 date_format + time_format。
<%- full_date(date, [format]) %>
示例:
<%- full_date(new Date()) %> // Jan 1, 2013 0:00:00 <%- full_date(new Date(), 'dddd, MMMM Do YYYY, h:mm:ss a') %> // Tuesday, January 1st 2013, 12:00:00 am
Moment.js 函數庫。
插入分類列表。
<%- list_categories([options]) %>
參數 | 描述 | 默認值 |
---|---|---|
orderby | 分類排列方式 | name |
order | 分類排列順序。1, asc 升序;-1, desc 降序。 | 1 |
show_count | 顯示每一個分類的文章總數 | true |
style | 分類列表的顯示方式。使用 list 以無序列表(unordered list)方式顯示。 | list |
separator | 分類間的分隔符號。只有在 style 不是 list 時有用。 | , |
depth | 要顯示的分類層級。0 顯示全部層級的分類;-1 和 0 很相似,可是顯示不分層級;1 只顯示第一層的分類。 | 0 |
class | 分類列表的 class 名稱。 | category |
transform | 改變分類名稱顯示方法的函數 |
插入標籤列表。
<%- list_tags([options]) %>
參數 | 描述 | 默認值 |
---|---|---|
orderby | 標籤排列方式 | name |
order | 標籤排列順序。1, asc 升序;-1, desc 降序。 | 1 |
show_count | 顯示每一個標籤的文章總數 | true |
style | 標籤列表的顯示方式。使用 list 以無序列表(unordered list)方式顯示。 | list |
separator | 標籤間的分隔符號。只有在 style 不是 list 時有用。 | |
class | 標籤列表的 class 名稱。 | tag |
transform | 改變標籤名稱顯示方法的函數 | |
amount | 要顯示的標籤數量(0 = 無限制) | 0 |
插入歸檔列表。
<%- list_archives([options]) %>
參數 | 描述 | 默認值 |
---|---|---|
type | 類型。此設定可爲 yearly 或 monthly。 | monthly |
order | 排列順序。1, asc 升序;-1, desc 降序。 | 1 |
show_count | 顯示每一個歸檔的文章總數 | true |
format | 日期格式 | MMMM YYYY |
style | 歸檔列表的顯示方式。使用 list 以無序列表(unordered list)方式顯示。 | list |
separator | 歸檔間的分隔符號。只有在 style 不是 list 時有用。 | |
class | 歸檔列表的 class 名稱。 archive | |
transform | 改變歸檔名稱顯示方法的函數 |
插入文章列表。
<%- list_posts([options]) %>
參數 | 描述 | 默認值 |
---|---|---|
orderby | 文章排列方式 | date |
order | 文章排列順序。1, asc 升序;-1, desc 降序。 | -1 |
style | 文章列表的顯示方式。使用 list 以無序列表(unordered list)方式顯示。 | list |
separator | 文章間的分隔符號。只有在 style 不是 list 時有用。 | |
class | 文章列表的 class 名稱。 post | |
amount | 要顯示的文章數量(0 = 無限制) | 6 |
transform | 改變文章名稱顯示方法的函數 |
插入標籤雲。
<%- tagcloud([tags], [options]) %>
參數 | 描述 | 默認值 |
---|---|---|
min_font | 最小字體尺寸 | 10 |
max_font | 最大字體尺寸 | 20 |
unit | 字體尺寸的單位 | px |
amount | 標籤總量 | 40 |
orderby | 標籤排列方式 | name |
order | 標籤排列順序。1, sac 升序;-1, desc 降序 | 1 |
color | 使用顏色 | false |
start_color | 開始的顏色。您可以使用十六進位值(#b700ff),rgba(rgba(183, 0, 255, 1)),hsla(hsla(283, 100%, 50%, 1))或 顏色關鍵字。此變量僅在 color 參數開啓時纔有用。 | |
end_color | 結束的顏色。您可以使用十六進位值(#b700ff),rgba(rgba(183, 0, 255, 1)),hsla(hsla(283, 100%, 50%, 1))或 顏色關鍵字。此變量僅在 color 參數開啓時纔有用。 |
插入分頁連接。
<%- paginator(options) %>
參數 | 描述 | 默認值 |
---|---|---|
base | 基礎網址 | / |
format | 網址格式 | page/%d/ |
total | 分頁總數 | 1 |
current | 目前頁數 | 0 |
prev_text | 上一頁連接的文字。僅在 prev_next 設定開啓時纔有用。 | Prev |
next_text | 下一頁連接的文字。僅在 prev_next 設定開啓時纔有用。 | Next |
space | 空白文字 … | |
prev_next | 顯示上一頁和下一頁的連接 | true |
end_size | 顯示於兩側的頁數 | 1 |
mid_size | 顯示於中間的頁數 | 2 |
show_all | 顯示全部頁數。若是開啓此參數的話,end_size 和 mid_size 就沒用了。 | false |
插入 Google 搜索框。
<%- search_form(options) %>
參數 | 描述 | 默認值 |
---|---|---|
class | 表單的 class name | search-form |
text | 搜索提示文字 | Search |
button | 顯示搜索按鈕。此參數可爲布爾值(boolean)或字符串,當設定是字符串的時候,即爲搜索按鈕的文字。 | false |
格式化數字。
<%- number_format(number, [options]) %>
參數 | 描述 | 默認值 |
---|---|---|
precision | 數字精度。此選項可爲 false 或非負整數。 | false |
delimiter | 千位數分隔符號 | , |
separator | 整數和小數之間的分隔符號 | , |
示例:
<%- number_format(12345.67, {precision: 1}) %> // 12,345.68 <%- number_format(12345.67, {precision: 4}) %> // 12,345.6700 <%- number_format(12345.67, {precision: 0}) %> // 12,345 <%- number_format(12345.67, {delimiter: ''}) %> // 12345.67 <%- number_format(12345.67, {separator: '/'}) %> // 12,345/67
插入 open graph 資源。
<%- open_graph([options]) %>
參數 | 描述 | 默認值 |
---|---|---|
title | 頁面標題 (og:title) | page.title |
type | 頁面類型 (og:type) | blog |
url | 頁面網址 (og:url) | url |
image | 頁面圖片 (og:image) | 內容中的圖片 |
site_name | 網站名稱 (og:site_name) | config.title |
description | 頁面描述 (og:desription) | 內容摘要或前 200 字 |
twitter_card | Twitter 卡片類型 (twitter:card) | summary |
twitter_id | Twitter ID | (twitter:creator) |
twitter_site | Twitter 網站 | (twitter:site) |
google_plus | Google+ | 我的資料連接 |
fb_admins | 管理者 ID | |
fb_app_id | 應用程序 ID |
last: toc
解析內容中的標題標籤 (h1~h6) 並插入目錄。
<%- toc(str, [options]) %>
參數 | 描述 | 默認值 |
---|---|---|
class | Class 名稱 | toc |
list_number | 顯示編號 | true |
示例:
<%- toc(page.content) %>
看一下,Yelee主題的文件目錄:
根據這個目錄咱們來分析Hexo
是如何工做的
咱們都知道兩個命名,一個是 hexo new page name
,一個是 hexo new post name
hexo new page name
建立一個新頁面 , 頁面具體渲染模板在Theme主題下的layout文件夾下面
hexo new post name/hexo new post draft
是建立一篇新文章,新文章保存在source/_posts目錄下,若是是hexo new draft name
,則是保存在source/_drafts
目錄下,那麼根據scaffolds
的模板,能夠肯定新建的文章或者草稿的基本配置
看下圖:
下面看一下咱們的,引擎模板文件:
入口模板
具體實現
想要自定義404嗎?想要寫一個個性化的about me嗎?想要實現徹底自定義嗎?哈哈這個你仍是得去學習 EJS
啦
如何實現用D3-cloud來展示標籤雲
有沒有感受 Hexo
自帶的 tag-cloud
標籤雲太醜陋了呢!做爲一個前端程序員,對審美但是有着比較高的要求,github
上面有 d3-cloud
這個項目,那麼咱們來玩一玩吧,把github
上的d3-cloud
項目在咱們的hexo博客
中使用哈!
hexo是靜態博客,因此最後在網上看到的都是靜態的內容,也就是說,咱們的看到的標籤雲也是靜態的已經生成好的內容,並不會隨着刷新頁面而從新計算生成另外樣式的標籤雲。
固然d3-cloud這個項目,提供了瀏覽器端和node端運行的版本,見它的例子,咱們能夠在客戶端運行,也能夠在服務端做爲 node運行。
具體操做流程
:
找到關於tagcloud模板文件以及JS和CSS
我上面說的,應該很容易找到吧,我已經找到了呀
安裝模塊
npm install canvas --save npm install d3-cloud --save npm install d3 --save
找到文件: 你的 blog項目 -> node_modules -> hexo ->plugins -> helper -> index.js
var tagcloud = require('./tagcloud'); helper.register('tagcloud', tagcloud); helper.register('tag_cloud', tagcloud); //修改成下面的代碼:目的是不直接修改tagcloud.js,保留代碼 var tagcloud = require('./tagcloud'); var tagcloudd3 = require('./tagcloudd3'); helper.register('tagcloud', tagcloudd3); helper.register('tag_cloud', tagcloudd3);
新建文件tagcloudd3.js :位置在blog項目 -> node_modules -> hexo ->plugins -> helper -> tagcloudd3.jstagcloud3.js的內容以下
:
'use strict'; var Canvas = require("canvas"); var cloud = require("d3-cloud"); var d3 = require("d3"); var layout = cloud()//利用d3-cloud計算每一個標籤的位置 .size([600, 400]) .canvas(function() { return new Canvas(1, 1); }) .padding(7) .rotate(function() { return ~~(Math.random() * 2) * 90; }) .font("Impact") .fontSize(function(d) { return d.size; }); var fill = d3.scale.category20();//利用d3的接口給每一個標籤顏色 function tagcloudHelper(tags){ /****與tagcloud.js同樣,得到tags 開始***/ if ((!tags || !tags.hasOwnProperty('length'))){ tags = this.site.tags; } if (!tags || !tags.length) return ''; var result = []; tags = tags.sort('name', 1); // Ignore tags with zero posts tags = tags.filter(function(tag){ return tag.length; }); /****與tagcloud.js同樣,得到tags 結束***/ //計算標籤出現次數最大值,好比,博客中一共有兩個標籤,一個是hello,一個是world,hello出現2次,world 出現1次,那麼maxsize就是2 var maxsize = 1; tags.sort('length').forEach(function(tag){ var length = tag.length; if(length > maxsize) maxsize = length; }); //構建傳入layout的words var arr = [],words; tags.forEach(function(tag){ arr.push({"name": tag.name,"num" : tag.length}); }); words = arr.map(function(d) { var text = d.name.replace(/[^\x00-\xff]/g,"ab");//對中文的投機處理,用ab代替中文字符 return {name:d.name, text: text, size : Math.log(d.num)/(Math.log(maxsize)-Math.log(1)) * 15 + 30};//size的計算取對數,是爲了讓標籤之間的大小相對平均一些。由於博客側重前端內容,因此某一些標籤會比較多,標籤最大最小次數的差距會比較大。 }); layout.words(words); layout.start(); result.push('<svg width="600" height="400"><g transform="translate(300,200)">'); words.forEach(function(word,i){ result.push( '<text text-anchor="middle" fill="'+fill(i)+'" transform="translate('+word.x+','+word.y+')rotate('+ word.rotate+')" style="font-size:'+word.size+'px;font-family:Impact">'+ word.name+ '</text>' ); }); result.push('</g></svg>'); return result.join(''); } module.exports = tagcloudHelper;
運行,就能夠看到結果啦
這個我並無實際操做,緣由很簡單,最近比較忙,還有一個就是,node安裝canvas實在是太麻煩了呀,
這裏給出地址:
關於主題的配置,這篇文章講的很詳細啦,Yelee中文參考手冊
關於Hexo,還有最後一篇文章,請看 :搭建Hexo博客進階篇--API和一些小部件
Hexo官方網站 : https://hexo.io/
利用d3-cloud實現標籤雲 : http://www.cnblogs.com/lilyimage/p/5207697.html