Advertisement
GroggyOtter

AHK Comment Aligner

Nov 5th, 2024
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Autohotkey 5.65 KB | Source Code | 0 0
  1. *F1::commenter.Show()
  2. *F2::commenter.Hide()
  3.  
  4. class commenter {
  5.     #Requires Autohotkey v2.0.18+
  6.    
  7.     ; === User Methods ===
  8.     ; Show Commenter GUI
  9.     static show() => WinExist('ahk_id ' this.gui.hwnd) ? 0 : this.gui.Show()
  10.     ; Hide Commenter GUI
  11.     static hide() => WinExist('ahk_id ' this.gui.hwnd) ? this.gui.Hide() : 0
  12.    
  13.    
  14.     ; === Internal ===
  15.     static title := 'AHK Commenter'
  16.     static __New() => this.make_gui()
  17.     static make_gui() {
  18.         start_w     := A_ScreenWidth * 0.4
  19.         start_h     := A_ScreenHeight * 0.4
  20.         btn_w       := 100
  21.         btn_h       := 30
  22.         cb_w        := 100
  23.         cb_h        := 30
  24.         pad         := 5
  25.         min_width   := (btn_w + pad) * 5 + pad
  26.         min_height  := 300
  27.         bg_color    := 0x101010
  28.        
  29.         min_size := '+MinSize' min_width 'x' min_height
  30.         this.gui := goo := Gui('+Resize ' min_size, this.title, this.events)
  31.         goo.BackColor := bg_color
  32.         goo.MarginX := goo.MarginY := pad
  33.         goo.OnEvent('Size', gui_resize)
  34.        
  35.         ; Add buttons
  36.         goo.SetFont('bold')
  37.         goo.AddButton('vbtn_com_add', 'Add`nComments').OnEvent('Click', 'add_comments')
  38.         goo.AddButton('vbtn_com_rem', 'Remove`nComments').OnEvent('Click', 'remove_comments')
  39.         goo.AddButton('vbtn_clipboard', 'Save to`nClipboard').OnEvent('Click', 'save_to_clip')
  40.         goo.AddButton('vbtn_clipboard_reddit', 'Reddit Format to`nClipboard').OnEvent('Click', 'save_to_clip_reddit')
  41.         goo.AddButton('vbtn_close', 'Close').OnEvent('Click', (con, *) => con.Gui.Hide())
  42.         goo.SetFont('norm')
  43.        
  44.         ; Add edits
  45.         con := goo.AddEdit('vedt_left +Multi +Background0 +HScroll', 'Paste Code Here')
  46.         con.SetFont('cWhite', 'Courier New')
  47.         con.SetFont('cWhite', 'Consolas')
  48.         con := goo.AddEdit('vedt_right +Multi +ReadOnly +Background0 +HScroll')
  49.         con.SetFont('cWhite', 'Courier New')
  50.         con.SetFont('cWhite', 'Consolas')
  51.        
  52.         gui_resize(goo, 0, start_w, start_h)
  53.         goo.Show('w' start_w ' h' start_h)
  54.         goo['edt_left'].Focus()
  55.         return
  56.        
  57.         gui_resize(goo, MinMax, Width, Height) {
  58.             last_left := last_top := last_right := last_bottom := last_width := last_height := unset
  59.            
  60.             ; Edit fields
  61.             set('edt_left', pad, pad, (Width - pad * 3) / 2,  height - pad * 3 - btn_h)
  62.             set('edt_right',last_right + pad,last_top,last_width,last_height)
  63.            
  64.             ; Controls
  65.             set('btn_com_add', pad, height - pad - btn_h, btn_w, btn_h)
  66.             set('btn_com_rem', last_right + pad, last_top, last_width, last_height)
  67.             set('btn_close', width - pad - btn_w, last_top, btn_w, btn_h)
  68.             set('btn_clipboard', last_left - pad - btn_w, last_top, last_width, last_height)
  69.             set('btn_clipboard_reddit', last_left - pad - btn_w, last_top, last_width, last_height)
  70.             return
  71.            
  72.             set(name, x, y, w, h) {
  73.                 last_left   := x
  74.                 last_top    := y
  75.                 last_width  := w
  76.                 last_height := h
  77.                 last_right  := x + w
  78.                 last_bottom := y + h
  79.                 goo[name].Move(x, y, w, h)
  80.             }
  81.         }
  82.     }
  83.    
  84.     ; Contains all gui control events
  85.     class events {
  86.         static rgx_comment := '^(.*\S.*)[ \t](;.*?)$'
  87.         static add_comments(btn, *) {
  88.             ; Get length of longest line
  89.             max_line_len := 0
  90.             text := btn.gui['edt_left'].Text
  91.             loop parse text, '`n', '`r' {
  92.                 if RegExMatch(A_LoopField, this.rgx_comment, &match)
  93.                     len := StrLen(match[1])
  94.                 else len := StrLen(A_LoopField)
  95.                 if (len > max_line_len)
  96.                     max_line_len := len
  97.             }
  98.            
  99.             ; Apply comments to each line and align previous comments.
  100.             result := ''
  101.             loop parse text, '`n', '`r' {
  102.                 ; if blank line, no change
  103.                 if RegExMatch(A_LoopField, '^\s*$')
  104.                     result .= A_LoopField
  105.                 ; if header comment, no change
  106.                 else if RegExMatch(A_LoopField, '^[ \t]*;.*$')
  107.                     result .= A_LoopField
  108.                 ; if comment already exists, fix it
  109.                 else if RegExMatch(A_LoopField, this.rgx_comment, &match)
  110.                     result .= match[1] make_pad(1 + max_line_len - StrLen(match[1])) match[2]
  111.                 ; else add a comment
  112.                 else result .= A_LoopField make_pad(max_line_len - StrLen(A_LoopField)) ' `; '
  113.                 result .= '`r`n'
  114.             }
  115.            
  116.             btn.Gui['edt_right'].Text := result
  117.             return
  118.            
  119.             make_pad(size:=0, char:=' ') {
  120.                 pad := ''
  121.                 loop size
  122.                     pad .= char
  123.                 return pad
  124.             }
  125.         }
  126.        
  127.         static remove_comments(btn, *) {
  128.             text := btn.Gui['edt_left'].Text
  129.             result := ''
  130.             loop parse text, '`n', '`r'
  131.                 if RegExMatch(A_LoopField, this.rgx_comment, &match)
  132.                     result .= match[1] '`r`n'
  133.                 else result .= A_LoopField '`r`n'
  134.             btn.Gui['edt_right'].Text := result
  135.         }
  136.        
  137.         static save_to_clip(btn, *) => A_Clipboard := btn.Gui['edt_right'].Text
  138.  
  139.         static save_to_clip_reddit(btn, *) {
  140.             txt := btn.Gui['edt_right'].Text
  141.             A_Clipboard := '`r`n`r`n    ' StrReplace(txt, '`r`n', '`r`n    ')
  142.         }
  143.     }
  144. }
  145.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement