mirror of
https://github.com/google/pebble.git
synced 2025-03-15 08:41:21 +00:00
166 lines
5 KiB
Ruby
166 lines
5 KiB
Ruby
# Copyright 2025 Google LLC
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
require 'open-uri'
|
|
require 'zip'
|
|
require 'nokogiri'
|
|
|
|
require_relative '../lib/pebble_documentation_pebblekit_android.rb'
|
|
require_relative '../lib/pebble_documentation_c.rb'
|
|
require_relative '../lib/pebble_documentation_js.rb'
|
|
require_relative '../lib/pebble_documentation_pebblekit_ios.rb'
|
|
require_relative '../lib/toc_generator.rb'
|
|
|
|
OpenURI::Buffer.send :remove_const, 'StringMax' if OpenURI::Buffer.const_defined?('StringMax')
|
|
OpenURI::Buffer.const_set 'StringMax', 0
|
|
|
|
# Master plugins for processing the documentation on the site.
|
|
# The actual work is done in individual classes for each language type.
|
|
# Each class generates three types of data:
|
|
# - Symbols
|
|
# - Pages
|
|
# - Tree
|
|
#
|
|
# The Symbols are a list of objects that are things such as methods, classes
|
|
# or enums, that are used to populate the search indexes, and power the double
|
|
# backtick docs linking.
|
|
#
|
|
# The Pages are the Jekyll pages that will be part of the built site and are
|
|
# what the user will see.
|
|
#
|
|
# The Tree is used to build the site navigation.
|
|
#
|
|
# Note: The docs_url variable is created from the environment.
|
|
# See environment.md for more information.
|
|
|
|
module Jekyll
|
|
class DocsGenerator < Generator
|
|
priority :high
|
|
|
|
def generate(site)
|
|
@site = site
|
|
@docs = {
|
|
symbols: [],
|
|
pages: [],
|
|
tree: {}
|
|
}
|
|
if @site.config['docs_url'].nil? || @site.config['docs_url'].empty?
|
|
Jekyll.logger.warn(
|
|
'Config Warning:',
|
|
'You did not provide a DOCS_URL environment variable.'
|
|
)
|
|
elsif !@site.config['skip_docs'].nil? && (@site.config['skip_docs'] == 'true')
|
|
Jekyll.logger.info('Docs Generation:', 'Skipping documentation generation...')
|
|
else
|
|
Jekyll.logger.info('Docs Generation:', 'Generating pages...')
|
|
generate_docs
|
|
render_pages
|
|
Jekyll.logger.info('Docs Generation:', 'Done.')
|
|
end
|
|
set_data
|
|
end
|
|
|
|
private
|
|
|
|
def generate_docs
|
|
# The order of these functions will determine the order of preference
|
|
# when looking up symbols e.g. double backticks
|
|
# DO NOT CHANGE THE ORDER UNLESS YOU KNOW WHAT YOU ARE DOING
|
|
generate_docs_c
|
|
generate_docs_c_preview unless @site.data['docs']['c_preview'].nil?
|
|
generate_docs_rocky_js
|
|
generate_docs_pebblekit_js
|
|
generate_docs_pebblekit_android
|
|
generate_docs_pebblekit_ios
|
|
end
|
|
|
|
def render_pages
|
|
@docs[:pages].each { |page| @site.pages << page }
|
|
end
|
|
|
|
def set_data
|
|
# A somewhat ugly hack to let the Markdown parser have access
|
|
# to this data.
|
|
@site.config[:docs] = @docs
|
|
@site.data['docs'] = @docs
|
|
# Another ugly hack to make accessing the data much easier from Liquid.
|
|
@site.data['docs_tree'] = JSON.parse(JSON.dump(@docs[:tree]))
|
|
@site.data['symbols'] = JSON.parse(JSON.dump(@docs[:symbols]))
|
|
end
|
|
|
|
def generate_docs_c
|
|
docs = Pebble::DocumentationC.new(
|
|
@site,
|
|
@site.config['docs_url'] + @site.data['docs']['c'],
|
|
'/docs/c/'
|
|
)
|
|
load_data(docs, :c)
|
|
end
|
|
|
|
def generate_docs_c_preview
|
|
docs = Pebble::DocumentationC.new(
|
|
@site,
|
|
@site.config['docs_url'] + @site.data['docs']['c_preview'],
|
|
'/docs/c/preview/',
|
|
'c_preview'
|
|
)
|
|
load_data(docs, :c_preview)
|
|
end
|
|
|
|
def generate_docs_rocky_js
|
|
docs = Pebble::DocumentationJs.new(
|
|
@site,
|
|
@site.data['docs']['rocky_js'],
|
|
'/docs/rockyjs/',
|
|
'rockyjs',
|
|
true
|
|
)
|
|
load_data(docs, :rockyjs)
|
|
end
|
|
|
|
def generate_docs_pebblekit_js
|
|
docs = Pebble::DocumentationJs.new(
|
|
@site,
|
|
@site.data['docs']['pebblekit_js'],
|
|
'/docs/pebblekit-js/',
|
|
'pebblekit_js'
|
|
)
|
|
load_data(docs, :pebblekit_js)
|
|
end
|
|
|
|
def generate_docs_pebblekit_android
|
|
docs = Pebble::DocumentationPebbleKitAndroid.new(
|
|
@site,
|
|
@site.config['docs_url'] + @site.data['docs']['pebblekit_android']
|
|
)
|
|
load_data(docs, :pebblekit_android)
|
|
end
|
|
|
|
def generate_docs_pebblekit_ios
|
|
docs = Pebble::DocumentationPebbleKitIos.new(
|
|
@site,
|
|
@site.config['docs_url'] + @site.data['docs']['pebblekit_ios'],
|
|
'/docs/pebblekit-ios/'
|
|
)
|
|
load_data(docs, :pebblekit_ios)
|
|
end
|
|
|
|
def load_data(docs, type)
|
|
@docs[:tree][type] = []
|
|
docs.load_symbols(@docs[:symbols])
|
|
docs.create_pages(@docs[:pages])
|
|
docs.build_tree(@docs[:tree][type])
|
|
end
|
|
end
|
|
end
|