+ (call-process "arbitools-run.py" nil "Arbitools-output" nil "standings" buffer-file-name))
+
+(defun arbitools-list-players ()
+ "Put the list of players in two buffers, one in plain text and another in a beautiful LaTeX"
+ ;; TODO: the beautiful LaTeX
+ (interactive)
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "^001" nil t)
+ (let* ((linestring (thing-at-point 'line))
+ (rankstring (substring linestring 5 8)))
+
+ (with-current-buffer "List of players"
+ (insert (format " %s " rankstring))))
+
+ (let* ((linestring (thing-at-point 'line))
+ (namestring (substring linestring 14 47)))
+
+ (with-current-buffer "List of players"
+ (insert (format "%s " namestring))))
+
+ (let* ((linestring (thing-at-point 'line))
+ (elostring (substring linestring 48 52)))
+
+ (with-current-buffer "List of players"
+ (insert (format "%s\n" elostring))))))
+ (with-current-buffer "List of players"
+ (remove-text-properties (point-min)(point-max) '(face nil))))
+
+(defun arbitools-new-trf ()
+ "Create an empty trf file"
+ (interactive)
+ (generate-new-buffer "New trf")
+ (switch-to-buffer "New trf")
+ (set-buffer "New trf")
+ (arbitools-mode)
+ (insert "012 NAME OF THE TOURNAMENT\n")
+ (insert "022 PLACE\n")
+ (insert "032 FEDERATION\n")
+ (insert "042 STARTING DATE (YYYY/MM/DD)\n")
+ (insert "052 ENDING DATE (YYYY/MM/DD)\n")
+ (insert "062 NUMBER OF PLAYERS\n")
+ (insert "072 NUMBER OF RATED PLAYERS\n")
+ (insert "082 NUMBER OF TEAMS\n")
+ (insert "092 TYPE OF TOURNAMENT\n")
+ (insert "102 CHIEF ARBITER\n")
+ (insert "112 DEPUTY CHIEF ARBITER\n")
+ (insert "122 ALLOTED TIMES PER MOVE/GAME\n")
+ (insert "132 DATES YY/MM/DD YY/MM/DD\n")
+ ;; (insert "001 000 GTIT NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN RAT. FED 0000000000 YYYY/MM/DD 00.0 RNK 0000 C R 0000 C R\n")
+ ;; (insert "013 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 0000 0000\n")
+)
+
+ (defun arbitools-number-of-rounds ()
+ "Get the number of rounds in the tournament. It has to be executed in the principal buffer."
+ (let* ((numberofrounds 0))
+ (save-excursion
+ (goto-char (point-min))
+ (re-search-forward "^132" nil t)
+ (let* ((linestringrounds (thing-at-point 'line))
+ ;; (actualround " ")
+ (beginning-of-round 91)
+ (end-of-round 99)
+ (continue t))
+
+ ;; (with-current-buffer "Arbitools-output" (insert (format "rounds: %s" linestringrounds)))
+ ;; (with-current-buffer "Arbitools-output" (insert (format "length: %s" (- (length linestringrounds) 4))))
+ ;; For some reason, the length of the string is 4 characters longer than the real line
+ (while continue
+ (if (< end-of-round (length linestringrounds))
+
+ (progn
+ ;; (setq actualround (substring-no-properties linestringrounds beginning-of-round end-of-round))
+ (setq numberofrounds (+ numberofrounds 1))
+ (setq beginning-of-round (+ beginning-of-round 10))
+ (setq end-of-round (+ end-of-round 10)))
+
+ (setq continue nil)))))
+ numberofrounds))
+
+(defun arbitools-calculate-points ()
+ "Automatically calculate the points of each player"
+ (interactive)
+ (save-excursion
+ (let ( (numberofrounds (arbitools-number-of-rounds))
+ (points 0.0)
+ (pointstosum 0.0)
+ (roundcount 1))
+ (goto-char (point-min))
+ (while (re-search-forward "^001" nil t)
+ (setq points 0.0)
+ (setq roundcount 1)
+ (while (<= roundcount numberofrounds)
+ (beginning-of-line)
+ (forward-char (+ 98 (* (- roundcount 1) 10))) ;; go to where the result is for each round
+ (cond ((string= (thing-at-point 'symbol) "1") (setq pointstosum 1.0))
+ ((string= (thing-at-point 'symbol) "+") (setq pointstosum 1.0))
+ ((string= (thing-at-point 'symbol) "=") (setq pointstosum 0.5))
+ ((string= (thing-at-point 'symbol) "0") (setq pointstosum 0.0))
+ ((string= (thing-at-point 'symbol) "-") (setq pointstosum 0.0))
+ ((string= (thing-at-point 'symbol) nil) (setq pointstosum 0.0)))
+ (setq points (+ points pointstosum))
+ (setq roundcount (+ roundcount 1)))
+ (beginning-of-line)
+ (forward-char 84)
+ (forward-char -3)
+ (delete-char 3)
+ (insert-char ?\s (- 3 (length (format "%s" points))))
+ (insert (format "%s" points))))))
+
+(defun arbitools-calculate-standings ()
+ "Write the standings in the Standings buffer"
+ (interactive)
+ (arbitools-calculate-points) ;; make sure the points of each player are correct
+ (save-excursion
+ (with-current-buffer "Standings"
+ (erase-buffer))
+ (let ((datachunk ""))
+ (goto-char (point-min))
+ (while (re-search-forward "^001" nil t)
+ (let* ()
+ (beginning-of-line)
+ (forward-char 89) ;; get the POS field
+ (setq datachunk (thing-at-point 'word))
+ (with-current-buffer "Standings"
+ (insert (format "%s" datachunk))
+ (insert-char ?\s (- 3 (length datachunk)))
+ (insert " "))
+ (setq datachunk (substring-no-properties (thing-at-point 'line) 14 47)) ;; get name
+ (with-current-buffer "Standings"
+ (insert (format "%s " datachunk))
+ (insert-char ?\s (- 33 (length datachunk))))
+ (beginning-of-line)
+ (forward-char 68)
+ (setq datachunk (thing-at-point 'word)) ;; get idfide
+ (with-current-buffer "Standings"
+ (insert (format "%s " datachunk))
+ (insert-char ?\s (- 10 (length datachunk))))
+ (setq datachunk (substring-no-properties (thing-at-point 'line) 80 84)) ;; get points
+ (with-current-buffer "Standings"
+ (insert (format "%s " datachunk))
+ (insert-char ?\s (- 4 (length datachunk))))
+ (with-current-buffer "Standings"
+ (insert "\n")
+ (sort-columns 1 49 (- (point-max) 1))))))
+ (let ((newpos 0)
+ (idfide ""))
+ (goto-char (point-min))
+ (while (re-search-forward "^001" nil t)
+ (beginning-of-line)
+ (forward-char 68)
+ (setq idfide (thing-at-point 'word))
+ (with-current-buffer "Standings"
+ (goto-char (point-min))
+ (search-forward idfide nil t)
+ (setq newpos (line-number-at-pos))) ;; the POS is in the beginning of the line in Standings
+ (with-current-buffer "Arbitools-output"
+ (insert (format "%s" newpos))
+ (insert "\n"))
+ (beginning-of-line)
+ (forward-char 89) ;; go to POS field
+ (forward-char -3)
+ (delete-char 3)
+ (insert-char ?\s (- 3 (length (format "%s" newpos))))
+ (insert (format "%s" newpos))))))
+
+(defun arbitools-delete-player (player)
+ "Delete a player. Adjust all the rank numbers accordingly."
+ (interactive "splayer: ")
+ (let ((numberofrounds 0)
+ (elo ""))
+
+ (save-excursion
+ (goto-char (point-min))
+ (re-search-forward "^132" nil t)
+ (let* ((linestringrounds (thing-at-point 'line))
+ ;; (actualround " ")
+ (beginning-of-round 91)
+ (end-of-round 99)
+ (continue t))
+ (while continue
+ (if (< end-of-round (length linestringrounds))
+ (progn
+ ;; (setq actualround (substring-no-properties linestringrounds beginning-of-round end-of-round))
+ (setq numberofrounds (+ numberofrounds 1))
+ (setq beginning-of-round (+ beginning-of-round 10))
+ (setq end-of-round (+ end-of-round 10)))
+ (setq continue nil)))))
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "^001" nil t)
+ (let* ((linestring (thing-at-point 'line))
+ (rankstring (substring linestring 5 8)))
+ (when (= (string-to-number rankstring) (string-to-number player))
+ (forward-char 1)
+ (delete-char 4)
+ (insert " DEL")
+ (setq elo (substring linestring 48 52))
+ (with-current-buffer "Arbitools-output" (insert (format "%s" elo))))
+ (when (> (string-to-number rankstring)(string-to-number player))
+ (forward-char 1)
+ (delete-char 4)
+ (insert-char ?\s (- 4 (length (format "%s" (- (string-to-number rankstring) 1)))))
+ (insert (format "%s" (- (string-to-number rankstring) 1)))
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "^001" nil t)
+ (let* ((roundcount 1))
+ (while (<= roundcount numberofrounds)
+ (beginning-of-line)
+ (forward-char (+ 95 (* (- roundcount 1) 10)))
+ (when (string= (format "%s" (string-to-number rankstring)) (thing-at-point 'word))
+ (forward-char -4) ;; go back to the beginning of the opponent's number
+ (delete-char 4) ;; remove the original opponent's number
+ (insert-char ?\s (- 4 (length (format "%s" (- (string-to-number rankstring) 1)))))
+ (insert (format "%s" (- (string-to-number rankstring) 1))))
+ (setq roundcount (+ roundcount 1))))
+ ;;(condition-case nil ;; TODO: fix teams info
+ (save-excursion
+ (while (re-search-forward "^013" nil t)
+ (let* ((linestringteam (thing-at-point 'line))
+ (integrantcount 0)
+ (members 0))
+
+ ;; to find the end of the line, the number is length -2, for some reason
+ (setq members (/ (- (- (length linestringteam) 2) 34) 5)) ;; calculate number of members
+
+ (while (< integrantcount members)
+ (beginning-of-line)
+ (forward-char (+ 40 (* (- integrantcount 1) 5)))
+ (when (string= (format "%s" (string-to-number rankstring)) (thing-at-point 'word))
+ (forward-char -4)
+ (delete-char 4)
+ (insert-char ?\s (- 4 (length (format "%s" (- (string-to-number rankstring) 1)))))
+ (insert (format "%s" (- (string-to-number rankstring) 1))))
+ (setq integrantcount (+ integrantcount 1))))))))))))
+
+ (save-excursion ;; Actually delete the player's line
+ (goto-char (point-min))
+ (while (re-search-forward "^001 DEL" nil t)
+ (beginning-of-line)
+ (let ((beg (point)))
+ (forward-line 1)
+ (delete-region beg (point)))))
+ ;; TODO delete the rank from teams section
+ ;; TODO change number of players and number of rated players
+ (save-excursion
+ (with-current-buffer "Arbitools-output" (insert (format "%s" elo)))
+ (goto-char (point-min))
+ (re-search-forward "^062 ")
+ (let* ((linestring (thing-at-point 'line))
+ (numberofplayers (substring linestring 4)))
+ (delete-char (length numberofplayers))
+ (setq numberofplayers (string-to-number numberofplayers))
+ (setq numberofplayers (- numberofplayers 1))
+ (insert (concat (number-to-string numberofplayers) "\n")))
+ (re-search-forward "^072 ")
+ (let* ((linestring (thing-at-point 'line))
+ (numberofratedplayers (substring linestring 4)))
+ (unless (< (length elo) 2) ;; if elo is 0 or nonexistent
+ (delete-char (length numberofratedplayers))
+ (setq numberofratedplayers (string-to-number numberofratedplayers))
+ (setq numberofratedplayers (- numberofratedplayers 1))
+ (insert (concat (number-to-string numberofratedplayers) "\n")))))))
+
+(defun arbitools-delete-round (round)
+ "Delete a round."
+ (interactive "sround: ")
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "^001" nil t)
+ (forward-char (+ 88 (* (- (string-to-number round) 1) 10)))
+ (delete-char 8)
+ (insert " "))))
+
+(defun arbitools-replace-empty ()
+ "Replace non played games with spaces"
+ (interactive)
+ (save-excursion
+ (goto-char (point-min))
+ (while (search-forward "0000 - 0" nil t)
+ (replace-match " "))))
+
+(defun arbitools-insert-player (sex title name elo fed idfide year)
+ "Insert a player"
+ ;; TODO: automatically insert the player in a team
+ (interactive "ssex: \nstitle: \nsname: \nselo: \nsfed: \nsidfide: \nsyear: ")
+ (let ((playerlinelength nil)
+ (thislinelength nil))
+ (save-excursion
+ (goto-char (point-min))
+ (re-search-forward "^001 ")
+ (let* ((linestring (thing-at-point 'line)))
+ (setq playerlinelength (length linestring))))
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "^001" nil t))
+ (let* ((linestring (thing-at-point 'line))
+ (rankstring (substring linestring 5 8)))
+
+ (forward-line 1)
+ (insert "\n")
+ (forward-char -1)
+ (insert (format "001 "))
+ (insert-char ?\s (- 4 (length (format "%s" (+ (string-to-number rankstring) 1)))))
+ (insert (format "%s" (+ (string-to-number rankstring) 1)))
+ (insert (format " %s" sex))
+ (when (= (length sex) 0) (insert " ")) ;; add extra space if the sex string is empty
+ (insert-char ?\s (- 3 (length title)))
+ (insert (format "%s " title))
+ (insert (format "%s" name))
+ (insert-char ?\s (- 34 (length name)))
+ (when (= (length elo) 4) (insert (format "%s " elo)))
+ (when (= (length elo) 0) (insert " ")) ;; add extra space if the elo is empty
+ (when (= (length elo) 1) (insert " 0 ")) ;; add extra space if the elo is a "0"
+ (insert (format "%s" fed))
+ (when (= (length fed) 0) (insert " ")) ;; add extra space if fed is empty
+ (insert-char ?\s (- 12 (length idfide)))
+ (insert (format "%s " idfide))
+ (insert (format "%s " year))
+ (when (= (length year) 0) (insert " ")) ;; TODO: improve this to make it support different data formats
+ (insert (format " 0.0 "))
+ (insert-char ?\s (- 4 (length (format "%s" (+ (string-to-number rankstring) 1)))))
+ (insert (format "%s" (+ (string-to-number rankstring) 1)))
+ (setq thislinelength (length (thing-at-point 'line)))
+ (insert-char ?\s (- playerlinelength thislinelength)))))
+ (save-excursion
+ (goto-char (point-min))
+ (re-search-forward "^062 ")
+ (let* ((linestring (thing-at-point 'line))
+ (numberofplayers (substring linestring 4)))
+ (delete-char (length numberofplayers))
+ (setq numberofplayers (string-to-number numberofplayers))
+ (setq numberofplayers (+ 1 numberofplayers))
+ (insert (concat (number-to-string numberofplayers) "\n")))
+ (re-search-forward "^072 ")
+ (let* ((linestring (thing-at-point 'line))
+ (numberofratedplayers (substring linestring 4)))
+ (unless (< (length elo) 2)
+ (delete-char (length numberofratedplayers))
+ (setq numberofratedplayers (string-to-number numberofratedplayers))
+ (setq numberofratedplayers (+ 1 numberofratedplayers))
+ (insert (concat (number-to-string numberofratedplayers) "\n"))))))
+
+(defun arbitools-insert-result (round white black result)
+ "Insert a result."
+ (interactive "sround: \nswhite: \nsblack: \nsresult: ")
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "^001" nil t)
+ (forward-char 4) ;; rank number
+ (when (string= white (thing-at-point 'word))
+ ;;go to first round taking into account the cursor is in the rank number
+ (forward-char (+ 85 (* (- (string-to-number round) 1) 10)))
+ (insert " ") ;; replace the first positions with spaces
+ (delete-char 2) ;; delete the former characters
+ ;; make room for bigger numbers
+ (cond ((= 2 (length black))
+ (backward-char 1))
+ ((= 3 (length black))
+ (backward-char 2)))
+ (insert (format "%s w %s" black result))
+ (delete-char 5)
+ ;; adjust when numbers are longer
+ (cond ((= 2 (length black)) (delete-char 1))
+ ((= 3 (length black)) (delete-char 2))))
+ (when (string= black (thing-at-point 'word))
+ ;; go to first round taking into account the cursor is in the rank number
+ (forward-char (+ 85 (* (- (string-to-number round) 1) 10)))
+ (insert " ") ;; replace the first positions with spaces
+ (delete-char 2) ;; delete the former characters
+ ;; make room for bigger numbers
+ (cond ((= 2 (length white)) (backward-char 1))
+ ((= 3 (length white)) (backward-char 2)))
+ (cond ((string= "1" result) (insert (format "%s b 0" white)))
+ ((string= "=" result) (insert (format "%s b =" white)))
+ ((string= "+" result) (insert (format "%s b +" white)))
+ ((string= "-" result) (insert (format "%s b -" white)))
+ ((string= "0" result) (insert (format "%s b 1" white))))
+ (delete-char 5)
+ ;; adjust when numbers are longer
+ (cond ((= 2 (length white)) (delete-char 1))
+ ((= 3 (length white)) (delete-char 2)))))))