docs: Replace JSDuck with JSDoc (and pull-through VE with said change)

This is not great, but it's a start (and unblocks other pull-throughs).

New changes:
c401efc98 build: Replace jsduck with jsdoc for documentation
16ba162a0 JSDoc: @mixins -> @mixes
9e0a1f53b JSDoc: Fix complex return types
449b6cc0f Prefer arrow function callbacks
1539af2c8 Remove 'this' bindings in arrow functions
b760f3b14 Use arrow functions in OO.ui.Process steps
57c24109e Use arrow functions in jQuery callbacks
9622ccef9 Convert some remaining functions callbacks to arrow functions
f6c885021 Remove useless local variable
1cd800020 Clear branch node cache when rebuilding tree

Bug: T250843
Bug: T363329
Change-Id: I0f4878ca84b95e3f388b358b943f105637e455f9
This commit is contained in:
James D. Forrester 2024-04-29 12:52:40 +01:00 committed by Ed Sanders
parent f97b812fb2
commit b518e55ef9
43 changed files with 656 additions and 1565 deletions

92
.jsdoc.json Normal file
View file

@ -0,0 +1,92 @@
{
"opts": {
"encoding": "utf8",
"destination": "docs",
"package": "package.json",
"readme": "README.md",
"pedantic": false,
"private": true,
"recurse": true,
"template": "node_modules/jsdoc-wmf-theme",
"class-hierarchy": {
"showList": true
}
},
"plugins": [
"plugins/markdown",
"plugins/summarize",
"node_modules/jsdoc-class-hierarchy"
],
"source": {
"include": [ "modules/ve-mw", "modules/ve-mw-collab" ],
"exclude": [ "modules/ve-mw/tests" ]
},
"templates": {
"cleverLinks": true,
"default": {
"useLongnameInNav": true
},
"wmf": {
"maintitle": "VisualEditor-MediaWiki",
"repository": "https://gerrit.wikimedia.org/g/mediawiki/extensions/VisualEditor/",
"linkMap": {
"Mixed": "#",
"Array": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array",
"Error": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error",
"Object": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object",
"Promise": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise",
"Blob": "https://developer.mozilla.org/en-US/docs/Web/API/Blob",
"DataTransfer": "https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer",
"DataTransferItem": "https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem",
"Event": "https://developer.mozilla.org/en-US/docs/Web/API/Event",
"HTMLDocument": "https://developer.mozilla.org/en-US/docs/Web/API/HTMLDocument",
"HTMLElement": "https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement",
"MutationRecord": "https://developer.mozilla.org/en-US/docs/Web/API/MutationRecord",
"Node": "https://developer.mozilla.org/en-US/docs/Web/API/Node",
"NodeList": "https://developer.mozilla.org/en-US/docs/Web/API/NodeList",
"Range": "https://developer.mozilla.org/en-US/docs/Web/API/Range",
"Selection": "https://developer.mozilla.org/en-US/docs/Web/API/Selection",
"jQuery": "http://api.jquery.com/",
"jQuery.Deferred": "http://api.jquery.com/jQuery.Deferred/",
"jQuery.Event": "http://api.jquery.com/Types/#Event",
"jQuery.Promise": "http://api.jquery.com/Types/#Promise",
"OO.EventEmitter": "https://doc.wikimedia.org/oojs/master/OO.EventEmitter.html",
"OO.Factory": "https://doc.wikimedia.org/oojs/master/OO.Factory.html",
"OO.Registry": "https://doc.wikimedia.org/oojs/master/OO.Registry.html",
"OO.ui.mixin.GroupElement": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.mixin.GroupElement.html",
"OO.ui.mixin.PendingElement": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.mixin.PendingElement.html",
"OO.ui.BookletLayout": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.BookletLayout.html",
"OO.ui.ButtonSelectWidget": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.ButtonSelectWidget.html",
"OO.ui.DecoratedOptionWidget": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.DecoratedOptionWidget.html",
"OO.ui.Dialog": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.Dialog.html",
"OO.ui.Element": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.Element.html",
"OO.ui.HtmlSnippet": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.HtmlSnippet.html",
"OO.ui.MenuOptionWidget": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.MenuOptionWidget.html",
"OO.ui.MessageDialog": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.MessageDialog.html",
"OO.ui.MultilineTextInputWidget": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.MultilineTextInputWidget.html",
"OO.ui.NumberInputWidget": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.NumberInputWidget.html",
"OO.ui.OptionWidget": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.OptionWidget.html",
"OO.ui.PageLayout": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.PageLayout.html",
"OO.ui.PopupTool": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.PopupTool.html",
"OO.ui.Process": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.Process.html",
"OO.ui.ProcessDialog": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.ProcessDialog.html",
"OO.ui.SearchWidget": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.SearchWidget.html",
"OO.ui.SelectWidget": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.SelectWidget.html",
"OO.ui.TextInputWidget": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.TextInputWidget.html",
"OO.ui.Tool": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.Tool.html",
"OO.ui.Toolbar": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.Toolbar.html",
"OO.ui.ToolFactory": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.ToolFactory.html",
"OO.ui.ToolGroup": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.ToolGroup.html",
"OO.ui.ToolGroupTool": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.ToolGroupTool.html",
"OO.ui.Widget": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.Widget.html",
"OO.ui.Window": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.Window.html",
"OO.ui.WindowManager": "https://doc.wikimedia.org/oojs-ui/master/js/OO.ui.WindowManager.html"
}
}
}
}

View file

@ -1,116 +0,0 @@
# Custom tags for JSDuck 5.x
# See also:
# - https://github.com/senchalabs/jsduck/wiki/Tags
# - https://github.com/senchalabs/jsduck/wiki/Custom-tags
# - https://github.com/senchalabs/jsduck/wiki/Custom-tags/7f5c32e568eab9edc8e3365e935bcb836cb11f1d
require 'jsduck/tag/tag'
class CommonTag < JsDuck::Tag::Tag
def initialize
@html_position = POS_DOC + 0.1
@repeatable = true
end
def parse_doc(scanner, position)
if @multiline
return { :tagname => @tagname, :doc => :multiline }
else
text = scanner.match(/.*$/)
return { :tagname => @tagname, :doc => text }
end
end
def process_doc(context, tags, position)
context[@tagname] = tags
end
def format(context, formatter)
context[@tagname].each do |tag|
tag[:doc] = formatter.format(tag[:doc])
end
end
end
class SourceTag < CommonTag
def initialize
@tagname = :source
@pattern = "source"
super
end
def to_html(context)
context[@tagname].map do |source|
<<-EOHTML
<h3 class='pa'>Source</h3>
#{source[:doc]}
EOHTML
end.join
end
end
class SeeTag < CommonTag
def initialize
@tagname = :see
@pattern = "see"
super
end
def format(context, formatter)
position = context[:files][0]
context[@tagname].each do |tag|
tag[:doc] = '<li>' + render_long_see(tag[:doc], formatter, position) + '</li>'
end
end
def to_html(context)
<<-EOHTML
<h3 class="pa">Related</h3>
<ul>
#{ context[@tagname].map {|tag| tag[:doc] }.join("\n") }
</ul>
EOHTML
end
def render_long_see(tag, formatter, position)
if tag =~ /\A([^\s]+)( .*)?\Z/m
name = $1
doc = $2 ? ': ' + $2 : ''
return formatter.format("{@link #{name}} #{doc}")
else
JsDuck::Logger.warn(nil, 'Unexpected @see argument: "'+tag+'"', position)
return tag
end
end
end
class ContextTag < CommonTag
def initialize
@tagname = :this
@pattern = 'this'
super
end
def format(context, formatter)
position = context[:files][0]
context[@tagname].each do |tag|
tag[:doc] = render_long_context(tag[:doc], formatter, position)
end
end
def to_html(context)
<<-EOHTML
<h3 class="pa">Context</h3>
#{ context[@tagname].last[:doc] }
EOHTML
end
def render_long_context(tag, formatter, position)
if tag =~ /\A([^\s]+)/m
name = $1
return formatter.format("`this` : {@link #{name}}")
else
JsDuck::Logger.warn(nil, 'Unexpected @this argument: "'+tag+'"', position)
return tag
end
end
end

View file

