summaryrefslogtreecommitdiff
path: root/cmd/tag
diff options
context:
space:
mode:
authorF.O. <scrotadamus@insiberia.net>2025-02-16 17:56:08 +0100
committerF.O. <scrotadamus@insiberia.net>2025-02-16 17:56:57 +0100
commit17fb6add26291b31f7020e3551a7c8487130a747 (patch)
treed4559a7339ed181393ff921909e6ce05b7c2cf18 /cmd/tag
genesi
Diffstat (limited to 'cmd/tag')
-rw-r--r--cmd/tag/add.go88
-rw-r--r--cmd/tag/remove.go87
-rw-r--r--cmd/tag/show.go82
-rw-r--r--cmd/tag/tag.go63
4 files changed, 320 insertions, 0 deletions
diff --git a/cmd/tag/add.go b/cmd/tag/add.go
new file mode 100644
index 0000000..a5dc258
--- /dev/null
+++ b/cmd/tag/add.go
@@ -0,0 +1,88 @@
+/*
+Copyright © 2025 NAME HERE <EMAIL ADDRESS>
+*/
+package tag
+
+import (
+ "fmt"
+ "io"
+ "os"
+
+ "github.com/scrotadamus/ghligh/document"
+ "github.com/spf13/cobra"
+)
+
+func readStdin() string {
+ data, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ panic(err)
+ }
+ return string(data)
+}
+
+// tagAddCmd represents the tag command
+var tagAddCmd = &cobra.Command{
+ Use: "add",
+ Short: "add a ghligh tag to a pdf file",
+ Long: `A longer description that spans multiple lines and likely contains examples
+and usage of using your command. For example:
+
+Cobra is a CLI library for Go that empowers applications.
+This application is a tool to generate the needed files
+to quickly create a Cobra application.`,
+ Run: func(cmd *cobra.Command, args []string) {
+ if len(args) == 0 {
+ cmd.Help()
+ return
+ }
+
+ stdin, err := cmd.Flags().GetBool("stdin")
+ if err != nil {
+ cmd.Help()
+ return
+ }
+ if stdin {
+ tags = append(tags, readStdin())
+ }
+ if len(tags) == 0 {
+ fmt.Fprintf(os.Stderr, "Either --tag or --stdin is required\n", err)
+ os.Exit(1)
+ }
+
+ for _, file := range args {
+ doc, err := document.Open(file)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "%v\n", err)
+ continue
+ }
+ for _, tag := range tags {
+ doc.Tag(tag)
+ fmt.Fprintf(os.Stderr, "added tag {{{%s}}} to %s\n", tag, file)
+ }
+ doc.Save()
+ doc.Close()
+ }
+ },
+}
+
+func init() {
+ TagCmd.AddCommand(tagAddCmd)
+
+ // Here you will define your flags and configuration settings.
+
+ // Cobra supports Persistent Flags which will work for this command
+ // and all subcommands, e.g.:
+ // tagCmd.PersistentFlags().String("foo", "", "A help for foo")
+
+ // Cobra supports local flags which will only run when this command
+ // is called directly, e.g.:
+ // tagCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
+ // TODO add to "add" command
+ tagAddCmd.Flags().StringArrayVarP(&tags, "tag", "t", []string{}, "Tag da associare ai file (può essere usato più volte)")
+ tagAddCmd.Flags().BoolP("stdin", "0", false, "read tag from stdin")
+
+ //if err := tagAddCmd.MarkFlagRequired("tag"); err != nil {
+ //panic(err)
+ //}
+
+}
diff --git a/cmd/tag/remove.go b/cmd/tag/remove.go
new file mode 100644
index 0000000..ca0f1b4
--- /dev/null
+++ b/cmd/tag/remove.go
@@ -0,0 +1,87 @@
+/*
+Copyright © 2025 NAME HERE <EMAIL ADDRESS>
+
+*/
+package tag
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/spf13/cobra"
+ "github.com/scrotadamus/ghligh/document"
+)
+
+var tagRemoveCmd = &cobra.Command{
+ Use: "remove",
+ Short: "remove ghligh tags from a pdf files using regex",
+ Long: `A longer description that spans multiple lines and likely contains examples
+and usage of using your command. For example:
+
+Cobra is a CLI library for Go that empowers applications.
+This application is a tool to generate the needed files
+to quickly create a Cobra application.`,
+ Run: func(cmd *cobra.Command, args []string) {
+ if len(args) == 0 {
+ cmd.Help()
+ return
+ }
+
+ if regex == "" && exact == "" {
+ fmt.Fprintf(os.Stderr, "either regex or exact must be set with --regex or --exact\n")
+ os.Exit(1)
+ }
+
+ nosafe, err := cmd.Flags().GetBool("nosafe")
+ if err != nil {
+ cmd.Help()
+ return
+ }
+
+ // just a little hack -> boundaries = nosafe ? "" : `\b`
+ boundaries := map[bool]string{true: "", false: `\b`}[nosafe]
+ regex = formatRegex(regex, boundaries)
+
+ // if exact set overwrite regex
+ if exact != "" {
+ regex = `^` + exact + `$`
+ }
+
+ for _, file := range(args){
+ doc, err := document.Open(file)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "%v\n", err)
+ continue
+ }
+
+ tags := regexSlice(regex, doc.GetTags())
+ removedTags := doc.RemoveTags(tags)
+ doc.Save()
+ doc.Close()
+
+ fmt.Printf("removed %d tags from %s\n", removedTags, doc.Path)
+ }
+
+ },
+}
+
+func init() {
+ TagCmd.AddCommand(tagRemoveCmd)
+
+ // Here you will define your flags and configuration settings.
+
+ // Cobra supports Persistent Flags which will work for this command
+ // and all subcommands, e.g.:
+ // removetagsCmd.PersistentFlags().String("foo", "", "A help for foo")
+
+ // Cobra supports local flags which will only run when this command
+ // is called directly, e.g.:
+ // removetagsCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
+ tagRemoveCmd.Flags().StringVarP(&regex, "regex", "r", "", "regex")
+ tagRemoveCmd.Flags().StringVarP(&exact, "exact", "e", "", "exact")
+ tagRemoveCmd.Flags().BoolP("nosafe", "", false, "don't use safe boundaries around regex")
+
+ //if err := tagRemoveCmd.MarkFlagRequired("regex"); err != nil {
+ //panic(err)
+ //}
+}
diff --git a/cmd/tag/show.go b/cmd/tag/show.go
new file mode 100644
index 0000000..3d8ae62
--- /dev/null
+++ b/cmd/tag/show.go
@@ -0,0 +1,82 @@
+/*
+Copyright © 2025 NAME HERE <EMAIL ADDRESS>
+
+*/
+package tag
+
+import (
+ "fmt"
+ "os"
+
+ "encoding/json"
+ "github.com/spf13/cobra"
+ "github.com/scrotadamus/ghligh/document"
+)
+
+var tagShowCmd = &cobra.Command{
+ Use: "show",
+ Short: "show ghligh tags of pdf files [json]",
+ Long: `A longer description that spans multiple lines and likely contains examples
+and usage of using your command. For example:
+
+Cobra is a CLI library for Go that empowers applications.
+This application is a tool to generate the needed files
+to quickly create a Cobra application.`,
+ Run: func(cmd *cobra.Command, args []string) {
+ if len(args) == 0 {
+ cmd.Help()
+ return
+ }
+
+ indent, err := cmd.Flags().GetBool("indent")
+ if err != nil {
+ cmd.Help()
+ return
+ }
+
+ exportTags := make(map[string][]string)
+ for _, file := range(args){
+ doc, err := document.Open(file)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "%v\n", err)
+ continue
+ }
+
+ if regex != "" {
+ regex = formatRegex(regex, "")
+ }
+ tags := regexSlice(regex, doc.GetTags())
+
+ exportTags[doc.Path] = tags
+
+ doc.Close()
+
+ }
+
+ var jsonBytes []byte
+ if indent {
+ jsonBytes, err = json.MarshalIndent(exportTags, "", " ")
+ } else {
+ jsonBytes, err = json.Marshal(exportTags)
+ }
+ if err != nil {
+ panic(err)
+ }
+ fmt.Println(string(jsonBytes))
+ },
+}
+
+func init() {
+ TagCmd.AddCommand(tagShowCmd)
+
+ // Here you will define your flags and configuration settings.
+
+ // Cobra supports Persistent Flags which will work for this command
+ // and all subcommands, e.g.:
+ // showtagsCmd.PersistentFlags().String("foo", "", "A help for foo")
+
+ // Cobra supports local flags which will only run when this command
+ // is called directly, e.g.:
+ tagShowCmd.Flags().BoolP("indent", "i", false, "indent the json data")
+ tagShowCmd.Flags().StringVarP(&regex, "regex", "r", "", "regex")
+}
diff --git a/cmd/tag/tag.go b/cmd/tag/tag.go
new file mode 100644
index 0000000..30e41c8
--- /dev/null
+++ b/cmd/tag/tag.go
@@ -0,0 +1,63 @@
+/*
+Copyright © 2025 NAME HERE <EMAIL ADDRESS>
+
+*/
+package tag
+
+import (
+ "regexp"
+ "github.com/spf13/cobra"
+)
+
+
+var tags []string
+
+var regex, exact string
+
+func formatRegex(r string, boundaries string) string {
+ //return `\b` + r + `\b`
+ return boundaries + r + boundaries
+}
+
+func regexSlice(regex string, slice []string) []string {
+ if regex == "" {
+ return slice
+ }
+
+ var newSlice []string
+ re, err := regexp.Compile(regex)
+ if err != nil {
+ panic(err)
+ }
+ for _, s := range(slice){
+ if re.MatchString(s){
+ newSlice = append(newSlice, s)
+ }
+ }
+
+ return newSlice
+}
+
+// tagCmd represents the tag command
+var TagCmd = &cobra.Command{
+ Use: "tag",
+ Short: "manage pdf tags",
+ Long: `a tag is a string you can attach to a pdf
+.`,
+}
+
+func init() {
+ //rootCmd.AddCommand(tagCmd)
+
+ // Here you will define your flags and configuration settings.
+
+ // Cobra supports Persistent Flags which will work for this command
+ // and all subcommands, e.g.:
+ // tagCmd.PersistentFlags().String("foo", "", "A help for foo")
+
+ // Cobra supports local flags which will only run when this command
+ // is called directly, e.g.:
+ // tagCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
+ // TODO add to "add" command
+ // tagCmd.Flags().StringArrayVarP(&tags, "tag", "t", []string{}, "Tag da associare ai file (può essere usato più volte)")
+}