mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-05-02 00:43:34 -04:00
Better handling of alternate spell palette documentation syntax for other code languages.
This commit is contained in:
parent
04976a7b14
commit
8c6ee66684
5 changed files with 62 additions and 14 deletions
app
schemas/models
templates/play/level/tome
views/play/level/tome
|
@ -29,7 +29,16 @@ PropertyDocumentationSchema = c.object {
|
||||||
description: {title: "Description", type: 'string', description: "Description of the property.", format: 'markdown', maxLength: 1000}
|
description: {title: "Description", type: 'string', description: "Description of the property.", format: 'markdown', maxLength: 1000}
|
||||||
args: c.array {title: "Arguments", description: "If this property has type 'function', then provide documentation for any function arguments."}, c.FunctionArgumentSchema
|
args: c.array {title: "Arguments", description: "If this property has type 'function', then provide documentation for any function arguments."}, c.FunctionArgumentSchema
|
||||||
owner: {title: "Owner", type: 'string', description: 'Owner of the property, like "this" or "Math".'}
|
owner: {title: "Owner", type: 'string', description: 'Owner of the property, like "this" or "Math".'}
|
||||||
example: {title: "Example", type: 'string', description: 'An optional example code block.', format: 'javascript'}
|
example:
|
||||||
|
oneOf: [
|
||||||
|
{title: "Example", type: 'string', description: 'An optional example code block.', format: 'javascript'}
|
||||||
|
{
|
||||||
|
type: 'object',
|
||||||
|
title: "Language Examples",
|
||||||
|
description: "Examples by code language.",
|
||||||
|
additionalProperties: {type: 'string', description: 'An example code block.', format: 'javascript'} # TODO: not JS
|
||||||
|
}
|
||||||
|
]
|
||||||
returns: c.object {
|
returns: c.object {
|
||||||
title: "Return Value"
|
title: "Return Value"
|
||||||
description: 'Optional documentation of any return value.'
|
description: 'Optional documentation of any return value.'
|
||||||
|
|
|
@ -4,7 +4,7 @@ ul(class="nav nav-pills" + (tabbed ? ' multiple-tabs' : ''))
|
||||||
each slug, group in entryGroupSlugs
|
each slug, group in entryGroupSlugs
|
||||||
li(class=group == "this" || slug == "available-spells" ? "active" : "")
|
li(class=group == "this" || slug == "available-spells" ? "active" : "")
|
||||||
a(data-toggle="pill", data-target='#palette-tab-' + slug)
|
a(data-toggle="pill", data-target='#palette-tab-' + slug)
|
||||||
h4= group
|
h4= entryGroupNames[group]
|
||||||
.tab-content
|
.tab-content
|
||||||
each slug, group in entryGroupSlugs
|
each slug, group in entryGroupSlugs
|
||||||
div(id="palette-tab-" + slug, class="tab-pane nano" + (group == "this" || slug == defaultGroupSlug ? " active" : ""))
|
div(id="palette-tab-" + slug, class="tab-pane nano" + (group == "this" || slug == defaultGroupSlug ? " active" : ""))
|
||||||
|
|
|
@ -77,22 +77,49 @@ module.exports = class SpellPaletteEntryView extends View
|
||||||
if _.isString @doc
|
if _.isString @doc
|
||||||
@doc = name: @doc, type: typeof @thang[@doc]
|
@doc = name: @doc, type: typeof @thang[@doc]
|
||||||
if options.isSnippet
|
if options.isSnippet
|
||||||
@doc.type = @doc.owner = 'snippet'
|
@doc.type = 'snippet'
|
||||||
|
@doc.owner = 'snippets'
|
||||||
@doc.shortName = @doc.shorterName = @doc.title = @doc.name
|
@doc.shortName = @doc.shorterName = @doc.title = @doc.name
|
||||||
else
|
else
|
||||||
@doc.owner ?= 'this'
|
@doc.owner ?= 'this'
|
||||||
suffix = ''
|
ownerName = @doc.ownerName = if @doc.owner isnt 'this' then @doc.owner else switch options.language
|
||||||
|
when 'python', 'lua' then 'self'
|
||||||
|
when 'coffeescript' then '@'
|
||||||
|
else 'this'
|
||||||
if @doc.type is 'function'
|
if @doc.type is 'function'
|
||||||
argNames = (arg.name for arg in @doc.args ? []).join(', ')
|
sep = {clojure: ' '}[options.language] ? ', '
|
||||||
argNames = '...' if argNames.length > 6
|
argNames = (arg.name for arg in @doc.args ? []).join sep
|
||||||
suffix = "(#{argNames})"
|
argString = if argNames then '__ARGS__' else ''
|
||||||
@doc.shortName = "#{@doc.owner}.#{@doc.name}#{suffix};"
|
@doc.shortName = switch options.language
|
||||||
if @doc.owner is 'this' or options.tabbify
|
when 'coffeescript' then "#{ownerName}#{if ownerName is '@' then '' else '.'}#{@doc.name}#{if argString then ' ' + argString else '()'}"
|
||||||
@doc.shorterName = "#{@doc.name}#{suffix}"
|
when 'python' then "#{ownerName}.#{@doc.name}(#{argString})"
|
||||||
|
when 'lua' then "#{ownerName}:#{@doc.name}(#{argString})"
|
||||||
|
when 'clojure' then "(#{@doc.name} #{ownerName}#{if argNames then ' ' + argString else ''})"
|
||||||
|
when 'io' then "#{if ownerName is 'this' then '' else ownerName + ' '}#{@doc.name}#{if argNames then '(' + argNames + ')' else ''}"
|
||||||
|
else "#{ownerName}.#{@doc.name}(#{argString});"
|
||||||
else
|
else
|
||||||
|
@doc.shortName = switch options.language
|
||||||
|
when 'coffeescript' then "#{ownerName}#{if ownerName is '@' then '' else '.'}#{@doc.name}"
|
||||||
|
when 'python' then "#{ownerName}.#{@doc.name}"
|
||||||
|
when 'lua' then "#{ownerName}.#{@doc.name}"
|
||||||
|
when 'clojure' then "(#{@doc.name} #{ownerName})"
|
||||||
|
when 'io' then "#{if ownerName is 'this' then '' else ownerName + ' '}#{@doc.name}"
|
||||||
|
else "#{ownerName}.#{@doc.name};"
|
||||||
|
@doc.shorterName = @doc.shortName
|
||||||
|
if @doc.type is 'function' and argString
|
||||||
|
@doc.shortName = @doc.shorterName.replace argString, argNames
|
||||||
|
@doc.shorterName = @doc.shorterName.replace argString, (if argNames.length > 6 then '...' else argNames)
|
||||||
|
if @options.language is 'javascript'
|
||||||
@doc.shorterName = @doc.shortName.replace ';', ''
|
@doc.shorterName = @doc.shortName.replace ';', ''
|
||||||
|
if @doc.owner is 'this' or options.tabbify
|
||||||
|
@doc.shorterName = @doc.shorterName.replace /^this\./, ''
|
||||||
@doc.title = if options.shortenize then @doc.shorterName else @doc.shortName
|
@doc.title = if options.shortenize then @doc.shorterName else @doc.shortName
|
||||||
|
|
||||||
|
if example = @doc.example?[options.language]
|
||||||
|
@doc.example = example
|
||||||
|
else unless _.isString @doc.example
|
||||||
|
@doc.example = null
|
||||||
|
|
||||||
getRenderData: ->
|
getRenderData: ->
|
||||||
c = super()
|
c = super()
|
||||||
c.doc = @doc
|
c.doc = @doc
|
||||||
|
|
|
@ -31,6 +31,7 @@ module.exports = class SpellPaletteView extends View
|
||||||
c = super()
|
c = super()
|
||||||
c.entryGroups = @entryGroups
|
c.entryGroups = @entryGroups
|
||||||
c.entryGroupSlugs = @entryGroupSlugs
|
c.entryGroupSlugs = @entryGroupSlugs
|
||||||
|
c.entryGroupNames = @entryGroupNames
|
||||||
c.tabbed = _.size(@entryGroups) > 1
|
c.tabbed = _.size(@entryGroups) > 1
|
||||||
c.defaultGroupSlug = @defaultGroupSlug
|
c.defaultGroupSlug = @defaultGroupSlug
|
||||||
c
|
c
|
||||||
|
@ -96,7 +97,7 @@ module.exports = class SpellPaletteView extends View
|
||||||
return 'more' if entry.doc.owner is 'this' and entry.doc.name in (propGroups.more ? [])
|
return 'more' if entry.doc.owner is 'this' and entry.doc.name in (propGroups.more ? [])
|
||||||
entry.doc.owner
|
entry.doc.owner
|
||||||
@entries = _.sortBy @entries, (entry) ->
|
@entries = _.sortBy @entries, (entry) ->
|
||||||
order = ['this', 'more', 'Math', 'Vector', 'snippets']
|
order = ['this', 'more', 'Math', 'Vector', 'String', 'Object', 'Array', 'Function', 'snippets']
|
||||||
index = order.indexOf groupForEntry entry
|
index = order.indexOf groupForEntry entry
|
||||||
index = String.fromCharCode if index is -1 then order.length else index
|
index = String.fromCharCode if index is -1 then order.length else index
|
||||||
index += entry.doc.name
|
index += entry.doc.name
|
||||||
|
@ -108,13 +109,18 @@ module.exports = class SpellPaletteView extends View
|
||||||
@entryGroups[defaultGroup] = @entries
|
@entryGroups[defaultGroup] = @entries
|
||||||
@defaultGroupSlug = _.string.slugify defaultGroup
|
@defaultGroupSlug = _.string.slugify defaultGroup
|
||||||
@entryGroupSlugs = {}
|
@entryGroupSlugs = {}
|
||||||
|
@entryGroupNames = {}
|
||||||
for group, entries of @entryGroups
|
for group, entries of @entryGroups
|
||||||
@entryGroupSlugs[group] = _.string.slugify group
|
|
||||||
@entryGroups[group] = _.groupBy entries, (entry, i) -> Math.floor i / N_ROWS
|
@entryGroups[group] = _.groupBy entries, (entry, i) -> Math.floor i / N_ROWS
|
||||||
|
@entryGroupSlugs[group] = _.string.slugify group
|
||||||
|
@entryGroupNames[group] = group
|
||||||
|
if thisName = {coffeescript: '@', lua: 'self', clojure: 'self'}[@options.language]
|
||||||
|
if @entryGroupNames.this
|
||||||
|
@entryGroupNames.this = thisName
|
||||||
null
|
null
|
||||||
|
|
||||||
addEntry: (doc, shortenize, tabbify, isSnippet=false) ->
|
addEntry: (doc, shortenize, tabbify, isSnippet=false) ->
|
||||||
new SpellPaletteEntryView doc: doc, thang: @thang, shortenize: shortenize, tabbify: tabbify, isSnippet: isSnippet
|
new SpellPaletteEntryView doc: doc, thang: @thang, shortenize: shortenize, tabbify: tabbify, isSnippet: isSnippet, language: @options.language
|
||||||
|
|
||||||
onDisableControls: (e) -> @toggleControls e, false
|
onDisableControls: (e) -> @toggleControls e, false
|
||||||
onEnableControls: (e) -> @toggleControls e, true
|
onEnableControls: (e) -> @toggleControls e, true
|
||||||
|
@ -140,6 +146,9 @@ module.exports = class SpellPaletteView extends View
|
||||||
|
|
||||||
onTomeChangedLanguage: (e) ->
|
onTomeChangedLanguage: (e) ->
|
||||||
@updateCodeLanguage e.language
|
@updateCodeLanguage e.language
|
||||||
|
entry.destroy() for entry in @entries
|
||||||
|
@createPalette()
|
||||||
|
@render()
|
||||||
|
|
||||||
onEditEditorConfig: (e) ->
|
onEditEditorConfig: (e) ->
|
||||||
@openModalView new EditorConfigModal session: @options.session
|
@openModalView new EditorConfigModal session: @options.session
|
||||||
|
|
|
@ -272,7 +272,10 @@ module.exports = class SpellView extends View
|
||||||
else
|
else
|
||||||
@ace.setValue source
|
@ace.setValue source
|
||||||
@eventsSuppressed = false
|
@eventsSuppressed = false
|
||||||
@ace.resize true # hack: @ace may not have updated its text properly, so we force it to refresh
|
try
|
||||||
|
@ace.resize true # hack: @ace may not have updated its text properly, so we force it to refresh
|
||||||
|
catch error
|
||||||
|
console.warn "Error resizing ACE after an update:", error
|
||||||
|
|
||||||
# Called from CastButtonView initially and whenever the delay is changed
|
# Called from CastButtonView initially and whenever the delay is changed
|
||||||
setAutocastDelay: (@autocastDelay) ->
|
setAutocastDelay: (@autocastDelay) ->
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue