284 lines
5.9 KiB
Go
284 lines
5.9 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/manifoldco/promptui"
|
|
)
|
|
|
|
func main() {
|
|
prompt := promptui.SelectWithAdd{
|
|
Label: "What's your source file path",
|
|
Items: []string{"/Users/ehlxr/WorkSpaces/blog/Hexo/source/_posts"},
|
|
AddLabel: "Input your source file path",
|
|
}
|
|
|
|
_, source, err := prompt.Run()
|
|
if err != nil {
|
|
fmt.Printf("prompt failed %v\n", err)
|
|
return
|
|
}
|
|
|
|
files := getFiles(source)
|
|
for _, file := range files {
|
|
has, err := hasSlug(file)
|
|
if err != nil {
|
|
//fmt.Printf("hasSlug file: %s failed: %v\n", file, err)
|
|
continue
|
|
}
|
|
if has {
|
|
//println("file have content slug already")
|
|
continue
|
|
}
|
|
//
|
|
// bytes, err := handleText(file)
|
|
// if err != nil {
|
|
// fmt.Printf("handleText file: %s failed: %v\n", file, err)
|
|
// continue
|
|
// }
|
|
//
|
|
// if len(bytes) > 0 {
|
|
// err = writeFile(file, bytes)
|
|
// if err != nil {
|
|
// fmt.Printf("writeFile file: %s failed: %v\n", file, err)
|
|
// continue
|
|
// }
|
|
//
|
|
// fmt.Printf("deal file: %s done!!!\n", file)
|
|
// }
|
|
|
|
//desc, err := genDesc(file)
|
|
//if err != nil {
|
|
// fmt.Printf("genDesc file: %s failed: %v\n", file, err)
|
|
//}
|
|
|
|
desc, err := genIndexImg(file)
|
|
if err != nil {
|
|
fmt.Printf("genDesc file: %s failed: %v\n", file, err)
|
|
continue
|
|
}
|
|
if len(desc) <= 0 {
|
|
continue
|
|
}
|
|
println(file, "=", string(desc))
|
|
|
|
bytes, err := genNew(file, string(desc))
|
|
if err != nil {
|
|
fmt.Printf("genNew file: %s failed: %v\n", file, err)
|
|
}
|
|
|
|
if len(bytes) > 0 {
|
|
err = writeFile(file, bytes)
|
|
if err != nil {
|
|
fmt.Printf("writeFile file: %s failed: %v\n", file, err)
|
|
continue
|
|
}
|
|
|
|
fmt.Printf("deal file: %s done!!!\n", file)
|
|
}
|
|
}
|
|
}
|
|
|
|
func hasSlug(file string) (bool, error) {
|
|
f, err := os.OpenFile(file, os.O_RDONLY, 0644)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
defer f.Close()
|
|
|
|
fd, err := ioutil.ReadAll(f)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
if strings.Index(string(fd), "index_img:") > -1 {
|
|
return true, nil
|
|
}
|
|
|
|
return false, nil
|
|
}
|
|
|
|
func handleText(path string) ([]byte, error) {
|
|
file, err := os.OpenFile(path, os.O_RDONLY, 0644)
|
|
if err != nil {
|
|
log.Printf("cannot open text file: %s, err: [%v]", path, err)
|
|
return nil, err
|
|
}
|
|
defer file.Close()
|
|
|
|
output := make([]byte, 0)
|
|
// 按行读取文件
|
|
scanner := bufio.NewScanner(file)
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
// line := scanner.Bytes()
|
|
|
|
output = append(output, line...)
|
|
output = append(output, []byte("\n")...)
|
|
|
|
if strings.Index(line, "title:") > -1 {
|
|
newByte := strings.Replace(line, "title:", "slug:", 1)
|
|
output = append(output, newByte...)
|
|
output = append(output, []byte("\n")...)
|
|
}
|
|
}
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
log.Printf("cannot scanner text file: %s, err: [%v]", path, err)
|
|
return nil, err
|
|
}
|
|
|
|
return output, nil
|
|
}
|
|
|
|
func genDesc(path string) ([]byte, error) {
|
|
file, err := os.OpenFile(path, os.O_RDONLY, 0644)
|
|
if err != nil {
|
|
log.Printf("cannot open text file: %s, err: [%v]", path, err)
|
|
return nil, err
|
|
}
|
|
defer file.Close()
|
|
|
|
// 按行读取文件
|
|
scanner := bufio.NewScanner(file)
|
|
var identifier int
|
|
output := make([]byte, 0)
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
// line := scanner.Bytes()
|
|
|
|
if line == "<!--more-->" {
|
|
break
|
|
}
|
|
|
|
if identifier < 2 && line == "---" {
|
|
identifier++
|
|
continue
|
|
}
|
|
|
|
if identifier == 2 && line != "" {
|
|
output = append(output, line...)
|
|
output = append(output, []byte("\n")...)
|
|
output = append(output, []byte("\n")...)
|
|
output = append(output, []byte("\n")...)
|
|
}
|
|
}
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
log.Printf("cannot scanner text file: %s, err: [%v]", path, err)
|
|
return nil, err
|
|
}
|
|
|
|
return output, nil
|
|
}
|
|
|
|
func genIndexImg(path string) ([]byte, error) {
|
|
file, err := os.OpenFile(path, os.O_RDONLY, 0644)
|
|
if err != nil {
|
|
log.Printf("cannot open text file: %s, err: [%v]", path, err)
|
|
return nil, err
|
|
}
|
|
defer file.Close()
|
|
|
|
// 按行读取文件
|
|
scanner := bufio.NewScanner(file)
|
|
output := make([]byte, 0)
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
// line := scanner.Bytes()
|
|
|
|
if strings.Index(line, "https://cdn.jsdelivr.net/gh/0vo/oss/images") > -1 {
|
|
newByte := strings.Split(line, "https")[1]
|
|
newByte = strings.Split(newByte, " ")[0]
|
|
newByte = strings.Split(newByte, ")")[0]
|
|
output = append(output, "https"...)
|
|
output = append(output, newByte...)
|
|
break
|
|
}
|
|
}
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
log.Printf("cannot scanner text file: %s, err: [%v]", path, err)
|
|
return nil, err
|
|
}
|
|
|
|
return output, nil
|
|
}
|
|
|
|
func genNew(path string, des string) ([]byte, error) {
|
|
file, err := os.OpenFile(path, os.O_RDONLY, 0644)
|
|
if err != nil {
|
|
log.Printf("cannot open text file: %s, err: [%v]", path, err)
|
|
return nil, err
|
|
}
|
|
defer file.Close()
|
|
|
|
// 按行读取文件
|
|
scanner := bufio.NewScanner(file)
|
|
var identifier int
|
|
output := make([]byte, 0)
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
|
|
if identifier < 2 && line == "---" {
|
|
identifier++
|
|
}
|
|
|
|
if identifier == 2 && line == "---" {
|
|
identifier++
|
|
|
|
output = append(output, fmt.Sprintf("index_img: \"%s\"", des)...)
|
|
output = append(output, []byte("\n")...)
|
|
}
|
|
|
|
output = append(output, line...)
|
|
output = append(output, []byte("\n")...)
|
|
}
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
log.Printf("cannot scanner text file: %s, err: [%v]", path, err)
|
|
return nil, err
|
|
}
|
|
|
|
return output, nil
|
|
}
|
|
|
|
func writeFile(path string, b []byte) error {
|
|
file, err := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0777)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
_, err = file.Write(b)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func getFiles(root string) (files []string) {
|
|
err := filepath.Walk(root, func(p string, f os.FileInfo, err error) error {
|
|
if f == nil {
|
|
return nil
|
|
}
|
|
if p == root || f.IsDir() {
|
|
return nil
|
|
}
|
|
files = append(files, p)
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
fmt.Printf("filepath.Walk() returned %v\n", err)
|
|
}
|
|
|
|
return files
|
|
}
|