commands.py 5.0 KB

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