Module: Cosensee

Defined in:
lib/cosensee/page.rb,
lib/cosensee.rb,
lib/cosensee/user.rb,
lib/cosensee/error.rb,
lib/cosensee/project.rb,
lib/cosensee/version.rb,
lib/cosensee/node/code.rb,
lib/cosensee/node/link.rb,
lib/cosensee/cli/option.rb,
lib/cosensee/cli/parser.rb,
lib/cosensee/node/quote.rb,
lib/cosensee/page_store.rb,
lib/cosensee/web_server.rb,
lib/cosensee/delegatable.rb,
lib/cosensee/line_parser.rb,
lib/cosensee/node/indent.rb,
lib/cosensee/parsed_line.rb,
lib/cosensee/html_builder.rb,
lib/cosensee/api/page_data.rb,
lib/cosensee/node/hash_tag.rb,
lib/cosensee/bracket_parser.rb,
lib/cosensee/html_encodable.rb,
lib/cosensee/link_encodable.rb,
lib/cosensee/node/codeblock.rb,
lib/cosensee/parsed_bracket.rb,
lib/cosensee/cli/initializer.rb,
lib/cosensee/tailwind_command.rb,
lib/cosensee/node/command_line.rb,
lib/cosensee/node/icon_bracket.rb,
lib/cosensee/node/text_bracket.rb,
lib/cosensee/tailwind_renderer.rb,
lib/cosensee/bracket_serializer.rb,
lib/cosensee/node/blank_bracket.rb,
lib/cosensee/node/empty_bracket.rb,
lib/cosensee/node/image_bracket.rb,
lib/cosensee/node/double_bracket.rb,
lib/cosensee/node/formula_bracket.rb,
lib/cosensee/node/youtube_bracket.rb,
lib/cosensee/node/decorate_bracket.rb,
lib/cosensee/render_class_findable.rb,
lib/cosensee/web_content_generator.rb,
lib/cosensee/tailwind_renderer/code.rb,
lib/cosensee/tailwind_renderer/link.rb,
lib/cosensee/tailwind_renderer/page.rb,
lib/cosensee/tailwind_renderer/quote.rb,
lib/cosensee/node/gyazo_image_bracket.rb,
lib/cosensee/node/external_link_bracket.rb,
lib/cosensee/node/internal_link_bracket.rb,
lib/cosensee/tailwind_renderer/hash_tag.rb,
lib/cosensee/tailwind_renderer/codeblock.rb,
lib/cosensee/node/spotify_playlist_bracket.rb,
lib/cosensee/tailwind_renderer/parsed_line.rb,
lib/cosensee/tailwind_renderer/command_line.rb,
lib/cosensee/tailwind_renderer/icon_bracket.rb,
lib/cosensee/tailwind_renderer/text_bracket.rb,
lib/cosensee/web_server/static_file_handler.rb,
lib/cosensee/tailwind_renderer/blank_bracket.rb,
lib/cosensee/tailwind_renderer/empty_bracket.rb,
lib/cosensee/tailwind_renderer/image_bracket.rb,
lib/cosensee/tailwind_renderer/double_bracket.rb,
lib/cosensee/tailwind_renderer/formula_bracket.rb,
lib/cosensee/tailwind_renderer/inline_svg_text.rb,
lib/cosensee/tailwind_renderer/youtube_bracket.rb,
lib/cosensee/tailwind_renderer/decorate_bracket.rb,
lib/cosensee/tailwind_renderer/gyazo_image_bracket.rb,
lib/cosensee/tailwind_renderer/external_link_bracket.rb,
lib/cosensee/tailwind_renderer/internal_link_bracket.rb,
lib/cosensee/tailwind_renderer/spotify_playlist_bracket.rb

Overview

require ‘uri’

Defined Under Namespace

Modules: Api, BracketSerializer, Delegatable, HtmlEncodable, LinkEncodable, Node, RenderClassFindable, TailwindCommand Classes: BracketParser, CLI, Error, HtmlBuilder, LineParser, PageStore, ParsedBracket, ParsedLine, Project, TailwindRenderer, WebContentGenerator, WebServer

Constant Summary collapse

MAX_SUMMARY_LINE =
10
MAX_SUMMARY_TEXT_SIZE =
300
DEFAULT_OUTPUT_DIR =
'./dist'
DEFAULT_CSS_DIR =
'css'
DEFAULT_PORT =
'1212'
TAILWIND_CONFIG_FILE =
'tailwind.config.js'
Page =

for Page

Data.define(:id, :title, :created, :updated, :views, :lines) do
  def self.from_array(args_list)
    args_list.map do |args|
      if args.is_a?(Cosensee::Page)
        args
      else
        new(**args)
      end
    end
  end

  def initialize(id:, title:, created:, updated:, views:, lines:)
    temp_lines = lines.drop(1).map { |arg| LineParser.parse(arg) }
    @parsed_lines = LineParser.merge_blocks(temp_lines)
    @linking_page_titles = @parsed_lines.map(&:internal_links).flatten
    @first_image = @parsed_lines.find(&:first_image)&.first_image

    super(
      id:,
      title:,
      created: Time.at(created),
      updated: Time.at(updated),
      views:,
      lines:
    )
  end

  attr_accessor :parsed_lines, :linking_page_titles, :first_image

  def summary
    if (image = first_image)
      if image.is_a?(Cosensee::Node::GyazoImageBracket)
        %(<img src="#{image.src}/raw" loading="lazy">)
      else
        %(<img src="#{image.src}" loading="lazy">)
      end
    else
      parsed_lines.map(&:to_s).take(MAX_SUMMARY_LINE).join
    end
  end

  def summary_text
    parsed_lines.map(&:to_s).join.slice(0, MAX_SUMMARY_TEXT_SIZE)
  end

  def description
    summary_text
  end

  def ogp_image_url
    first_image
  end

  def song_page?
    parsed_lines.any?(&:song_tagged?)
  end

  def body_lines
    lines.drop(1)
  end

  def link_path
    # body = URI.encode_www_form_component(title.gsub(/ /, '_'))
    body = title.gsub(/ /, '_').gsub('=', '=3d').gsub('/', '=2F').gsub('#', '=23')

    "#{body}.html"
  end

  def full_url(base_url:)
    return unless base_url && link_path

    "#{base_url}/#{link_path}"
  end

  def to_html(project: nil)
    Cosensee::TailwindRenderer.new(content: self, project:).render
  end

  def to_obj
    { id:, title:, created: created.to_i, updated: updated.to_i, views:, lines: }
  end

  def to_json(*)
    to_obj.to_json(*)
  end

  def inspect
    "#<data Cosensee::Page id: #{id}, title: #{title}>"
  end
end
User =

for User

Data.define(:id, :name, :display_name, :email) do
  def self.from_array(users_args)
    users_args.map do |args|
      if args.is_a?(Cosensee::User)
        args
      else
        new(**args)
      end
    end
  end

  # allow both `:display_key` and `:displayKey`
  def initialize(id:, name:, email:, **kwargs)
    display_name = if kwargs.keys == [:display_name]
                     kwargs[:display_name]
                   elsif kwargs.keys == [:displayName]
                     kwargs[:displayName]
                   else
                     raise Cosensee::Error, 'Cosensee::User.new need an argument :display_name or :displayName'
                   end
    super(
      id:,
      display_name:,
      name:,
      email:
    )
  end

  def to_obj
    { id:, name:, displayName: display_name, email: }
  end

  def to_json(*)
    to_obj.to_json(*)
  end
end
VERSION =
'0.8.0'