Просмотр исходного кода

Merge branch 'ns-file-completer'

Nate Stemen 9 лет назад
Родитель
Сommit
74ba7402de

+ 3 - 2
services/web/public/coffee/ide/editor/directives/aceEditor.coffee

@@ -15,6 +15,7 @@ define [
 	"ide/metadata/services/metadata"
 	"ide/metadata/services/metadata"
 	"ide/graphics/services/graphics"
 	"ide/graphics/services/graphics"
 	"ide/preamble/services/preamble"
 	"ide/preamble/services/preamble"
+    "ide/files/services/files"
 ], (App, Ace, SearchBox, ModeList, UndoManager, AutoCompleteManager, SpellCheckManager, HighlightsManager, CursorPositionManager, TrackChangesManager, MetadataManager, LabelsManager) ->
 ], (App, Ace, SearchBox, ModeList, UndoManager, AutoCompleteManager, SpellCheckManager, HighlightsManager, CursorPositionManager, TrackChangesManager, MetadataManager, LabelsManager) ->
 	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')
@@ -37,7 +38,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, metadata, graphics, preamble, $http, $q) ->
+	App.directive "aceEditor", ($timeout, $compile, $rootScope, event_tracking, localStorage, $cacheFactory, labels, metadata, graphics, preamble, files, $http, $q) ->
 		monkeyPatchSearch($rootScope, $compile)
 		monkeyPatchSearch($rootScope, $compile)
 
 
 		return  {
 		return  {
@@ -106,7 +107,7 @@ define [
 				trackChangesManager   = new TrackChangesManager(scope, editor, element)
 				trackChangesManager   = new TrackChangesManager(scope, editor, element)
 				labelsManager = new LabelsManager(scope, editor, element, labels)
 				labelsManager = new LabelsManager(scope, editor, element, labels)
 				metadataManager = new MetadataManager(scope, editor, element, metadata)
 				metadataManager = new MetadataManager(scope, editor, element, metadata)
-				autoCompleteManager = new AutoCompleteManager(scope, editor, element, metadataManager, labelsManager, graphics, preamble)
+				autoCompleteManager = new AutoCompleteManager(scope, editor, element, metadataManager, labelsManager, graphics, preamble, files)
 
 
 
 
 				# Prevert Ctrl|Cmd-S from triggering save dialog
 				# Prevert Ctrl|Cmd-S from triggering save dialog

+ 25 - 1
services/web/public/coffee/ide/editor/directives/aceEditor/auto-complete/AutoCompleteManager.coffee

@@ -10,7 +10,7 @@ define [
 	aceSnippetManager = ace.require('ace/snippets').snippetManager
 	aceSnippetManager = ace.require('ace/snippets').snippetManager
 
 
 	class AutoCompleteManager
 	class AutoCompleteManager
-		constructor: (@$scope, @editor, @element, @metadataManager, @labelsManager, @graphics, @preamble) ->
+		constructor: (@$scope, @editor, @element, @metadataManager, @labelsManager, @graphics, @preamble, @files) ->
 
 
 			@monkeyPatchAutocomplete()
 			@monkeyPatchAutocomplete()
 
 
@@ -41,6 +41,8 @@ define [
 
 
 			Graphics = @graphics
 			Graphics = @graphics
 			Preamble = @preamble
 			Preamble = @preamble
+			Files = @files
+
 			GraphicsCompleter =
 			GraphicsCompleter =
 				getCompletions: (editor, session, pos, prefix, callback) ->
 				getCompletions: (editor, session, pos, prefix, callback) ->
 					context = Helpers.getContext(editor, pos)
 					context = Helpers.getContext(editor, pos)
@@ -67,6 +69,27 @@ define [
 							callback null, result
 							callback null, result
 
 
 			metadataManager = @metadataManager
 			metadataManager = @metadataManager
+			FilesCompleter =
+				getCompletions: (editor, session, pos, prefix, callback) =>
+					context = Helpers.getContext(editor, pos)
+					{lineUpToCursor, commandFragment, lineBeyondCursor, needsClosingBrace} = context
+					if commandFragment
+						match = commandFragment.match(/^\\(input|include){(\w*)/)
+						if match
+							commandName = match[1]
+							currentArg = match[2]
+							result = []
+							for file in Files.getTeXFiles()
+								if file.id != @$scope.docId
+									path = file.path
+									result.push {
+										caption: "\\#{commandName}{#{path}#{if needsClosingBrace then '}' else ''}",
+										value: "\\#{commandName}{#{path}#{if needsClosingBrace then '}' else ''}",
+										meta: "file",
+										score: 50
+									}
+							callback null, result
+
 			LabelsCompleter =
 			LabelsCompleter =
 				getCompletions: (editor, session, pos, prefix, callback) ->
 				getCompletions: (editor, session, pos, prefix, callback) ->
 					context = Helpers.getContext(editor, pos)
 					context = Helpers.getContext(editor, pos)
@@ -136,6 +159,7 @@ define [
 				ReferencesCompleter
 				ReferencesCompleter
 				LabelsCompleter
 				LabelsCompleter
 				GraphicsCompleter
 				GraphicsCompleter
+				FilesCompleter
 			]
 			]
 
 
 		disable: () ->
 		disable: () ->

+ 16 - 16
services/web/public/coffee/ide/file-tree/FileTreeManager.coffee

@@ -13,15 +13,15 @@ define [
 				@loadRootFolder()
 				@loadRootFolder()
 				@loadDeletedDocs()
 				@loadDeletedDocs()
 				@$scope.$emit "file-tree:initialized"
 				@$scope.$emit "file-tree:initialized"
-				
+
 			@$scope.$watch "rootFolder", (rootFolder) =>
 			@$scope.$watch "rootFolder", (rootFolder) =>
 				if rootFolder?
 				if rootFolder?
 					@recalculateDocList()
 					@recalculateDocList()
 
 
 			@_bindToSocketEvents()
 			@_bindToSocketEvents()
-			
+
 			@$scope.multiSelectedCount = 0
 			@$scope.multiSelectedCount = 0
-			
+
 			$(document).on "click", =>
 			$(document).on "click", =>
 				@clearMultiSelectedEntities()
 				@clearMultiSelectedEntities()
 				$scope.$digest()
 				$scope.$digest()
@@ -46,7 +46,7 @@ define [
 						type: "file"
 						type: "file"
 					}
 					}
 					@recalculateDocList()
 					@recalculateDocList()
-					
+
 			@ide.socket.on "reciveNewFolder", (parent_folder_id, folder) =>
 			@ide.socket.on "reciveNewFolder", (parent_folder_id, folder) =>
 				parent_folder = @findEntityById(parent_folder_id) or @$scope.rootFolder
 				parent_folder = @findEntityById(parent_folder_id) or @$scope.rootFolder
 				@$scope.$apply () =>
 				@$scope.$apply () =>
@@ -85,25 +85,25 @@ define [
 			@ide.fileTreeManager.forEachEntity (entity) ->
 			@ide.fileTreeManager.forEachEntity (entity) ->
 				entity.selected = false
 				entity.selected = false
 			entity.selected = true
 			entity.selected = true
-		
+
 		toggleMultiSelectEntity: (entity) ->
 		toggleMultiSelectEntity: (entity) ->
 			entity.multiSelected = !entity.multiSelected
 			entity.multiSelected = !entity.multiSelected
 			@$scope.multiSelectedCount = @multiSelectedCount()
 			@$scope.multiSelectedCount = @multiSelectedCount()
-		
+
 		multiSelectedCount: () ->
 		multiSelectedCount: () ->
 			count = 0
 			count = 0
 			@forEachEntity (entity) ->
 			@forEachEntity (entity) ->
 				if entity.multiSelected
 				if entity.multiSelected
 					count++
 					count++
 			return count
 			return count
-		
+
 		getMultiSelectedEntities: () ->
 		getMultiSelectedEntities: () ->
 			entities = []
 			entities = []
 			@forEachEntity (e) ->
 			@forEachEntity (e) ->
 				if e.multiSelected
 				if e.multiSelected
 					entities.push e
 					entities.push e
 			return entities
 			return entities
-		
+
 		getMultiSelectedEntityChildNodes: () ->
 		getMultiSelectedEntityChildNodes: () ->
 			entities = @getMultiSelectedEntities()
 			entities = @getMultiSelectedEntities()
 			paths = {}
 			paths = {}
@@ -125,13 +125,13 @@ define [
 				if !prefixes[path]?
 				if !prefixes[path]?
 					child_entities.push entity
 					child_entities.push entity
 			return child_entities
 			return child_entities
-		
+
 		clearMultiSelectedEntities: () ->
 		clearMultiSelectedEntities: () ->
 			return if @$scope.multiSelectedCount == 0 # Be efficient, this is called a lot on 'click'
 			return if @$scope.multiSelectedCount == 0 # Be efficient, this is called a lot on 'click'
 			@forEachEntity (entity) ->
 			@forEachEntity (entity) ->
 				entity.multiSelected = false
 				entity.multiSelected = false
 			@$scope.multiSelectedCount = 0
 			@$scope.multiSelectedCount = 0
-		
+
 		multiSelectSelectedEntity: () ->
 		multiSelectSelectedEntity: () ->
 			@findSelectedEntity()?.multiSelected = true
 			@findSelectedEntity()?.multiSelected = true
 
 
@@ -140,7 +140,7 @@ define [
 			return false if !folder?
 			return false if !folder?
 			entity = @_findEntityByPathInFolder(folder, name)
 			entity = @_findEntityByPathInFolder(folder, name)
 			return entity?
 			return entity?
-			
+
 		findSelectedEntity: () ->
 		findSelectedEntity: () ->
 			selected = null
 			selected = null
 			@forEachEntity (entity) ->
 			@forEachEntity (entity) ->
@@ -178,7 +178,7 @@ define [
 			parts = path.split("/")
 			parts = path.split("/")
 			name = parts.shift()
 			name = parts.shift()
 			rest = parts.join("/")
 			rest = parts.join("/")
-			
+
 			if name == "."
 			if name == "."
 				return @_findEntityByPathInFolder(folder, rest)
 				return @_findEntityByPathInFolder(folder, rest)
 
 
@@ -268,7 +268,7 @@ define [
 					type: "doc"
 					type: "doc"
 					deleted: true
 					deleted: true
 				}
 				}
-				
+
 		recalculateDocList: () ->
 		recalculateDocList: () ->
 			@$scope.docs = []
 			@$scope.docs = []
 			@forEachEntity (entity, parentFolder, path) =>
 			@forEachEntity (entity, parentFolder, path) =>
@@ -287,7 +287,7 @@ define [
 					return -1
 					return -1
 				else
 				else
 					return 1
 					return 1
-			
+
 		getEntityPath: (entity) ->
 		getEntityPath: (entity) ->
 			@_getEntityPathInFolder @$scope.rootFolder, entity
 			@_getEntityPathInFolder @$scope.rootFolder, entity
 
 
@@ -349,7 +349,7 @@ define [
 			}
 			}
 
 
 		deleteEntity: (entity, callback = (error) ->) ->
 		deleteEntity: (entity, callback = (error) ->) ->
-			# We'll wait for the socket.io notification to 
+			# We'll wait for the socket.io notification to
 			# delete from scope.
 			# delete from scope.
 			return @ide.queuedHttp {
 			return @ide.queuedHttp {
 				method: "DELETE"
 				method: "DELETE"
@@ -367,7 +367,7 @@ define [
 				folder_id: parent_folder.id
 				folder_id: parent_folder.id
 				_csrf: window.csrfToken
 				_csrf: window.csrfToken
 			}
 			}
-			
+
 		_isChildFolder: (parent_folder, child_folder) ->
 		_isChildFolder: (parent_folder, child_folder) ->
 			parent_path = @getEntityPath(parent_folder) or "" # null if root folder
 			parent_path = @getEntityPath(parent_folder) or "" # null if root folder
 			child_path = @getEntityPath(child_folder) or "" # null if root folder
 			child_path = @getEntityPath(child_folder) or "" # null if root folder

+ 17 - 0
services/web/public/coffee/ide/files/services/files.coffee

@@ -0,0 +1,17 @@
+define [
+	"base"
+], (App) ->
+
+	App.factory 'files', (ide) ->
+
+		Files =
+			getTeXFiles: () ->
+				texFiles = []
+				ide.fileTreeManager.forEachEntity (entity, folder, path) ->
+					if entity.type == 'doc' && entity?.name?.match?(/.*\.(tex|txt|md)/)
+						cloned = _.clone(entity)
+						cloned.path = path
+						texFiles.push cloned
+				return texFiles
+
+		return Files