diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9a297fe --- /dev/null +++ b/.gitignore @@ -0,0 +1,97 @@ +## +## generic gitignore file. +## - amirmc +## + +################################################# +# OS Specific # +################################################# + # Linux +*~ + # Mac OSX +.DS_Store +.Thumbs +.AppleDouble +.LSOverride +Icon +._* +.Spotlight-V100 +.Trashes + # Windows +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ + +################################################# +# Jekyll # +################################################# +_site/* +_theme_packages/* + +################################################# +# Code # +################################################# + # OCaml +*.annot +*.cmo +*.cma +*.cmi +*.a +*.o +*.cmx +*.cmxs +*.cmxa + # Ruby +.rbenv-version +.rvmrc + +################################################# +# Editors # +################################################# + # LaTeX +*.acn +*.acr +*.alg +*.aux +*.bbl +*.blg +*.dvi +*.fdb_latexmk +*.glg +*.glo +*.gls +*.idx +*.ilg +*.ind +*.ist +*.lof +*.log +*.lot +*.maf +*.mtc +*.mtc0 +*.nav +*.nlo +*.out +*.pdfsync +*.ps +*.snm +*.synctex.gz +*.toc +*.vrb +*.xdy +*.tdo + # Sublime Text +*.sublime-workspace + # vim +.*.sw[a-z] +*.un~ +Session.vim +.netrwhist + +################################################# +# Misc # +################################################# + # No idea... +!.gitkeep diff --git a/404.html b/404.html new file mode 100644 index 0000000..1a83eb6 --- /dev/null +++ b/404.html @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+

Page not found

+

Sorry, the content you’re looking for doesn’t seem to be here.

+

Perhaps you could try looking from the front page at nymote.org.

+