@ -1,357 +0,0 @@
[
{
"name": "VisualEditor (MediaWiki extension)",
"groups": [
{
"name": "Initialization",
"classes": [
"mw.libs.ve*",
"ve.init.mw*"
]
},
{
"name": "Switching",
"classes": [
"mw.libs.ve.MWEditMode*Tool"
]
},
{
"name": "User Interface",
"classes": [
"ve.ui.MWAriaDescribe",
"ve.ui.MW*Action",
"ve.ui.MW*Command",
"ve.ui.MW*ContextItem",
"ve.ui.MW*Dialog",
"ve.ui.MW*Element",
"ve.ui.MW*Factory",
"ve.ui.MW*Inspector",
"ve.ui.MW*Layout",
"ve.ui.MW*Page",
"ve.ui.MW*Registry",
"ve.ui.MW*Surface",
"ve.ui.MW*Tool",
"ve.ui.MW*ToolGroup",
"ve.ui.MW*TransferHandler",
"ve.ui.MW*Widget",
"ve.ui.MW*Window"
]
},
{
"name": "Visual Diffing",
"classes": [
"ve.dm.VisualDiff",
"ve.DiffMatchPatch",
"ve.DiffTreeNode",
"ve.ui.DiffDialog",
"ve.ui.DiffElement"
]
},
{
"name": "Data Model",
"classes": [
"ve.dm.MW*Annotation",
"ve.dm.MW*MetaItem",
"ve.dm.MW*Model",
"ve.dm.MW*Node",
"ve.dm.MW*Surface",
"ve.dm.MW*SurfaceFragment"
]
},
{
"name": "ContentEditable",
"classes": [
"ve.ce.MW*Annotation",
"ve.ce.MW*Node",
"ve.ce.MW*Surface"
]
}
]
},
{
"name": "VisualEditor (core) unused parts",
"groups": [
{
"name": "Standalone",
"classes": [
"ve.init.sa*"
]
}
]
},
{
"name": "Upstream (MediaWiki)",
"groups": [
{
"name": "MediaWiki",
"classes": [
"mw.Api",
"mw.Message",
"mw.Title",
"mw.widgets.*Widget"
]
},
{
"name": "MobileFrontend",
"classes": [
"VisualEditorOverlay"
]
}
]
},
{
"name": "VisualEditor (core)",
"groups": [
{
"name": "General",
"classes": [
"ve",
"ve.Range",
"ve.PositionStep",
"ve.SelectionState",
"ve.EventSequencer",
"ve.Filibuster",
"ve.TriggerListener",
"ve.Scheduler",
"ve.Node",
"ve.BranchNode",
"ve.LeafNode",
"ve.Document"
]
},
{
"name": "Initialization",
"classes": [
"ve.init",
"ve.init.Platform",
"ve.init.Target",
"ve.init.*Storage",
"global",
"ve.init.sa*"
]
},
{
"name": "DataModel",
"classes": [
"ve.dm",
"ve.dm.Model",
"ve.dm.ModelRegistry",
"ve.dm.ModelFactory",
"ve.dm.AnnotationFactory",
"ve.dm.NodeFactory",
"ve.dm.Converter",
"ve.dm.DataString",
"ve.dm.HashValueStore",
"ve.dm.Scalable",
"ve.dm.Surface",
"ve.dm.*SurfaceFragment",
"ve.dm.*Selection",
"ve.dm.Transaction",
"ve.dm.TransactionBuilder",
"ve.dm.TransactionSquasher",
"ve.dm.TreeCursor",
"ve.dm.TreeModifier",
"ve.dm.TransactionProcessor",
"ve.dm.TransactionProcessor.*",
"ve.dm.*Annotation",
"ve.dm.AnnotationSet",
"ve.dm.*MetaItem",
"ve.dm.MetaList",
"ve.dm.InternalList",
"ve.dm.Document",
"ve.dm.*Slice",
"ve.dm.*Node",
"ve.dm.*LinearData*",
"ve.dm.*Model",
"ve.dm.TableMatrix",
"ve.dm.TableMatrixCell",
"ve.dm.TableNodeCellIterator",
"ve.dm.Change",
"ve.dm.RebaseClient",
"ve.dm.SurfaceSynchronizer"
]
},
{
"name": "ContentEditable",
"classes": [
"ve.ce",
"ve.ce.View",
"ve.ce.AnnotationFactory",
"ve.ce.NodeFactory",
"ve.ce.Surface",
"ve.ce.SurfaceObserver",
"ve.ce.*Selection",
"ve.ce.RangeState",
"ve.ce.TextState",
"ve.ce.TextStateChunk",
"ve.ce.*Annotation",
"ve.ce.MetaItem",
"ve.ce.*Factory",
"ve.ce.*KeyDownHandler",
"ve.ce.Document",
"ve.ce.*Node"
]
},
{
"name": "User Interface",
"classes": [
"ve.ui",
"ve.ui.*Surface",
"ve.ui.*Context",
"ve.ui.Overlay",
"ve.ui.*Toolbar",
"ve.ui.DebugBar",
"ve.ui.Trigger",
"ve.ui.TabIndexScope",
"ve.ui.*Action",
"ve.ui.*Command",
"ve.ui.*ContextItem",
"ve.ui.*TransferHandler",
"ve.ui.DataTransferItem",
"ve.ui.*Element",
"ve.ui.*Factory",
"ve.ui.*Layout",
"ve.ui.*Page",
"ve.ui.*Registry",
"ve.ui.*Sequence",
"ve.ui.*Tool",
"ve.ui.*Widget",
"ve.ui.*WindowManager",
"ve.ui.*Window",
"ve.ui.*Dialog",
"ve.ui.*Inspector"
]
}
]
},
{
"name": "Upstream",
"groups": [
{
"name": "OOjs",
"classes": [
"OO",
"OO.EmitterList",
"OO.EventEmitter",
"OO.Factory",
"OO.Registry",
"OO.SortedEmitterList"
]
},
{
"name": "UnicodeJS",
"classes": [
"unicodeJS",
"unicodeJS.TextString",
"unicodeJS.wordbreak",
"unicodeJS.graphemebreak",
"unicodeJS.characterclass"
]
},
{
"name": "OOjs UI General",
"classes": [
"OO.ui",
"OO.ui.Element",
"OO.ui.HtmlSnippet",
"OO.ui.Toolbar",
"OO.ui.Window*",
"OO.ui.Dialog",
"OO.ui.Process",
"OO.ui.Error",
"OO.ui.ActionSet"
]
},
{
"name": "OOjs UI Mixins",
"classes": [
"OO.ui.mixin",
"OO.ui.mixin.*"
]
},
{
"name": "OOjs UI Factories",
"classes": [
"OO.ui.*Factory"
]
},
{
"name": "OOjs UI Layouts",
"classes": [
"OO.ui.*Layout"
]
},
{
"name": "OOjs UI Tool groups",
"classes": [
"OO.ui.*ToolGroup"
]
},
{
"name": "OOjs UI Tools",
"classes": [
"OO.ui.*Tool"
]
},
{
"name": "OOjs UI Widgets",
"classes": [
"OO.ui.*Widget"
]
},
{
"name": "OOjs UI Dialogs",
"classes": [
"OO.ui.*Dialog"
]
},
{
"name": "OOjs UI Themes",
"classes": [
"OO.ui.*Theme"
]
},
{
"name": "jQuery",
"classes": [
"jQuery",
"jQuery.Event",
"jQuery.Promise",
"jQuery.Deferred",
"jQuery.jqXHR",
"QUnit"
]
},
{
"name": "treeDiffer",
"classes": [
"treeDiffer.Differ",
"treeDiffer.Tree",
"treeDiffer.TreeNode"
]
},
{
"name": "DiffMatchPatch",
"classes": [
"diff_match_patch"
]
},
{
"name": "JavaScript",
"classes": [
"Array",
"Boolean",
"Date",
"Function",
"Map",
"MutationRecord",
"Number",
"Object",
"RegExp",
"Set",
"String"
]
}
]
}
]

View file

