本文整理汇总了Python中tweelexer.TweeLexer类的典型用法代码示例。如果您正苦于以下问题:Python TweeLexer类的具体用法?Python TweeLexer怎么用?Python TweeLexer使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了TweeLexer类的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Python代码示例。
示例1: offerAssistance
def offerAssistance(self):
"""
Offer to fulfill certain incomplete tasks evident from the state of the passage text.
(Technically, none of this needs to be on passageFrame instead of passageWidget.)
"""
# Offer to create passage for broken links
if self.app.config.ReadBool('createPassagePrompt'):
brokens = links = filter(lambda text: TweeLexer.linkStyle(text) == TweeLexer.BAD_LINK, self.widget.getBrokenLinks())
if brokens :
if len(brokens) > 1:
brokenmsg = 'create ' + str(len(brokens)) + ' new passages to match these broken links?'
else:
brokenmsg = 'create the passage "' + brokens[0] + '"?'
dialog = wx.MessageDialog(self, 'Do you want to ' + brokenmsg, 'Create Passages', \
wx.ICON_QUESTION | wx.YES_NO | wx.CANCEL | wx.YES_DEFAULT)
check = dialog.ShowModal()
if check == wx.ID_YES:
for title in brokens:
self.widget.parent.newWidget(title = title, pos = self.widget.parent.toPixels (self.widget.pos))
elif check == wx.ID_CANCEL:
return
# Offer to import external images
if self.app.config.ReadBool('importImagePrompt'):
regex = tweeregex.EXTERNAL_IMAGE_REGEX
externalimages = re.finditer(regex, self.widget.passage.text)
check = None
downloadedurls = {}
storyframe = self.widget.parent.parent
for img in externalimages:
if not check:
dialog = wx.MessageDialog(self, 'Do you want to import the image files linked\nin this passage into the story file?', 'Import Images', \
wx.ICON_QUESTION | wx.YES_NO | wx.CANCEL | wx.YES_DEFAULT);
check = dialog.ShowModal()
if check == wx.ID_NO:
break
elif check == wx.ID_CANCEL:
return
# Download the image if it's at an absolute URL
imgurl = img.group(4) or img.group(7)
if not imgurl:
continue
# If we've downloaded it before, don't do it again
if imgurl not in downloadedurls:
# Internet image, or local image?
if any(imgurl.startswith(t) for t in ['http://', 'https://', 'ftp://']):
imgpassagename = storyframe.importImageURL(imgurl, showdialog=False)
else:
imgpassagename = storyframe.importImageFile(storyframe.getLocalDir()+os.sep+imgurl, showdialog=False)
if not imgpassagename:
continue
downloadedurls[imgurl] = imgpassagename
# Replace all found images
for old, new in downloadedurls.iteritems():
self.widget.passage.text = re.sub(regex.replace(tweeregex.IMAGE_FILENAME_REGEX, re.escape(old)),
lambda m: m.group(0).replace(old, new), self.widget.passage.text)
self.bodyInput.SetText(self.widget.passage.text)
开发者ID:fourks,项目名称:twine,代码行数:60,代码来源:passageframe.py
示例2: updateSubmenus
def updateSubmenus(self, event=None):
"""
Updates our passage menus. This should be called sparingly, i.e. not during
a UI update event, as it is doing a bunch of removing and adding of items.
"""
# separate outgoing and broken links
outgoing = []
incoming = []
broken = []
# Remove externals
links = filter(lambda text: TweeLexer.linkStyle(text) == TweeLexer.BAD_LINK, self.widget.passage.links)
for link in links:
if len(link) > 0:
if link in self.widget.parent.widgetDict:
outgoing.append(link)
elif not self.widget.parent.includedPassageExists(link):
broken.append(link)
# incoming links
for widget in self.widget.parent.widgetDict.itervalues():
if self.widget.passage.title in widget.passage.links and len(widget.passage.title) > 0:
incoming.append(widget.passage.title)
# repopulate the menus
def populate(menu, links):
for item in menu.GetMenuItems():
menu.DeleteItem(item)
if len(links):
for link in links:
item = menu.Append(-1, link)
self.Bind(wx.EVT_MENU, self.openOtherEditor, item)
else:
item = menu.Append(wx.ID_ANY, "(None)")
item.Enable(False)
outTitle = "Outgoing Links"
if len(outgoing) > 0:
outTitle += " (" + str(len(outgoing)) + ")"
self.outLinksMenuTitle.SetText(outTitle)
populate(self.outLinksMenu, outgoing)
inTitle = "Incoming Links"
if len(incoming) > 0:
inTitle += " (" + str(len(incoming)) + ")"
self.inLinksMenuTitle.SetText(inTitle)
populate(self.inLinksMenu, incoming)
brokenTitle = "Broken Links"
if len(broken) > 0:
brokenTitle += " (" + str(len(broken)) + ")"
self.brokenLinksMenuTitle.SetText(brokenTitle)
populate(self.brokenLinksMenu, broken)
开发者ID:jju,项目名称:twine,代码行数:59,代码来源:passageframe.py
示例3: update
def update(self):
"""
Update the lists of all passages linked/displayed by this one.
Returns internal links and <<choice>>/<<actions>> macros.
"""
if not self.isStoryText() and not self.isAnnotation() and not self.isStylesheet():
self.displays = []
self.links = []
self.images = []
self.macros = []
return
# <<display>>
self.displays = list(set(re.findall(r'\<\<display\s+[\'"]?(.+?)[\'"]?\s?\>\>', self.text, re.IGNORECASE)))
macros = set()
# other macros (including shorthand <<display>>)
for m in re.finditer(tweeregex.MACRO_REGEX, self.text):
# Exclude shorthand <<print>>
if m.group(1) and m.group(1)[0] != '$':
macros.add(m.group(1))
self.macros = list(macros)
# avoid duplicates by collecting links in a set
links = set()
# Regular hyperlinks (also matches wiki-style links inside macros)
for m in re.finditer(tweeregex.LINK_REGEX, self.text):
# Exclude external links
link = m.group(2) or m.group(1)
if TweeLexer.linkStyle(link) != TweeLexer.EXTERNAL:
links.add(m.group(2) or m.group(1))
# Include images
for m in re.finditer(tweeregex.IMAGE_REGEX, self.text):
if m.group(5):
links.add(m.group(5))
# <<choice passage_name [link_text]>>
for block in re.findall(r'\<\<choice\s+(.*?)\s?\>\>', self.text):
item = re.match(r'(?:"([^"]*)")|(?:\'([^\']*)\')|([^"\'\[\s]\S*)', block)
if item:
links.add(''.join(item.groups('')))
# <<actions '' ''>>
for block in re.findall(r'\<\<actions\s+(.*?)\s?\>\>', self.text):
links.update(re.findall(r'[\'"](.*?)[\'"]', block))
self.links = list(links)
# Images
images = set()
for block in re.finditer(tweeregex.IMAGE_REGEX, self.text):
images.add(block.group(4))
self.images = list(images)
开发者ID:fourks,项目名称:twine,代码行数:57,代码来源:tiddlywiki.py
示例4: update
def update(self):
"""
Update the lists of all passages linked/displayed by this one.
Returns internal links and <<choice>>/<<actions>> macros.
"""
if not self.isStoryText() and not self.isAnnotation() and not self.isStylesheet():
self.displays = []
self.links = []
self.images = []
self.macros = []
return
images = set()
macros = set()
links = set()
# <<display>>
self.displays = list(set(re.findall(r'\<\<display\s+[\'"]?(.+?)[\'"]?\s?\>\>', self.text, re.IGNORECASE)))
macros = set()
# other macros (including shorthand <<display>>)
for m in re.finditer(tweeregex.MACRO_REGEX, self.text):
# Exclude shorthand <<print>>
if m.group(1) and m.group(1)[0] != '$':
macros.add(m.group(1))
self.macros = list(macros)
# Regular hyperlinks (also matches wiki-style links inside macros)
for m in re.finditer(tweeregex.LINK_REGEX, self.text):
# Exclude external links
link = m.group(2) or m.group(1)
if TweeLexer.linkStyle(link) != TweeLexer.EXTERNAL:
links.add(m.group(2) or m.group(1))
# Include images
for m in re.finditer(tweeregex.IMAGE_REGEX, self.text):
if m.group(5):
links.add(m.group(5))
# HTML data-passage links
for m in re.finditer(tweeregex.HTML_REGEX, self.text):
attrs = m.group(2)
if attrs:
dataPassage = re.search(r"""data-passage\s*=\s*(?:([^<>'"=`\s]+)|'((?:[^'\\]*\\.)*[^'\\]*)'|"((?:[^"\\]*\\.)*[^"\\]*)")""", attrs)
if dataPassage:
theSet = images if m.group(1) == "img" else links
theSet.add(dataPassage.group(1) or dataPassage.group(2) or dataPassage.group(3))
# <<choice passage_name [link_text]>>
for block in re.findall(r'\<\<choice\s+(.*?)\s?\>\>', self.text):
item = re.match(r'(?:"([^"]*)")|(?:\'([^\']*)\')|([^"\'\[\s]\S*)', block)
if item:
links.add(''.join(item.groups('')))
# <<actions '' ''>>
for block in re.findall(r'\<\<actions\s+(.*?)\s?\>\>', self.text):
links.update(re.findall(r'[\'"](.*?)[\'"]', block))
self.links = list(links)
# Images
for block in re.finditer(tweeregex.IMAGE_REGEX, self.text):
images.add(block.group(4))
self.images = list(images)
开发者ID:patrickklug,项目名称:twine,代码行数:66,代码来源:tiddlywiki.py
示例5: addLink
def addLink(link):
style = TweeLexer.linkStyle(link)
if style == TweeLexer.PARAM:
variableLinks.add(link)
elif style != TweeLexer.EXTERNAL:
links.add(link)
开发者ID:Adalbertson,项目名称:twine,代码行数:6,代码来源:tiddlywiki.py
示例6: __init__
#.........这里部分代码省略.........
editMenu.Append(wx.ID_REDO, '&Redo\tCtrl-Y')
self.Bind(wx.EVT_MENU, lambda e: self.bodyInput.Redo(), id = wx.ID_REDO)
editMenu.AppendSeparator()
editMenu.Append(wx.ID_CUT, 'Cu&t\tCtrl-X')
self.Bind(wx.EVT_MENU, lambda e: self.bodyInput.Cut(), id = wx.ID_CUT)
editMenu.Append(wx.ID_COPY, '&Copy\tCtrl-C')
self.Bind(wx.EVT_MENU, lambda e: self.bodyInput.Copy(), id = wx.ID_COPY)
editMenu.Append(wx.ID_PASTE, '&Paste\tCtrl-V')
self.Bind(wx.EVT_MENU, lambda e: self.bodyInput.Paste(), id = wx.ID_PASTE)
editMenu.Append(wx.ID_SELECTALL, 'Select &All\tCtrl-A')
self.Bind(wx.EVT_MENU, lambda e: self.bodyInput.SelectAll(), id = wx.ID_SELECTALL)
editMenu.AppendSeparator()
editMenu.Append(wx.ID_FIND, '&Find...\tCtrl-F')
self.Bind(wx.EVT_MENU, lambda e: self.showSearchFrame(PassageSearchFrame.FIND_TAB), id = wx.ID_FIND)
editMenu.Append(PassageFrame.EDIT_FIND_NEXT, 'Find &Next\tCtrl-G')
self.Bind(wx.EVT_MENU, self.findNextRegexp, id = PassageFrame.EDIT_FIND_NEXT)
if sys.platform == 'darwin':
shortcut = 'Ctrl-Shift-H'
else:
shortcut = 'Ctrl-H'
editMenu.Append(wx.ID_REPLACE, '&Replace...\t' + shortcut)
self.Bind(wx.EVT_MENU, lambda e: self.showSearchFrame(PassageSearchFrame.REPLACE_TAB), id = wx.ID_REPLACE)
# menus
self.menus = wx.MenuBar()
self.menus.Append(passageMenu, '&Passage')
self.menus.Append(editMenu, '&Edit')
self.SetMenuBar(self.menus)
# controls
self.panel = wx.Panel(self)
allSizer = wx.BoxSizer(wx.VERTICAL)
self.panel.SetSizer(allSizer)
# title/tag controls
self.topControls = wx.Panel(self.panel)
topSizer = wx.FlexGridSizer(3, 2, metrics.size('relatedControls'), metrics.size('relatedControls'))
titleLabel = wx.StaticText(self.topControls, style = wx.ALIGN_RIGHT, label = PassageFrame.TITLE_LABEL)
self.titleInput = wx.TextCtrl(self.topControls)
tagsLabel = wx.StaticText(self.topControls, style = wx.ALIGN_RIGHT, label = PassageFrame.TAGS_LABEL)
self.tagsInput = wx.TextCtrl(self.topControls)
topSizer.Add(titleLabel, 0, flag = wx.ALL, border = metrics.size('focusRing'))
topSizer.Add(self.titleInput, 1, flag = wx.EXPAND | wx.ALL, border = metrics.size('focusRing'))
topSizer.Add(tagsLabel, 0, flag = wx.ALL, border = metrics.size('focusRing'))
topSizer.Add(self.tagsInput, 1, flag = wx.EXPAND | wx.ALL, border = metrics.size('focusRing'))
topSizer.AddGrowableCol(1, 1)
self.topControls.SetSizer(topSizer)
# body text
self.bodyInput = wx.stc.StyledTextCtrl(self.panel, style = wx.TE_PROCESS_TAB | wx.BORDER_SUNKEN)
self.bodyInput.SetUseHorizontalScrollBar(False)
self.bodyInput.SetMargins(8, 8)
self.bodyInput.SetMarginWidth(1, 0)
self.bodyInput.SetWrapMode(wx.stc.STC_WRAP_WORD)
self.bodyInput.SetSelBackground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHT))
self.bodyInput.SetSelForeground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT))
# final layout
allSizer.Add(self.topControls, flag = wx.TOP | wx.LEFT | wx.RIGHT | wx.EXPAND, border = metrics.size('windowBorder'))
allSizer.Add(self.bodyInput, proportion = 1, flag = wx.TOP | wx.EXPAND, border = metrics.size('relatedControls'))
self.lexer = TweeLexer(self.bodyInput, self)
self.applyPrefs()
self.syncInputs()
self.bodyInput.EmptyUndoBuffer()
self.updateSubmenus()
self.setLexer()
# event bindings
# we need to do this AFTER setting up initial values
self.titleInput.Bind(wx.EVT_TEXT, self.syncPassage)
self.tagsInput.Bind(wx.EVT_TEXT, self.syncPassage)
self.bodyInput.Bind(wx.stc.EVT_STC_CHANGE, self.syncPassage)
self.bodyInput.Bind(wx.stc.EVT_STC_START_DRAG, self.prepDrag)
self.Bind(wx.EVT_CLOSE, self.closeFullscreen)
self.Bind(wx.EVT_MENU_OPEN, self.updateSubmenus)
self.Bind(wx.EVT_UPDATE_UI, self.updateUI)
if not re.match('Untitled Passage \d+', self.widget.passage.title):
self.bodyInput.SetFocus()
self.bodyInput.SetSelection(-1, -1)
self.SetIcon(self.app.icon)
self.Show(True)
开发者ID:factorypreset,项目名称:twee,代码行数:101,代码来源:passageframe.py
示例7: PassageFrame
#.........这里部分代码省略.........
allSizer = wx.BoxSizer(wx.VERTICAL)
self.panel.SetSizer(allSizer)
# title/tag controls
self.topControls = wx.Panel(self.panel)
topSizer = wx.FlexGridSizer(3, 2, metrics.size('relatedControls'), metrics.size('relatedControls'))
titleLabel = wx.StaticText(self.topControls, style = wx.ALIGN_RIGHT, label = PassageFrame.TITLE_LABEL)
self.titleInput = wx.TextCtrl(self.topControls)
tagsLabel = wx.StaticText(self.topControls, style = wx.ALIGN_RIGHT, label = PassageFrame.TAGS_LABEL)
self.tagsInput = wx.TextCtrl(self.topControls)
topSizer.Add(titleLabel, 0, flag = wx.ALL, border = metrics.size('focusRing'))
topSizer.Add(self.titleInput, 1, flag = wx.EXPAND | wx.ALL, border = metrics.size('focusRing'))
topSizer.Add(tagsLabel, 0, flag = wx.ALL, border = metrics.size('focusRing'))
topSizer.Add(self.tagsInput, 1, flag = wx.EXPAND | wx.ALL, border = metrics.size('focusRing'))
topSizer.AddGrowableCol(1, 1)
self.topControls.SetSizer(topSizer)
# body text
self.bodyInput = wx.stc.StyledTextCtrl(self.panel, style = wx.TE_PROCESS_TAB | wx.BORDER_SUNKEN)
self.bodyInput.SetUseHorizontalScrollBar(False)
self.bodyInput.SetMargins(8, 8)
self.bodyInput.SetMarginWidth(1, 0)
self.bodyInput.SetWrapMode(wx.stc.STC_WRAP_WORD)
self.bodyInput.SetSelBackground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHT))
self.bodyInput.SetSelForeground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT))
# final layout
allSizer.Add(self.topControls, flag = wx.TOP | wx.LEFT | wx.RIGHT | wx.EXPAND, border = metrics.size('windowBorder'))
allSizer.Add(self.bodyInput, proportion = 1, flag = wx.TOP | wx.EXPAND, border = metrics.size('relatedControls'))
self.lexer = TweeLexer(self.bodyInput, self)
self.applyPrefs()
self.syncInputs()
self.bodyInput.EmptyUndoBuffer()
self.updateSubmenus()
self.setLexer()
# event bindings
# we need to do this AFTER setting up initial values
self.titleInput.Bind(wx.EVT_TEXT, self.syncPassage)
self.tagsInput.Bind(wx.EVT_TEXT, self.syncPassage)
self.bodyInput.Bind(wx.stc.EVT_STC_CHANGE, self.syncPassage)
self.bodyInput.Bind(wx.stc.EVT_STC_START_DRAG, self.prepDrag)
self.Bind(wx.EVT_CLOSE, self.closeFullscreen)
self.Bind(wx.EVT_MENU_OPEN, self.updateSubmenus)
self.Bind(wx.EVT_UPDATE_UI, self.updateUI)
if not re.match('Untitled Passage \d+', self.widget.passage.title):
self.bodyInput.SetFocus()
self.bodyInput.SetSelection(-1, -1)
self.SetIcon(self.app.icon)
self.Show(True)
def syncInputs (self):
"""Updates the inputs based on the passage's state."""
self.titleInput.SetValue(self.widget.passage.title)
self.bodyInput.SetText(self.widget.passage.text)
tags = ''
for tag in self.widget.passage.tags:
开发者ID:factorypreset,项目名称:twee,代码行数:67,代码来源:passageframe.py
示例8: PassageFrame
#.........这里部分代码省略.........
self.bodyInput = wx.stc.StyledTextCtrl(self.panel, style = wx.TE_PROCESS_TAB | wx.BORDER_SUNKEN)
self.bodyInput.SetUseHorizontalScrollBar(False)
self.bodyInput.SetMargins(8, 8)
self.bodyInput.SetMarginWidth(1, 0)
self.bodyInput.SetWrapMode(wx.stc.STC_WRAP_WORD)
self.bodyInput.SetSelBackground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHT))
self.bodyInput.SetSelForeground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT))
# The default keyboard shortcuts for StyledTextCtrl are
# nonstandard on Mac OS X
if sys.platform == "darwin":
# cmd-left/right to move to beginning/end of line
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_LEFT, wx.stc.STC_SCMOD_CTRL, wx.stc.STC_CMD_HOMEDISPLAY)
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_LEFT, wx.stc.STC_SCMOD_CTRL | wx.stc.STC_SCMOD_SHIFT, wx.stc.STC_CMD_HOMEDISPLAYEXTEND)
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_RIGHT, wx.stc.STC_SCMOD_CTRL, wx.stc.STC_CMD_LINEENDDISPLAY)
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_RIGHT, wx.stc.STC_SCMOD_CTRL | wx.stc.STC_SCMOD_SHIFT, wx.stc.STC_CMD_LINEENDDISPLAYEXTEND)
# opt-left/right to move forward/back a word
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_LEFT, wx.stc.STC_SCMOD_ALT, wx.stc.STC_CMD_WORDLEFT)
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_LEFT, wx.stc.STC_SCMOD_ALT | wx.stc.STC_SCMOD_SHIFT, wx.stc.STC_CMD_WORDLEFTEXTEND)
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_RIGHT, wx.stc.STC_SCMOD_ALT, wx.stc.STC_CMD_WORDRIGHT)
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_RIGHT, wx.stc.STC_SCMOD_ALT | wx.stc.STC_SCMOD_SHIFT, wx.stc.STC_CMD_WORDRIGHTEXTEND)
# cmd-delete to delete from the cursor to beginning of line
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_BACK, wx.stc.STC_SCMOD_CTRL, wx.stc.STC_CMD_DELLINELEFT)
# opt-delete to delete the previous/current word
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_BACK, wx.stc.STC_SCMOD_ALT, wx.stc.STC_CMD_DELWORDLEFT)
# cmd-shift-z to redo
self.bodyInput.CmdKeyAssign(ord('Z'), wx.stc.STC_SCMOD_CTRL | wx.stc.STC_SCMOD_SHIFT, wx.stc.STC_CMD_REDO)
# final layout
allSizer.Add(self.topControls, flag = wx.TOP | wx.LEFT | wx.RIGHT | wx.EXPAND, border = metrics.size('windowBorder'))
allSizer.Add(self.bodyInput, proportion = 1, flag = wx.TOP | wx.EXPAND, border = metrics.size('relatedControls'))
self.lexer = TweeLexer(self.bodyInput, self)
self.applyPrefs()
self.syncInputs()
self.bodyInput.EmptyUndoBuffer()
self.updateSubmenus()
self.setLexer()
# event bindings
# we need to do this AFTER setting up initial values
self.titleInput.Bind(wx.EVT_TEXT, self.syncPassage)
self.tagsInput.Bind(wx.EVT_TEXT, self.syncPassage)
self.bodyInput.Bind(wx.stc.EVT_STC_CHANGE, self.syncPassage)
self.bodyInput.Bind(wx.stc.EVT_STC_START_DRAG, self.prepDrag)
self.Bind(wx.EVT_CLOSE, self.closeFullscreen)
self.Bind(wx.EVT_MENU_OPEN, self.updateSubmenus)
self.Bind(wx.EVT_UPDATE_UI, self.updateUI)
if not re.match('Untitled Passage \d+', self.widget.passage.title):
self.bodyInput.SetFocus()
self.bodyInput.SetSelection(-1, -1)
# Hack to force titles (>18 char) to display correctly.
# NOTE: stops working if moved above bodyInput code.
self.titleInput.SetInsertionPoint(0)
self.SetIcon(self.app.icon)
self.Show(True)
def syncInputs(self):
"""Updates the inputs based on the passage's state."""
self.titleInput.SetValue(self.widget.passage.title)
self.bodyInput.SetText(self.widget.passage.text)
开发者ID:lagunazero,项目名称:twine,代码行数:67,代码来源:passageframe.py
示例9: __init__
#.........这里部分代码省略.........
self.Bind(wx.EVT_MENU, lambda e: wx.LaunchDefaultBrowser('http://twinery.org/wiki/syntax'), id = PassageFrame.HELP2)
helpMenu.Append(PassageFrame.HELP3, 'About Links')
self.Bind(wx.EVT_MENU, lambda e: wx.LaunchDefaultBrowser('http://twinery.org/wiki/link'), id = PassageFrame.HELP3)
helpMenu.Append(PassageFrame.HELP4, 'About Tags')
self.Bind(wx.EVT_MENU, lambda e: wx.LaunchDefaultBrowser('http://twinery.org/wiki/tag'), id = PassageFrame.HELP4)
# menus
self.menus = wx.MenuBar()
self.menus.Append(passageMenu, '&Passage')
self.menus.Append(editMenu, '&Edit')
self.menus.Append(helpMenu, '&Help')
self.SetMenuBar(self.menus)
# controls
self.panel = wx.Panel(self)
allSizer = wx.BoxSizer(wx.VERTICAL)
self.panel.SetSizer(allSizer)
# title/tag controls
self.topControls = wx.Panel(self.panel)
topSizer = wx.FlexGridSizer(3, 2, metrics.size('relatedControls'), metrics.size('relatedControls'))
self.titleLabel = wx.StaticText(self.topControls, style = wx.ALIGN_RIGHT, label = PassageFrame.TITLE_LABEL)
self.titleInput = wx.TextCtrl(self.topControls)
tagsLabel = wx.StaticText(self.topControls, style = wx.ALIGN_RIGHT, label = PassageFrame.TAGS_LABEL)
self.tagsInput = wx.TextCtrl(self.topControls)
topSizer.Add(self.titleLabel, 0, flag = wx.ALL, border = metrics.size('focusRing'))
topSizer.Add(self.titleInput, 1, flag = wx.EXPAND | wx.ALL, border = metrics.size('focusRing'))
topSizer.Add(tagsLabel, 0, flag = wx.ALL, border = metrics.size('focusRing'))
topSizer.Add(self.tagsInput, 1, flag = wx.EXPAND | wx.ALL, border = metrics.size('focusRing'))
topSizer.AddGrowableCol(1, 1)
self.topControls.SetSizer(topSizer)
# body text
self.bodyInput = wx.stc.StyledTextCtrl(self.panel, style = wx.TE_PROCESS_TAB | wx.BORDER_SUNKEN)
self.bodyInput.SetUseHorizontalScrollBar(False)
self.bodyInput.SetMargins(8, 8)
self.bodyInput.SetMarginWidth(1, 0)
self.bodyInput.SetWrapMode(wx.stc.STC_WRAP_WORD)
self.bodyInput.SetSelBackground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHT))
self.bodyInput.SetSelForeground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT))
# The default keyboard shortcuts for StyledTextCtrl are
# nonstandard on Mac OS X
if sys.platform == "darwin":
# cmd-left/right to move to beginning/end of line
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_LEFT, wx.stc.STC_SCMOD_CTRL, wx.stc.STC_CMD_HOMEDISPLAY)
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_LEFT, wx.stc.STC_SCMOD_CTRL | wx.stc.STC_SCMOD_SHIFT, wx.stc.STC_CMD_HOMEDISPLAYEXTEND)
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_RIGHT, wx.stc.STC_SCMOD_CTRL, wx.stc.STC_CMD_LINEENDDISPLAY)
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_RIGHT, wx.stc.STC_SCMOD_CTRL | wx.stc.STC_SCMOD_SHIFT, wx.stc.STC_CMD_LINEENDDISPLAYEXTEND)
# opt-left/right to move forward/back a word
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_LEFT, wx.stc.STC_SCMOD_ALT, wx.stc.STC_CMD_WORDLEFT)
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_LEFT, wx.stc.STC_SCMOD_ALT | wx.stc.STC_SCMOD_SHIFT, wx.stc.STC_CMD_WORDLEFTEXTEND)
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_RIGHT, wx.stc.STC_SCMOD_ALT, wx.stc.STC_CMD_WORDRIGHT)
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_RIGHT, wx.stc.STC_SCMOD_ALT | wx.stc.STC_SCMOD_SHIFT, wx.stc.STC_CMD_WORDRIGHTEXTEND)
# cmd-delete to delete from the cursor to beginning of line
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_BACK, wx.stc.STC_SCMOD_CTRL, wx.stc.STC_CMD_DELLINELEFT)
# opt-delete to delete the previous/current word
self.bodyInput.CmdKeyAssign(wx.stc.STC_KEY_BACK, wx.stc.STC_SCMOD_ALT, wx.stc.STC_CMD_DELWORDLEFT)
# cmd-shift-z to redo
self.bodyInput.CmdKeyAssign(ord('Z'), wx.stc.STC_SCMOD_CTRL | wx.stc.STC_SCMOD_SHIFT, wx.stc.STC_CMD_REDO)
# final layout
allSizer.Add(self.topControls, flag = wx.TOP | wx.LEFT | wx.RIGHT | wx.EXPAND, border = metrics.size('windowBorder'))
allSizer.Add(self.bodyInput, proportion = 1, flag = wx.TOP | wx.EXPAND, border = metrics.size('relatedControls'))
self.lexer = TweeLexer(self.bodyInput, self)
self.applyPrefs()
self.syncInputs()
self.bodyInput.EmptyUndoBuffer()
self.updateSubmenus()
self.setLexer()
# event bindings
# we need to do this AFTER setting up initial values
self.titleInput.Bind(wx.EVT_TEXT, self.syncPassage)
self.tagsInput.Bind(wx.EVT_TEXT, self.syncPassage)
self.bodyInput.Bind(wx.stc.EVT_STC_CHANGE, self.syncPassage)
self.bodyInput.Bind(wx.stc.EVT_STC_START_DRAG, self.prepDrag)
self.Bind(wx.EVT_CLOSE, self.closeFullscreen)
self.Bind(wx.EVT_MENU_OPEN, self.updateSubmenus)
self.Bind(wx.EVT_UPDATE_UI, self.updateUI)
if not re.match('Untitled Passage \d+', self.widget.passage.title):
self.bodyInput.SetFocus()
self.bodyInput.SetSelection(-1, -1)
# Hack to force titles (>18 char) to display correctly.
# NOTE: stops working if moved above bodyInput code.
self.titleInput.SetInsertionPoint(0)
self.SetIcon(self.app.icon)
self.Show(True)
开发者ID:lagunazero,项目名称:twine,代码行数:101,代码来源:passageframe.py
注:本文中的tweelexer.TweeLexer类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论