PKV4=&|mmHyperlinking.package-menu PKV4=Q)Hypergrammar.pyimport os class GrammarGenerator: """generates a grammar for a view""" def __init__(self, folderPath): self.folderPath = os.path.abspath(folderPath) self.head = """ uuid F15EC19A-970E-4a82-B3AD-C6F8B6DF9F09 patterns """ self.foot = """ name Custom grammar for ${wikiname} scopeName string fileTypes .wiki """ self.template = """ match\\b${name}\\b namemarkup.italic """ def syntaxFile(self): return os.path.join(self.folderPath, "syntax-highlighting.tmLanguage") def run(self): if os.path.exists(self.folderPath) == False: print "Folder '%s' does not exist" % self.folderPath return None wikiName = os.path.split(self.folderPath)[1] content = self.head files = [f for f in os.listdir(self.folderPath) if f.endswith(".wiki")] names = [os.path.splitext(n)[0] for n in files] for name in names: content = content + self.template.replace("${name}", name) content = content + self.foot.replace("${wikiname}", wikiName) syntaxFile = self.syntaxFile() f = open(syntaxFile, 'w') f.write(content) f.close() return syntaxFile if __name__ == "__main__": gen = GrammarGenerator("C:\\usr\\projects\\fiction-modus-operandi") syntaxFile = gen.run() print syntaxFilePKV4=\ Default.sublime-keymap PKV4=;iHyperlinking.py#HYPERLINKING # # A Plugin for Sublime Text, By Steve Cooper # # see README.txt for usage instructions. import sublime, sublimeplugin, re, os, Hypergrammar class NavigateBase(sublimeplugin.TextCommand): def ensureFile(self, fileName): if os.path.exists(fileName) == False: print "creating %s" % fileName f = open(fileName, 'w') f.write("") f.close() def run(self, view, args): print "base class!" class NavigateToWikiIndexPageCommand(NavigateBase): """This command creates a new view containing all the files which can be visited from the currently-visible wiki file """ def run(self, view, args): dirName = os.path.dirname(view.fileName()) indexFileName = os.path.join(dirName, "IndexPage.wiki") self.ensureFile(indexFileName) allFiles = os.listdir(dirName) wikiFiles = [ "[%s]" % f[:-5] for f in allFiles if os.path.isfile(f) and f.lower().endswith(".wiki")] wikiFiles.sort() bufferContent = "FILES IN " + dirName + "\r\n\r\n" + "\r\n".join( wikiFiles ) newView = view.window().openFile(indexFileName) # openFile() is asynchronous, so it returns None. Therefore we can't insertfil #newView.insert(0, bufferContent) def isEnabled(self, view, args): return view.fileName() class NavigateToWikiPageCommand(NavigateBase): """This command takes the user to a wiki page under the cursor. Eg, if the cursor is in NewPa|geToNavigateTo, and the user executes the command, NewPageToNavigateTo.wiki in the same folder will be opened """ # OLD FORM # matches, eg, ExampleWikiFile, MissingFile #wikiWordPattern = r"^([A-Z][a-z0-9]+){2,}" # NEW FORM # matches any word wikiWordPattern = r"^\w+\b" # what extension do wiki pages have? wikiFileExtension = "wiki" def run(self, view, args): # get the wikiname under the cursor. for s in view.sel(): # try to find a phrase in square brackets name = self.phraseInSquareBrackets(view, s) if name == None: # nothing in square brackets -- try a word name = self.wordUnderCursor(view, s) if name == None: # total failure! sublime.statusMessage("No suitable hyperlink found. Try square brackets around the text.") return candidateFileName = os.path.split(view.fileName())[0] + "\\" + name + "." + self.wikiFileExtension print candidateFileName if (os.access(candidateFileName, os.R_OK)): sublime.statusMessage("Opening page: %s" % candidateFileName) view.window().openFile(candidateFileName) else: if sublime.questionBox("Do you want to create %s" % candidateFileName): self.ensureFile(candidateFileName) sublime.statusMessage("No page at %s: starting new file" % candidateFileName) view.window().openFile(candidateFileName) def phraseInSquareBrackets(self, view, s): start = self.findStartSquareBracket(view, s) end = self.findEndSquareBracket(view, s) if end > 0: return view.substr(sublime.Region(start, end)) def wordUnderCursor(self, view, s): wb = self.findWordBoundary(view, s) # see if what follows the word boundary is a wikiword word = self.getWordAtPoint(view, wb) return word def findEndSquareBracket(self, view, s): pos = s.begin() while True: if (pos == view.size()): return 0 # no end sq charAfterPoint = view.substr(sublime.Region(pos, pos+1)) if charAfterPoint == "]": return pos if charAfterPoint == "[": return 0 pos = pos + 1 def findStartSquareBracket(self, view, s): pos = s.begin() while True: if (pos == 0): return 0 #search for open square bracket before cursor charBeforePoint = view.substr(sublime.Region(pos-1, pos)) if charBeforePoint == "[": return pos if charBeforePoint == "]": return 0 pos = pos - 1 def findWordBoundary(self, view, s): pos = s.begin() wbRx = re.compile(r"[^\w]\w") while True: if (pos == 0): return 0 #search for not-word, word around cursor twoCharsAroundPoint= view.substr(sublime.Region(pos-1, pos+1)) match = wbRx.match(twoCharsAroundPoint) if match: return pos pos = pos - 1 def getWordAtPoint(self, view, p): wikiWordRx = re.compile(self.wikiWordPattern) stringToSearch = view.substr(sublime.Region(p, p+128)) match = wikiWordRx.match(stringToSearch) if (match): return match.group(0) return None # class RefreshSyntaxHighlightingCommand(sublimeplugin.TextCommand): # def run(self, view, args): # print view.syntaxName(view.sel()[0].begin()) # print view.fileName() # folder = os.path.split(view.fileName())[0] # if os.path.exists(folder) == False: # print "no folder" # return # grammarGenerator = Hypergrammar.GrammarGenerator(folder) # syntaxFile = grammarGenerator.run() # view.options().set('syntax', syntaxFile) # print "set syntax file to %s" % syntaxFile PKV4=p README.txtBringing hyperlinking to text file navigation... This plugin provides a simple hyperlinking facility, which allows you to create very lightweight, text-file-based wikis. # Getting Started Here's how you use it; create a folder and add at least one file with a ".wiki" extension. say; \world_of_fruit \fruit.wiki Now edit fruit.wiki: The apple is a fine fruit. So is the orange. Put your cursor somewhere inside the word 'apple', like this; The ap|ple is a fine fruit. So is the orange. Hit ctrl+alt+n (navigate). You'll be prompted to see if you want to create a new file, apple.wiki. If you say yes, apple.wiki is created and you can start editing it straight away. Easy! # Longer Links If you want to create a file with a longer name, you can enclose it in square brackets; Have you ever wondered about the [nutritional values of kiwis]? Then you can use the same navigation keypress (ctrl+alt+n) to visit 'nutritional values of kiwis.wiki' PKV4=&|mmHyperlinking.package-menuPKV4=Q)Hypergrammar.pyPKV4=\ {Default.sublime-keymapPKV4=;iE Hyperlinking.pyPKV4=p README.txtPK=*"