commands.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. # coding:utf-8
  2. import urllib
  3. import DjangoUeditor.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_ajax_command(self):
  43. """"生成通过ajax调用后端命令的前端ajax代码"""
  44. if not self.ajax_url: return ""
  45. return u"""
  46. UE.ajax.request( '%(ajax_url)s', {
  47. data: {
  48. name: 'ueditor'
  49. },
  50. onsuccess: function ( xhr ) {%(ajax_success)s},
  51. onerror: function ( xhr ){ %(ajax_error)s }
  52. });
  53. """ % {
  54. "ajax_url":self.ajax_url,
  55. "ajax_success":self.onExecuteAjaxCommand("success"),
  56. "ajax_error":self.onExecuteAjaxCommand("error")
  57. }
  58. def render_command(self):
  59. """" 返回注册命令的js定义 """
  60. cmd=self.onExecuteCommand()
  61. ajax_cmd=self.render_ajax_command()
  62. queryvalue_command=self.onExecuteQueryvalueCommand()
  63. cmds=[]
  64. if cmd or ajax_cmd:
  65. cmds.append( u"""execCommand: function() {
  66. %(exec_cmd)s
  67. %(exec_ajax_cmd)s
  68. }
  69. """ % {"exec_cmd":cmd,"exec_ajax_cmd":ajax_cmd},)
  70. if queryvalue_command:
  71. cmds.append(u"""queryCommandValue:function(){
  72. %s
  73. }""" % queryvalue_command)
  74. if len(cmds)>0:
  75. return u"""
  76. editor.registerCommand(uiName, {
  77. %s
  78. });
  79. """ % ",".join(cmds)
  80. else:
  81. return ""
  82. def render(self,editorID):
  83. return u"""
  84. UE.registerUI("%(uiName)s", function(editor, uiName) {
  85. %(registerCommand)s
  86. %(uiObject)s
  87. },%(index)s,"%(editor)s");
  88. """ % {
  89. "registerCommand":self.render_command(),
  90. "uiName":self.uiName,
  91. "uiObject":self.render_ui(editorID),
  92. "index":self.index,
  93. "editor":editorID
  94. }
  95. def onExecuteCommand(self):
  96. """ 返回执行Command时的js代码 """
  97. return ""
  98. def onExecuteAjaxCommand(self,state):
  99. """ 返回执行Command时发起Ajax调用成功与失败的js代码 """
  100. return ""
  101. def onExecuteQueryvalueCommand(self):
  102. """" 返回执行QueryvalueCommand时的js代码 """
  103. return ""
  104. class UEditorButtonCommand(UEditorCommand):
  105. def __init__(self,**kwargs):
  106. self.icon = kwargs.pop("icon", "")
  107. super(UEditorButtonCommand, self).__init__(**kwargs)
  108. def onClick(self):
  109. """"按钮单击js代码,默认执行uiName命令,默认会调用Command """
  110. return """
  111. editor.execCommand(uiName);
  112. """
  113. def render_ui(self,editorID):
  114. """ 创建button的js代码: """
  115. return """
  116. var btn = new UE.ui.Button({
  117. name: uiName,
  118. title: "%(title)s",
  119. cssRules: "background-image:url('%(icon)s')!important;",
  120. onclick: function() {
  121. %(onclick)s
  122. }
  123. });
  124. return btn
  125. """ % {
  126. "icon": urllib.basejoin(USettings.gSettings.MEDIA_URL , self.icon),
  127. "onclick": self.onClick(),
  128. "title": self.title
  129. }
  130. class UEditorComboCommand(UEditorCommand):
  131. def __init__(self,**kwargs):
  132. self.items = kwargs.pop("items", [])
  133. self.initValue=kwargs.pop("initValue","")
  134. super(UEditorComboCommand, self).__init__(**kwargs)
  135. def get_items(self):
  136. return self.items
  137. def onSelect(self):
  138. return ""
  139. def render_ui(self,editorID):
  140. """ 创建combo的js代码: """
  141. return """
  142. var combox = new UE.ui.Combox({
  143. editor:editor,
  144. items:%(items)s,
  145. onselect:function (t, index) {
  146. %(onselect)s
  147. },
  148. title:'%(title)s',
  149. initValue:'%(initValue)s'
  150. });
  151. return combox;
  152. """ % {
  153. "title":self.title,
  154. "items":str(self.get_items()),
  155. "onselect": self.onSelect(),
  156. "initValue":self.initValue
  157. }
  158. class UEditorDialogCommand(UEditorCommand):
  159. pass