Giter Site home page Giter Site logo

m1 / gospin Goto Github PK

View Code? Open in Web Editor NEW
55.0 4.0 8.0 2.22 MB

Article spinning and spintax/spinning syntax engine written in Go, useful for A/B, testing pieces of text/articles and creating more natural conversations

License: MIT License

Go 100.00%
golang go golang-library spintax spinning-syntax hacktoberfest

gospin's Introduction

GoSpin

GoDoc Build Status Go Report Card Release Coverage Status

Article spinning and spintax/spinning syntax engine written in Go, useful for A/B, testing pieces of text/articles and creating more natural conversations. Use as a library or as a CLI.

Installation

Use go get to get the latest version

go get github.com/m1/gospin

Then import it into your projects using the following:

import (
	"github.com/m1/gospin"
)

What is spintax?

Take this example:

{hello|hey} world

When spinning an article (the above sentence) each of the words/phrases contained within the curly brackets are randomly picked and substituted in the sentence. So for example, the above article could be spun to be: hey world and hello world

You can also have nested spintax, take this example:

{hello|hey} world, {hope {you're|you are} {okay|good}|have a nice day}

A few examples of what the above could output:

  • hey world, hope you're okay
  • hello world, hope you are good
  • hello world, have a nice day
  • etc...

You can also have optional phrases, just don't specify a word after or before a pipe to make it optional:

{hello|hey}{ world|}, how are you today?

A few examples of what the above could output:

  • hey, how are you today?
  • hello world, how are you today?
  • etc...

Why use spintax?

Spintax can be used for several things. It used to be used a lot for spinning articles for SEO but is less useful for that these days. It's more used for A/B testing, testing pieces of text for efficiency/click through rate. Also it is used spinning content for users to keep things fresh, i.e home page text or ai/chat bots.

Usage

To use as a library is pretty simple:

spinner := gospin.New(nil)
simple := "The {slow|quick} {fox|deer} {gracefully |}jumps over the {sleeping|lazy} dog"

spin := spinner.Spin(simple) // The slow fox jumps over the sleeping dog
spins := spinner.SpinN(simple, 10)
// spins = [
// "The slow fox gracefully jumps over the lazy dog"
// "The slow deer jumps over the sleeping dog"
// "The quick fox jumps over the lazy dog"
// ...
// ]

You can also configure it to take custom syntax (the package uses Jet format as the default), e.g. if you wanted it to set the start and end characters (default are curly brackets) to square brackets:

spinner := gospin.New(&gospin.Config{
        StartChar:     "[",
        EndChar:       "]",
        DelimiterChar: ";",
})
simple := "The [slow;quick] [fox;deer] [gracefully ;]jumps over the [sleeping;lazy] dog"
spin := spinner.Spin(simple) // The slow fox jumps over the sleeping dog

Escaping

To escape, the default character to use is \\, e.g:

The \{slow|quick\} {fox|deer} {gracefully |}jumps over the {sleeping|lazy} dog

Would output something like:

The {slow|quick} fox jumps over the sleeping dog

You can customize the escape char in the config:

spinner := gospin.New(&gospin.Config{
        EscapeChar:    "@",
})
simple := "The @{slow|quick@} {fox|deer} {gracefully |}jumps over the {sleeping|lazy} dog"
spin := spinner.Spin(simple) // The @{slow|quick@} fox jumps over the sleeping dog

Random seeds

The spin by default generates a random seed each spin, to stop this and use your own global rand seed you can use the UseGlobalRand toggle in the config. This is useful for testing:

spinner := gospin.New(&gospin.Config{
        UseGlobalRand: false,
})

CLI usage

GoSpin can also be used on the cli, just install using: go get github.com/m1/gospin/cmd/gospin

To use:

➜  ~ gospin --help                    
GoSpin is a fast and configurable article spinning and spintax engine written in Go.

Usage:
  gospin [text] [flags]

Flags:
      --delimiter string   Delimiter char (default "|")
      --end string         End char for the spinning engine (default "}")
      --escape string      Escape char (default "\\")
  -h, --help               help for gospin
      --start string       Start char for the spinning engine (default "{")
      --times int          How many articles to generate (default 1)

For example:

➜  ~ gospin "{hello|hey} friend"                     
hey friend

To spin multiple, use the times flag, this is outputted as json for easier parsing:

➜  ~ gospin "The {slow|quick} {fox|deer} {gracefully |}jumps over the {sleeping|lazy} dog" --times=5 | jq
[
  "The slow fox gracefully jumps over the sleeping dog",
  "The slow deer jumps over the lazy dog",
  "The quick deer jumps over the sleeping dog",
  "The slow fox gracefully jumps over the sleeping dog",
  "The quick fox jumps over the lazy dog"
]

gospin's People

Contributors

m1 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

gospin's Issues

Slow for large templates and number of articles

Hi, this app works quite slow for bigger templates and larger number of articles, I just run 10000 articles from template, it works for 20 mins and doesn't look like going to finish anytime soon.

Invalid result when the same block (e.g. {hello|hi}) is used in level 1 and then in higher levels.

Hi, i came across the bug that this package spins text like this with invalid result:

original string:
The {slow|quick} {brown|blue and {red|yellow}} {fox|deer} {gracefully |}jumps over the {{slow|quick} {fox|deer}}

result:
The slow blue and yellow fox jumps over the deer}

The problem is that on level!=1 you used block replacement in the original string. So when we are in nested block "{{slow|quick} {fox|deer}}" this replacement is applied to the first occurrence of "{slow|quick}" in the original string.

I've made a fix and will provide pull request soon.

Error in spinner.Spin

When i'm using
spinner.Spin("{Apply|Use} this {special |||}{spintax|spin}")
sometimes the output is "Use thisspintax" which means the white space after "this" is removed.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.