@ -1,557 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>VisualEditor Example</title>
<!-- visualEditor.core.view -->
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.FocusableNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.ActiveNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.AlienNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.BranchNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.ContentBranchNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.ParagraphNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.RootNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.GeneratedContentNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.HorizontalRuleNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.CommentNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/annotations/ve.ce.LanguageAnnotation.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/annotations/ve.ce.LinkAnnotation.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.ResizableNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.SectionNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.TableCellNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/nodes/ve.ce.TableNode.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/ve.ce.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ce/styles/ve.ce.Surface.less" class="stylesheet-ve">
<!-- visualEditor.core.ui -->
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/dialogs/ve.ui.ToolbarDialog.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/dialogs/ve.ui.CommandHelpDialog.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/dialogs/ve.ui.FindAndReplaceDialog.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/dialogs/ve.ui.ProgressDialog.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/dialogs/ve.ui.SpecialCharacterDialog.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/dialogs/ve.ui.TableDialog.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/tools/ve.ui.FormatTool.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/widgets/ve.ui.LanguageInputWidget.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/widgets/ve.ui.LanguageSearchWidget.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/widgets/ve.ui.CompletionWidget.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/widgets/ve.ui.ContextOptionWidget.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/widgets/ve.ui.ContextSelectWidget.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/widgets/ve.ui.DimensionsWidget.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/widgets/ve.ui.MediaSizeWidget.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/inspectors/ve.ui.CommentInspector.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/inspectors/ve.ui.FragmentInspector.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/inspectors/ve.ui.LanguageInspector.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/layouts/ve.ui.SymbolListBookletLayout.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/ve.ui.Context.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/ve.ui.ContextItem.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/contextitems/ve.ui.LinearContextItem.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/contextitems/ve.ui.TableLineContextItem.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/contextitems/ve.ui.AlignableContextItem.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/contextitems/ve.ui.CommentContextItem.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/contextitems/ve.ui.LanguageContextItem.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/contextitems/ve.ui.LinkContextItem.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/contextitems/ve.ui.MergeCellsContextItem.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/contextitems/ve.ui.ToolContextItem.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/ve.ui.Overlay.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/ve.ui.Surface.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/widgets/ve.ui.TargetWidget.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/ve.ui.TableLineContext.less" class="stylesheet-ve">
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/ve.ui.Toolbar.less" class="stylesheet-ve">
<!-- visualEditor.diffing -->
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/elements/ve.ui.DiffElement.less">
<!-- visualEditor.standalone.build -->
<link rel="stylesheet/less" href="lib/ve/src/init/sa/styles/ve.init.sa.Platform.less">
<!-- visualEditor.desktop.build -->
<link rel="stylesheet/less" href="lib/ve/src/ui/styles/ve.ui.DesktopContext.less">
<!-- example styles -->
<style>
body {
margin: 0;
padding: 0;
overflow-y: scroll;
background: #fff;
font: normal 1em/1.5 sans-serif;
}
</style>
</head>
<body>
<!-- less -->
<script src="lib/ve/lib/less/less.js"></script>
<!-- jquery -->
<script src="lib/ve/lib/jquery/jquery.js"></script>
<!-- oojs -->
<script src="lib/ve/lib/oojs/oojs.js"></script>
<!-- oojs-ui -->
<script src="lib/ve/lib/oojs-ui/oojs-ui-core.js"></script>
<script src="lib/ve/lib/oojs-ui/oojs-ui-widgets.js"></script>
<script src="lib/ve/lib/oojs-ui/oojs-ui-toolbars.js"></script>
<script src="lib/ve/lib/oojs-ui/oojs-ui-windows.js"></script>
<!-- CLDRPluralRuleParser -->
<script src="lib/ve/lib/jquery.i18n/libs/CLDRPluralRuleParser/src/CLDRPluralRuleParser.js"></script>
<!-- jquery.i18n -->
<script src="lib/ve/lib/jquery.i18n/src/jquery.i18n.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/jquery.i18n.messagestore.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/jquery.i18n.parser.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/jquery.i18n.emitter.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/jquery.i18n.emitter.bidi.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/jquery.i18n.language.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/jquery.i18n.fallbacks.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/bs.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/dsb.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/fi.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/ga.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/he.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/hsb.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/hu.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/hy.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/la.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/ml.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/os.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/ru.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/sl.js"></script>
<script src="lib/ve/lib/jquery.i18n/src/languages/uk.js"></script>
<!-- jquery.uls.data -->
<script src="lib/ve/lib/jquery.uls/src/jquery.uls.data.js"></script>
<script src="lib/ve/lib/jquery.uls/src/jquery.uls.data.utils.js"></script>
<!-- jquery.client -->
<script src="lib/ve/lib/jquery.client/jquery.client.js"></script>
<!-- papaparse -->
<script src="lib/ve/lib/papaparse/papaparse.js"></script>
<!-- unicodejs -->
<script src="lib/ve/lib/unicodejs/unicodejs.js"></script>
<!-- rangefix -->
<script src="lib/ve/lib/rangefix/rangefix.js"></script>
<!-- spark-md5 -->
<script src="lib/ve/lib/spark-md5/spark-md5.js"></script>
<!-- visualEditor.core.ve -->
<script src="lib/ve/src/ve.js"></script>
<!-- visualEditor.core.utils -->
<script src="lib/ve/src/ve.utils.js"></script>
<script src="lib/ve/src/ve.TriggerListener.js"></script>
<script src="lib/ve/src/ve.track.js"></script>
<!-- visualEditor.core.utils.parsing -->
<script src="lib/ve/src/ve.utils.parsing.js"></script>
<!-- visualEditor.supportCheck -->
<script src="lib/ve/src/init/ve.init.SupportCheck.js"></script>
<!-- visualEditor.core.utils.client -->
<script src="lib/ve/src/ve.utils.client.js"></script>
<!-- visualEditor.core.init -->
<script src="lib/ve/src/init/ve.init.js"></script>
<script src="lib/ve/src/init/ve.init.SafeStorage.js"></script>
<script src="lib/ve/src/init/ve.init.ConflictableStorage.js"></script>
<script src="lib/ve/src/init/ve.init.Platform.js"></script>
<script src="lib/ve/src/init/ve.init.Target.js"></script>
<!-- dompurify -->
<script src="lib/ve/lib/dompurify/purify.js"></script>
<!-- visualEditor.sanitize -->
<script src="lib/ve/src/ve.sanitize.js"></script>
<!-- visualEditor.core.root -->
<script src="lib/ve/src/ve.Range.js"></script>
<script src="lib/ve/src/ve.SelectionState.js"></script>
<script src="lib/ve/src/ve.Node.js"></script>
<script src="lib/ve/src/ve.PositionStep.js"></script>
<script src="lib/ve/src/ve.BranchNode.js"></script>
<script src="lib/ve/src/ve.LeafNode.js"></script>
<script src="lib/ve/src/ve.Document.js"></script>
<script src="lib/ve/src/ve.EventSequencer.js"></script>
<script src="lib/ve/src/ve.Scheduler.js"></script>
<!-- visualEditor.core.model -->
<script src="lib/ve/src/dm/ve.dm.js"></script>
<script src="lib/ve/src/dm/ve.dm.Model.js"></script>
<script src="lib/ve/src/dm/ve.dm.ModelFactory.js"></script>
<script src="lib/ve/src/dm/ve.dm.ModelRegistry.js"></script>
<script src="lib/ve/src/dm/ve.dm.NodeFactory.js"></script>
<script src="lib/ve/src/dm/ve.dm.AnnotationFactory.js"></script>
<script src="lib/ve/src/dm/ve.dm.AnnotationSet.js"></script>
<script src="lib/ve/src/dm/ve.dm.ClassAttributeNode.js"></script>
<script src="lib/ve/src/dm/ve.dm.AlignableNode.js"></script>
<script src="lib/ve/src/dm/ve.dm.FocusableNode.js"></script>
<script src="lib/ve/src/dm/ve.dm.ResizableNode.js"></script>
<script src="lib/ve/src/dm/ve.dm.TableCellableNode.js"></script>
<script src="lib/ve/src/dm/ve.dm.Scalable.js"></script>
<script src="lib/ve/src/dm/ve.dm.Node.js"></script>
<script src="lib/ve/src/dm/ve.dm.BranchNode.js"></script>
<script src="lib/ve/src/dm/ve.dm.ContentBranchNode.js"></script>
<script src="lib/ve/src/dm/ve.dm.LeafNode.js"></script>
<script src="lib/ve/src/dm/ve.dm.Annotation.js"></script>
<script src="lib/ve/src/dm/ve.dm.InternalList.js"></script>
<script src="lib/ve/src/dm/ve.dm.MetaItem.js"></script>
<script src="lib/ve/src/dm/ve.dm.MetaList.js"></script>
<script src="lib/ve/src/dm/ve.dm.TableMatrix.js"></script>
<script src="lib/ve/src/dm/ve.dm.TransactionProcessor.js"></script>
<script src="lib/ve/src/dm/ve.dm.Transaction.js"></script>
<script src="lib/ve/src/dm/ve.dm.TransactionBuilder.js"></script>
<script src="lib/ve/src/dm/ve.dm.TransactionSquasher.js"></script>
<script src="lib/ve/src/dm/ve.dm.Change.js"></script>
<script src="lib/ve/src/dm/ve.dm.TreeCursor.js"></script>
<script src="lib/ve/src/dm/ve.dm.TreeModifier.js"></script>
<script src="lib/ve/src/dm/ve.dm.Selection.js"></script>
<script src="lib/ve/src/dm/ve.dm.Surface.js"></script>
<script src="lib/ve/src/dm/ve.dm.SurfaceFragment.js"></script>
<script src="lib/ve/src/dm/ve.dm.SourceSurfaceFragment.js"></script>
<script src="lib/ve/src/dm/ve.dm.DataString.js"></script>
<script src="lib/ve/src/dm/ve.dm.Document.js"></script>
<script src="lib/ve/src/dm/ve.dm.DocumentSlice.js"></script>
<script src="lib/ve/src/dm/ve.dm.TableSlice.js"></script>
<script src="lib/ve/src/dm/ve.dm.LinearData.js"></script>
<script src="lib/ve/src/dm/ve.dm.HashValueStore.js"></script>
<script src="lib/ve/src/dm/ve.dm.Converter.js"></script>
<script src="lib/ve/src/dm/ve.dm.SourceConverter.js"></script>
<script src="lib/ve/src/dm/selections/ve.dm.LinearSelection.js"></script>
<script src="lib/ve/src/dm/selections/ve.dm.NullSelection.js"></script>
<script src="lib/ve/src/dm/selections/ve.dm.TableSelection.js"></script>
<script src="lib/ve/src/dm/lineardata/ve.dm.FlatLinearData.js"></script>
<script src="lib/ve/src/dm/lineardata/ve.dm.ElementLinearData.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.GeneratedContentNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.AlienNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.AlienBlockNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.AlienInlineNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.AlienTableCellNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.ArticleNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.BlockquoteNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.BreakNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.CenterNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.DefinitionListItemNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.DefinitionListNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.DivNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.DocumentNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.HeadingNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.HorizontalRuleNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.InternalItemNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.InternalListNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.ListItemNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.ListNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.ParagraphNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.PreformattedNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.SectionNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.TableCaptionNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.TableCellNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.TableNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.TableRowNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.TableSectionNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.TextNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.ImageNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.BlockImageNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.BlockImageCaptionNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.InlineImageNode.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.TextStyleAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.LanguageAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.LinkAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.AbbreviationAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.BidiAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.BigAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.BoldAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.CodeSampleAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.CodeAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.DatetimeAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.DefinitionAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.DeleteAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.FontAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.HighlightAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.InsertAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.ItalicAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.QuotationAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.SmallAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.SpanAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.StrikethroughAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.SubscriptAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.SuperscriptAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.UnderlineAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.UserInputAnnotation.js"></script>
<script src="lib/ve/src/dm/annotations/ve.dm.VariableAnnotation.js"></script>
<script src="lib/ve/src/dm/metaitems/ve.dm.AlienMetaItem.js"></script>
<script src="lib/ve/src/dm/metaitems/ve.dm.RemovableAlienMetaItem.js"></script>
<script src="lib/ve/src/dm/metaitems/ve.dm.CommentMetaItem.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.CommentNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.FakeCommentNode.js"></script>
<script src="lib/ve/src/dm/nodes/ve.dm.RealCommentNode.js"></script>
<!-- visualEditor.core.view -->
<script src="lib/ve/src/ce/ve.ce.js"></script>
<script src="lib/ve/src/ce/ve.ce.TextStateChunk.js"></script>
<script src="lib/ve/src/ce/ve.ce.TextState.js"></script>
<script src="lib/ve/src/ce/ve.ce.RangeState.js"></script>
<script src="lib/ve/src/ce/ve.ce.AnnotationFactory.js"></script>
<script src="lib/ve/src/ce/ve.ce.NodeFactory.js"></script>
<script src="lib/ve/src/ce/ve.ce.Document.js"></script>
<script src="lib/ve/src/ce/ve.ce.View.js"></script>
<script src="lib/ve/src/ce/ve.ce.Annotation.js"></script>
<script src="lib/ve/src/ce/ve.ce.Node.js"></script>
<script src="lib/ve/src/ce/ve.ce.BranchNode.js"></script>
<script src="lib/ve/src/ce/ve.ce.ContentBranchNode.js"></script>
<script src="lib/ve/src/ce/ve.ce.LeafNode.js"></script>
<script src="lib/ve/src/ce/ve.ce.MetaItem.js"></script>
<script src="lib/ve/src/ce/ve.ce.ClassAttributeNode.js"></script>
<script src="lib/ve/src/ce/ve.ce.AlignableNode.js"></script>
<script src="lib/ve/src/ce/ve.ce.FocusableNode.js"></script>
<script src="lib/ve/src/ce/ve.ce.ResizableNode.js"></script>
<script src="lib/ve/src/ce/ve.ce.TableCellableNode.js"></script>
<script src="lib/ve/src/ce/ve.ce.Selection.js"></script>
<script src="lib/ve/src/ce/ve.ce.Surface.js"></script>
<script src="lib/ve/src/ce/ve.ce.SurfaceObserver.js"></script>
<script src="lib/ve/src/ce/ve.ce.KeyDownHandlerFactory.js"></script>
<script src="lib/ve/src/ce/ve.ce.KeyDownHandler.js"></script>
<script src="lib/ve/src/ce/selections/ve.ce.LinearSelection.js"></script>
<script src="lib/ve/src/ce/selections/ve.ce.NullSelection.js"></script>
<script src="lib/ve/src/ce/selections/ve.ce.TableSelection.js"></script>
<script src="lib/ve/src/ce/keydownhandlers/ve.ce.LinearArrowKeyDownHandler.js"></script>
<script src="lib/ve/src/ce/keydownhandlers/ve.ce.LinearDeleteKeyDownHandler.js"></script>
<script src="lib/ve/src/ce/keydownhandlers/ve.ce.LinearEnterKeyDownHandler.js"></script>
<script src="lib/ve/src/ce/keydownhandlers/ve.ce.LinearEscapeKeyDownHandler.js"></script>
<script src="lib/ve/src/ce/keydownhandlers/ve.ce.TableArrowKeyDownHandler.js"></script>
<script src="lib/ve/src/ce/keydownhandlers/ve.ce.TableDeleteKeyDownHandler.js"></script>
<script src="lib/ve/src/ce/keydownhandlers/ve.ce.LinearTabKeyDownHandler.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.GeneratedContentNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.ContentEditableNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.ActiveNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.AlienNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.AlienBlockNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.AlienInlineNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.AlienTableCellNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.ArticleNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.BlockquoteNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.BreakNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.CenterNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.CommentNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.DefinitionListItemNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.DefinitionListNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.DivNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.DocumentNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.HeadingNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.HorizontalRuleNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.InternalItemNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.InternalListNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.ListItemNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.ListNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.ParagraphNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.PreformattedNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.SectionNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.TableCaptionNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.TableCellNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.TableNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.TableRowNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.TableSectionNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.TextNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.UnrenderedNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.ImageNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.BlockImageNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.BlockImageCaptionNode.js"></script>
<script src="lib/ve/src/ce/nodes/ve.ce.InlineImageNode.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.NailedAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.TextStyleAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.LanguageAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.LinkAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.AbbreviationAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.BidiAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.BigAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.BoldAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.CodeAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.CodeSampleAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.DatetimeAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.DefinitionAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.DeleteAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.FontAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.HighlightAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.InsertAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.ItalicAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.QuotationAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.SmallAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.SpanAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.StrikethroughAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.SubscriptAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.SuperscriptAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.UnderlineAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.UserInputAnnotation.js"></script>
<script src="lib/ve/src/ce/annotations/ve.ce.VariableAnnotation.js"></script>
<!-- visualEditor.core.ui -->
<script src="lib/ve/src/ui/ve.ui.js"></script>
<script src="lib/ve/src/ui/ve.ui.Overlay.js"></script>
<script src="lib/ve/src/ui/ve.ui.Surface.js"></script>
<script src="lib/ve/src/ui/ve.ui.Context.js"></script>
<script src="lib/ve/src/ui/contexts/ve.ui.LinearContext.js"></script>
<script src="lib/ve/src/ui/contexts/ve.ui.TableLineContext.js"></script>
<script src="lib/ve/src/ui/ve.ui.ModeledFactory.js"></script>
<script src="lib/ve/src/ui/ve.ui.ContextItem.js"></script>
<script src="lib/ve/src/ui/ve.ui.ContextItemFactory.js"></script>
<script src="lib/ve/src/ui/contextitems/ve.ui.LinearContextItem.js"></script>
<script src="lib/ve/src/ui/contextitems/ve.ui.ToolContextItem.js"></script>
<script src="lib/ve/src/ui/contextitems/ve.ui.PersistentContextItem.js"></script>
<script src="lib/ve/src/ui/contextitems/ve.ui.AnnotationContextItem.js"></script>
<script src="lib/ve/src/ui/contextitems/ve.ui.TableLineContextItem.js"></script>
<script src="lib/ve/src/ui/contextitems/ve.ui.MobileActionsContextItem.js"></script>
<script src="lib/ve/src/ui/contextitems/ve.ui.AlignableContextItem.js"></script>
<script src="lib/ve/src/ui/contextitems/ve.ui.CommentContextItem.js"></script>
<script src="lib/ve/src/ui/contextitems/ve.ui.LanguageContextItem.js"></script>
<script src="lib/ve/src/ui/contextitems/ve.ui.LinkContextItem.js"></script>
<script src="lib/ve/src/ui/contextitems/ve.ui.TableContextItem.js"></script>
<script src="lib/ve/src/ui/contextitems/ve.ui.MergeCellsContextItem.js"></script>
<script src="lib/ve/src/ui/contextitems/ve.ui.SumCellsContextItem.js"></script>
<script src="lib/ve/src/ui/ve.ui.Tool.js"></script>
<script src="lib/ve/src/ui/ve.ui.Toolbar.js"></script>
<script src="lib/ve/src/ui/ve.ui.TargetToolbar.js"></script>
<script src="lib/ve/src/ui/ve.ui.PositionedTargetToolbar.js"></script>
<script src="lib/ve/src/ui/ve.ui.ToolFactory.js"></script>
<script src="lib/ve/src/ui/ve.ui.Command.js"></script>
<script src="lib/ve/src/ui/ve.ui.CommandRegistry.js"></script>
<script src="lib/ve/src/ui/ve.ui.CommandHelpRegistry.js"></script>
<script src="lib/ve/src/ui/ve.ui.Trigger.js"></script>
<script src="lib/ve/src/ui/ve.ui.TriggerRegistry.js"></script>
<script src="lib/ve/src/ui/ve.ui.Sequence.js"></script>
<script src="lib/ve/src/ui/ve.ui.SequenceRegistry.js"></script>
<script src="lib/ve/src/ui/ve.ui.Action.js"></script>
<script src="lib/ve/src/ui/ve.ui.ActionFactory.js"></script>
<script src="lib/ve/src/ui/ve.ui.DataTransferHandler.js"></script>
<script src="lib/ve/src/ui/ve.ui.FileTransferHandler.js"></script>
<script src="lib/ve/src/ui/ve.ui.DataTransferHandlerFactory.js"></script>
<script src="lib/ve/src/ui/ve.ui.DataTransferItem.js"></script>
<script src="lib/ve/src/ui/ve.ui.WindowManager.js"></script>
<script src="lib/ve/src/ui/ve.ui.FragmentWindow.js"></script>
<script src="lib/ve/src/ui/ve.ui.NodeWindow.js"></script>
<script src="lib/ve/src/ui/ve.ui.TabIndexScope.js"></script>
<script src="lib/ve/src/ui/windowmanagers/ve.ui.SurfaceWindowManager.js"></script>
<script src="lib/ve/src/ui/actions/ve.ui.AnnotationAction.js"></script>
<script src="lib/ve/src/ui/actions/ve.ui.BlockquoteAction.js"></script>
<script src="lib/ve/src/ui/actions/ve.ui.CompletionAction.js"></script>
<script src="lib/ve/src/ui/actions/ve.ui.ContentAction.js"></script>
<script src="lib/ve/src/ui/actions/ve.ui.FormatAction.js"></script>
<script src="lib/ve/src/ui/actions/ve.ui.HelpCompletionAction.js"></script>
<script src="lib/ve/src/ui/actions/ve.ui.HistoryAction.js"></script>
<script src="lib/ve/src/ui/actions/ve.ui.IndentationAction.js"></script>
<script src="lib/ve/src/ui/actions/ve.ui.LinkAction.js"></script>
<script src="lib/ve/src/ui/actions/ve.ui.ListAction.js"></script>
<script src="lib/ve/src/ui/actions/ve.ui.TableAction.js"></script>
<script src="lib/ve/src/ui/actions/ve.ui.WindowAction.js"></script>
<script src="lib/ve/src/ui/commands/ve.ui.ClearAnnotationCommand.js"></script>
<script src="lib/ve/src/ui/commands/ve.ui.HistoryCommand.js"></script>
<script src="lib/ve/src/ui/commands/ve.ui.IndentationCommand.js"></script>
<script src="lib/ve/src/ui/commands/ve.ui.MergeCellsCommand.js"></script>
<script src="lib/ve/src/ui/dialogs/ve.ui.FragmentDialog.js"></script>
<script src="lib/ve/src/ui/dialogs/ve.ui.NodeDialog.js"></script>
<script src="lib/ve/src/ui/dialogs/ve.ui.ToolbarDialog.js"></script>
<script src="lib/ve/src/ui/dialogs/ve.ui.CommandHelpDialog.js"></script>
<script src="lib/ve/src/ui/dialogs/ve.ui.FindAndReplaceDialog.js"></script>
<script src="lib/ve/src/ui/dialogs/ve.ui.ProgressDialog.js"></script>
<script src="lib/ve/src/ui/dialogs/ve.ui.SpecialCharacterDialog.js"></script>
<script src="lib/ve/src/ui/dialogs/ve.ui.TableDialog.js"></script>
<script src="lib/ve/src/ui/datatransferhandlers/ve.ui.HTMLStringTransferHandler.js"></script>
<script src="lib/ve/src/ui/datatransferhandlers/ve.ui.PlainTextStringTransferHandler.js"></script>
<script src="lib/ve/src/ui/datatransferhandlers/ve.ui.DSVFileTransferHandler.js"></script>
<script src="lib/ve/src/ui/datatransferhandlers/ve.ui.PlainTextFileTransferHandler.js"></script>
<script src="lib/ve/src/ui/datatransferhandlers/ve.ui.HTMLFileTransferHandler.js"></script>
<script src="lib/ve/src/ui/datatransferhandlers/ve.ui.UrlStringTransferHandler.js"></script>
<script src="lib/ve/src/ui/elements/ve.ui.PreviewElement.js"></script>
<script src="lib/ve/src/ui/windowmanagers/ve.ui.ToolbarDialogWindowManager.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.AlignWidget.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.LanguageSearchWidget.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.LanguageResultWidget.js"></script>
<script src="lib/ve/src/ui/dialogs/ve.ui.LanguageSearchDialog.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.LanguageInputWidget.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.TargetWidget.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.LinkAnnotationWidget.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.CompletionWidget.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.ContextSelectWidget.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.ContextOptionWidget.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.DimensionsWidget.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.MediaSizeWidget.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.NoFocusButtonWidget.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.WhitespacePreservingTextInputWidget.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.AnnotationTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.ChangeDirectionalityTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.ClearAnnotationTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.WindowTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.FragmentWindowTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.FragmentInspectorTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.LinkInspectorTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.CommentInspectorTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.ToolbarDialogTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.FormatTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.HelpCompletionTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.HistoryTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.IndentationTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.LanguageInspectorTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.ListTool.js"></script>
<script src="lib/ve/src/ui/tools/ve.ui.TableTool.js"></script>
<script src="lib/ve/src/ui/inspectors/ve.ui.FragmentInspector.js"></script>
<script src="lib/ve/src/ui/inspectors/ve.ui.AnnotationInspector.js"></script>
<script src="lib/ve/src/ui/inspectors/ve.ui.NodeInspector.js"></script>
<script src="lib/ve/src/ui/inspectors/ve.ui.LinkAnnotationInspector.js"></script>
<script src="lib/ve/src/ui/inspectors/ve.ui.CommentInspector.js"></script>
<script src="lib/ve/src/ui/inspectors/ve.ui.LanguageInspector.js"></script>
<script src="lib/ve/src/ui/layouts/ve.ui.SymbolListBookletLayout.js"></script>
<script src="lib/ve/src/ui/pages/ve.ui.SymbolListPage.js"></script>
<!-- treeDiffer -->
<script src="lib/ve/lib/treeDiffer/treeDiffer-dist.js"></script>
<!-- diffMatchPatch -->
<script src="lib/ve/lib/diff-match-patch/diff_match_patch_uncompressed.js"></script>
<!-- visualEditor.diffing -->
<script src="lib/ve/src/ve.DiffTreeNode.js"></script>
<script src="lib/ve/src/ve.DiffMatchPatch.js"></script>
<script src="lib/ve/src/dm/ve.dm.VisualDiff.js"></script>
<script src="lib/ve/src/ui/elements/ve.ui.DiffElement.js"></script>
<script src="lib/ve/src/ui/widgets/ve.ui.ChangeDescriptionsSelectWidget.js"></script>
<!-- visualEditor.diffing.standalone -->
<script src="lib/ve/src/ui/dialogs/ve.ui.DiffDialog.js"></script>
<!-- visualEditor.standalone.build -->
<script src="lib/ve/src/init/sa/ve.init.sa.js"></script>
<script src="lib/ve/src/init/sa/ve.init.sa.SafeStorage.js"></script>
<script src="lib/ve/src/init/sa/ve.init.sa.Platform.js"></script>
<script src="lib/ve/src/init/sa/ve.init.sa.Target.js"></script>
<!-- visualEditor.desktop.build -->
<script src="lib/ve/src/ui/contexts/ve.ui.DesktopContext.js"></script>
<script src="lib/ve/src/ui/windowmanagers/ve.ui.DesktopInspectorWindowManager.js"></script>
<!-- visualEditor.desktop.standalone -->
<script src="lib/ve/src/init/sa/ve.init.sa.DesktopTarget.js"></script>
<!-- example scripts -->
<script>
// Ensure ve.init.platform exists for use in examples
var platform = new ve.init.sa.Platform( ve.messagePaths ).initialize();
function loadInlineExample( code, options, callback ) {
platform.done( function () {
try {
eval( code );
callback && callback( true );
} catch (e) {
document.body.appendChild( document.createTextNode( e ) );
callback && callback( false, e );
}
} );
}
</script>
</body>
</html>

