Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# dpdigital
# 1.1.2
- Adding server for parsing and delivery, using project as application.


# original solafide authors:
# 1.1.1
- Added additional meta data to bible objects
# 1.1.0
Expand Down
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2023 Sola Fide
Copyright (c) 2023 DPDIGITAL, LLC

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
47 changes: 44 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Gobible is a library for interacting with the Bible in Go.
Initially, Gobible was created as an effort to support an easy to use JSON format for the Bible for use in other projects,
but through development has grown to instead be a library for working with that format, as well and importing other formats into the Gobible format.
### Supported Formats
- Gobible JSON [Example](https://raw.githubusercontent.com/gobible/gobible/master/data/WEB.json)
- Gobible JSON [Example](https://raw.githubusercontent.com/gobible/gobible/master/data/KJV.json)
- OSIS XML [Example](https://raw.githubusercontent.com/gobible/gobible/master/data/WEB.xml)


Expand All @@ -24,10 +24,10 @@ There are a few ways to initialize a bible:
b := NewGoBible()

// Load a GoBible formatted JSON file
b.Load("KJV.json")
b.Load("data/KJV.json")

// Load an alternate support format
b.LoadFormat("WEB.xml", "osis")
b.LoadFormat("data/WEB.xml", "osis")
```

One you have a Bible object with some translations loaded into it, you can use this object in a few ways.
Expand Down Expand Up @@ -88,6 +88,47 @@ for _, r := range refs {
// Genesis 2:1 The heavens and the earth were finished, and all the host of them.
```

## Create HTTP Handlers to Embed Bible functionality into your web services or apps
```go
//server.go
func VerseServeHTTP(w http.ResponseWriter, r *http.Request) {
// Initialize an empty GoBible object
b := NewGoBible()

// Load a GoBible formatted JSON file
b.Load("data/KJV.json")

ref := GetReference(r)
if ref == "" {
http.Error(w, "missing reference argument", http.StatusBadRequest)
return
}

log.Println("parsing BIBLE REF..", ref)
verses, err := b.ParseReference(ref)
if err != nil {
log.Println("failed to parse reference:", err)
http.Error(w, "invalid reference format", http.StatusBadRequest)
return
}
verseList := make([]ReferenceDTO, len(verses))
for i, v := range verses {
verseList[i] = ReferenceDTO{
Book: v.Book,
Chapter: v.Chapter,
Verse: v.Verse,
Text: v.VerseRef.Text,
}
}

WriteHttpJson(verseList, w)
}
```
# Now Query:
```sh
curl http://127.0.0.1:7777/verse?ref=Genesis%201:1-3
```

## Looking for Bibles?

We have published a few Public Domain bibles, as well as a Go program to generate additional ones in the [gobible-gen](https://github.com/solafide-dev/gobible-gen) repo.
11 changes: 11 additions & 0 deletions executions.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[=]VERSE SERVE[=]SERVER START: 2026-04-02 04:20:38.688610432 -0500 CDT
[=]VERSE SERVE[=]parsing.. Genesis 1:1-3
[=]VERSE SERVE[=]parsing BIBLE REF.. Genesis 1:1-3
[=]VERSE SERVE[=]book Genesis
[=]VERSE SERVE[=]chapterVersePart 1:1-3
[=]VERSE SERVE[=]chapterVerseParts [1:1 3]
[=]VERSE SERVE[=]startVerse 1
[=]VERSE SERVE[=]len(chapterVerseParts) 2
[=]VERSE SERVE[=]chapter 1
[=]VERSE SERVE[=]start 1
[=]VERSE SERVE[=]end 3
13 changes: 8 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
module github.com/solafide-dev/gobible
module github.com/dpdatadev/gobible
//upgraded from github.com/solafide-dev/gobible v1.1.1 (1.19)
go 1.24

go 1.19
require (
github.com/pkg/errors v0.9.1
github.com/solafide-dev/gobible v1.1.1
github.com/stretchr/testify v1.8.4
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/objx v0.5.0 // indirect
github.com/stretchr/testify v1.8.4 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
11 changes: 3 additions & 8 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/solafide-dev/gobible v1.1.1 h1:gnEnnavD3gCHI0uwk1dxfh8tOgz6d7lN5+P7FLkUdLU=
github.com/solafide-dev/gobible v1.1.1/go.mod h1:vNQz0MXUfedUc33zqelugXug0gUOx4K6aOcmUr9aE7Y=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
2 changes: 1 addition & 1 deletion gobible.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gobible
package main

import (
_ "embed"
Expand Down
2 changes: 1 addition & 1 deletion gobible_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gobible
package main

import (
"testing"
Expand Down
19 changes: 10 additions & 9 deletions reference.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package gobible
package main

import (
"errors"
"log"
"strconv"
"strings"

Expand Down Expand Up @@ -73,9 +74,9 @@ func (g *GoBible) ParseReference(reference string) (References, error) {
chapterVersePart := parts[len(parts)-1]
chapterVerseParts := strings.Split(chapterVersePart, "-")

//log.Println("book", book)
//log.Println("chapterVersePart", chapterVersePart)
//log.Println("chapterVerseParts", chapterVerseParts)
log.Println("book", book)
log.Println("chapterVersePart", chapterVersePart)
log.Println("chapterVerseParts", chapterVerseParts)

var startChapter, endChapter, startVerse, endVerse int
chapterParts := strings.Split(chapterVerseParts[0], ":")
Expand All @@ -97,9 +98,9 @@ func (g *GoBible) ParseReference(reference string) (References, error) {
return nil, err
}

//log.Println("startVerse", startVerse)
log.Println("startVerse", startVerse)

//log.Println("len(chapterVerseParts)", len(chapterVerseParts))
log.Println("len(chapterVerseParts)", len(chapterVerseParts))

if len(chapterVerseParts) > 1 {
chapterParts := strings.Split(chapterVerseParts[1], ":")
Expand Down Expand Up @@ -135,11 +136,11 @@ func (g *GoBible) ParseReference(reference string) (References, error) {

var references []Reference
for chapter := startChapter; chapter <= endChapter; chapter++ {
//log.Println("chapter", chapter)
log.Println("chapter", chapter)
start, end := startVerse, endVerse

//log.Println("start", start)
//log.Println("end", end)
log.Println("start", start)
log.Println("end", end)

if chapter > startChapter {
start = 1
Expand Down
2 changes: 1 addition & 1 deletion reference_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gobible
package main

import (
"testing"
Expand Down
116 changes: 116 additions & 0 deletions server.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package main

/*
TODO, add KJV.db (Sqlite)
(parsing references and actually delivering the verses)
- Add a function to query the database and return the results
- Add a function to handle HTTP requests and return the results as JSON
- Add a function to handle errors and return appropriate HTTP status codes
*/

import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"time"

"github.com/pkg/errors"
)

type ReferenceDTO struct {
Book string `json:"book"`
Chapter int `json:"chapter"`
Verse int `json:"verse"`
Text string `json:"text"`
}

func init() {
log.SetPrefix("[=]VERSE SERVE[=]")
log.SetFlags(0)
localLog := GetFileWrite("executions.log")
log.SetOutput(localLog)
log.Printf("SERVER START: %s\n", time.Now().Local().String())
}

// Return files for Logging or dumping
func GetFileWrite(fileName string) *os.File {
if fileName == "" {
log.Fatalf("errors.New(\"\"): %v\n", errors.New("WRITE FILE ERROR"))
return nil
}

file, err := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
log.Fatalf("errors.New(\"\"): %v\n", err)
return nil
}

return file
}

func WriteHttpJson(v any, w http.ResponseWriter) {
b, err := json.Marshal(v)
if err != nil {
log.Println("failed to serialize response:", err)
return
}
w.Header().Add("Content-Type", "application/json")
w.Write(b)
}

func GetReference(r *http.Request) string {
ref := r.URL.Query().Get("ref")
if ref == "" {
missingMsg := "missing reference argument"
log.Println(missingMsg)
return errors.New(missingMsg).Error()
}

log.Println("parsing..", ref)

return ref
}

func VerseServeHTTP(w http.ResponseWriter, r *http.Request) {
// Initialize an empty GoBible object
b := NewGoBible()

// Load a GoBible formatted JSON file
b.Load("data/KJV.json")

ref := GetReference(r)
if ref == "" {
http.Error(w, "missing reference argument", http.StatusBadRequest)
return
}

log.Println("parsing BIBLE REF..", ref)
verses, err := b.ParseReference(ref)
if err != nil {
log.Println("failed to parse reference:", err)
http.Error(w, "invalid reference format", http.StatusBadRequest)
return
}
verseList := make([]ReferenceDTO, len(verses))
for i, v := range verses {
verseList[i] = ReferenceDTO{
Book: v.Book,
Chapter: v.Chapter,
Verse: v.Verse,
Text: v.VerseRef.Text,
}
}

WriteHttpJson(verseList, w)
}

func main() {
// example usage: http://127.0.1:777/verse?ref=Genesis%201:1-3
http.HandleFunc("/verse", VerseServeHTTP)
fmt.Println("Starting [/verse] endpoint on :7777...")
if err := http.ListenAndServe(":7777", nil); err != nil {
log.Fatalf("failed to start server: %v\n", err)
}
}