在hexo静态博客中利用d3-cloud来展现标签云

效果: http://lucyhao.com/tags/

hexo自带的tag cloud的标签展现不太美观,想能够展现出“云”效果的标签。在网上找到了d3-cloud这个项目,github地址:https://github.com/jasondavies/d3-cloud demo地址:https://www.jasondavies.com/wordcloud/

hexo生成的是静态博客,所以最后在网上看到的都是静态的内容,也就是说,我们的看到的标签云也是静态的已经生成好的内容,并不会随着刷新页面而重新计算生成另外样式的标签云。

当然d3-cloud这个项目,提供了浏览器端和node端运行的版本,见它的例子,我们可以在客户端运行,也可以在服务端作为 node运行。

如何在hexo搭建的博客系统中使用呢?

(1)hexo中提供的tag cloud.js的方法,在你的blog项目中,node_modules -> hexo ->plugins -> helper -> tagcloud.js

(2)本博客使用的是icarus主题,在主题下的layout->tags.ejs 文件中加载目录tags下面的内容

//这里加载了标签云,tagcloud也就是(1)中tagcloud.js提供的功能
  <div class="layout-wrap-inner tag-cloud">
    <% if(site.tags.length) { %>
        <%- tagcloud() %>
    <% } %>
  </div>

  

由上所知 ,要修改hexo中的tagcloud, 只要修改tag cloud.js函数就可以啦~

现在我们来看看d3-cloud这个项目,如何把它与tagcloud结合起来。 首先,d3-cloud提供了在浏览器和在服务端运行的方式,见他的例子node.js和browserify.js。两个不同版本的原因,是因为在计算字符串的宽度的时候,利用了canvas的mesureText接口。在d3-cloud的 index.js源码中可以看到,有一行代码是

function cloudCanvas() {
  return document.createElement("canvas");//生成虚拟的canvas
}

  

因为在计算标签云的时候,要保证标签之间不重叠,需要知道标签的宽度,高度;而js语言是不具备这个能力可以计算出来的,要不就是借助浏览器,生成一个dom,比如span标签,把字符串的内容放到span中,设置span的属性为字符串需要显示的属性,然后获取span的宽度。在d3-cloud中,则是直接利用canvas的接口来实现的。所以在客户端的版本中,浏览器提供的canvas功能;而在node版本中则需要 node-canvas模块。

由于我们是在hexo的“后台”来运行标签云的算法,得到静态的构造好的标签输出到页面上,所以我们应该选择用node版本。当然也可以用browserify.js版本,毕竟他就是一个运行在浏览器中的js, 放到博客的js中也是可以的,后续会介绍。

利用node-canvas遇到的问题

node-canvas模块的mesureText对于中文的支持有bug,在chrome中,同样的中文字符串"你好"的宽度是33.*;而用node-canvas的到的“你好”的宽度只有8.*

怎么办?我投机取巧的用两个英文字符“ab”代替一个中文字符,然后计算字符串的长度,这样的到的长度只是近似长度。

正式开始修改hexo的到d3-cloud的标签云

(1)安装需要的模块:

$ npm install canvas --save
$ npm install d3-cloud --save
$ npm install d3 --save(可选)

  

(2)找到文件: 你的 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);

  

(3)新建文件tagcloudd3.js :位置在blog项目 -> node_modules -> hexo ->plugins -> helper -> tagcloudd3.js

(4)tagcloudd3.js的 内容如下:

  • 代码中引用了d3 来给标签fill颜色,可以去掉,也可以像tagcloud一样根据是否需要颜色来设置
‘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;

  

(5)运行hexo

$ hexo s

  

如图所示得到自己的标签云:

(6)上传自己的博客, 没问题以后,就生成静态博客,并上传

$ hexo g
$ hexo d

简单说下在客户端引用d3-cloud

(1) browserify编译d3-cloud提供的browserify.js例子,得到tagtest.js 文件,里面把d3,d3-cloud,d3-dispatch打包到了一起

$ browserify broswerify.js > tagtest.js

(2)把index.js放到目录: 你的主题->source -> js -> tagtest.js

(3)把index引用入到你的主题中 <%- js(‘js/tagtest‘) %>

(4)修改tagtest.js中的代码,把words的部分修改成接受传参的形式,在tags.ejs中用site.tags把tags的参数传进去

这样会在博客中增加很多js,个人觉得有点违背了静态博客小而轻的感觉。。。

时间: 2024-12-14 18:13:25

在hexo静态博客中利用d3-cloud来展现标签云的相关文章

