6 changed files with 52 additions and 175 deletions
@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
|
||||
INT. HOUSE - DAY |
||||
|
||||
MARY |
||||
I can't believe how easy it is to write in Fountain. |
||||
|
||||
TOM |
||||
(typing) |
||||
Look! I just made a parenthetical! |
||||
|
||||
SOMETHING HAPPENS! |
||||
|
||||
(what? I don't know...) |
||||
|
||||
EXT. GARDEN |
||||
|
||||
TOM |
||||
What am I doing here now? |
||||
To be honest, I have absolutely no idea! |
||||
|
||||
And that means really no idea! |
@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
|
||||
INT. HOUSE - DAY |
||||
|
||||
MARY |
||||
I can't believe how easy it is to write in Fountain. |
||||
|
||||
TOM |
||||
(typing) |
||||
Look! I just made a parenthetical! |
||||
|
||||
SOMETHING HAPPENS! |
||||
|
||||
(what? I don't know...) |
||||
|
||||
EXT. GARDEN |
||||
|
||||
TOM |
||||
What am I doing here now? |
||||
To be honest, I have absolutely no idea! |
||||
|
||||
And that means really no idea! |
@ -1,120 +1,11 @@
@@ -1,120 +1,11 @@
|
||||
package main |
||||
|
||||
import ( |
||||
"github.com/jung-kurt/gofpdf" |
||||
"io/ioutil" |
||||
"os" |
||||
"strings" |
||||
"github.com/lapingvino/lexington/lex" |
||||
"github.com/lapingvino/lexington/pdf" |
||||
"github.com/lapingvino/lexington/rules" |
||||
) |
||||
|
||||
type Action int |
||||
|
||||
var example = ` |
||||
INT. HOUSE - DAY |
||||
|
||||
MARY |
||||
I can't believe how easy it is to write in Fountain. |
||||
|
||||
TOM |
||||
(typing) |
||||
Look! I just made a parenthetical! |
||||
|
||||
SOMETHING HAPPENS! |
||||
|
||||
(what? I don't know...) |
||||
|
||||
EXT. GARDEN |
||||
|
||||
TOM |
||||
What am I doing here now? |
||||
To be honest, I have absolutely no idea! |
||||
|
||||
And that means really no idea! |
||||
` |
||||
|
||||
var action = map[string]struct { |
||||
Left, Width float64 |
||||
}{ |
||||
"action": {1.5, 6}, |
||||
"speaker": {4.2, 3.3}, |
||||
"dialog": {2.9, 3.3}, |
||||
"scene": {1.5, 6}, |
||||
"paren": {3.6, 2}, |
||||
"trans": {6, 1.5}, |
||||
"note": {1.5, 6}, |
||||
"allcaps": {1.5, 6}, |
||||
"empty": {1.5, 6}, |
||||
} |
||||
|
||||
var tr func(string) string |
||||
|
||||
type Tree struct { |
||||
PDF *gofpdf.Fpdf |
||||
F []struct { |
||||
Format string |
||||
Text string |
||||
} |
||||
} |
||||
|
||||
func (t Tree) pr(a string, text string) { |
||||
line(t.PDF, action[a].Left, action[a].Width, text) |
||||
} |
||||
|
||||
func (t Tree) Render() { |
||||
for _, row := range t.F { |
||||
t.pr(row.Format, row.Text) |
||||
} |
||||
} |
||||
|
||||
func line(pdf *gofpdf.Fpdf, jump, width float64, text string) { |
||||
pdf.SetX(jump) |
||||
pdf.MultiCell(width, 0.19, tr(text), "", "aligned", false) |
||||
} |
||||
|
||||
func (t *Tree) ParseString(play string) { |
||||
toParse := strings.Split(play, "\n") |
||||
for i, row := range toParse { |
||||
action := "action" |
||||
if row == strings.ToUpper(row) { |
||||
action = "allcaps" |
||||
} |
||||
if row == "" { |
||||
action = "empty" |
||||
} else { |
||||
if i > 0 { |
||||
switch t.F[i-1].Format { |
||||
case "allcaps": |
||||
t.F[i-1].Format = "speaker" |
||||
if row[0] == '(' && row[len(row)-1] == ')' { |
||||
action = "paren" |
||||
} else { |
||||
action = "dialog" |
||||
} |
||||
case "paren", "dialog": |
||||
action = "dialog" |
||||
} |
||||
} |
||||
} |
||||
t.F = append(t.F, struct{ Format, Text string }{action, row}) |
||||
} |
||||
} |
||||
|
||||
func main() { |
||||
pdf := gofpdf.New("P", "in", "Letter", "") |
||||
tr = pdf.UnicodeTranslatorFromDescriptor("") |
||||
pdf.AddPage() |
||||
pdf.SetFont("courier", "", 12) |
||||
pdf.SetMargins(1, 1, 1) |
||||
pdf.SetXY(1, 1) |
||||
f := Tree{PDF: pdf} |
||||
input, err := ioutil.ReadAll(os.Stdin) |
||||
if err != nil { |
||||
panic(err) |
||||
} |
||||
f.ParseString(string(input)) |
||||
f.Render() |
||||
err = pdf.OutputFileAndClose("fountain.pdf") |
||||
if err != nil { |
||||
panic(err) |
||||
} |
||||
pdf.Create("fountain.pdf", rules.Default, lex.Screenplay{}) |
||||
} |
||||
|
Loading…
Reference in new issue