+
+
+
+
+ +
+ + + diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..18bc7c5 --- /dev/null +++ b/Rakefile @@ -0,0 +1,309 @@ +require "rubygems" +require 'rake' +require 'yaml' +require 'time' + +SOURCE = "." +CONFIG = { + 'version' => "0.3.0", + 'themes' => File.join(SOURCE, "_includes", "themes"), + 'layouts' => File.join(SOURCE, "_layouts"), + 'posts' => File.join(SOURCE, "_posts"), + 'post_ext' => "md", + 'theme_package_version' => "0.1.0" +} + +# Path configuration helper +module JB + class Path + SOURCE = "." + Paths = { + :layouts => "_layouts", + :themes => "_includes/themes", + :theme_assets => "assets/themes", + :theme_packages => "_theme_packages", + :posts => "_posts" + } + + def self.base + SOURCE + end + + # build a path relative to configured path settings. + def self.build(path, opts = {}) + opts[:root] ||= SOURCE + path = "#{opts[:root]}/#{Paths[path.to_sym]}/#{opts[:node]}".split("/") + path.compact! + File.__send__ :join, path + end + + end #Path +end #JB + +# Usage: rake post title="A Title" [date="2012-02-09"] [tags=[tag1, tag2]] +desc "Begin a new post in #{CONFIG['posts']}" +task :post do + abort("rake aborted: '#{CONFIG['posts']}' directory not found.") unless FileTest.directory?(CONFIG['posts']) + title = ENV["title"] || "new-post" + tags = ENV["tags"] || "[]" + slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '') + begin + date = (ENV['date'] ? Time.parse(ENV['date']) : Time.now).strftime('%Y-%m-%d') + rescue Exception => e + puts "Error - date format must be YYYY-MM-DD, please check you typed it correctly!" + exit -1 + end + filename = File.join(CONFIG['posts'], "#{date}-#{slug}.#{CONFIG['post_ext']}") + if File.exist?(filename) + abort("rake aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n' + end + + puts "Creating new post: #{filename}" + open(filename, 'w') do |post| + post.puts "---" + post.puts "layout: post" + post.puts "title: \"#{title.gsub(/-/,' ')}\"" + post.puts 'description: ""' + post.puts "category: " + post.puts "tags: []" + post.puts "---" + post.puts "{% include JB/setup %}" + end +end # task :post + +# Usage: rake page name="about.html" +# You can also specify a sub-directory path. +# If you don't specify a file extention we create an index.html at the path specified +desc "Create a new page." +task :page do + name = ENV["name"] || "new-page.md" + filename = File.join(SOURCE, "#{name}") + filename = File.join(filename, "index.html") if File.extname(filename) == "" + title = File.basename(filename, File.extname(filename)).gsub(/[\W\_]/, " ").gsub(/\b\w/){$&.upcase} + if File.exist?(filename) + abort("rake aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n' + end + + mkdir_p File.dirname(filename) + puts "Creating new page: #{filename}" + open(filename, 'w') do |post| + post.puts "---" + post.puts "layout: page" + post.puts "title: \"#{title}\"" + post.puts 'description: ""' + post.puts "---" + post.puts "{% include JB/setup %}" + end +end # task :page + +desc "Launch preview environment" +task :preview do + system "jekyll --auto --server" +end # task :preview + +# Public: Alias - Maintains backwards compatability for theme switching. +task :switch_theme => "theme:switch" + +namespace :theme do + + # Public: Switch from one theme to another for your blog. + # + # name - String, Required. name of the theme you want to switch to. + # The the theme must be installed into your JB framework. + # + # Examples + # + # rake theme:switch name="the-program" + # + # Returns Success/failure messages. + desc "Switch between Jekyll-bootstrap themes." + task :switch do + theme_name = ENV["name"].to_s + theme_path = File.join(CONFIG['themes'], theme_name) + settings_file = File.join(theme_path, "settings.yml") + non_layout_files = ["settings.yml"] + + abort("rake aborted: name cannot be blank") if theme_name.empty? + abort("rake aborted: '#{theme_path}' directory not found.") unless FileTest.directory?(theme_path) + abort("rake aborted: '#{CONFIG['layouts']}' directory not found.") unless FileTest.directory?(CONFIG['layouts']) + + Dir.glob("#{theme_path}/*") do |filename| + next if non_layout_files.include?(File.basename(filename).downcase) + puts "Generating '#{theme_name}' layout: #{File.basename(filename)}" + + open(File.join(CONFIG['layouts'], File.basename(filename)), 'w') do |page| + if File.basename(filename, ".html").downcase == "default" + page.puts "---" + page.puts File.read(settings_file) if File.exist?(settings_file) + page.puts "---" + else + page.puts "---" + page.puts "layout: default" + page.puts "---" + end + page.puts "{% include JB/setup %}" + page.puts "{% include themes/#{theme_name}/#{File.basename(filename)} %}" + end + end + + puts "=> Theme successfully switched!" + puts "=> Reload your web-page to check it out =)" + end # task :switch + + # Public: Install a theme using the theme packager. + # Version 0.1.0 simple 1:1 file matching. + # + # git - String, Optional path to the git repository of the theme to be installed. + # name - String, Optional name of the theme you want to install. + # Passing name requires that the theme package already exist. + # + # Examples + # + # rake theme:install git="https://github.com/jekyllbootstrap/theme-twitter.git" + # rake theme:install name="cool-theme" + # + # Returns Success/failure messages. + desc "Install theme" + task :install do + if ENV["git"] + manifest = theme_from_git_url(ENV["git"]) + name = manifest["name"] + else + name = ENV["name"].to_s.downcase + end + + packaged_theme_path = JB::Path.build(:theme_packages, :node => name) + + abort("rake aborted! + => ERROR: 'name' cannot be blank") if name.empty? + abort("rake aborted! + => ERROR: '#{packaged_theme_path}' directory not found. + => Installable themes can be added via git. You can find some here: http://github.com/jekyllbootstrap + => To download+install run: `rake theme:install git='[PUBLIC-CLONE-URL]'` + => example : rake theme:install git='git@github.com:jekyllbootstrap/theme-the-program.git' + ") unless FileTest.directory?(packaged_theme_path) + + manifest = verify_manifest(packaged_theme_path) + + # Get relative paths to packaged theme files + # Exclude directories as they'll be recursively created. Exclude meta-data files. + packaged_theme_files = [] + FileUtils.cd(packaged_theme_path) { + Dir.glob("**/*.*") { |f| + next if ( FileTest.directory?(f) || f =~ /^(manifest|readme|packager)/i ) + packaged_theme_files << f + } + } + + # Mirror each file into the framework making sure to prompt if already exists. + packaged_theme_files.each do |filename| + file_install_path = File.join(JB::Path.base, filename) + if File.exist? file_install_path and ask("#{file_install_path} already exists. Do you want to overwrite?", ['y', 'n']) == 'n' + next + else + mkdir_p File.dirname(file_install_path) + cp_r File.join(packaged_theme_path, filename), file_install_path + end + end + + puts "=> #{name} theme has been installed!" + puts "=> ---" + if ask("=> Want to switch themes now?", ['y', 'n']) == 'y' + system("rake switch_theme name='#{name}'") + end + end + + # Public: Package a theme using the theme packager. + # The theme must be structured using valid JB API. + # In other words packaging is essentially the reverse of installing. + # + # name - String, Required name of the theme you want to package. + # + # Examples + # + # rake theme:package name="twitter" + # + # Returns Success/failure messages. + desc "Package theme" + task :package do + name = ENV["name"].to_s.downcase + theme_path = JB::Path.build(:themes, :node => name) + asset_path = JB::Path.build(:theme_assets, :node => name) + + abort("rake aborted: name cannot be blank") if name.empty? + abort("rake aborted: '#{theme_path}' directory not found.") unless FileTest.directory?(theme_path) + abort("rake aborted: '#{asset_path}' directory not found.") unless FileTest.directory?(asset_path) + + ## Mirror theme's template directory (_includes) + packaged_theme_path = JB::Path.build(:themes, :root => JB::Path.build(:theme_packages, :node => name)) + mkdir_p packaged_theme_path + cp_r theme_path, packaged_theme_path + + ## Mirror theme's asset directory + packaged_theme_assets_path = JB::Path.build(:theme_assets, :root => JB::Path.build(:theme_packages, :node => name)) + mkdir_p packaged_theme_assets_path + cp_r asset_path, packaged_theme_assets_path + + ## Log packager version + packager = {"packager" => {"version" => CONFIG["theme_package_version"].to_s } } + open(JB::Path.build(:theme_packages, :node => "#{name}/packager.yml"), "w") do |page| + page.puts packager.to_yaml + end + + puts "=> '#{name}' theme is packaged and available at: #{JB::Path.build(:theme_packages, :node => name)}" + end + +end # end namespace :theme + +# Internal: Download and process a theme from a git url. +# Notice we don't know the name of the theme until we look it up in the manifest. +# So we'll have to change the folder name once we get the name. +# +# url - String, Required url to git repository. +# +# Returns theme manifest hash +def theme_from_git_url(url) + tmp_path = JB::Path.build(:theme_packages, :node => "_tmp") + abort("rake aborted: system call to git clone failed") if !system("git clone #{url} #{tmp_path}") + manifest = verify_manifest(tmp_path) + new_path = JB::Path.build(:theme_packages, :node => manifest["name"]) + if File.exist?(new_path) && ask("=> #{new_path} theme package already exists. Override?", ['y', 'n']) == 'n' + remove_dir(tmp_path) + abort("rake aborted: '#{manifest["name"]}' already exists as theme package.") + end + + remove_dir(new_path) if File.exist?(new_path) + mv(tmp_path, new_path) + manifest +end + +# Internal: Process theme package manifest file. +# +# theme_path - String, Required. File path to theme package. +# +# Returns theme manifest hash +def verify_manifest(theme_path) + manifest_path = File.join(theme_path, "manifest.yml") + manifest_file = File.open( manifest_path ) + abort("rake aborted: repo must contain valid manifest.yml") unless File.exist? manifest_file + manifest = YAML.load( manifest_file ) + manifest_file.close + manifest +end + +def ask(message, valid_options) + if valid_options + answer = get_stdin("#{message} #{valid_options.to_s.gsub(/"/, '').gsub(/, /,'/')} ") while !valid_options.include?(answer) + else + answer = get_stdin(message) + end + answer +end + +def get_stdin(message) + print message + STDIN.gets.chomp +end + +#Load custom rake scripts +Dir['_rake/*.rake'].each { |r| load r } diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..55c1772 --- /dev/null +++ b/_config.yml @@ -0,0 +1,127 @@ +# This is the default format. +# For more see: https://github.com/mojombo/jekyll/wiki/Permalinks +permalink: /:categories/:year/:title + +exclude: [".rvmrc", ".rbenv-version", "README.md", "Rakefile", "changelog.md"] +pygments: true + +# Themes are encouraged to use these universal variables +# so be sure to set them if your theme uses them. +# +title : Nymote +tagline: Your conductor in the cloud +author : + name : Nymote + email : amir@nymote.com + github : nymote + twitter : nymote + feedburner : nymote + +# The production_url is only used when full-domain names are needed +# such as sitemap.txt +# Most places will/should use BASE_PATH to make the urls +# +# If you have set a CNAME (pages.github.com) set your custom domain here. +# Else if you are pushing to username.github.io, replace with your username. +# Finally if you are pushing to a GitHub project page, include the project name at the end. +# +production_url : http://nymote.github.io + +# All Jekyll-Bootstrap specific configurations are namespaced into this hash +# +JB : + version : 0.3.0 + + # All links will be namespaced by BASE_PATH if defined. + # Links in your website should always be prefixed with {{BASE_PATH}} + # however this value will be dynamically changed depending on your deployment situation. + # + # CNAME (http://yourcustomdomain.com) + # DO NOT SET BASE_PATH + # (urls will be prefixed with "/" and work relatively) + # + # GitHub Pages (http://username.github.io) + # DO NOT SET BASE_PATH + # (urls will be prefixed with "/" and work relatively) + # + # GitHub Project Pages (http://username.github.io/project-name) + # + # A GitHub Project site exists in the `gh-pages` branch of one of your repositories. + # REQUIRED! Set BASE_PATH to: http://username.github.io/project-name + # + # CAUTION: + # - When in Localhost, your site will run from root "/" regardless of BASE_PATH + # - Only the following values are falsy: ["", null, false] + # - When setting BASE_PATH it must be a valid url. + # This means always setting the protocol (http|https) or prefixing with "/" + BASE_PATH : false + + # By default, the asset_path is automatically defined relative to BASE_PATH plus the enabled theme. + # ex: [BASE_PATH]/assets/themes/[THEME-NAME] + # + # Override this by defining an absolute path to assets here. + # ex: + # http://s3.amazonaws.com/yoursite/themes/watermelon + # /assets + # + ASSET_PATH : false + + # These paths are to the main pages Jekyll-Bootstrap ships with. + # Some JB helpers refer to these paths; change them here if needed. + # + archive_path: /archive/ + categories_path : #/categories.html + tags_path : /tags/ + atom_path : /atom.xml + rss_path : /rss.xml + + # Settings for comments helper + # Set 'provider' to the comment provider you want to use. + # Set 'provider' to false to turn commenting off globally. + # + comments : + provider : livefyre +# disqus : +# short_name : jekyllbootstrap + livefyre : + site_id : 336188 +# intensedebate : +# account : 123abc +# facebook : +# appid : 123 +# num_posts: 5 +# width: 580 +# colorscheme: light + + # Settings for analytics helper + # Set 'provider' to the analytics provider you want to use. + # Set 'provider' to false to turn analytics off globally. + # + analytics : + provider : google + google : + tracking_id : 'UA-41508244-1' + getclicky : + site_id : + mixpanel : + token : '_MIXPANEL_TOKEN_' + + # Settings for sharing helper. + # Sharing is for things like tweet, plusone, like, reddit buttons etc. + # Set 'provider' to the sharing provider you want to use. + # Set 'provider' to false to turn sharing off globally. + # + sharing : + provider : false + + # Settings for all other include helpers can be defined by creating + # a hash with key named for the given helper. ex: + # + # pages_list : + # provider : "custom" + # + # Setting any helper's provider to 'custom' will bypass the helper code + # and include your custom code. Your custom file must be defined at: + # ./_includes/custom/[HELPER] + # where [HELPER] is the name of the helper you are overriding. + diff --git a/_includes/JB/analytics b/_includes/JB/analytics new file mode 100644 index 0000000..4b04ec9 --- /dev/null +++ b/_includes/JB/analytics @@ -0,0 +1,14 @@ +{% if site.safe and site.JB.analytics.provider and page.JB.analytics != false %} + +{% case site.JB.analytics.provider %} +{% when "google" %} + {% include JB/analytics-providers/google %} +{% when "getclicky" %} + {% include JB/analytics-providers/getclicky %} +{% when "mixpanel" %} + {% include JB/analytics-providers/mixpanel %} +{% when "custom" %} + {% include custom/analytics %} +{% endcase %} + +{% endif %} \ No newline at end of file diff --git a/_includes/JB/analytics-providers/getclicky b/_includes/JB/analytics-providers/getclicky new file mode 100644 index 0000000..e9462f4 --- /dev/null +++ b/_includes/JB/analytics-providers/getclicky @@ -0,0 +1,12 @@ + + diff --git a/_includes/JB/analytics-providers/google b/_includes/JB/analytics-providers/google new file mode 100644 index 0000000..9014866 --- /dev/null +++ b/_includes/JB/analytics-providers/google @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/_includes/JB/analytics-providers/mixpanel b/_includes/JB/analytics-providers/mixpanel new file mode 100644 index 0000000..4406eb0 --- /dev/null +++ b/_includes/JB/analytics-providers/mixpanel @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/_includes/JB/categories_list b/_includes/JB/categories_list new file mode 100644 index 0000000..83be2e2 --- /dev/null +++ b/_includes/JB/categories_list @@ -0,0 +1,37 @@ +{% comment %}{% endcomment %} + +{% if site.JB.categories_list.provider == "custom" %} + {% include custom/categories_list %} +{% else %} + {% if categories_list.first[0] == null %} + {% for category in categories_list %} +
  • + {{ category | join: "/" }} {{ site.categories[category].size }} +
  • + {% endfor %} + {% else %} + {% for category in categories_list %} +
  • + {{ category[0] | join: "/" }} {{ category[1].size }} +
  • + {% endfor %} + {% endif %} +{% endif %} +{% assign categories_list = nil %} \ No newline at end of file diff --git a/_includes/JB/comments b/_includes/JB/comments new file mode 100644 index 0000000..4e9e600 --- /dev/null +++ b/_includes/JB/comments @@ -0,0 +1,16 @@ +{% if site.JB.comments.provider and page.comments != false %} + +{% case site.JB.comments.provider %} +{% when "disqus" %} + {% include JB/comments-providers/disqus %} +{% when "livefyre" %} + {% include JB/comments-providers/livefyre %} +{% when "intensedebate" %} + {% include JB/comments-providers/intensedebate %} +{% when "facebook" %} + {% include JB/comments-providers/facebook %} +{% when "custom" %} + {% include custom/comments %} +{% endcase %} + +{% endif %} \ No newline at end of file diff --git a/_includes/JB/comments-providers/disqus b/_includes/JB/comments-providers/disqus new file mode 100644 index 0000000..618a7b7 --- /dev/null +++ b/_includes/JB/comments-providers/disqus @@ -0,0 +1,14 @@ +
    + + +blog comments powered by Disqus diff --git a/_includes/JB/comments-providers/facebook b/_includes/JB/comments-providers/facebook new file mode 100644 index 0000000..6b3e5e0 --- /dev/null +++ b/_includes/JB/comments-providers/facebook @@ -0,0 +1,9 @@ +
    + +
    \ No newline at end of file diff --git a/_includes/JB/comments-providers/intensedebate b/_includes/JB/comments-providers/intensedebate new file mode 100644 index 0000000..ab0c3c9 --- /dev/null +++ b/_includes/JB/comments-providers/intensedebate @@ -0,0 +1,6 @@ + + diff --git a/_includes/JB/comments-providers/livefyre b/_includes/JB/comments-providers/livefyre new file mode 100644 index 0000000..704b803 --- /dev/null +++ b/_includes/JB/comments-providers/livefyre @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/_includes/JB/liquid_raw b/_includes/JB/liquid_raw new file mode 100644 index 0000000..a5c1783 --- /dev/null +++ b/_includes/JB/liquid_raw @@ -0,0 +1,32 @@ +{% comment%}{% endcomment%} + +{% if site.JB.liquid_raw.provider == "custom" %} + {% include custom/liquid_raw %} +{% else %} +
    {{text | replace:"|.", "{" | replace:".|", "}" | replace:">", ">" | replace:"<", "<" }}
    +{% endif %} +{% assign text = nil %} \ No newline at end of file diff --git a/_includes/JB/pages_list b/_includes/JB/pages_list new file mode 100644 index 0000000..42f827a --- /dev/null +++ b/_includes/JB/pages_list @@ -0,0 +1,39 @@ +{% comment %}{% endcomment %} + +{% if site.JB.pages_list.provider == "custom" %} + {% include custom/pages_list %} +{% else %} + {% for node in pages_list %} + {% if node.title != null %} + {% if group == null or group == node.group %} + {% if page.url == node.url %} +
  • {{node.title}}
  • + {% else %} +
  • {{node.title}}
  • + {% endif %} + {% endif %} + {% endif %} + {% endfor %} +{% endif %} +{% assign pages_list = nil %} +{% assign group = nil %} \ No newline at end of file diff --git a/_includes/JB/posts_collate b/_includes/JB/posts_collate new file mode 100644 index 0000000..f612ade --- /dev/null +++ b/_includes/JB/posts_collate @@ -0,0 +1,55 @@ +{% comment %}{% endcomment %} + +{% if site.JB.posts_collate.provider == "custom" %} + {% include custom/posts_collate %} +{% else %} + {% for post in posts_collate %} + {% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %} + {% capture this_month %}{{ post.date | date: "%B" }}{% endcapture %} + {% capture next_year %}{{ post.previous.date | date: "%Y" }}{% endcapture %} + {% capture next_month %}{{ post.previous.date | date: "%B" }}{% endcapture %} + + {% if forloop.first %} +

    {{this_year}}

    +

    {{this_month}}

    + + {% else %} + {% if this_year != next_year %} + +

    {{next_year}}

    +

    {{next_month}}

    + +

    {{next_month}}

    + +

    {{next_year}}

    + {% comment %}

    {{next_month}}

    {% endcomment %} + + {% comment %}

    {{next_month}}

    {% endcomment %} +