labels -> metadata

This commit is contained in:
Nate Stemen
2017-10-05 14:19:30 +01:00
parent e53a24f8f5
commit 507bb568a3
4 changed files with 130 additions and 24 deletions
@@ -5,6 +5,30 @@ logger = require 'logger-sharelatex'
module.exports = MetadataController = module.exports = MetadataController =
getAllLabels: (req, res, next) ->
project_id = req.params.project_id
logger.log {project_id}, "getting labels for project"
MetadataHandler.getMetadataForProject project_id, (err, projectMetadata) ->
if err?
logger.err {project_id, err}, "[MetadataController] error getting labels from project"
return next err
res.json {
projectId: project_id
projectLabels: projectMetadata["labels"]
}
getAllPackages: (req, res, next) ->
project_id = req.params.project_id
logger.log {project_id}, "getting labels for project"
MetadataHandler.getMetadataForProject project_id, (err, projectMetadata) ->
if err?
logger.err {project_id, err}, "[MetadataController] error getting labels from project"
return next err
res.json {
projectId: project_id
projectPackages: projectMetadata["packages"]
}
getAllMetadata: (req, res, next) -> getAllMetadata: (req, res, next) ->
project_id = req.params.project_id project_id = req.params.project_id
logger.log {project_id}, "getting metadata for project" logger.log {project_id}, "getting metadata for project"
@@ -33,4 +57,4 @@ module.exports = MetadataController =
packages: docMetadata["packages"] packages: docMetadata["packages"]
} }
} }
res.sendStatus(200) res.sendStatus 200
@@ -9,11 +9,13 @@ define [
"ide/editor/directives/aceEditor/highlights/HighlightsManager" "ide/editor/directives/aceEditor/highlights/HighlightsManager"
"ide/editor/directives/aceEditor/cursor-position/CursorPositionManager" "ide/editor/directives/aceEditor/cursor-position/CursorPositionManager"
"ide/editor/directives/aceEditor/track-changes/TrackChangesManager" "ide/editor/directives/aceEditor/track-changes/TrackChangesManager"
"ide/editor/directives/aceEditor/labels/LabelsManager" # "ide/editor/directives/aceEditor/labels/LabelsManager"
"ide/labels/services/labels" "ide/editor/directives/aceEditor/metadata/MetadataManager"
# "ide/labels/services/labels"
"ide/metadata/services/metadata"
"ide/graphics/services/graphics" "ide/graphics/services/graphics"
"ide/preamble/services/preamble" "ide/preamble/services/preamble"
], (App, Ace, SearchBox, ModeList, UndoManager, AutoCompleteManager, SpellCheckManager, HighlightsManager, CursorPositionManager, TrackChangesManager, LabelsManager) -> ], (App, Ace, SearchBox, ModeList, UndoManager, AutoCompleteManager, SpellCheckManager, HighlightsManager, CursorPositionManager, TrackChangesManager, MetadataManager) ->
EditSession = ace.require('ace/edit_session').EditSession EditSession = ace.require('ace/edit_session').EditSession
ModeList = ace.require('ace/ext/modelist') ModeList = ace.require('ace/ext/modelist')
@@ -35,7 +37,7 @@ define [
url = ace.config._moduleUrl(args...) + "?fingerprint=#{window.aceFingerprint}" url = ace.config._moduleUrl(args...) + "?fingerprint=#{window.aceFingerprint}"
return url return url
App.directive "aceEditor", ($timeout, $compile, $rootScope, event_tracking, localStorage, $cacheFactory, labels, graphics, preamble) -> App.directive "aceEditor", ($timeout, $compile, $rootScope, event_tracking, localStorage, $cacheFactory, metadata, graphics, preamble) ->
monkeyPatchSearch($rootScope, $compile) monkeyPatchSearch($rootScope, $compile)
return { return {
@@ -102,8 +104,9 @@ define [
highlightsManager = new HighlightsManager(scope, editor, element) highlightsManager = new HighlightsManager(scope, editor, element)
cursorPositionManager = new CursorPositionManager(scope, editor, element, localStorage) cursorPositionManager = new CursorPositionManager(scope, editor, element, localStorage)
trackChangesManager = new TrackChangesManager(scope, editor, element) trackChangesManager = new TrackChangesManager(scope, editor, element)
labelsManager = new LabelsManager(scope, editor, element, labels) metadataManager = new metadataManager(scope, editor, element, metadata)
autoCompleteManager = new AutoCompleteManager(scope, editor, element, labelsManager, graphics, preamble) # labelsManager = new LabelsManager(scope, editor, element, labels)
autoCompleteManager = new AutoCompleteManager(scope, editor, element, metadataManager, graphics, preamble)
# Prevert Ctrl|Cmd-S from triggering save dialog # Prevert Ctrl|Cmd-S from triggering save dialog
@@ -9,7 +9,7 @@ define [
aceSnippetManager = ace.require('ace/snippets').snippetManager aceSnippetManager = ace.require('ace/snippets').snippetManager
class AutoCompleteManager class AutoCompleteManager
constructor: (@$scope, @editor, @element, @labelsManager, @graphics, @preamble) -> constructor: (@$scope, @editor, @element, @metadataManager, @graphics, @preamble) ->
@suggestionManager = new CommandManager() @suggestionManager = new CommandManager()
@monkeyPatchAutocomplete() @monkeyPatchAutocomplete()
@@ -34,6 +34,8 @@ define [
enableLiveAutocompletion: false enableLiveAutocompletion: false
}) })
# metadataManager = @metadataManager
SnippetCompleter = new EnvironmentManager() SnippetCompleter = new EnvironmentManager()
Graphics = @graphics Graphics = @graphics
@@ -63,7 +65,7 @@ define [
} }
callback null, result callback null, result
labelsManager = @labelsManager metadataManager = @metadataManager
LabelsCompleter = LabelsCompleter =
getCompletions: (editor, session, pos, prefix, callback) -> getCompletions: (editor, session, pos, prefix, callback) ->
context = Helpers.getContext(editor, pos) context = Helpers.getContext(editor, pos)
@@ -80,7 +82,7 @@ define [
meta: "cross-reference", meta: "cross-reference",
score: 60 score: 60
} }
for label in labelsManager.getAllLabels() for label in metadataManager.getAllLabels()
result.push { result.push {
caption: "\\#{commandName}{#{label}#{if needsClosingBrace then '}' else ''}", caption: "\\#{commandName}{#{label}#{if needsClosingBrace then '}' else ''}",
value: "\\#{commandName}{#{label}#{if needsClosingBrace then '}' else ''}", value: "\\#{commandName}{#{label}#{if needsClosingBrace then '}' else ''}",
@@ -0,0 +1,77 @@
define [
"ace/ace"
], () ->
Range = ace.require("ace/range").Range
getLastCommandFragment = (lineUpToCursor) ->
if m = lineUpToCursor.match(/(\\[^\\]+)$/)
return m[1]
else
return null
class MetadataManager
constructor: (@$scope, @editor, @element, @Metadata) ->
@debouncer = {} # DocId => Timeout
onChange = (change) =>
if change.remote
return
if change.action not in ['remove', 'insert']
return
cursorPosition = @editor.getCursorPosition()
end = change.end
range = new Range(end.row, 0, end.row, end.column)
lineUpToCursor = @editor.getSession().getTextRange(range)
commandFragment = getLastCommandFragment(lineUpToCursor)
linesContainLabel = _.any(
change.lines,
(line) -> line.match(/\\label\{[^\}\n\\]{0,80}\}/)
)
linesContainPackage = _.any(
change.lines,
(line) -> line.match(/\\usepackage(?:\[.*?])?\s*{.*?}/)
)
linesContainMeta = linesContainPackage or linesContainLabel
lastCommandFragmentIsLabel = commandFragment?.startsWith '\\label{'
lastCommandFragmentIsPackage = commandFragment?.startsWith '\\usepackage'
lastCommandFragmentIsMeta = lastCommandFragmentIsPackage or lastCommandFragmentIsLabel
if linesContainMeta or lastCommandFragmentIsMeta
@scheduleLoadCurrentDocMetadataFromServer()
@editor.on 'changeSession', (e) =>
e.oldSession.off 'change', onChange
e.session.on 'change', onChange
loadCurrentDocMetadataFromServer: () ->
currentDocId = @$scope.docId
@Metadata.loadDocMetadataFromServer currentDocId
loadDocMetadataFromServer: (docId) ->
@Metadata.loadDocMetadataFromServer docId
scheduleLoadCurrentDocMetadataFromServer: () ->
# De-bounce loading labels with a timeout
currentDocId = @$scope.docId
existingTimeout = @debouncer[currentDocId]
if existingTimeout?
clearTimeout(existingTimeout)
delete @debouncer[currentDocId]
@debouncer[currentDocId] = setTimeout(
() =>
@loadDocMetadataFromServer(currentDocId)
delete @debouncer[currentDocId]
, 1000
, this
)
getAllLabels: () ->
@Metadata.getAllLabels()
getAllPackages: () ->
@Metadata.getAllPackages()
getAllMetadata: () ->
@Metadata.getAllMetadata()