Forráskód Böngészése

WIP: basically working labels/ref autocomplete

Shane Kilkelly 9 éve
szülő
commit
da84b3f31c

+ 16 - 3
services/web/public/coffee/ide/editor/directives/aceEditor/auto-complete/AutoCompleteManager.coffee

@@ -31,6 +31,8 @@ define [
 				e.oldSession.off "change", onChange
 				e.oldSession.off "change", onChange
 				e.session.on "change", onChange
 				e.session.on "change", onChange
 
 
+			@labelsManager = @$scope.$root._labels
+
 		enable: () ->
 		enable: () ->
 			@editor.setOptions({
 			@editor.setOptions({
 				enableBasicAutocompletion: true,
 				enableBasicAutocompletion: true,
@@ -40,10 +42,10 @@ define [
 
 
 			SnippetCompleter = new SnippetManager()
 			SnippetCompleter = new SnippetManager()
 
 
-			labelsState = @$scope.$root._labels
+			labelsManager = @labelsManager
 			LabelsCompleter =
 			LabelsCompleter =
 				getCompletions: (editor, session, pos, prefxi, callback) ->
 				getCompletions: (editor, session, pos, prefxi, callback) ->
-					console.log ">> [LabelsCompleter] getting completions"
+					# console.log ">> [LabelsCompleter] getting completions"
 					upToCursorRange = new Range(pos.row, 0, pos.row, pos.column)
 					upToCursorRange = new Range(pos.row, 0, pos.row, pos.column)
 					lineUpToCursor = editor.getSession().getTextRange(upToCursorRange)
 					lineUpToCursor = editor.getSession().getTextRange(upToCursorRange)
 					commandFragment = getLastCommandFragment(lineUpToCursor)
 					commandFragment = getLastCommandFragment(lineUpToCursor)
@@ -61,7 +63,7 @@ define [
 								meta: "cross-reference",
 								meta: "cross-reference",
 								score: 11000
 								score: 11000
 							}
 							}
-							labels = _.flatten(labels for docId, labels of labelsState.documents)
+							labels = labelsManager.getAllLabels()
 							for label in labels
 							for label in labels
 								result.push {
 								result.push {
 									caption: "\\ref{#{label}#{if needsClosingBrace then '}' else ''}",
 									caption: "\\ref{#{label}#{if needsClosingBrace then '}' else ''}",
@@ -118,6 +120,7 @@ define [
 			})
 			})
 
 
 		onChange: (change) ->
 		onChange: (change) ->
+			window.EDITOR = @editor
 			cursorPosition = @editor.getCursorPosition()
 			cursorPosition = @editor.getCursorPosition()
 			end = change.end
 			end = change.end
 			# Check that this change was made by us, not a collaborator
 			# Check that this change was made by us, not a collaborator
@@ -129,9 +132,19 @@ define [
 					commandFragment = getLastCommandFragment(lineUpToCursor)
 					commandFragment = getLastCommandFragment(lineUpToCursor)
 
 
 					if commandFragment? and commandFragment.length > 2
 					if commandFragment? and commandFragment.length > 2
+						if commandFragment.startsWith('\\label{')
+							# console.log ">> LABEL IS HERE"
+							# TODO: trigger re-scan of document
+							@labelsManager.scheduleLoadLabelsFromOpenDoc()
 						setTimeout () =>
 						setTimeout () =>
 							@editor.execCommand("startAutocomplete")
 							@editor.execCommand("startAutocomplete")
 						, 0
 						, 0
+			else
+				if change.action == 'remove'
+					if _.any(change.lines, (line) -> line.match(/\\label{.*}/))
+						# console.log ">> a label has been removed"
+						# TODO: trigger removal of label
+						@labelsManager.scheduleLoadLabelsFromOpenDoc()
 
 
 		monkeyPatchAutocomplete: () ->
 		monkeyPatchAutocomplete: () ->
 			Autocomplete = ace.require("ace/autocomplete").Autocomplete
 			Autocomplete = ace.require("ace/autocomplete").Autocomplete

+ 24 - 12
services/web/public/coffee/ide/labels/LabelsManager.coffee

@@ -2,37 +2,49 @@ define [
 ], () ->
 ], () ->
 	class LabelsManager
 	class LabelsManager
 		constructor: (@ide, @$scope) ->
 		constructor: (@ide, @$scope) ->
+			@$scope.$root._labels = this
 
 
-			@$scope.$root._labels = @state =
+			@state =
 				documents: {}
 				documents: {}
 
 
-			window.STATE = @state
+			@loadLabelsTimeout = null
 
 
 			setTimeout(
 			setTimeout(
 				(self) ->
 				(self) ->
 					self.$scope.$on 'document:opened', (e, doc) ->
 					self.$scope.$on 'document:opened', (e, doc) ->
-						console.log ">> [LabelsManager] document opened"
+						# console.log ">> [LabelsManager] document opened"
 						setTimeout(
 						setTimeout(
-							(self, doc) ->
-								self.loadLabelsFromDoc(doc)
+							(self) ->
+								self.loadLabelsFromOpenDoc()
 							, 1000
 							, 1000
 							, self
 							, self
-							, doc
 						)
 						)
 				, 0
 				, 0
 				this
 				this
 			)
 			)
 
 
-		loadLabelsFromDoc: (doc) ->
-			docId = doc.doc_id
-			console.log ">> [LabelsMangager] loading labels", docId
-			docText = doc._doc.getText()
+		loadLabelsFromOpenDoc: () ->
+			docId = @ide.editorManager.getCurrentDocId()
+			# console.log ">> [LabelsMangager] loading labels", docId
+			docText = @ide.editorManager.getCurrentDocValue()
 			labels = []
 			labels = []
 			re = /\\label{(.*)}/g
 			re = /\\label{(.*)}/g
 			while labelMatch = re.exec(docText)
 			while labelMatch = re.exec(docText)
-				labels.push(labelMatch[1])
+				if labelMatch[1]
+					labels.push(labelMatch[1])
 			@state.documents[docId] = labels
 			@state.documents[docId] = labels
-			console.log ">> [LabelsMangager] success, loaded labels", docId, labels
+			# console.log ">> [LabelsMangager] success, loaded labels", docId, labels
+
+		scheduleLoadLabelsFromOpenDoc: () ->
+			if @loadLabelsTimeout
+				clearTimeout(@loadLabelsTimeout)
+			@loadLabelsTimeout = setTimeout(
+				(self) ->
+					# console.log ">> trigger timeout"
+					self.loadLabelsFromOpenDoc()
+				, 500
+				, this
+			)
 
 
 		getAllLabels: () ->
 		getAllLabels: () ->
 			_.flatten(labels for docId, labels of @state.documents)
 			_.flatten(labels for docId, labels of @state.documents)