# Port number to bind on (will overwrite the config one).
var opt_port = new OptionInt("Port number to use", -1, "--port")
+ # --no-private
+ var opt_no_private = new OptionBool("Do not show private entities", "--no-private")
+
+ # --no-fictive
+ var opt_no_fictive = new OptionBool("Do not show fictive entities", "--no-fictive")
+
+ # --no-test
+ var opt_no_test = new OptionBool("Do not show test related entities", "--no-test")
+
+ # --no-attribute
+ var opt_no_attribute = new OptionBool("Do not show attributes", "--no-attribute")
+
+ # --no-empty-doc
+ var opt_no_empty_doc = new OptionBool("Do not undocumented entities", "--no-empty-doc")
+
# Web rendering phase.
var webphase: Phase = new NitwebPhase(self, null)
init do
super
- option_context.add_option(opt_config, opt_host, opt_port)
+ option_context.add_option(opt_config, opt_host, opt_port, opt_no_private,
+ opt_no_fictive, opt_no_test, opt_no_attribute, opt_no_empty_doc)
end
end
# Build the nitweb config from `toolcontext` options.
fun build_config(toolcontext: ToolContext, mainmodule: MModule): NitwebConfig do
- var config = new NitwebConfig(
- toolcontext.modelbuilder.model,
- mainmodule,
- toolcontext.modelbuilder)
+
+ var model = toolcontext.modelbuilder.model
+
+ var filter = new ModelFilter(
+ if toolcontext.opt_no_private.value then protected_visibility else private_visibility,
+ accept_fictive = not toolcontext.opt_no_fictive.value,
+ accept_empty_doc = not toolcontext.opt_no_empty_doc.value,
+ accept_test = not toolcontext.opt_no_test.value,
+ accept_attribute = not toolcontext.opt_no_attribute.value
+ )
+
+ var view = new ModelView(model, mainmodule, filter)
+
+ var config = new NitwebConfig(model, mainmodule, toolcontext.modelbuilder, view)
var config_file = toolcontext.opt_config.value
if config_file == null then config.default_config_file = "nitweb.ini"
config.parse_options(args)
class InheritanceGraph
super ModelVisitor
+ autoinit center, view, filter
+
# MEntity at the center of this graph
var center: MEntity
return mentities
end
+ # Filter mentities based on the config view filters
+ fun filter_mentities(req: HttpRequest, mentities: Array[MEntity]): Array[MEntity] do
+ var res = new Array[MEntity]
+ for mentity in mentities do
+ if config.view.filter.accept_mentity(mentity) then res.add mentity
+ end
+ return res
+ end
+
# Sort mentities by lexicographic order
#
# TODO choose order from request
- fun sort_mentities(req: HttpRequest, mentities: Array[MEntity]) : Array[MEntity] do
+ fun sort_mentities(req: HttpRequest, mentities: Array[MEntity]): Array[MEntity] do
var sorted = mentities.to_a
var sorter = new MEntityNameSorter
sorter.sort(sorted)
redef fun get(req, res) do
var mentities = list_mentities(req)
+ mentities = filter_mentities(req, mentities)
mentities = randomize_mentities(req, mentities)
mentities = limit_mentities(req, mentities)
res.json new JsonArray.from(mentities)
res.api_error(404, "No definition list for mentity `{mentity.full_name}`")
return
end
+ mentities = filter_mentities(req, mentities)
mentities = sort_mentities(req, mentities)
mentities = limit_mentities(req, mentities)
res.json new JsonArray.from(mentities)
# Modelbuilder used to access sources.
var modelbuilder: ModelBuilder
- # The JSON API does not filter anything by default.
- #
- # So we can cache the model view.
- var view: ModelView is lazy do
- var view = new ModelView(model, mainmodule)
- view.min_visibility = private_visibility
- view.include_fictive = true
- view.include_empty_doc = true
- view.include_attribute = true
- view.include_test = true
- return view
- end
+ # ModelView used to access model.
+ var view: ModelView
end
# Specific handler for the nitweb API.
# Find the MEntity ` with `full_name`.
fun find_mentity(model: ModelView, full_name: nullable String): nullable MEntity do
if full_name == null then return null
- return model.mentity_by_full_name(full_name.from_percent_encoding)
+ var mentity = model.mentity_by_full_name(full_name.from_percent_encoding)
+ if mentity == null then return null
+ if config.view.accept_mentity(mentity) then return mentity
+ return null
end
# Try to load the mentity from uri with `/:id`.