mirror of https://github.com/freeCodeCamp/devdocs
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
1.8 KiB
84 lines
1.8 KiB
module Docs
|
|
class Doc
|
|
INDEX_FILENAME = 'index.json'
|
|
|
|
class << self
|
|
attr_accessor :name, :slug, :type, :version, :abstract
|
|
|
|
def inherited(subclass)
|
|
subclass.type = type
|
|
end
|
|
|
|
def name
|
|
@name || super.try(:demodulize)
|
|
end
|
|
|
|
def slug
|
|
@slug || name.try(:downcase)
|
|
end
|
|
|
|
def path
|
|
slug
|
|
end
|
|
|
|
def index_path
|
|
File.join path, INDEX_FILENAME
|
|
end
|
|
|
|
def as_json
|
|
{ name: name,
|
|
slug: slug,
|
|
type: type,
|
|
version: version,
|
|
index_path: index_path }
|
|
end
|
|
|
|
def index_page(id)
|
|
if (page = new.build_page(id)) && page[:entries].present?
|
|
yield page[:store_path], page[:output]
|
|
index = EntryIndex.new
|
|
index.add page[:entries]
|
|
index
|
|
end
|
|
end
|
|
|
|
def index_pages
|
|
index = EntryIndex.new
|
|
new.build_pages do |page|
|
|
next if page[:entries].blank?
|
|
yield page[:store_path], page[:output]
|
|
index.add page[:entries]
|
|
end
|
|
index.empty? ? nil : index
|
|
end
|
|
|
|
def store_page(store, id)
|
|
store.open path do
|
|
index = index_page(id, &store.method(:write))
|
|
!!index
|
|
end
|
|
end
|
|
|
|
def store_pages(store)
|
|
store.replace path do
|
|
index = index_pages(&store.method(:write))
|
|
store.write INDEX_FILENAME, index.to_json if index
|
|
!!index
|
|
end
|
|
end
|
|
end
|
|
|
|
def initialize
|
|
raise NotImplementedError, "#{self.class} is an abstract class and cannot be instantiated." if self.class.abstract
|
|
end
|
|
|
|
def build_page(id, &block)
|
|
raise NotImplementedError
|
|
end
|
|
|
|
def build_pages(&block)
|
|
raise NotImplementedError
|
|
end
|
|
end
|
|
end
|