View file

@ -1,41 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>VisualEditor Example</title>
<!-- STYLES -->
<!-- example styles -->
<style>
body {
margin: 0;
padding: 0;
overflow-y: scroll;
background: #fff;
font: normal 1em/1.5 sans-serif;
}
</style>
</head>
<body>
<!-- SCRIPTS -->
<!-- example scripts -->
<script>
// Ensure ve.init.platform exists for use in examples
var platform = new ve.init.sa.Platform( ve.messagePaths ).initialize();
function loadInlineExample( code, options, callback ) {
platform.done( function () {
try {
eval( code );
callback && callback( true );
} catch (e) {
document.body.appendChild( document.createTextNode( e ) );
callback && callback( false, e );
}
} );
}
</script>
</body>
</html>

View file

@ -1,34 +0,0 @@
/**
* @class mw.Api
* @source <https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.Api>
*/
/**
* @class mw.Message
* @source <https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.Message>
*/
/**
* @class mw.Title
* @source <https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.Title>
*/
/**
* @class mw.widgets.TitleInputWidget
* @source <https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.widgets.TitleInputWidget>
*/
/**
* @class mw.widgets.MediaSearchWidget
* @source <https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.widgets.MediaSearchWidget>
*/
/**
* @class mw.widgets.MediaResultWidget
* @source <https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.widgets.MediaResultWidget>
*/
/**
* @class VisualEditorOverlay
* @source <https://doc.wikimedia.org/MobileFrontend/master/js/VisualEditorOverlay.html>
*/

