takahashim/cheepub

View on GitHub
lib/cheepub/content.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'yaml'

module Cheepub
  class Content
    include Enumerable
    using Cheepub::ExtHash

    SEPARATOR_PATTERN = /\n\n(?:\={3,}|\-{6,})\s*\n\n/m
    FRONTMATTER_PATTERN = /\A---$(.*?)^---\n/m

    attr_reader :src
    attr_reader :header
    attr_reader :body
    attr_reader :pages

    def initialize(content)
      @content = content
      @header, @body = parse_frontmatter(@content)
      @pages = separate_pages(@body)
    end

    def each
      @pages.each do |page|
        yield page
      end
    end


    def separate_pages(body)
      pages = nil
      if body =~ SEPARATOR_PATTERN
        pages = body.split(SEPARATOR_PATTERN)
      else
        pages = [body]
      end
      pages.each_with_index do |page, idx|
        if idx < pages.size - 1
          page.concat("\n")
        end
      end
      pages
    end

    def parse_frontmatter(src)
      header = body = nil
      if src =~ FRONTMATTER_PATTERN
        header, body = YAML.safe_load($1).symbolize_keys!, $'
      else
        header, body = Hash.new(), src
      end
      return header, body
    end
  end
end