class JsDuck::News

Public Class Methods

create(relations, doc_formatter, opts) click to toggle source

Creates News object from relations data when –import option specified.

# File lib/jsduck/news.rb, line 9
def self.create(relations, doc_formatter, opts)
  if opts.import.length > 0
    News.new(relations, doc_formatter)
  else
    Util::NullObject.new(:to_html => "")
  end
end
new(relations, doc_formatter) click to toggle source

Generates list of new classes & members in this version.

# File lib/jsduck/news.rb, line 18
def initialize(relations, doc_formatter)
  @doc_formatter = doc_formatter
  @columns = Columns.new(:members)
  @new_items = filter_new_items(relations)
end

Public Instance Methods

to_html(style="") click to toggle source

Returns the HTML

# File lib/jsduck/news.rb, line 25
def to_html(style="")
  return [
    "<div id='news-content' style='#{style}'>",
      "<div class='section'>",
        "<h1>New in this version</h1>",
          render_news(@new_items),
        "<div style='clear:both'></div>",
      "</div>",
    "</div>",
  ].flatten.join("\n")
end

Private Instance Methods

discard_accessors(members) click to toggle source
# File lib/jsduck/news.rb, line 84
def discard_accessors(members)
  accessors = {}
  members.find_all {|m| m[:accessor] }.each do |cfg|
    accessors["set" + upcase_first(cfg[:name])] = true
    accessors["get" + upcase_first(cfg[:name])] = true
    accessors[cfg[:name].downcase + "change"] = true if cfg[:evented]
  end

  members.reject {|m| accessors[m[:name]] }
end
filter_new_items(relations) click to toggle source
# File lib/jsduck/news.rb, line 39
def filter_new_items(relations)
  classes = []
  new_items = []

  relations.each do |cls|
    if !cls[:private]
      if cls[:new]
        classes << cls
      else
        members = filter_new_members(cls)
        if members.length > 0
          new_items << {:name => cls[:name], :members => members}
        end
      end
    end
  end

  new_items.sort! {|a, b| a[:name] <=> b[:name] }

  # Place the new classes section at the beginning
  if classes.length > 0
    new_items.unshift({:name => "New classes", :members => classes})
  end

  new_items
end
filter_new_members(cls) click to toggle source

Returns all members of a class that have been marked as new, or have parameters marked as new.

# File lib/jsduck/news.rb, line 68
def filter_new_members(cls)
  members = cls.all_local_members.find_all do |m|
    visible?(m) && (m[:new] || new_params?(m))
  end
  members = discard_accessors(members)
  members.sort! {|a, b| a[:name] <=> b[:name] }
end
new_params?(member) click to toggle source
# File lib/jsduck/news.rb, line 80
def new_params?(member)
  Array(member[:params]).any? {|p| p[:new] }
end
params_note(m) click to toggle source
# File lib/jsduck/news.rb, line 139
def params_note(m)
  if !m[:new] && new_params?(m)
    " <small>+parameters</small>"
  else
    ""
  end
end
render_col(col) click to toggle source
# File lib/jsduck/news.rb, line 120
def render_col(col)
  return col.map do |item|
    [
      "<h3>#{item[:name]}</h3>",
      "<ul class='links'>",
      item[:members].map {|m| "<li>" + link(m) + "</li>" },
      "</ul>",
    ]
  end
end
render_columns(new_items) click to toggle source
# File lib/jsduck/news.rb, line 107
def render_columns(new_items)
  align = ["left-column", "middle-column", "right-column"]
  i = -1
  return @columns.split(new_items, 3).map do |col|
    i += 1
    [
      "<div class='#{align[i]}'>",
      render_col(col),
      "</div>",
    ]
  end
end
render_news(new_items) click to toggle source
# File lib/jsduck/news.rb, line 99
def render_news(new_items)
  if new_items.length > 0
    render_columns(new_items)
  else
    "<h3>Nothing new.</h3>"
  end
end
upcase_first(str) click to toggle source
# File lib/jsduck/news.rb, line 95
def upcase_first(str)
  str[0,1].upcase + str[1..-1]
end
visible?(member) click to toggle source
# File lib/jsduck/news.rb, line 76
def visible?(member)
  !member[:private] && !member[:hide]
end