View file

@ -1,102 +0,0 @@
[
{
"name": "VisualEditor (MediaWiki extension)",
"groups": [
{
"name": "Initialization",
"classes": [
"mw.libs.ve*",
"ve.init.mw*"
]
},
{
"name": "Switching",
"classes": [
"mw.libs.ve.MWEditMode*Tool"
]
},
{
"name": "User Interface",
"classes": [
"ve.ui.MWAriaDescribe",
"ve.ui.MW*Action",
"ve.ui.MW*Command",
"ve.ui.MW*ContextItem",
"ve.ui.MW*Dialog",
"ve.ui.MW*Element",
"ve.ui.MW*Factory",
"ve.ui.MW*Inspector",
"ve.ui.MW*Layout",
"ve.ui.MW*Page",
"ve.ui.MW*Registry",
"ve.ui.MW*Surface",
"ve.ui.MW*Tool",
"ve.ui.MW*ToolGroup",
"ve.ui.MW*TransferHandler",
"ve.ui.MW*Widget",
"ve.ui.MW*Window"
]
},
{
"name": "Visual Diffing",
"classes": [
"ve.dm.VisualDiff",
"ve.DiffMatchPatch",
"ve.DiffTreeNode",
"ve.ui.DiffDialog",
"ve.ui.DiffElement"
]
},
{
"name": "Data Model",
"classes": [
"ve.dm.MW*Annotation",
"ve.dm.MW*MetaItem",
"ve.dm.MW*Model",
"ve.dm.MW*Node",
"ve.dm.MW*Surface",
"ve.dm.MW*SurfaceFragment"
]
},
{
"name": "ContentEditable",
"classes": [
"ve.ce.MW*Annotation",
"ve.ce.MW*Node",
"ve.ce.MW*Surface"
]
}
]
},
{
"name": "VisualEditor (core) unused parts",
"groups": [
{
"name": "Standalone",
"classes": [
"ve.init.sa*"
]
}
]
},
{
"name": "Upstream (MediaWiki)",
"groups": [
{
"name": "MediaWiki",
"classes": [
"mw.Api",
"mw.Message",
"mw.Title",
"mw.widgets.*Widget"
]
},
{
"name": "MobileFrontend",
"classes": [
"VisualEditorOverlay"
]
}
]
}
]

View file