搭建hexo静态博客

使用hexo搭建博客,并将博客部署到github 需要的工具 Node.js Git 一个Github账号 正式开始 在任意目录下新建一个文件夹,如blog,在该文件夹下右键打开git bash here,执行npm install -g hexo-cli,安装hexo 执行hexo init 执行npm install 根据提示依次执行npm audit fix和npm audit fix --force 执行hexo g,生成博客 执行hexo s后,可以在 http://localhost

hexo静态博客的安装及应用实践记录

1. 必须要安装 nodejs,git 2. 安装hexo node install -g hexo 3. npm源的问题使在安装时有卡住的问题而导致无法安装,则需要更改npm的源 npm config set registry="http://registry.cnpmjs.org” 4. 执行完上面命令后,进入指定目录(自定义的项目目录)再执行 hexo init 5. 接着执行以下命令生成静态页面至public目录 hexo generate 6.在基目录下可以看到public目录下的所有

Git+Hexo搭建静态博客网站

Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页. 安装环境 安装Git 版本管理工具,可以将我们生成的静态网页托管到GitHub上 设置全局 git config --global user.name "name" 配置username git config --global user.email "邮箱" 配置邮箱 设置ssh ssh -keygen -t rsa -

Hexo快速搭建静态博客并实现远程VPS自动部署

这篇文章将如何搭建hexo,以及如何通过git webhooks实现远程vps的自动部署 这篇文件适合的条件: 简单的用于个人博客.公司博客展示,hexo的定位是静态博客,要实现动态服务器的功能并不适合 有自己私有的服务器.vps.域名 git仓库,Github或国内的Coding.net hexo本地部署 流程:先在本机搭建好hexo环境,push到git仓库,再部署到服务器上. 第一步,安装hexo命令行工具,这个工具在服务器端也需要执行安装 1 npm install hexo-cli -

hexo搭建github静态博客

具体效果github不仅能免费提供代码托管,此外还提供了创建github博客的功能,网上有jekyll的方法,之前我试过最终由于Ubuntu下安装ruby及其他组建失败没成功,过程也比较繁琐,但有另一种方法,操作起来很简单,而且达到的效果也很好,那就是通过hexo搭建github博客.搭建环境为window, 步骤 1.安装git客户端,以及github账号:通过gitBash 生成ssh key,将公钥加入到github中,具体方法,百度搜索:为gthub配置ssh key.2.登陆githu

使用Hexo搭建Github静态博客

1. 环境环境 1.1 安装Git 默认配置就好 1.2 安装node.js 下载:http://nodejs.org/download/ 安装时直接保持默认配置即可. 2. 配置Github 1.1 建立Repository 建立与你用户名对应的仓库,仓库名必须为[your_user_name.github.io] 1.2 配置SSH-Key 参考文章:window下配置SSH连接GitHub.GitHub配置ssh key 3. 安装Hexo 关于Hexo的安装配置过程,请以官方Hexo[2

hexo部署到gitcafe上静态博客

http://zanderzhang.gitcafe.io/2015/09/17/hexo部署到gitcafe上静态博客/ hexo这些事儿,zippera's blog,之类的,这些都说的很清楚了. 不过也还是有几个特别的地方: 想插入图片的时候竟然上不了谷歌.好吧,睡觉,明天继续 在部署deploy的时候,出现 ERROR Deployer not found: git, 加上 npm install hexo-deployer-git --save, 之前type是填github,现在是g

linux中安装hexo编译博客

title: linux中安装hexo编译博客 categories: 运维 date: 2019-10-29 01:41:10 tags: linux toc: true --- 背景 几天前就看到服务器要到期了,没去管他,结果给忘了,今天凌晨过期了,这台阿里云华东2(上海)的机器也用了快2年了,物理位置在上海让我这个强迫症很不舒服,而且40G的盘都用了30G了(反正就是给自己各种不嫌麻烦的借口),看到新出的学生机有可以购买在华东1(杭州)就果断释放了原来的服务器,新购于杭州节点 之前用宝塔做

windows上使用mkdocs搭建静态博客

windows上使用mkdocs搭建静态博客 之前尝试过用HEXO搭建静态博客,最近发现有个叫mkdocs的开源项目也是搭建静态博客的好选择,而且它支持markdown格式,下面简要介绍一下mkdocs的环境搭建过程 项目地址:https://github.com/mkdocs/mkdocs 介绍:英文版----http://www.mkdocs.org/ 中文版----http://markdown-docs-zh.readthedocs.io/zh_CN/latest/ 使用环境:win8.