from http://oyanglul.us
getting started
Github page 上建博客本来就是很geek的事情, 用octopress来建博客可用说是 for ruby geeks, 因为可以用欢乐的rake <task> 来完成建立文章和发布等一系 列task. 当然他依赖于 Jekyll
如果wordpress的发布过程是这样的:
- 打开wordpress
- 点下new post
- 在textarea中输入内容
这样好像非常简单, 这种wysiwyg的编辑器完全不需要学习曲线, 当然效率也不 会有神马曲线. 比如一个简单的 加粗 操 作, 需要选中需要加粗的字, 点一下=B=. 这对一个程序员来说是有多么痛苦啊.
好吧,如果你说 wordpress 也有快捷键, 那么bia代码和插入图片肿么办. 各种插件随之而来, 但是个人并没有发现更wsgiwyg编辑器任何高效的地方. 一个高效的码农不希望任何一只手离开键盘. 好吧, 这时候 GitHub Flavored Markdown 和 GitHub Pages 冲出来解放码农的鼠标手. 当然, Github Pages 的原意是让程序员为自己的repository建立一个静态网页.
于是乎, 有了octopress, 简而言之,就是用 git 和你最喜欢的编辑器写博客. 当然,就算你喜欢用wordpress, 同样可以用 prose.io + travis ci 实现auto deploy octopress with travis ci {fn:1} {fn:2}.
安装 octopress
just do the following in your shell.
$ \curl -L https://get.rvm.io | bash # install ruby version manager rvm install 1.9.3 # octopress need 1.9.3 rvm user 1.9.3 --default # use it as default git clone git://github.com/imathis/octopress.git octopress cd octopress # If you use RVM, You'll be asked if you trust the .rvmrc file (say yes). ruby --version #should be 1.9.3 rake install # install default Octopress theme
Setup Github Pages
- new 一个名叫
username.github.io
的 repository, 所有push 到 master
的代码即是静态网页. // 这是user page, 如果是项目page, 需要push到 gh-pages branch.
- Done // yeah~ that’s it
Setup Octopress
rake setup_github_pages rake generate # This will generate your blog, copy the generated files into _deploy rake deploy # push to your github pages echo 'your-domain.com' >> source/CNAME
Use Octopress
Inline code
this is inline code
The Greatest Code Blocks
[language] [title] [url] [link text] code snippet
ruby Discover if a number is prime http://www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-for-prime-numbers/ Source Article class Fixnum def prime? ('1' * self) !~ /^1?$|^(11+?)\1+$/ end end
will render as
Discover if a number is prime http://www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-for-prime-numbers/ Source Article class Fixnum def prime? ('1' * self) !~ /^1?$|^(11+?)\1+$/ end end
Gist
gist gist_id filename
like
gist 996818
will be rander as
{% gist 996818 %}
3rd party plugin
default_asides: [asides/recent_posts.html, asides/github.html, asides/twitter.html, asides/delicious.html, asides/pinboard.html, asides/googleplus.html, asides/weibo.html]
Put Octopress Folder into Dropbox
当然要扔到dropbox上, 喂小米, 因为这样我们可以用手机写博客. 好吧, 前提 是你的手机要有个好用的markdown编辑器.
auto deploy octopress with travis ci [fn:1] [fn:2]
用dropbox绝对不是让你 blog on the go 的最好方式, 因为你还需要打开电脑 deploy 一下. 那么最给力的做法是使用 travis ci 自动的 rake deploy 你的 文章. 再加上 prose.io, 简直就是wordpress, 你不需要任何push, 只要在 prose.io 上编辑完成后点下 publish 即可. travis会自动给你发布hoho. 这样 就可以随时随地发了hoho.
- get github OAtuh token
curl -u 'your_github_name' -d '{"scopes":["public_repo"], "note":"Travis access"}' https://api.github.com/authorizations
- encypte your token
gem install travis travis encrypt GH_TOKEN=your_token --add # do this in your octopress dir
- setup in
.travis.yml
--- language: ruby branches: only: - source rvm: - 1.9.3 before_script: - git config --global user.name "Jichao Ouyang" - git config --global user.email "oyanglulu@gmail.com" - export REPO_URL="https://$GH_TOKEN@github.com/$GH_REPO.git" - rake setup_github_pages[$REPO_URL] script: - rake generate after_script: - rake deploy env: global: - GH_REPO="geogeo.github.com" - secure: ! 'UcwYke5vbuDVxFf8smJ2h8UkaVAdutc4hJ7WD06KKJlxQdGuF3rrG5rActpx 5Np/gu1Nui3jnZv6jBnd9vJjKvwhPbpXBymlpoxo0tswhiAFAg5Tu8Zo50dF nB//OpMAD8Yp30cUwZ7V7x46tikWAweZYpPGTRgfS5lU3ebA1js='
rakefile中需要做如下更改
diff --git a/Rakefile b/Rakefile index a57a56f..59b758a 100755 --- a/Rakefile +++ b/Rakefile @@ -9,10 +9,10 @@ ssh_port = "22" document_root = "~/website.com/" rsync_delete = false rsync_args = "" # Any extra arguments to pass to rsync -deploy_default = "rsync" +deploy_default = "push" # This will be configured for you when you run config_deploy -deploy_branch = "gh-pages" +deploy_branch = "master" ## -- Misc Configs -- ## @@ -255,10 +255,10 @@ multitask :push do system "git add ." system "git add -u" puts "\n## Commiting: Site updated at #{Time.now.utc}" - message = "Site updated at #{Time.now.utc}" + message = "Site updated at #{Time.now.utc} [ci skip]" system "git commit -m \"#{message}\"" puts "\n## Pushing generated #{deploy_dir} website" - system "git push origin #{deploy_branch} --force" + system "git push origin #{deploy_branch} --force --quiet" puts "\n## Github Pages deploy complete" end end @@ -307,7 +307,7 @@ task :setup_github_pages, :repo do |t, args| puts "(For example, 'git@github.com:your_username/your_username.github.io)" repo_url = get_stdin("Repository url: ") end - user = repo_url.match(/:([^\/]+)/)[1] + user = repo_url.match(/[\/:]([^\/]+)\/[^\/]+$/)[1] branch = (repo_url.match(/\/[\w-]+\.github\.(?:io|com)/).nil?) ? 'gh-pages' : 'master' project = (branch == 'gh-pages') ? repo_url.match(/\/([^\.]+)/)[1] : '' unless (`git remote -v` =~ /origin.+?octopress(?:\.git)?/).nil? @@ -317,7 +317,7 @@ task :setup_github_pages, :repo do |t, args| # If this is a user/organization pages repository, add the correct origin remote # and checkout the source branch for committing changes to the blog source. system "git remote add origin #{repo_url}" - puts "Added remote #{repo_url} as origin" + puts "Added remote origin" system "git config branch.master.remote origin" puts "Set origin as default remote" system "git branch -m master source" @@ -341,7 +341,7 @@ task :setup_github_pages, :repo do |t, args| system "git init" system "echo 'My Octopress Page is coming soon …' > index.html" system "git add ." - system "git commit -m \"Octopress init\"" + system "git commit -m \"Octopress init[ci skip]\"" system "git branch -m gh-pages" unless branch == 'master' system "git remote add origin #{repo_url}" rakefile = IO.read(__FILE__) @@ -351,7 +351,7 @@ task :setup_github_pages, :repo do |t, args| f.write rakefile end end - puts "\n---\n## Now you can deploy to #{url} with `rake deploy` ##" + puts "\n---\n## Now you can deploy to `rake deploy` ##" end
config文件中如下更改, 最后一行
diff --git a/_config.yml b/_config.yml old mode 100755 new mode 100644 index 1397f8d..91db12e --- a/_config.yml +++ b/_config.yml @@ -2,12 +2,12 @@ # Main Configs # # ----------------------- # -url: http://yoursite.com -title: My Octopress Blog -subtitle: A blogging framework for hackers. -author: Your Name +url: http://oyanglul.us +title: Jichao Ouyang's Journal +subtitle: Code or Else. +author: Jichao Ouyang simple_search: http://google.com/search -description: +description: Jichao Ouyang's Journal/Blog/Whatever # Default date format is "ordinal" (resulting in "July 22nd 2007") # You can customize the format as defined in @@ -36,7 +36,7 @@ category_dir: blog/categories markdown: rdiscount pygments: false # default python pygments have been replaced by pygments.rb -paginate: 10 # Posts per page on the blog index +paginate: 12 # Posts per page on the blog index pagination_dir: blog # Directory base for pagination URLs eg. /blog/page/2/ recent_posts: 5 # Posts in the sidebar Recent Posts section excerpt_link: "Read on →" # "Continue reading" link text at the bottom of excerpted @@ -45,7 +45,7 @@ titlecase: true # Converts page and post titles to titlecase # To add custom asides, create files in /source/_includes/custom/asides/ and add them to t -default_asides: [asides/recent_posts.html, asides/github.html, asides/delicious.html, asid +default_asides: [asides/recent_posts.html, asides/github.html, asides/twitter.html, asides # Each layout uses the default asides, but they can have their own asides instead. Simply # and add an array with the asides you want to use. @@ -58,26 +58,38 @@ default_asides: [asides/recent_posts.html, asides/github.html, asides/d # ----------------------- #
Use Org-mode instead of Markdown
当然我并不是说markdown有什么不好的, 完全可以搞定博客的各种格式. 但是作 为emacs用户, 没有神马是org不能搞定的文档工作. 好吧, 不是emacs重度用户 请跳过该节.
其实思路非常简单
- 更改
rake new_post
使其建立一个org后缀的文件,而不是markdown后缀 - 更改 rake file 和文章的header
posts_dir = "_org_posts" new_post_ext = "org" # default new post file extension when using the new_post task new_page_ext = "org" # default new page file extension when using the new_page task
@@ -21,10 +21,11 @@ source_dir = "source" # source file directory blog_index_dir = 'source' # directory for your blog's index page (if you put your index in source/blog/ deploy_dir = "_deploy" # deploy directory (for Github pages deployment) stash_dir = "_stash" # directory to stash posts for +posts_dir = "_org_posts" themes_dir = ".themes" # directory for blog files -new_post_ext = "markdown" # default new post file extension when using the new_post task -new_page_ext = "markdown" # default new page file extension when using the new_page task +new_post_ext = "org" # default new post file extension when using the new_post task +new_page_ext = "org" # default new page file extension when using the new_page task server_port = "4000" # port for preview server eg. localhost:4000 @@ -105,6 +106,7 @@ task :new_post, :title do |t, args| end puts "Creating new post: #{filename}" open(filename, 'w') do |post| + post.puts "#+BEGIN_HTML" post.puts "---" post.puts "layout: post" post.puts "title: \"#{title.gsub(/&/,'&')}\"" @@ -112,6 +114,8 @@ task :new_post, :title do |t, args| post.puts "comments: true" post.puts "categories: " post.puts "---" + post.puts "#+END_HTML" + post.puts "#+OPTIONS: toc:nil" end end
- hook publish html to octopress folder
(setq org-publish-project-alist '(("blog" . (:base-directory "~/Dropbox/octopress/source/_org_posts/" :base-extension "org" :publishing-directory "~/Dropbox/octopress/source/_posts/" :sub-superscript "" :recursive t :publishing-function org-html-publish-to-html :headline-levels 4 :html-extension "markdown" :body-only t))))
为什么要导出 html 到 markdown 的目录呢, 这样有毛好处呢, 为毛不直接转成 markdown. 因为转成markdown后jykll再转成html就会成屎了. 好吧, 直接转成 html格式不会乱.
因此, 前面所说的有些标签就得变成org-mode格式的. 例如 code block
就需要用 #+BEGIN_SRC
来包住而不是 ```
, 快捷键 <s TAB
为什么要用org-mode
- org-babel mode 可以让你在 org 中嵌入各种语言的代码
- 更多快捷键
- 比markdown更丰富
- for emacser
Footnotes
[fn:1] http://www.harimenon.com/blog/2013/01/27/auto-deploying-to-my-octopress-blog/
[fn:2] http://rogerz.github.io/
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。