Compare commits

..

No commits in common. "main" and "v1.0.10" have entirely different histories.

4 changed files with 21 additions and 125 deletions

View File

@ -1,10 +1,5 @@
# CHANGELOG
## v1.5.1 (2026-06-08)
- **JS 对齐 & 智能文档**:
- 将所有注册到 `jsmod` 的方法名统一为 PascalCase。
- **可选参数优化**: 将 `Open``password``Save``filename` 改为指针类型。配合最新的 `go/js` 引擎,生成的 `.d.ts` 定义将正确提示为可选参数 `?`,极大优化了 AI 编码体验。
## v1.1.0 (2026-05-17)
- **PDF 语义重构**: 引入全局语义分析引擎。
- **无缝流**: 彻底移除分页干扰(移除 `---``Page X` 标记),实现跨页内容自然合并。

15
go.mod
View File

@ -3,18 +3,17 @@ module apigo.cc/go/document
go 1.25.0
require (
apigo.cc/go/cast v1.5.0
apigo.cc/go/file v1.5.0
apigo.cc/go/jsmod v1.5.0
apigo.cc/go/cast v1.3.3
apigo.cc/go/file v1.3.2
github.com/dslipak/pdf v0.0.2
github.com/xuri/excelize/v2 v2.10.1
github.com/young2j/oxmltotext v1.0.3
)
require (
apigo.cc/go/encoding v1.5.0 // indirect
apigo.cc/go/rand v1.5.0 // indirect
apigo.cc/go/safe v1.5.0 // indirect
apigo.cc/go/encoding v1.3.1 // indirect
apigo.cc/go/rand v1.3.1 // indirect
apigo.cc/go/safe v1.3.1 // indirect
github.com/andybalholm/brotli v1.0.5 // indirect
github.com/dgrr/quickxml v0.0.0-20201022091424-4977de546d6c // indirect
github.com/klauspost/compress v1.17.0 // indirect
@ -28,10 +27,10 @@ require (
github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9 // indirect
go.uber.org/multierr v1.10.0 // indirect
go.uber.org/zap v1.26.0 // indirect
golang.org/x/crypto v0.52.0 // indirect
golang.org/x/crypto v0.51.0 // indirect
golang.org/x/image v0.40.0 // indirect
golang.org/x/net v0.54.0 // indirect
golang.org/x/sys v0.45.0 // indirect
golang.org/x/sys v0.44.0 // indirect
golang.org/x/text v0.37.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

28
go.sum
View File

@ -1,15 +1,13 @@
apigo.cc/go/cast v1.5.0 h1:UBGJtFQ8eJPMQXs37cUgqd7YQo1zI9opuSDBDmn2/pE=
apigo.cc/go/cast v1.5.0/go.mod h1:z2GW5p5WCZGEqVVIJUdhl232vRbLf2Qu4EDlEakX/D8=
apigo.cc/go/encoding v1.5.0 h1:EJNdRVDOMoI2DAvZwQNQTbYuqB/6zsEzvg7lS5pQI+I=
apigo.cc/go/encoding v1.5.0/go.mod h1:8++NfZj3hWig0qh2g7GQRw/4LpSvCYMWUZ+8J+x58cA=
apigo.cc/go/file v1.5.0 h1:Fh1NSDBqaxjuXYJ71yPHPXVJ8BFEv/AGS3l+jkLi5uw=
apigo.cc/go/file v1.5.0/go.mod h1:4YhOGgBINTpmmmgws3H8LAyXQQBGzBp44hYUoCS+kr0=
apigo.cc/go/jsmod v1.5.0 h1:JgQtJNiJWy1NOP9AzE8NX5VXJkpO/x3GqLsCCSny5Ec=
apigo.cc/go/jsmod v1.5.0/go.mod h1:bmyeZtOAP/j5am+YRnaiM89smysK24K7ebk0koFtsSw=
apigo.cc/go/rand v1.5.0 h1:1o8hh8fhdBuk1/h02IvugvamuT3dkWbVJrqEJVQKB2E=
apigo.cc/go/rand v1.5.0/go.mod h1:Lh98S2dm9UY0X+M+kNQQEKyXHG5pcCKSFPyXN0QCGdk=
apigo.cc/go/safe v1.5.0 h1:W1NblmcU8cex1f9Y5z8mNLUJOzZTE1s6fszb3FbhGnk=
apigo.cc/go/safe v1.5.0/go.mod h1:OfQ5d6COePSGEuPvMeOk6KagX2sezw7nvKh7exj9SeM=
apigo.cc/go/cast v1.3.3 h1:aln5eDR5DZVWVzZ/y5SJh1gQNgWv2sT82I25NaO9g34=
apigo.cc/go/cast v1.3.3/go.mod h1:lGlwImiOvHxG7buyMWhFzcdvQzmSaoKbmr7bcDfUpHk=
apigo.cc/go/encoding v1.3.1 h1:y8O58KYAyulkThg1O2ji2BqjnFoSvk42sit9I3z+K7Y=
apigo.cc/go/encoding v1.3.1/go.mod h1:xAJk5b83VZ31mXMTnyp0dfMoBKfT/AHDn0u+cQfojgY=
apigo.cc/go/file v1.3.2 h1:pu4oiDyiqgj3/eykfnJf+/6+A9v/Z0b3ClP5XK+lwG4=
apigo.cc/go/file v1.3.2/go.mod h1:vci4h0Pz94mV6dkniQkuyBYERVYeq7/LX4jJVuCg9hs=
apigo.cc/go/rand v1.3.1 h1:7FvsI6PtQ5XrWER0dTiLVo0p7GIxRidT/TBKhVy93j8=
apigo.cc/go/rand v1.3.1/go.mod h1:mZ/4Soa3bk+XvDaqPWJuUe1bfEi4eThBj1XmEAuYxsk=
apigo.cc/go/safe v1.3.1 h1:irTCqPAC97gGsX/Lw5AzLelDt1xXLEZIAaVhLELWe9Q=
apigo.cc/go/safe v1.3.1/go.mod h1:XdOpBhN2vkImalaykYXXmEpczqWa1y3ah6/Q72cdRqE=
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@ -58,12 +56,14 @@ go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988=
golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=
golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8=
golang.org/x/image v0.40.0 h1:Tw4GyDXMo+daZN1znreBRC3VayR1aLFUyUEOLUdW1a8=
golang.org/x/image v0.40.0/go.mod h1:uIc348UZMSvS5Z65CVZ7iDPaNobNFEPeJ4kbqTOszmA=
golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w=
golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ=
golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

View File

@ -1,98 +0,0 @@
package document
import (
"context"
"apigo.cc/go/file"
"apigo.cc/go/jsmod"
)
func init() {
jsmod.Register("document", map[string]any{
"Open": func(ctx context.Context, filename string, password *string) (*jsDocument, error) {
p, err := file.VerifyPathForSafeMode(ctx, filename)
if err != nil {
return nil, err
}
var doc Document
if password != nil {
doc, err = Open(p, *password)
} else {
doc, err = Open(p)
}
if err != nil {
return nil, err
}
return &jsDocument{ctx: ctx, d: doc}, nil
},
"Create": func(ctx context.Context, ext string) (*jsDocument, error) {
doc, err := Create(ext)
if err != nil {
return nil, err
}
return &jsDocument{ctx: ctx, d: doc}, nil
},
"NewExcel": func(ctx context.Context) *jsDocument {
return &jsDocument{ctx: ctx, d: NewExcel()}
},
"NewGraph": func(ctx context.Context) *jsDocument {
return &jsDocument{ctx: ctx, d: NewGraph()}
},
})
}
type jsDocument struct {
ctx context.Context
d Document
}
func (j *jsDocument) ToJSON() string { return j.d.ToJSON() }
func (j *jsDocument) ToMarkdown() string { return j.d.ToMarkdown() }
func (j *jsDocument) Save(filename *string) error {
var targetPath string
if filename != nil && *filename != "" {
p, err := file.VerifyPathForSafeMode(j.ctx, *filename)
if err != nil {
return err
}
targetPath = p
}
return j.d.Save(targetPath)
}
// Excel 增强方法 (如果底层是 Excel)
func (j *jsDocument) Get(sheetName string, start, end string) ([][]any, error) {
if x, ok := j.d.(*Excel); ok {
return x.Get(sheetName, start, end)
}
return nil, nil
}
func (j *jsDocument) GetData(sheetName string, start, end string) ([]map[string]any, error) {
if x, ok := j.d.(*Excel); ok {
return x.GetData(sheetName, start, end)
}
return nil, nil
}
func (j *jsDocument) Set(sheetName string, table [][]any, start, end string) error {
if x, ok := j.d.(*Excel); ok {
return x.Set(sheetName, table, start, end)
}
return nil
}
func (j *jsDocument) SetData(sheetName string, data []map[string]any, start, end string) error {
if x, ok := j.d.(*Excel); ok {
return x.SetData(sheetName, data, start, end)
}
return nil
}
func (j *jsDocument) Sheets() []string {
if x, ok := j.d.(*Excel); ok {
return x.Sheets()
}
return nil
}