1C distributives grouper

Groups distributive links into OS-specific containers

当前为 2023-10-04 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name 1C distributives grouper
  3. // @description Groups distributive links into OS-specific containers
  4. // @version 0.5
  5. // @author Akpaev E.A.
  6. // @grant none
  7. // @namespace https://github.com/akpaevj
  8. // @license MIT
  9. // @match https://releases.1c.ru/version_files?nick=Platform83*
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14. const container = document.createElement('div');
  15. container.className = 'container tabbale';
  16.  
  17. const ul = document.createElement('ul');
  18. ul.className = 'nav nav-tabs';
  19. container.append(ul);
  20.  
  21. const filesContainer = document.querySelector('.files-container');
  22. filesContainer.append(container);
  23.  
  24. const tabContent = document.createElement('div');
  25. tabContent.className = 'tab-content';
  26. container.append(tabContent);
  27.  
  28. function addTab(id, title, active = false) {
  29. const li = document.createElement('li');
  30. if (active) {
  31. li.className = 'active';
  32. }
  33. ul.append(li);
  34.  
  35. const a = document.createElement('a');
  36. a.setAttribute('href', `#${id}`);
  37. a.dataset.toggle = 'tab';
  38. a.textContent = title;
  39. li.append(a);
  40. }
  41.  
  42. function addPane(id, active = false, addSelectorRow = false) {
  43. const div = document.createElement('div');
  44. if (active) {
  45. div.className = 'tab-pane active';
  46. } else {
  47. div.className = 'tab-pane';
  48. }
  49. div.setAttribute('id', id);
  50. tabContent.append(div);
  51.  
  52. if (addSelectorRow) {
  53. const row = document.createElement('div');
  54. row.className = 'row-fluid';
  55. div.append(row);
  56. }
  57.  
  58. return div;
  59. }
  60.  
  61. function addTabAndPane(id, title, active = false, addSelectorRow = false) {
  62. addTab(id, title, active);
  63. return addPane(id, active, addSelectorRow);
  64. }
  65.  
  66. function addOption(select, value, title) {
  67. const option = document.createElement('option');
  68. option.setAttribute('value', value);
  69. option.textContent = title;
  70. select.append(option);
  71. }
  72.  
  73. function addSelector(pane, id, title, onChangeCallback) {
  74. const row = pane.querySelector('.row-fluid');
  75.  
  76. const span = document.createElement('div');
  77. span.className = 'span3';
  78. if (row === null) {
  79. pane.append(span);
  80. } else {
  81. row.append(span);
  82. }
  83.  
  84. const label = document.createElement('label');
  85. label.setAttribute('for', `${id}-select`);
  86. label.textContent = title;
  87. span.append(label);
  88.  
  89. const select = document.createElement('select');
  90. select.setAttribute('id', `${id}-select`);
  91. span.append(select);
  92.  
  93. select.onchange = _ => onChangeCallback(select.selectedOptions[0].value, pane);
  94.  
  95. return select;
  96. }
  97.  
  98. function showHideLink(e, show, filterId) {
  99. const filteredBy = new Set(JSON.parse(e.dataset.filteredBy));
  100.  
  101. if (show) {
  102. filteredBy.delete(filterId);
  103. } else {
  104. filteredBy.add(filterId);
  105. }
  106.  
  107. if (filteredBy.size > 0) {
  108. e.style.display = "none";
  109. } else {
  110. e.style.display = "block";
  111. }
  112.  
  113. e.dataset.filteredBy = JSON.stringify(Array.from(filteredBy));
  114. }
  115.  
  116. function showHideLinkByRegex(e, regex, filterId) {
  117. showHideLink(e, regex.test(e.querySelector('a').innerText), filterId);
  118. }
  119.  
  120. function addArchSelector(pane) {
  121. const filterId = 'arch'
  122. const select = addSelector(pane, 'arch', 'Arch', (value, pane) => {
  123. if (value === 'all') {
  124. pane.querySelectorAll('.formLine').forEach((e) => {
  125. showHideLink(e, true, filterId);
  126. });
  127. } else if (value === '86') {
  128. pane.querySelectorAll('.formLine').forEach((e) => {
  129. showHideLinkByRegex(e, /^(?:(?!64-bit).)*$/i, filterId);
  130. });
  131. } else {
  132. pane.querySelectorAll('.formLine').forEach((e) => {
  133. showHideLinkByRegex(e, /.*64-bit.*/i, filterId);
  134. });
  135. }
  136. });
  137.  
  138. addOption(select, 'all', 'All');
  139. addOption(select, '86', 'x86');
  140. addOption(select, '64', 'x64');
  141. }
  142.  
  143. function addPackageManagerSelector(pane) {
  144. const filterId = 'pm'
  145. const select = addSelector(pane, 'pm', 'Package manager', (value, pane) => {
  146. if (value === 'all') {
  147. pane.querySelectorAll('.formLine').forEach((e) => {
  148. showHideLink(e, true, filterId);
  149. });
  150. } else if (value === 'deb') {
  151. pane.querySelectorAll('.formLine').forEach((e) => {
  152. showHideLink(e, /.*DEB.*/i.test(e.querySelector('a').innerText), filterId);
  153. });
  154. } else {
  155. pane.querySelectorAll('.formLine').forEach((e) => {
  156. showHideLink(e, /.*RPM.*/i.test(e.querySelector('a').innerText), filterId);
  157. });
  158. }
  159. });
  160.  
  161. addOption(select, 'all', 'All');
  162. addOption(select, 'deb', 'DEB');
  163. addOption(select, 'rpm', 'RPM');
  164. }
  165.  
  166. function addApplicationTypeSelector(pane) {
  167. const filterId = 'type'
  168. const select = addSelector(pane, 'type', 'Type', (value, pane) => {
  169. if (value === 'all') {
  170. pane.querySelectorAll('.formLine').forEach((e) => {
  171. showHideLink(e, true, filterId);
  172. });
  173. } else if (value === 'full') {
  174. pane.querySelectorAll('.formLine').forEach((e) => {
  175. showHideLink(e, /.*Технологическая платформа.*/i.test(e.querySelector('a').innerText), filterId);
  176. });
  177. } else if (value === 'server') {
  178. pane.querySelectorAll('.formLine').forEach((e) => {
  179. showHideLink(e, /.*Сервер.*/i.test(e.querySelector('a').innerText), filterId);
  180. });
  181. } else if (value === 'client') {
  182. pane.querySelectorAll('.formLine').forEach((e) => {
  183. showHideLink(e, /^Клиент.*/i.test(e.querySelector('a').innerText), filterId);
  184. });
  185. } else {
  186. pane.querySelectorAll('.formLine').forEach((e) => {
  187. showHideLink(e, /.*Тонкий клиент.*/i.test(e.querySelector('a').innerText), filterId);
  188. });
  189. }
  190. });
  191.  
  192. addOption(select, 'all', 'All');
  193. addOption(select, 'full', 'Full');
  194. addOption(select, 'server', 'Server');
  195. addOption(select, 'client', 'Client');
  196. addOption(select, 'thinClient', 'Thin client');
  197. }
  198.  
  199. const cCont = addTabAndPane('common', 'Common', true, true);
  200. addArchSelector(cCont);
  201.  
  202. const wCont = addTabAndPane('windows', 'Windows', false, true);
  203. addApplicationTypeSelector(wCont);
  204. addArchSelector(wCont);
  205.  
  206. const lCont = addTabAndPane('linux', 'Linux', false, true);
  207. addApplicationTypeSelector(lCont);
  208. addArchSelector(lCont);
  209. addPackageManagerSelector(lCont);
  210.  
  211. const mCont = addTabAndPane('mac', 'Mac');
  212. const oCont = addTabAndPane('other', 'Other');
  213.  
  214. document.querySelectorAll(".formLine").forEach((e) => {
  215. e.dataset.filteredBy = JSON.stringify([]);
  216. const a = e.querySelector('a');
  217.  
  218. if (/.*Windows.*/i.test(a.innerText) && (/.*Linux.*/i.test(a.innerText) || /.*MacOS.*/i.test(a.innerText))) {
  219. cCont.append(e)
  220. } else if (/.*Windows.*/i.test(a.innerText)) {
  221. wCont.append(e)
  222. } else if (/.*Linux.*/i.test(a.innerText)) {
  223. lCont.append(e)
  224. } else if (/.*MacOS.*/i.test(a.innerText)) {
  225. mCont.append(e)
  226. } else {
  227. oCont.append(e)
  228. }
  229. });
  230. })();