commands.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. # coding:utf-8
  2. import urllib
  3. import settings as USettings
  4. class UEditorEventHandler(object):
  5. """用来处理UEditor的事件侦听"""
  6. def on_selectionchange(self):
  7. return ""
  8. def on_contentchange(self):
  9. return ""
  10. def render(self,editorID):
  11. jscode="""
  12. %(editor)s.addListener('%(event)s', function () {
  13. %(event_code)s
  14. });"""
  15. event_codes=[]
  16. #列出所有on_打头的方法,然后在ueditor中进行侦听
  17. events=filter(lambda x: x[0:3]=="on_", dir(self))
  18. for event in events:
  19. try:
  20. event_code=getattr(self,event)()
  21. if event_code:
  22. event_code=event_code % {"editor":editorID}
  23. event_codes.append(jscode % {"editor":editorID,"event":event[3:],"event_code":event_code})
  24. except:
  25. pass
  26. if len(event_codes)==0:
  27. return ""
  28. else:
  29. return "\n".join(event_codes)
  30. class UEditorCommand(object):
  31. """
  32. 为前端增加按钮,下拉等扩展,
  33. """
  34. def __init__(self,**kwargs):
  35. self.uiName=kwargs.pop("uiName","")
  36. self.index=kwargs.pop("index",0)
  37. self.title=kwargs.pop("title",self.uiName)
  38. self.ajax_url=kwargs.pop("ajax_url","")
  39. def render_ui(self,editor):
  40. """" 创建ueditor的ui扩展对象的js代码,如button,combo等 """
  41. raise NotImplementedError
  42. def render_queryvalue_command(self):
  43. """"生成通过ajax调用后端命令的前端ajax代码"""
  44. return ""
  45. def render_ajax_command(self):
  46. """"生成通过ajax调用后端命令的前端ajax代码"""
  47. if not self.ajax_url: return ""
  48. return u"""
  49. UE.ajax.request( '%(ajax_url)s', {
  50. data: {
  51. name: 'ueditor'
  52. },
  53. onsuccess: function ( xhr ) {%(ajax_success)s},
  54. onerror: function ( xhr ){ %(ajax_error)s }
  55. });
  56. """ % {
  57. "ajax_url":self.ajax_url,
  58. "ajax_success":self.onExecuteAjaxCommand("success"),
  59. "ajax_error":self.onExecuteAjaxCommand("error")
  60. }
  61. def render_command(self):
  62. """" 返回注册命令的js定义 """
  63. cmd=self.onExecuteCommand()
  64. ajax_cmd=self.render_ajax_command()
  65. queryvalue_command=self.render_queryvalue_command()
  66. cmds=[]
  67. if cmd or ajax_cmd:
  68. cmds.append( u"""execCommand: function() {
  69. %(exec_cmd)s
  70. %(exec_ajax_cmd)s
  71. }
  72. """ % {"exec_cmd":cmd,"exec_ajax_cmd":ajax_cmd},)
  73. if queryvalue_command:
  74. cmds.append(u"""queryCommandValue:function(){
  75. %s
  76. }""" % queryvalue_command)
  77. if len(cmds)>0:
  78. return u"""
  79. editor.registerCommand(uiName, {
  80. %s
  81. });
  82. """ % ",".join(cmds)
  83. else:
  84. return ""
  85. def render(self,editorID):
  86. return u"""
  87. UE.registerUI("%(uiName)s", function(editor, uiName) {
  88. %(registerCommand)s
  89. %(uiObject)s
  90. },%(index)s,"%(editor)s");
  91. """ % {
  92. "registerCommand":self.render_command(),
  93. "uiName":self.uiName,
  94. "uiObject":self.render_ui(editorID),
  95. "index":self.index,
  96. "editor":editorID
  97. }
  98. def onExecuteCommand(self):
  99. """ 返回执行Command时的js代码 """
  100. return ""
  101. def onExecuteAjaxCommand(self,state):
  102. """ 返回执行Command时发起Ajax调用成功与失败的js代码 """
  103. return ""
  104. def onQueryCommandValue(selfself):
  105. return ""
  106. class UEditorButtonCommand(UEditorCommand):
  107. def __init__(self,**kwargs):
  108. self.icon = kwargs.pop("icon", "")
  109. super(UEditorButtonCommand, self).__init__(**kwargs)
  110. def onClick(self):
  111. """"按钮单击js代码,默认执行uiName命令,默认会调用Command """
  112. return """
  113. editor.execCommand(uiName);
  114. """
  115. def render_ui(self,editorID):
  116. """ 创建button的js代码: """
  117. return """
  118. var btn = new UE.ui.Button({
  119. name: uiName,
  120. title: "%(title)s",
  121. cssRules: "background-image:url('%(icon)s')!important;",
  122. onclick: function() {
  123. %(onclick)s
  124. }
  125. });
  126. return btn
  127. """ % {
  128. "icon": urllib.basejoin(USettings.gSettings.MEDIA_URL , self.icon),
  129. "onclick": self.onClick(),
  130. "title": self.title
  131. }
  132. class UEditorComboCommand(UEditorCommand):
  133. def __init__(self,**kwargs):
  134. self.items = kwargs.pop("items", [])
  135. self.initValue=kwargs.pop("initValue","")
  136. super(UEditorComboCommand, self).__init__(**kwargs)
  137. def get_items(self):
  138. return self.items
  139. def onSelect(self):
  140. return ""
  141. def render_ui(self,editorID):
  142. """ 创建combo的js代码: """
  143. return """
  144. var combox = new UE.ui.Combox({
  145. editor:editor,
  146. items:%(items)s,
  147. onselect:function (t, index) {
  148. %(onselect)s
  149. },
  150. title:'%(title)s',
  151. initValue:'%(initValue)s'
  152. });
  153. return combox;
  154. """ % {
  155. "title":self.title,
  156. "items":str(self.get_items()),
  157. "onselect": self.onSelect(),
  158. "initValue":self.initValue
  159. }
  160. class UEditorDialogCommand(UEditorCommand):
  161. pass