Untitled

 avatar
unknown
golang
a year ago
1.9 kB
5
Indexable
package main

import (
	"bufio"
	"bytes"
	"fmt"
	"os/exec"
	"runtime"
	"strings"
	"unicode"
	"unicode/utf8"
)

func fromClipboard() ([]byte, error) {
	var cmd *exec.Cmd
	var outb bytes.Buffer
	switch runtime.GOOS {
	case "linux":
		cmd = exec.Command("xclip", "-selection", "clipboard", "-o")
	default:
		cmd = exec.Command("Get-Clipboard")
	}

	cmd.Stdout = &outb
	err := cmd.Run()
	if err != nil {
		return nil, err
	}
	return outb.Bytes(), nil
}

func toClipboard(output []byte) error {
	var err error
	switch runtime.GOOS {
	case "linux":
		mycmd := fmt.Sprintf("echo %s | xclip -selection clipboard", string(output))
		err = exec.Command("bash", "-c", mycmd).Run()
	default:
		o := fmt.Sprintf("\"%s\"", string(output))
		err = exec.Command("Set-Clipboard", "-Value", o).Run()
	}
	return err
}

func main() {
	// input es lo importante. En un futuro se puede cambiar para que sea
	// el texto sanitizado de un comentario
	input, err := fromClipboard()
	if err != nil {
		panic(err)
	}

	// el output es la salida, con el formato de excel. cada coma representa una nueva celda.
	var output []byte

	lineScanner := bufio.NewScanner(strings.NewReader(string(input)))
	for lineScanner.Scan() {
		byteScanner := bufio.NewScanner(strings.NewReader(lineScanner.Text()))
		byteScanner.Split(bufio.ScanRunes)

		prediction := false // flag que controla si la linea es una prediccion o está vacía

		for byteScanner.Scan() {
			rune, _ := utf8.DecodeRune(byteScanner.Bytes())
			if unicode.IsDigit(rune) {
				prediction = true
				// añade un número a la lista
				output = append(output, byteScanner.Bytes()...)
				output = append(output, byte(','))
			}
		}

		if prediction {
			// añadir tres tabulaciones más para separar predicciones
			for i := 0; i < 3; i++ {
				output = append(output, byte(','))
			}
		}
	}

	err = toClipboard(output)
	if err != nil {
		panic(err)
	}
	fmt.Printf("Listo, facha.")
}
Editor is loading...
Leave a Comment