@ -7,8 +7,7 @@
'use strict';
module.exports = function ( grunt ) {
const modules = grunt.file.readJSON( 'lib/ve/build/modules.json' ),
conf = grunt.file.readJSON( 'extension.json' ),
const conf = grunt.file.readJSON( 'extension.json' ),
screenshotOptions = {
reporter: 'spec',
// TODO: Work out how to catch this timeout and continue.
@ -33,7 +32,6 @@ module.exports = function ( grunt ) {
};
grunt.loadNpmTasks( 'grunt-banana-checker' );
grunt.loadNpmTasks( 'grunt-contrib-copy' );
grunt.loadNpmTasks( 'grunt-contrib-watch' );
grunt.loadNpmTasks( 'grunt-eslint' );
grunt.loadNpmTasks( 'grunt-image' );
@ -44,38 +42,6 @@ module.exports = function ( grunt ) {
grunt.loadTasks( 'build/tasks' );
grunt.initConfig( {
jsduckcatconfig: {
main: {
target: '.jsduck/categories.json',
from: [
'.jsduck/mw-categories.json',
{
file: 'lib/ve/.jsduck/categories.json',
aggregate: {
'VisualEditor (core)': [
'General',
'Initialization',
'DataModel',
'ContentEditable',
'User Interface',
'Tests'
]
},
include: [ 'UnicodeJS', 'OOjs UI', 'Upstream' ]
}
]
}
},
buildloader: {
egiframe: {
targetFile: '.jsduck/eg-iframe.html',
template: '.jsduck/eg-iframe.html.template',
modules: modules,
load: [ 'visualEditor.desktop.standalone' ],
pathPrefix: 'lib/ve/',
indent: '\t\t'
}
},
mochaTest: {
'screenshots-en': {
options: screenshotOptions,
@ -167,13 +133,6 @@ module.exports = function ( grunt ) {
]
},
banana: conf.MessagesDirs,
copy: {
jsduck: {
src: 'lib/ve/**/*',
dest: 'docs/',
expand: true
}
},
watch: {
files: [
'.{stylelintrc,eslintrc}.json',
@ -204,9 +163,7 @@ module.exports = function ( grunt ) {
} );
} );
grunt.registerTask( 'build', [ 'jsduckcatconfig', 'buildloader' ] );
grunt.registerTask( 'lint', [ 'tyops', 'eslint', 'stylelint', 'banana' ] );
grunt.registerTask( 'test', [ 'build', 'lint' ] );
grunt.registerTask( 'test', [ 'tyops', 'eslint', 'stylelint', 'banana' ] );
grunt.registerTask( 'test-ci', [ 'git-status' ] );
grunt.registerTask( 'screenshots', [ 'mochaTest:screenshots-en', 'image:pngs' ] );
grunt.registerTask( 'screenshots-all', [ 'mochaTest:screenshots-all', 'image:pngs' ] );

View file

@ -1,72 +0,0 @@
/*!
* Merge jsduck configuration files with a downstream one
*/
'use strict';
module.exports = function ( grunt ) {
const _ = grunt.util._;
grunt.registerMultiTask( 'jsduckcatconfig', function () {
const targetFile = this.data.target,
from = this.data.from,
output = [];
from.forEach( function ( src ) {
if ( typeof src === 'string' ) {
src = {
file: src
};
}
const srcCategories = grunt.file.readJSON( src.file );
if ( !src.include && !src.aggregate ) {
// Default to a straight inclusion
output.push.apply( output, srcCategories );
return;
}
if ( src.aggregate ) {
_.forIn( src.aggregate, function ( targetCat, targetCatName ) {
const targetGroups = [];
// For each of the target category groups...
targetCat.forEach( function ( targetGroupName ) {
// ... find the category in the aggregate source
srcCategories.forEach( function ( aggrCat ) {
if ( aggrCat.name === targetGroupName ) {
const targetGroup = {
name: targetGroupName,
classes: []
};
aggrCat.groups.forEach( function ( group ) {
targetGroup.classes = targetGroup.classes.concat( group.classes );
} );
targetGroups.push( targetGroup );
}
} );
} );
output.push( {
name: targetCatName,
groups: targetGroups
} );
} );
}
if ( src.include ) {
src.include.forEach( function ( targetCatName ) {
srcCategories.forEach( function ( aggrCat ) {
if ( aggrCat.name === targetCatName ) {
output.push( aggrCat );
}
} );
} );
}
} );
grunt.file.write( targetFile, JSON.stringify( output, null, '\t' ) + '\n' );
grunt.log.ok( 'File "' + targetFile + '" written.' );
} );
};

View file

@ -1,25 +0,0 @@
{
"--title": "VisualEditor - Documentation",
"--output": "docs",
"--categories": ".jsduck/categories.json",
"--eg-iframe": ".jsduck/eg-iframe.html",
"--tags": ".jsduck/CustomTags.rb",
"--processes": "0",
"--warnings-exit-nonzero": true,
"--builtin-classes": true,
"--external": "HTMLDocument,HTMLBodyElement,HTMLHtmlElement,Window,Node,Text,Set,Range,Selection,ClientRect,File,FileList,Blob,DataTransfer,DataTransferItem,KeyboardEvent,MouseEvent,Promise,Storage,URL",
"--warnings": [ "-nodoc(class,public)", "-global", "-inheritdoc" ],
"--exclude": [
"lib/ve/rebaser/src/dm/",
"modules/ve-mw/tests/"
],
"--": [
".jsduck/external.js",
"lib/ve/.jsduck/external.js",
"lib/ve/.jsduck/external-ooui.js",
"lib/ve/lib/unicodejs/unicodejs.js",
"lib/ve/lib/treeDiffer/treeDiffer-dist.js",
"lib/ve/src",
"modules/ve-mw"
]
}

2
lib/ve

@ -1 +1 @@
Subproject commit f428c59fadb27b0cdd79830eb3db79ccd30b2d82
Subproject commit 1cd800020d64c7b99e98f7cb03892ad209256f3a

View file

@ -4,7 +4,7 @@
"wikimedia/client-es6",
"wikimedia/jquery",
"wikimedia/mediawiki",
"wikimedia/jsduck",
"wikimedia/jsdoc",
"./eslint-shared.json"
],
"rules": {

View file

@ -93,21 +93,21 @@ OO.mixinClass( ve.dm.MWImageModel, OO.EventEmitter );
/**
* Change of image alignment or of having alignment at all
*
* @event alignmentChange
* @event ve.dm.MWImageModel#alignmentChange
* @param {string} Alignment 'left', 'right', 'center' or 'none'
*/
/**
* Change in size type between default and custom
*
* @event sizeDefaultChange
* @event ve.dm.MWImageModel#sizeDefaultChange
* @param {boolean} Image is default size
*/
/**
* Change in the image type
*
* @event typeChange
* @event ve.dm.MWImageModel#typeChange
* @param {string} Image type 'thumb', 'frame', 'frameless' or 'none'
*/

View file

@ -42,7 +42,7 @@ OO.mixinClass( ve.dm.MWParameterModel, OO.EventEmitter );
/**
* Emitted when the parameter's value changed.
*
* @event change
* @event ve.dm.MWParameterModel#change
*/
/* Methods */

View file

@ -48,14 +48,14 @@ OO.inheritClass( ve.dm.MWTemplateModel, ve.dm.MWTransclusionPartModel );
/**
* Emitted when a new parameter was added to the template.
*
* @event add
* @event ve.dm.MWTemplateModel#add
* @param {ve.dm.MWParameterModel} param Added param
*/
/**
* Emitted when a parameter was removed from the template.
*
* @event remove
* @event ve.dm.MWTemplateModel#remove
* @param {ve.dm.MWParameterModel} param Removed param
*/
@ -63,7 +63,7 @@ OO.inheritClass( ve.dm.MWTemplateModel, ve.dm.MWTransclusionPartModel );
* Emitted when anything changed, e.g. a parameter was added or removed, or a parameter's value
* edited.
*
* @event change
* @event ve.dm.MWTemplateModel#change
*/
/* Static Methods */

View file

@ -5,6 +5,15 @@
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* See https://www.mediawiki.org/wiki/Extension:TemplateData#Set_object
*
* @typedef {Object} Set
* @memberof ve.dm.MWTemplateSpecModel
* @property {string|Object.<string, string>} label A brief name for the parameter set.
* @property {string[]} params One or more names of parameters to include in the set.
*/
/**
* Object literal returned by the TemplataData API. Expected to be in formatversion=2,
* guaranteed via ve.init.mw.Target#getContentApi.
@ -21,7 +30,7 @@
* @property {Object.<string,ve.dm.MWTemplateParamDescription>} [params] Parameters by param name
* @property {string[]} [paramOrder] Preferred parameter order as documented via TemplateData. If
* given, the TemplateData API makes sure this contains the same parameters as `params`.
* @property {{label:(string|Object.<string,string>),params:string[]}[]} [sets] List of parameter
* @property {ve.dm.MWTemplateSpecModel.Set[]} [sets] List of parameter
* sets, i.e. parameters that belong together (whatever that means, this feature is underspecified
* and unused)
* @property {Object.<string,Object.<string,string|string[]|string[][]>>} [maps] Source to target
@ -443,9 +452,7 @@ ve.dm.MWTemplateSpecModel.prototype.getKnownParameterNames = function () {
};
/**
* See https://www.mediawiki.org/wiki/Extension:TemplateData#Set_object
*
* @return {{label:(string|Object.<string,string>),params:string[]}[]}
* @return {ve.dm.MWTemplateSpecModel.Set[]}
*/
ve.dm.MWTemplateSpecModel.prototype.getParameterSets = function () {
return this.templateData.sets || [];
@ -454,7 +461,7 @@ ve.dm.MWTemplateSpecModel.prototype.getParameterSets = function () {
/**
* See https://www.mediawiki.org/wiki/Extension:TemplateData#Maps_object
*
* @return {Object.<string,Object.<string,string|string[]|string[][]>>}
* @return {Object.<string,Object>}
*/
ve.dm.MWTemplateSpecModel.prototype.getMaps = function () {
return this.templateData.maps || {};

View file

@ -33,7 +33,7 @@ OO.inheritClass( ve.dm.MWTransclusionContentModel, ve.dm.MWTransclusionPartModel
/**
* Emitted when the wikitext changed.
*
* @event change
* @event ve.dm.MWTransclusionContentModel#change
*/
/* Methods */

View file

@ -62,7 +62,7 @@
* Emitted when a part is added, removed, replaced (e.g. a placeholder with an actual template),
* or an existing part changed position.
*
* @event replace
* @event ve.dm.MWTransclusionPartInstruction#replace
* @param {ve.dm.MWTransclusionPartModel|null} removed Removed part
* @param {ve.dm.MWTransclusionPartModel|null} added Added or moved part
* @param {number} [newPosition] Position the part was added or moved to
@ -71,7 +71,7 @@
/**
* Emitted when anything changed, including any changes in the content of the parts.
*
* @event change
* @event ve.dm.MWTransclusionPartInstruction#change
*/
/* Methods */

View file

@ -38,7 +38,7 @@ OO.mixinClass( ve.dm.MWTransclusionPartModel, OO.EventEmitter );
* Emitted when anything changed in the content the part represents, e.g. a parameter was added to a
* template, or a value edited.
*
* @event change
* @event ve.dm.MWTransclusionPartModel#change
*/
/* Methods */

View file

@ -257,7 +257,7 @@ ve.dm.MWMagicLinkType.prototype.getCode = function () {
};
/**
* @method getHref
* @method ve.dm.MWMagicLinkNode.getHref
* @inheritdoc ve.dm.MWMagicLinkNode#getHref
*/

View file

@ -105,7 +105,7 @@ ve.init.mw.ApiResponseCache.prototype.getCached = function ( name ) {
/**
* Fired when a new entry is added to the cache.
*
* @event add
* @event ve.init.mw.ApiResponseCache#add
* @param {Object} entries Cache entries that were added. Object mapping names to data objects.
*/

View file

@ -100,38 +100,38 @@ OO.inheritClass( ve.init.mw.ArticleTarget, ve.init.mw.Target );
/* Events */
/**
* @event save
* @event ve.init.mw.ArticleTarget#save
* @param {Object} data Save data from the API, see ve.init.mw.ArticleTarget#saveComplete
* Fired immediately after a save is successfully completed
*/
/**
* @event showChanges
* @event ve.init.mw.ArticleTarget#showChanges
*/
/**
* @event noChanges
* @event ve.init.mw.ArticleTarget#noChanges
*/
/**
* @event saveError
* @event ve.init.mw.ArticleTarget#saveError
* @param {string} code Error code
*/
/**
* @event loadError
* @event ve.init.mw.ArticleTarget#loadError
*/
/**
* @event showChangesError
* @event ve.init.mw.ArticleTarget#showChangesError
*/
/**
* @event serializeError
* @event ve.init.mw.ArticleTarget#serializeError
*/
/**
* @event serializeComplete
* @event ve.init.mw.ArticleTarget#serializeComplete
* Fired when serialization is complete
*/

View file

@ -162,34 +162,34 @@ ve.init.mw.DesktopArticleTarget.static.platformType = 'desktop';
/* Events */
/**
* @event deactivate
* @event ve.init.mw.DesktopArticleTarget#deactivate
*/
/**
* @event transformPage
* @event ve.init.mw.DesktopArticleTarget#transformPage
*/
/**
* @event restorePage
* @event ve.init.mw.DesktopArticleTarget#restorePage
*/
/**
* @event saveWorkflowBegin
* @event ve.init.mw.DesktopArticleTarget#saveWorkflowBegin
* Fired when user clicks the button to open the save dialog.
*/
/**
* @event saveWorkflowEnd
* @event ve.init.mw.DesktopArticleTarget#saveWorkflowEnd
* Fired when user exits the save workflow
*/
/**
* @event saveReview
* @event ve.init.mw.DesktopArticleTarget#saveReview
* Fired when user initiates review changes in save workflow
*/
/**
* @event saveInitiated
* @event ve.init.mw.DesktopArticleTarget#saveInitiated
* Fired when user initiates saving of the document
*/

View file

@ -89,29 +89,29 @@ ve.ui.MWSaveDialog.static.actions = [
/* Events */
/**
* @event save
* @event ve.ui.MWSaveDialog#save
* @param {jQuery.Deferred} saveDeferred Deferred object to resolve/reject when the save
* succeeds/fails.
* Emitted when the user clicks the save button
*/
/**
* @event review
* @event ve.ui.MWSaveDialog#review
* Emitted when the user clicks the review changes button
*/
/**
* @event preview
* @event ve.ui.MWSaveDialog#preview
* Emitted when the user clicks the show preview button
*/
/**
* @event resolve
* @event ve.ui.MWSaveDialog#resolve
* Emitted when the user clicks the resolve conflict button
*/
/**
* @event retry
* @event ve.ui.MWSaveDialog#retry
* Emitted when the user clicks the retry/continue save button after an error.
*/

View file

@ -51,7 +51,7 @@ OO.mixinClass( ve.ui.MWExpandableErrorElement, OO.EventEmitter );
/* Events */
/**
* @event update
* @event ve.ui.MWExpandableErrorElement#update
*/
/* Methods */

View file

@ -148,7 +148,7 @@ OO.inheritClass( ve.ui.MWParameterPage, OO.ui.PageLayout );
/**
* Triggered when the parameter value changes between empty and not empty.
*
* @event hasValueChange
* @event ve.ui.MWParameterPage#hasValueChange
* @param string parameterId Keyed by unique id of the parameter, e.g. something
* like "part_1/param1".
* @param boolean hasValue

View file

@ -64,7 +64,7 @@ OO.inheritClass( ve.ui.MWAceEditorWidget, ve.ui.WhitespacePreservingTextInputWid
/**
* The editor has resized
*
* @event resize
* @event ve.ui.MWAceEditorWidget#resize
*/
/* Methods */

View file

@ -51,7 +51,7 @@ OO.mixinClass( ve.ui.MWCategoryInputWidget, OO.ui.mixin.LookupElement );
/* Events */
/**
* @event choose
* @event ve.ui.MWCategoryInputWidget#choose
* A category was chosen
* @param {OO.ui.MenuOptionWidget} item Chosen item
*/

View file

@ -68,7 +68,7 @@ OO.mixinClass( ve.ui.MWCategoryItemWidget, OO.ui.mixin.DraggableElement );
/* Events */
/**
* @event togglePopupMenu
* @event ve.ui.MWCategoryItemWidget#togglePopupMenu
* @param {ve.ui.MWCategoryItemWidget} item Item to load into popup
*/

View file

@ -72,12 +72,12 @@ OO.inheritClass( ve.ui.MWCategoryPopupWidget, OO.ui.PopupWidget );
/* Events */
/**
* @event removeCategory
* @event ve.ui.MWCategoryPopupWidget#removeCategory
* @param {string} category Category name
*/
/**
* @event updateSortkey
* @event ve.ui.MWCategoryPopupWidget#updateSortkey
* @param {string} category Category name
* @param {string} sortkey New sortkey
*/

View file

@ -76,7 +76,7 @@ OO.mixinClass( ve.ui.MWCategoryWidget, OO.ui.mixin.DraggableGroupElement );
/* Events */
/**
* @event newCategory
* @event ve.ui.MWCategoryWidget#newCategory
* @param {Object} item Category item
* @param {string} item.name Fully prefixed category name
* @param {string} item.value Category value (name without prefix)
@ -85,7 +85,7 @@ OO.mixinClass( ve.ui.MWCategoryWidget, OO.ui.mixin.DraggableGroupElement );
*/
/**
* @event updateSortkey
* @event ve.ui.MWCategoryWidget#updateSortkey
* @param {Object} item Category item
* @param {string} item.name Fully prefixed category name
* @param {string} item.value Category value (name without prefix)

View file

@ -41,5 +41,5 @@ OO.mixinClass( ve.ui.MWGalleryGroupWidget, OO.ui.mixin.DraggableGroupElement );
/* Events */
/**
* @event editItem
* @event ve.ui.MWGalleryGroupWidget#editItem
*/

View file

@ -73,7 +73,7 @@ OO.mixinClass( ve.ui.MWGalleryItemWidget, OO.ui.mixin.TabIndexedElement );
/* Events */
/**
* @event edit
* @event ve.ui.MWGalleryItemWidget#edit
*/
/* Methods */

View file

@ -211,7 +211,14 @@ ve.ui.MWTemplateTitleInputWidget.prototype.addExactMatch = function ( response )
}
/**
* @param {{pageid: number}[]} pages
* @typedef {Object} PageResponse
* @memberof ve.ui.MWTemplateTitleInputWidget
* @param {number} pageId Page ID
* @param {number} index Page ID
*/
/**
* @param {ve.ui.MWTemplateTitleInputWidget.PageResponse[]} pages
* @param {number} pageId
* @return {boolean}
*/
@ -222,7 +229,7 @@ ve.ui.MWTemplateTitleInputWidget.prototype.addExactMatch = function ( response )
}
/**
* @param {{index: number}[]} pages
* @param {ve.ui.MWTemplateTitleInputWidget.PageResponse[]} pages
* @param {Object} [newPage]
*/
function unshiftPages( pages, newPage ) {

View file

@ -59,7 +59,7 @@ ve.ui.MWTransclusionOutlineButtonWidget.static.pressable = false;
/* Events */
/**
* @event keyPressed
* @event ve.ui.MWTransclusionOutlineButtonWidget#keyPressed
* @param {number} key Typically one of the {@see OO.ui.Keys} constants
*/

View file

@ -93,26 +93,26 @@ OO.mixinClass( ve.ui.MWTransclusionOutlineControlsWidget, OO.ui.mixin.GroupEleme
/**
* Emitted when the "Add template" button in the toolbar is clicked
*
* @event addTemplate
* @event ve.ui.MWTransclusionOutlineControlsWidget#addTemplate
*/
/**
* Emitted when the "Add wikitext" button in the toolbar is clicked
*
* @event addWikitext
* @event ve.ui.MWTransclusionOutlineControlsWidget#addWikitext
*/
/**
* Emitted when one of the two "Move item up/down" buttons in the toolbar is clicked
*
* @event move
* @event ve.ui.MWTransclusionOutlineControlsWidget#move
* @param {number} places Number of places to move, typically -1 or 1
*/
/**
* Emitted when the "Remove item" button in the toolbar is clicked
*
* @event remove
* @event ve.ui.MWTransclusionOutlineControlsWidget#remove
*/
/* Methods */

View file

@ -52,7 +52,7 @@ OO.mixinClass( ve.ui.MWTransclusionOutlineParameterSelectWidget, ve.ui.MWAriaDes
* This is fired instead of the "choose" event from the {@see OO.ui.SelectWidget} base class when
* pressing space on a parameter to toggle it or scroll it into view, without losing the focus.
*
* @event templateParameterSpaceDown
* @event ve.ui.MWTransclusionOutlineParameterSelectWidget#templateParameterSpaceDown
* @param {ve.ui.MWTransclusionOutlineParameterWidget} item
* @param {boolean} selected
*/

View file

@ -75,7 +75,7 @@ OO.inheritClass( ve.ui.MWTransclusionOutlinePartWidget, OO.ui.Widget );
/**
* "Soft" selection with space.
*
* @event transclusionPartSoftSelected
* @event ve.ui.MWTransclusionOutlinePartWidget#transclusionPartSoftSelected
* @param {string} partId Unique id of the {@see ve.dm.MWTransclusionPartModel}, e.g. something like
* "part_1".
*/
@ -85,7 +85,7 @@ OO.inheritClass( ve.ui.MWTransclusionOutlinePartWidget, OO.ui.Widget );
* be reflected in the content pane of the dialog. This includes e.g. selecting something that was
* already selected.
*
* @event transclusionOutlineItemSelected
* @event ve.ui.MWTransclusionOutlinePartWidget#transclusionOutlineItemSelected
* @param {string} pageName Unique id of the {@see OO.ui.BookletLayout} page, e.g. something like
* "part_1" or "part_1/param1".
* @param {boolean} [soft] If true, focus should stay in the sidebar. Defaults to false.

View file

@ -61,7 +61,7 @@ OO.inheritClass( ve.ui.MWTransclusionOutlineTemplateWidget, ve.ui.MWTransclusion
/**
* Triggered when the user uses the search widget at the top to filter the list of parameters.
*
* @event filterParametersById
* @event ve.ui.MWTransclusionOutlineTemplateWidget#filterParametersById
* @param {Object.<string,boolean>} visibility Keyed by unique id of the parameter, e.g. something
* like "part_1/param1". Note this lists only parameters that are currently shown as a checkbox.
* The spec might contain more parameters (e.g. deprecated).

View file

@ -32,7 +32,7 @@ OO.inheritClass( ve.ui.MWTransclusionOutlineToggleUnusedWidget, OO.ui.ButtonWidg
/* Events */
/**
* @event toggleUnusedFields
* @event ve.ui.MWTransclusionOutlineToggleUnusedWidget#toggleUnusedFields
* @param {boolean} visibility If unused fields should be shown or not.
* @param {boolean} [fromClick]
* Emitted when the visibility for unused fields should be (re)applied.

View file

@ -26,7 +26,7 @@ OO.inheritClass( ve.ui.MWTransclusionOutlineWidget, OO.ui.Widget );
/* Events */
/**
* @event filterPagesByName
* @event ve.ui.MWTransclusionOutlineWidget#filterPagesByName
* @param {Object.<string,boolean>} visibility Keyed by unique id of the {@see OO.ui.BookletLayout}
* page, e.g. something like "part_1/param1".
*/
@ -34,7 +34,7 @@ OO.inheritClass( ve.ui.MWTransclusionOutlineWidget, OO.ui.Widget );
/**
* Respond to the intent to select a sidebar item
*
* @event sidebarItemSelected
* @event ve.ui.MWTransclusionOutlineWidget#sidebarItemSelected
* @param {string} pageName Unique id of the {@see OO.ui.BookletLayout} page, e.g. something like
* "part_1" or "part_1/param1".
* @param {boolean} [soft] If true, don't focus the content pane. Defaults to false.

627
package-lock.json generated
View file

@ -17,7 +17,6 @@
"eslint-config-wikimedia": "0.27.0",
"grunt": "1.6.1",
"grunt-banana-checker": "0.11.1",
"grunt-contrib-copy": "1.0.0",
"grunt-contrib-watch": "1.1.0",
"grunt-eslint": "24.3.0",
"grunt-image": "5.0.1",
@ -25,6 +24,9 @@
"grunt-stylelint": "0.19.0",
"grunt-tyops": "0.1.1",
"jimp": "0.13.0",
"jsdoc": "4.0.2",
"jsdoc-class-hierarchy": "1.1.2",
"jsdoc-wmf-theme": "0.0.12",
"mocha": "5.2.0",
"selenium-webdriver": "3.6.0",
"stringify-object": "3.2.2",
@ -147,6 +149,18 @@
"node": ">=4"
}
},
"node_modules/@babel/parser": {
"version": "7.24.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz",
"integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/runtime": {
"version": "7.17.9",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz",
@ -831,6 +845,18 @@
"regenerator-runtime": "^0.13.3"
}
},
"node_modules/@jsdoc/salty": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz",
"integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==",
"dev": true,
"dependencies": {
"lodash": "^4.17.21"
},
"engines": {
"node": ">=v12.0.0"
}
},
"node_modules/@mdn/browser-compat-data": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.4.1.tgz",
@ -1008,6 +1034,12 @@
"@types/node": "*"
}
},
"node_modules/@types/linkify-it": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz",
"integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==",
"dev": true
},
"node_modules/@types/lodash": {
"version": "4.14.182",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz",
@ -1041,6 +1073,22 @@
"@types/lodash": "*"
}
},
"node_modules/@types/markdown-it": {
"version": "12.2.3",
"resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
"integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
"dev": true,
"dependencies": {
"@types/linkify-it": "*",
"@types/mdurl": "*"
}
},
"node_modules/@types/mdurl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz",
"integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==",
"dev": true
},
"node_modules/@types/minimatch": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
@ -1685,6 +1733,16 @@
"node": ">=12.0.0"
}
},
"node_modules/@wikimedia/codex-design-tokens": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@wikimedia/codex-design-tokens/-/codex-design-tokens-1.1.1.tgz",
"integrity": "sha512-qFX7LcR/l90yqVTBApvrIDY3Xa0WifoMlBJRGD1DoWff8e/yMhLmxF1o2DRcIfQlOvKDg0Vhy8jAttF6MUfMAA==",
"dev": true,
"engines": {
"node": ">=16",
"npm": ">=7.21.0"
}
},
"node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@ -3062,6 +3120,18 @@
"integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
"dev": true
},
"node_modules/catharsis": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
"integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
"dev": true,
"dependencies": {
"lodash": "^4.17.15"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/caw": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz",
@ -4330,6 +4400,12 @@
}
]
},
"node_modules/domino": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz",
"integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==",
"dev": true
},
"node_modules/domutils": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
@ -5616,12 +5692,6 @@
"node": "^10.12.0 || >=12.0.0"
}
},
"node_modules/file-sync-cmp": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz",
"integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=",
"dev": true
},
"node_modules/file-type": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
@ -6504,83 +6574,6 @@
"nopt": "bin/nopt.js"
}
},
"node_modules/grunt-contrib-copy": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz",
"integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=",
"dev": true,
"dependencies": {
"chalk": "^1.1.1",
"file-sync-cmp": "^0.1.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/grunt-contrib-copy/node_modules/ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/grunt-contrib-copy/node_modules/ansi-styles": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/grunt-contrib-copy/node_modules/chalk": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"dependencies": {
"ansi-styles": "^2.2.1",
"escape-string-regexp": "^1.0.2",
"has-ansi": "^2.0.0",
"strip-ansi": "^3.0.0",
"supports-color": "^2.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/grunt-contrib-copy/node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/grunt-contrib-copy/node_modules/strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"dependencies": {
"ansi-regex": "^2.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/grunt-contrib-copy/node_modules/supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/grunt-contrib-watch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz",
@ -8112,12 +8105,56 @@
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/js2xmlparser": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
"integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
"dev": true,
"dependencies": {
"xmlcreate": "^2.0.4"
}
},
"node_modules/jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
"dev": true
},
"node_modules/jsdoc": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz",
"integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==",
"dev": true,
"dependencies": {
"@babel/parser": "^7.20.15",
"@jsdoc/salty": "^0.2.1",
"@types/markdown-it": "^12.2.3",
"bluebird": "^3.7.2",
"catharsis": "^0.9.0",
"escape-string-regexp": "^2.0.0",
"js2xmlparser": "^4.0.2",
"klaw": "^3.0.0",
"markdown-it": "^12.3.2",
"markdown-it-anchor": "^8.4.1",
"marked": "^4.0.10",
"mkdirp": "^1.0.4",
"requizzle": "^0.2.3",
"strip-json-comments": "^3.1.0",
"underscore": "~1.13.2"
},
"bin": {
"jsdoc": "jsdoc.js"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/jsdoc-class-hierarchy": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/jsdoc-class-hierarchy/-/jsdoc-class-hierarchy-1.1.2.tgz",
"integrity": "sha512-oU7UgWr0Qbtxd2J81/ee1lM8xAdyUU7B1ZosVwZxJwjhPWvtkX9ooHjD1Fk97OyOlpTBXxYVTpptvSCKRt8wvQ==",
"dev": true
},
"node_modules/jsdoc-type-pratt-parser": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
@ -8127,6 +8164,28 @@
"node": ">=12.0.0"
}
},
"node_modules/jsdoc-wmf-theme": {
"version": "0.0.12",
"resolved": "https://registry.npmjs.org/jsdoc-wmf-theme/-/jsdoc-wmf-theme-0.0.12.tgz",
"integrity": "sha512-nuM3TZ91hYWr0GcWr0ECccUMaqxmfQaQTrvqh6n2OSCJj1PRYLMAX7ME3iR+3NX8yBI5MLA+SoiZMwDq/B6pdg==",
"dev": true,
"dependencies": {
"@wikimedia/codex-design-tokens": "1.1.1",
"domino": "^2.1.6",
"lunr": "2.3.9",
"normalize.css": "8.0.1",
"taffydb": "^2.7.3"
}
},
"node_modules/jsdoc/node_modules/escape-string-regexp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/jsesc": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
@ -8278,6 +8337,15 @@
"node": ">=0.10.0"
}
},
"node_modules/klaw": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
"integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.1.9"
}
},
"node_modules/known-css-properties": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz",
@ -8478,6 +8546,15 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
"node_modules/linkify-it": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
"integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
"dev": true,
"dependencies": {
"uc.micro": "^1.0.1"
}
},
"node_modules/livereload-js": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz",
@ -8788,6 +8865,12 @@
"node": ">=10"
}
},
"node_modules/lunr": {
"version": "2.3.9",
"resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
"integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
"dev": true
},
"node_modules/make-dir": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
@ -8839,6 +8922,53 @@
"node": ">=0.10.0"
}
},
"node_modules/markdown-it": {
"version": "12.3.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
"integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
"dev": true,
"dependencies": {
"argparse": "^2.0.1",
"entities": "~2.1.0",
"linkify-it": "^3.0.1",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
},
"bin": {
"markdown-it": "bin/markdown-it.js"
}
},
"node_modules/markdown-it-anchor": {
"version": "8.6.7",
"resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
"integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
"dev": true,
"peerDependencies": {
"@types/markdown-it": "*",
"markdown-it": "*"
}
},
"node_modules/markdown-it/node_modules/entities": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
"integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
"dev": true,
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/marked": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
"integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
"dev": true,
"bin": {
"marked": "bin/marked.js"
},
"engines": {
"node": ">= 12"
}
},
"node_modules/marky": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/marky/-/marky-1.2.4.tgz",
@ -8861,6 +8991,12 @@
"integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
"dev": true
},
"node_modules/mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
"integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
"dev": true
},
"node_modules/meow": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
@ -9418,6 +9554,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/normalize.css": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz",
"integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==",
"dev": true
},
"node_modules/npm-conf": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
@ -11025,6 +11167,15 @@
"node": ">=0.10.5"
}
},
"node_modules/requizzle": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
"integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
"dev": true,
"dependencies": {
"lodash": "^4.17.21"
}
},
"node_modules/resolve": {
"version": "1.22.8",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
@ -12688,6 +12839,12 @@
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
"node_modules/taffydb": {
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz",
"integrity": "sha512-GQ3gtYFSOAxSMN/apGtDKKkbJf+8izz5YfbGqIsUc7AMiQOapARZ76dhilRY2h39cynYxBFdafQo5HUL5vgkrg==",
"dev": true
},
"node_modules/tar-fs": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
@ -13054,6 +13211,12 @@
"node": "*"
}
},
"node_modules/uc.micro": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
"dev": true
},
"node_modules/unbox-primitive": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
@ -13088,6 +13251,12 @@
"node": ">=0.10.0"
}
},
"node_modules/underscore": {
"version": "1.13.6",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
"integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
"dev": true
},
"node_modules/underscore.string": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz",
@ -13579,6 +13748,12 @@
"node": ">=8.0"
}
},
"node_modules/xmlcreate": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
"integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==",
"dev": true
},
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@ -13987,6 +14162,12 @@
}
}
},
"@babel/parser": {
"version": "7.24.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz",
"integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==",
"dev": true
},
"@babel/runtime": {
"version": "7.17.9",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz",
@ -14477,6 +14658,15 @@
"regenerator-runtime": "^0.13.3"
}
},
"@jsdoc/salty": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz",
"integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==",
"dev": true,
"requires": {
"lodash": "^4.17.21"
}
},
"@mdn/browser-compat-data": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.4.1.tgz",
@ -14636,6 +14826,12 @@
"@types/node": "*"
}
},
"@types/linkify-it": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz",
"integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==",
"dev": true
},
"@types/lodash": {
"version": "4.14.182",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz",
@ -14669,6 +14865,22 @@
"@types/lodash": "*"
}
},
"@types/markdown-it": {
"version": "12.2.3",
"resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
"integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
"dev": true,
"requires": {
"@types/linkify-it": "*",
"@types/mdurl": "*"
}
},
"@types/mdurl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz",
"integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==",
"dev": true
},
"@types/minimatch": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
@ -15182,6 +15394,12 @@
"p-iteration": "^1.1.8"
}
},
"@wikimedia/codex-design-tokens": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@wikimedia/codex-design-tokens/-/codex-design-tokens-1.1.1.tgz",
"integrity": "sha512-qFX7LcR/l90yqVTBApvrIDY3Xa0WifoMlBJRGD1DoWff8e/yMhLmxF1o2DRcIfQlOvKDg0Vhy8jAttF6MUfMAA==",
"dev": true
},
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@ -16235,6 +16453,15 @@
"integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
"dev": true
},
"catharsis": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
"integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
"dev": true,
"requires": {
"lodash": "^4.17.15"
}
},
"caw": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz",
@ -17236,6 +17463,12 @@
}
}
},
"domino": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz",
"integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==",
"dev": true
},
"domutils": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
@ -18230,12 +18463,6 @@
"flat-cache": "^3.0.4"
}
},
"file-sync-cmp": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz",
"integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=",
"dev": true
},
"file-type": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
@ -18973,64 +19200,6 @@
}
}
},
"grunt-contrib-copy": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz",
"integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=",
"dev": true,
"requires": {
"chalk": "^1.1.1",
"file-sync-cmp": "^0.1.0"
},
"dependencies": {
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
},
"ansi-styles": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
"dev": true
},
"chalk": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
"ansi-styles": "^2.2.1",
"escape-string-regexp": "^1.0.2",
"has-ansi": "^2.0.0",
"strip-ansi": "^3.0.0",
"supports-color": "^2.0.0"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
}
},
"supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
"dev": true
}
}
},
"grunt-contrib-watch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz",
@ -20100,18 +20269,77 @@
"argparse": "^2.0.1"
}
},
"js2xmlparser": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
"integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
"dev": true,
"requires": {
"xmlcreate": "^2.0.4"
}
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
"dev": true
},
"jsdoc": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz",
"integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==",
"dev": true,
"requires": {
"@babel/parser": "^7.20.15",
"@jsdoc/salty": "^0.2.1",
"@types/markdown-it": "^12.2.3",
"bluebird": "^3.7.2",
"catharsis": "^0.9.0",
"escape-string-regexp": "^2.0.0",
"js2xmlparser": "^4.0.2",
"klaw": "^3.0.0",
"markdown-it": "^12.3.2",
"markdown-it-anchor": "^8.4.1",
"marked": "^4.0.10",
"mkdirp": "^1.0.4",
"requizzle": "^0.2.3",
"strip-json-comments": "^3.1.0",
"underscore": "~1.13.2"
},
"dependencies": {
"escape-string-regexp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
"dev": true
}
}
},
"jsdoc-class-hierarchy": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/jsdoc-class-hierarchy/-/jsdoc-class-hierarchy-1.1.2.tgz",
"integrity": "sha512-oU7UgWr0Qbtxd2J81/ee1lM8xAdyUU7B1ZosVwZxJwjhPWvtkX9ooHjD1Fk97OyOlpTBXxYVTpptvSCKRt8wvQ==",
"dev": true
},
"jsdoc-type-pratt-parser": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
"integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==",
"dev": true
},
"jsdoc-wmf-theme": {
"version": "0.0.12",
"resolved": "https://registry.npmjs.org/jsdoc-wmf-theme/-/jsdoc-wmf-theme-0.0.12.tgz",
"integrity": "sha512-nuM3TZ91hYWr0GcWr0ECccUMaqxmfQaQTrvqh6n2OSCJj1PRYLMAX7ME3iR+3NX8yBI5MLA+SoiZMwDq/B6pdg==",
"dev": true,
"requires": {
"@wikimedia/codex-design-tokens": "1.1.1",
"domino": "^2.1.6",
"lunr": "2.3.9",
"normalize.css": "8.0.1",
"taffydb": "^2.7.3"
}
},
"jsesc": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
@ -20248,6 +20476,15 @@
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true
},
"klaw": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
"integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.9"
}
},
"known-css-properties": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz",
@ -20438,6 +20675,15 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
"linkify-it": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
"integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
"dev": true,
"requires": {
"uc.micro": "^1.0.1"
}
},
"livereload-js": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz",
@ -20696,6 +20942,12 @@
"yallist": "^4.0.0"
}
},
"lunr": {
"version": "2.3.9",
"resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
"integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
"dev": true
},
"make-dir": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
@ -20734,6 +20986,40 @@
"integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
"dev": true
},
"markdown-it": {
"version": "12.3.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
"integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
"dev": true,
"requires": {
"argparse": "^2.0.1",
"entities": "~2.1.0",
"linkify-it": "^3.0.1",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
},
"dependencies": {
"entities": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
"integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
"dev": true
}
}
},
"markdown-it-anchor": {
"version": "8.6.7",
"resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
"integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
"dev": true,
"requires": {}
},
"marked": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
"integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
"dev": true
},
"marky": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/marky/-/marky-1.2.4.tgz",
@ -20752,6 +21038,12 @@
"integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
"dev": true
},
"mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
"integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
"dev": true
},
"meow": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
@ -21168,6 +21460,12 @@
"integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
"dev": true
},
"normalize.css": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz",
"integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==",
"dev": true
},
"npm-conf": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
@ -22372,6 +22670,15 @@
"integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
"dev": true
},
"requizzle": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
"integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
"dev": true,
"requires": {
"lodash": "^4.17.21"
}
},
"resolve": {
"version": "1.22.8",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
@ -23631,6 +23938,12 @@
}
}
},
"taffydb": {
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz",
"integrity": "sha512-GQ3gtYFSOAxSMN/apGtDKKkbJf+8izz5YfbGqIsUc7AMiQOapARZ76dhilRY2h39cynYxBFdafQo5HUL5vgkrg==",
"dev": true
},
"tar-fs": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
@ -23930,6 +24243,12 @@
"integrity": "sha512-K9mwJm/DaB6mRLZfw6q8IMXipcrmuT6yfhYmwhAkuh+81sChuYstYA+znlgaflUPaYUa3odxKPKGw6Vw/lANew==",
"dev": true
},
"uc.micro": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
"dev": true
},
"unbox-primitive": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
@ -23958,6 +24277,12 @@
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
"dev": true
},
"underscore": {
"version": "1.13.6",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
"integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
"dev": true
},
"underscore.string": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz",
@ -24326,6 +24651,12 @@
"integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
"dev": true
},
"xmlcreate": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
"integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==",
"dev": true
},
"xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",

View file

@ -8,8 +8,7 @@
"eslint-fix": "eslint --cache --ext .js,.json --fix .",
"api-testing": "mocha --timeout 0 --parallel --recursive tests/api-testing",
"test": "grunt test",
"doc": "jsduck",
"postdoc": "grunt copy:jsduck",
"doc": "jsdoc -c .jsdoc.json",
"screenshots-all": "grunt screenshots-all",
"selenium-daily": "npm run selenium-test -- --mochaOpts.grep @daily",
"selenium-test": "wdio tests/selenium/wdio.conf.js"
@ -24,13 +23,15 @@
"eslint-config-wikimedia": "0.27.0",
"grunt": "1.6.1",
"grunt-banana-checker": "0.11.1",
"grunt-contrib-copy": "1.0.0",
"grunt-contrib-watch": "1.1.0",
"grunt-eslint": "24.3.0",
"grunt-image": "5.0.1",
"grunt-mocha-test": "0.13.3",
"grunt-stylelint": "0.19.0",
"grunt-tyops": "0.1.1",
"jsdoc": "4.0.2",
"jsdoc-class-hierarchy": "1.1.2",
"jsdoc-wmf-theme": "0.0.12",
"jimp": "0.13.0",
"mocha": "5.2.0",
"selenium-webdriver": "3.6.0",