Twitter

Wer einen Post über 280 Zeichen bei Twitter absetzen will hat zwei Möglichkeiten: entweder er registriert sich kostenpflichtig („kauft“ den blauen Haken), oder er teilt seinen Post auf ein kleinere Häppchen. Auch für dafür kann es guten Grund geben.

Dieses Script produziert ein Textfenster, in dem der Anwender seinen vorbereiteten Text hineinkopiert und mit Kontextmenü aufteilt.

System-Voraussetzung: aktuelle Installation der Scripting-Sprache Tcl/Tk.


#!/usr/bin/wish

namespace eval twitter {
  
  variable limit 273
  
  proc tweetLength txt {
    # Links als 23 Zeichen zählen
    set pat {[a-z]+://\S+}
    set result [string length $txt]
    foreach url [regexp -inline -all $pat $txt] {
      incr result -[string length $url]
      incr result 23
    }
    set result
  }
  
  proc endIndicesPeriod txt {
    set ranges [regexp -inline -indices -all {[.:!?“)](?=\s)} "$txt "]
    set indices [lmap range $ranges {lindex $range 0}]
  }
  
  proc endIndicesComma txt {
    set ranges [regexp -inline -indices -all {[.:!?“,;)](?=\s)} "$txt "]
    set indices [lmap range $ranges {lindex $range 0}]
  }
  
  proc endIndicesAny txt {
    set ranges [regexp -inline -indices -all {\S(?=\s)} "$txt "]
    set indices [lmap range $ranges {lindex $range 0}]
  }
  
  proc endIndices txt {
    variable limit
    set indices [endIndicesComma $txt]
    if {$indices eq {}} then {
      set indices [endIndicesAny $txt]
    } else {
      lassign $indices index
      set part1 [string range $txt 0 $index]
      if {[tweetLength $part1] > $limit} then {
        set indices [endIndicesAny $txt]
      }
    }
    set indices
  }
  
  proc stopIndex txt {
    variable limit
    set part0 {}
    set result 0
    foreach index [endIndices $txt] {
      set part0 [string range $txt 0 $index]
      set twLen [tweetLength $part0]
      if {$twLen > $limit} break
      set result $index
    }
    set result
  }
  
  proc parts txt {
    if {![string is space $txt]} then {
      set index [stopIndex $txt]
      set part [string range $txt 0 $index]
      set rest [string range $txt $index+1 end]
      list $part {*}[parts $rest]
    }
  }
  
  proc tweets txt {
    set frags [parts $txt]
    set len [llength $frags]
    foreach frag $frags {
      append result \n\n [string trim $frag] " #[incr i]/$len"
    }
    string trim $result
  }
  
  namespace export tweets
}

namespace import ::twitter::tweets

package require Tk

destroy {*}[winfo children .]

pack [text .t -font "Helvetica 14" -undo yes]
.t insert 1.0 {Fenster zum Zerteilen für Tweets bis 280 Zeichen

Gebrauchsanweisung:

– Diesen Text löschen
– Gewünschten Text mit Copy und Paste ins Textfenster
– Kontextmenü Twitter. Der Text wird zerteilt.
– Textabschnitte nacheinander zu Twitter kopieren

Vergnügen!}

menu .t.m
bind .t <3> {tk_popup .t.m %X %Y}

.t.m add command -label Copy -command {event generate .t <<Copy>>}
.t.m add command -label Paste -command {event generate .t <<Paste>>}
.t.m add command -label Twitter! -command {
  .t replace 1.0 end [tweets [.t get 1.0 end-1i]]
}
.t.m add separator
.t.m add command -label Undo -command {event generate .t <<Undo>>}
.t.m add command -label Redo -command {event generate .t <<Redo>>}
.t.m add separator
.t.m add command -label Clear -command {.t delete 1.0 end}

28.5.2024