Coco Annotator Extra Features

Tool lỏ

目前为 2024-08-14 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Coco Annotator Extra Features
  3. // @author Hoang
  4. // @namespace @hoang/cocoanno-extra-features
  5. // @version 1.0.0
  6. // @icon https://i.imgur.com/hHETHAK.jpeg
  7. // @description Tool lỏ
  8. // @include *
  9. // @license No license
  10. // @run-at document-end
  11. // @grant GM.notification
  12. // @grant GM_setValue
  13. // @grant GM_getValue
  14. // @grant GM_deleteValue
  15. // @grant GM_listValues
  16. // @grant GM_addStyle
  17. // @grant GM_getResourceText
  18. // @grant GM_getResourceURL
  19. // @require https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js
  20. // @require https://unpkg.com/tinykeys@2.1.0/dist/tinykeys.umd.js
  21. // ==/UserScript==
  22.  
  23.  
  24. const buttonSelectTool = memoize(() => $('aside.left-panel i.fa.fa-x.fa-hand-pointer-o'))
  25. const buttonBBoxTool = memoize(() => $('aside.left-panel i.fa.fa-x.fa-object-group'))
  26. const buttonSave = memoize(() => $('aside.left-panel i.fa.fa-x.fa-save'))
  27. const buttonNewAnnotation = memoize(() => $('.sidebar-section i.fa.fa-plus'))
  28.  
  29. function memoize(fn) {
  30. let result = undefined
  31. let called = false
  32. let previousArgs = []
  33. return (...args) => {
  34. const isChanged = compareArgs(previousArgs, args)
  35. if (isChanged || !called) {
  36. previousArgs = args
  37. result = fn(...args)
  38. called = true
  39. }
  40. return result
  41. }
  42. }
  43.  
  44. function compareArgs(prevArgs, args) {
  45. const targetArgs = prevArgs.length > args.length ? prevArgs : args
  46. for (let i = 0; i < targetArgs.length; i++) {
  47. if (prevArgs[i] !== args[i]) {
  48. return true
  49. }
  50. }
  51. return false
  52. }
  53.  
  54. function isAnnotateWorkspaceUrl(href) {
  55. const url = new URL(href)
  56. return url.host == '124.158.6.188:5000' && url.hash.startsWith('#/annotate/')
  57. }
  58.  
  59. function countObjects() {
  60. return $('.sidebar-section ul.list-group').children('div').length
  61. }
  62.  
  63. function disableDefaultKeys(e) {
  64. const keys = [
  65. 116, // F5
  66. 32, // Space
  67. ]
  68. if (keys.includes(e.which) || keys.includes(e.keyCode)) {
  69. e.preventDefault()
  70. }
  71. }
  72.  
  73. function foldOtherKeypointList(keypointListElement) {
  74.  
  75. }
  76.  
  77. async function main() {
  78. if (!isAnnotateWorkspaceUrl(window.location.href)) {
  79. return undefined
  80. }
  81.  
  82. let prevObjCount = countObjects()
  83.  
  84. // $(document).bind("keydown", disableDefaultKeys);
  85. // $(document).on("keydown", disableDefaultKeys);
  86.  
  87. tinykeys.tinykeys(window, {
  88. 'S': () => {
  89. buttonSelectTool().click()
  90. },
  91. 'Space': (event) => {
  92. event.preventDefault()
  93. const objectCount = countObjects()
  94. if (objectCount == 0 || objectCount == prevObjCount) {
  95. buttonNewAnnotation().click()
  96. buttonBBoxTool().click()
  97. }
  98. prevObjCount = objectCount
  99. },
  100. 'F5': (event) => {
  101. event.preventDefault()
  102. const confirmReload = confirm('Tải lại trang? Nếu chưa lưu dữ liệu sẽ mất hết.')
  103. if (confirmReload) {
  104. window.location.reload()
  105. }
  106. }
  107. })
  108. console.log($)
  109.  
  110. setInterval(() => buttonSave().click(), 1000 * 20)
  111. }
  112.  
  113. main()