redcloth and dynamic content

D

Dick Davies

I've sat down to write a data-driven webapp. Nice steep
learning curve for me (I'm on my last week here so thought
I'd waste it productively).

So far FastCGI and PostGreSQL (this is an excuse for me
to finally spend time learning SQL in detail, trolls please stfu).

Few questions at the bottom of this, but it'd help to explain
how I got into this mess first...

[ Can I also place a hearty plug for Subversion here - I've
changed designs three or four times over the weekend and
renaming files/classes and nesting libs has been a dream
with it. Definitely a refactoring-friendly VCS..]

The db connection is wrapped in a class, Cnps, which I start up
outside the fcgi mainloop, and is the only thing that is SQL
savvy. The mainloop just calls methods on that class to get data
on demand.

It all works great - thanks to Carl and Ara for their
rubygarden wiki discussions on fastcgi - but
I'm coming to the stage where I have had enough of

out=<<"EOO"
<html><body>
#{cnps.champ} is winning with a score of #{cnps.score(cnps.champ)}
</body>
</html>
EOO


and want to use some kind of template thing.

First go was erb. Works well enough, but pretty verbose for
the Wiki Generation :) So plan B was to use redcloth and erb,
to generate eruby from redcloth templates, store them in another
class and eval them when the requests come in.


Problem with *that* is that I need placeholders in the Textile
for each thing Eruby can parse , so I end up with a lot of <% %>
noise in the templates.

(Doing it the other way round seemed hard to do, since I want to
actually evaluate the dynamic tags at request time, but still preload
the templates).

So, Plan C. Use the ability of RedCloth to create id tags to hook up
to Amrita.

So now we have

request comes in,
fcgi decides what to display,
asks a helper class to get the template,
executes the template using Amrita
and returns the output.

the helper class is responsible for converting the
requested template (textile, (blue|red)cloth, whatever)
to Amrita-ready html.

Problem here is that Amrita doesn't duck type at all, and
it'd really like a Hash. I was hoping to have Cnps just quack
like a Hash, but it isn't going to happen. Arse.


So a few questions:

Is there a way to delay evaluation of tags?
In a 'do the simplest thing' frame of mind, is there a way to
have ruby "" strings evaluated *after* construction?

Amrita seems a bit musty, has it got a successor? Does Kwartz
help me any?

[ This would be my personal preference ]
Is there a facility to extend RedCloth with custom tags?
I could avoid the whole 'do a template from redcloth, then
evaluate template' step that way, and create some kind of unholy
crossbreed of erb/amrita with redcloth?

Something like '>instance.method<' , then these tags get
processed first and return *more* Textile, which finally
gets converted... I'd need to do the evaluation during
to_html(), but that's kind of neat.

Obviously I don't expect anyone else to
put up with that, but if I could add my own tag, that'd be
great. I could see it having lots of uses for others too.


Am I reinventing a wheel here?
 
C

Carl Youngblood

--------------ms070108060207050503020303
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

I haven't looked into it much but I too am not very satisfied with
amrita for templating. I'd like something more like PHP's Smarty.
Haven't had much time to work on ruby web apps lately but when I get
back to my on-hold web app I will probably look into other options.

Carl

Dick said:
I've sat down to write a data-driven webapp. Nice steep
learning curve for me (I'm on my last week here so thought
I'd waste it productively).

So far FastCGI and PostGreSQL (this is an excuse for me
to finally spend time learning SQL in detail, trolls please stfu).

Few questions at the bottom of this, but it'd help to explain
how I got into this mess first...

[ Can I also place a hearty plug for Subversion here - I've
changed designs three or four times over the weekend and
renaming files/classes and nesting libs has been a dream
with it. Definitely a refactoring-friendly VCS..]

The db connection is wrapped in a class, Cnps, which I start up
outside the fcgi mainloop, and is the only thing that is SQL
savvy. The mainloop just calls methods on that class to get data
on demand.

It all works great - thanks to Carl and Ara for their
rubygarden wiki discussions on fastcgi - but
I'm coming to the stage where I have had enough of

out=<<"EOO"
<html><body>
#{cnps.champ} is winning with a score of #{cnps.score(cnps.champ)}
</body>
</html>
EOO


and want to use some kind of template thing.

First go was erb. Works well enough, but pretty verbose for
the Wiki Generation :) So plan B was to use redcloth and erb,
to generate eruby from redcloth templates, store them in another
class and eval them when the requests come in.


Problem with *that* is that I need placeholders in the Textile
for each thing Eruby can parse , so I end up with a lot of <% %>
noise in the templates.

(Doing it the other way round seemed hard to do, since I want to
actually evaluate the dynamic tags at request time, but still preload
the templates).

So, Plan C. Use the ability of RedCloth to create id tags to hook up
to Amrita.

So now we have

request comes in,
fcgi decides what to display,
asks a helper class to get the template,
executes the template using Amrita
and returns the output.

the helper class is responsible for converting the
requested template (textile, (blue|red)cloth, whatever)
to Amrita-ready html.

Problem here is that Amrita doesn't duck type at all, and
it'd really like a Hash. I was hoping to have Cnps just quack
like a Hash, but it isn't going to happen. Arse.


So a few questions:

Is there a way to delay evaluation of tags?
In a 'do the simplest thing' frame of mind, is there a way to
have ruby "" strings evaluated *after* construction?

Amrita seems a bit musty, has it got a successor? Does Kwartz
help me any?

[ This would be my personal preference ]
Is there a facility to extend RedCloth with custom tags?
I could avoid the whole 'do a template from redcloth, then
evaluate template' step that way, and create some kind of unholy
crossbreed of erb/amrita with redcloth?

Something like '>instance.method<' , then these tags get
processed first and return *more* Textile, which finally
gets converted... I'd need to do the evaluation during
to_html(), but that's kind of neat.

Obviously I don't expect anyone else to
put up with that, but if I could add my own tag, that'd be
great. I could see it having lots of uses for others too.


Am I reinventing a wheel here?

--------------ms070108060207050503020303
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
Content-Description: S/MIME Cryptographic Signature

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIPxjCC
BMgwggQxoAMCAQICBAIAApswDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCVVMxGDAWBgNV
BAoTD0dURSBDb3Jwb3JhdGlvbjEcMBoGA1UEAxMTR1RFIEN5YmVyVHJ1c3QgUm9vdDAeFw0w
MjA4MjcxOTA3MDBaFw0wNjAyMjMyMzU5MDBaMIHcMQswCQYDVQQGEwJHQjEXMBUGA1UEChMO
Q29tb2RvIExpbWl0ZWQxHTAbBgNVBAsTFENvbW9kbyBUcnVzdCBOZXR3b3JrMUYwRAYDVQQL
Ez1UZXJtcyBhbmQgQ29uZGl0aW9ucyBvZiB1c2U6IGh0dHA6Ly93d3cuY29tb2RvLm5ldC9y
ZXBvc2l0b3J5MR8wHQYDVQQLExYoYykyMDAyIENvbW9kbyBMaW1pdGVkMSwwKgYDVQQDEyND
b21vZG8gQ2xhc3MgMyBTZWN1cml0eSBTZXJ2aWNlcyBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBALEeYGbgQwaeJ2gvApnHiN+F69tl7NRJZ3ouH83cFSzWHqzynUY6XQPA
PQUsWhgNWSVCo3LArSjSrTwx4ksH+16Y66gz1mmyWp7qLEmmJi5M8MyrQNKq3ixOgbW6e7hc
0Hu9R/XABtLA5NdH22JAr6EcUQMY27jQu5THPHnqJWSuJhnhPGZHZ5Kde1WrNMJ1btknjp2M
8B3aa5yGBKKQteqdjM/7OUOo8BgtnvcZECycL+HQsf/XWcTNQDL514HbURzyQVKBQbGDuMgJ
/pkiR4BPnMuu4CjVHKxwR7Alq6E4Qhdr+mpujV95+PYpAzCkbkbUhV2qQJk4dtseAX3lDKUC
AwEAAaOCAacwggGjMEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93d3cucHVibGljLXRydXN0
LmNvbS9jZ2ktYmluL0NSTC8yMDA2L2NkcC5jcmwwHQYDVR0OBBYEFPZSIhcVEwgDWb8YlZ9I
tLnp/vhmMIGSBgNVHSAEgYowgYcwSQYKKoZIhvhjAQIBBTA7MDkGCCsGAQUFBwIBFi1odHRw
Oi8vd3d3LnB1YmxpYy10cnVzdC5jb20vQ1BTL09tbmlSb290Lmh0bWwwOgYMKwYBBAGyMQEC
AQMBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1AwWAYDVR0j
BFEwT6FJpEcwRTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD0dURSBDb3Jwb3JhdGlvbjEcMBoG
A1UEAxMTR1RFIEN5YmVyVHJ1c3QgUm9vdIICAaMwKwYDVR0QBCQwIoAPMjAwMjA4MjcxOTA3
MzFagQ8yMDA1MDIyMzIzNTkwMFowDgYDVR0PAQH/BAQDAgHmMA8GA1UdEwQIMAYBAf8CAQAw
DQYJKoZIhvcNAQEFBQADgYEAtqewenGL4LqzgR42MnqGGNbxq005CHEGWmegSwHlMEBtibWe
Faqxx/QKxlwO6TfeqJfH3M7Ncft0AgfcXxUnCFMHdtS5BunCd1AeysmwwkaBgACtRKpc1iDZ
VTK+Vpbx6r2g47wNgDrqzPuaV+14pTY9VurR53TKNMPPsVHp4AwwggV5MIIEYaADAgECAhEA
0778lNvXcqTJcbJWukDeKDANBgkqhkiG9w0BAQUFADCB3DELMAkGA1UEBhMCR0IxFzAVBgNV
BAoTDkNvbW9kbyBMaW1pdGVkMR0wGwYDVQQLExRDb21vZG8gVHJ1c3QgTmV0d29yazFGMEQG
A1UECxM9VGVybXMgYW5kIENvbmRpdGlvbnMgb2YgdXNlOiBodHRwOi8vd3d3LmNvbW9kby5u
ZXQvcmVwb3NpdG9yeTEfMB0GA1UECxMWKGMpMjAwMiBDb21vZG8gTGltaXRlZDEsMCoGA1UE
AxMjQ29tb2RvIENsYXNzIDMgU2VjdXJpdHkgU2VydmljZXMgQ0EwHhcNMDMwNzA2MDAwMDAw
WhcNMDQwNzA1MjM1OTU5WjCB3zE1MDMGA1UECxMsQ29tb2RvIFRydXN0IE5ldHdvcmsgLSBQ
RVJTT05BIE5PVCBWQUxJREFURUQxRjBEBgNVBAsTPVRlcm1zIGFuZCBDb25kaXRpb25zIG9m
IHVzZTogaHR0cDovL3d3dy5jb21vZG8ubmV0L3JlcG9zaXRvcnkxHzAdBgNVBAsTFihjKTIw
MDMgQ29tb2RvIExpbWl0ZWQxGDAWBgNVBAMTD0NhcmwgWW91bmdibG9vZDEjMCEGCSqGSIb3
DQEJARYUY2FybEB5b3VuZ2Jsb29kcy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB
AKtIZSyfoppNIZm8EwguRgIMPh8Sohgro0UwKanm8DXCPiLWFd25/2WjoCB0VYUMXVEC7D+c
tvpruXiLH9lKuD2WNvdHUzr2EdyBP7uJ7Q7C4lMpIjQRtYCOeSH3CeZcy6FyLKZ8jOtV/BgH
fWsaX/z8u29bktnr1K18MCNIKq7RAgMBAAGjggGzMIIBrzAfBgNVHSMEGDAWgBT2UiIXFRMI
A1m/GJWfSLS56f74ZjAdBgNVHQ4EFgQUrG/w0IpUWEnwYe5gDksKWgjVwqcwDgYDVR0PAQH/
BAQDAgWgMAwGA1UdEwEB/wQCMAAwIAYDVR0lBBkwFwYIKwYBBQUHAwQGCysGAQQBsjEBAwUC
MEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQEBMCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2Vj
dXJlLmNvbW9kby5uZXQvQ1BTMIGwBgNVHR8EgagwgaUwOKA2oDSGMmh0dHA6Ly9jcmwuY29t
b2RvLm5ldC9DbGFzczNTZWN1cml0eVNlcnZpY2VzXzIuY3JsMDqgOKA2hjRodHRwOi8vY3Js
LmNvbW9kb2NhLmNvbS9DbGFzczNTZWN1cml0eVNlcnZpY2VzXzIuY3JsMC2gK6ApgSdDbGFz
czNTZWN1cml0eVNlcnZpY2VzXzJAY3JsLmNvbW9kby5uZXQwEQYJYIZIAYb4QgEBBAQDAgUg
MB8GA1UdEQQYMBaBFGNhcmxAeW91bmdibG9vZHMub3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAR
powtW8sldyqXAfqn276jiYMlTBSX6BH1pjnIHNiYECywMi1txd8hRB3c/iHXCyAHuYq3AgRI
WegFJ+8/B1jGcUxDjvzmSSjnhFSztT1oNJZUrw0yYhdp+yWDjov24sKFFWYwC4rsnO0y6y9D
U9qAyrKk7NuwHp/NPR2tujpnvStgFLk3hvJTUj3Cu//+OXuqPwk6pIDYvnsGkISIkYfO8kQz
F39TAlNLkyBIsrzZdTotnSNlkwgzW1Ys62MRjZsC6zlrv2dMPxn0iyrxxtse3d82EF1Y53B/
hWvgGoQfQtnsz9bJSPbl9CvfMqPO/fRxGomUcOCSr7NPdoafve+JMIIFeTCCBGGgAwIBAgIR
ANO+/JTb13KkyXGyVrpA3igwDQYJKoZIhvcNAQEFBQAwgdwxCzAJBgNVBAYTAkdCMRcwFQYD
VQQKEw5Db21vZG8gTGltaXRlZDEdMBsGA1UECxMUQ29tb2RvIFRydXN0IE5ldHdvcmsxRjBE
BgNVBAsTPVRlcm1zIGFuZCBDb25kaXRpb25zIG9mIHVzZTogaHR0cDovL3d3dy5jb21vZG8u
bmV0L3JlcG9zaXRvcnkxHzAdBgNVBAsTFihjKTIwMDIgQ29tb2RvIExpbWl0ZWQxLDAqBgNV
BAMTI0NvbW9kbyBDbGFzcyAzIFNlY3VyaXR5IFNlcnZpY2VzIENBMB4XDTAzMDcwNjAwMDAw
MFoXDTA0MDcwNTIzNTk1OVowgd8xNTAzBgNVBAsTLENvbW9kbyBUcnVzdCBOZXR3b3JrIC0g
UEVSU09OQSBOT1QgVkFMSURBVEVEMUYwRAYDVQQLEz1UZXJtcyBhbmQgQ29uZGl0aW9ucyBv
ZiB1c2U6IGh0dHA6Ly93d3cuY29tb2RvLm5ldC9yZXBvc2l0b3J5MR8wHQYDVQQLExYoYyky
MDAzIENvbW9kbyBMaW1pdGVkMRgwFgYDVQQDEw9DYXJsIFlvdW5nYmxvb2QxIzAhBgkqhkiG
9w0BCQEWFGNhcmxAeW91bmdibG9vZHMub3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
gQCrSGUsn6KaTSGZvBMILkYCDD4fEqIYK6NFMCmp5vA1wj4i1hXduf9lo6AgdFWFDF1RAuw/
nLb6a7l4ix/ZSrg9ljb3R1M69hHcgT+7ie0OwuJTKSI0EbWAjnkh9wnmXMuhciymfIzrVfwY
B31rGl/8/LtvW5LZ69StfDAjSCqu0QIDAQABo4IBszCCAa8wHwYDVR0jBBgwFoAU9lIiFxUT
CANZvxiVn0i0uen++GYwHQYDVR0OBBYEFKxv8NCKVFhJ8GHuYA5LCloI1cKnMA4GA1UdDwEB
/wQEAwIFoDAMBgNVHRMBAf8EAjAAMCAGA1UdJQQZMBcGCCsGAQUFBwMEBgsrBgEEAbIxAQMF
AjBGBgNVHSAEPzA9MDsGDCsGAQQBsjEBAgEBATArMCkGCCsGAQUFBwIBFh1odHRwczovL3Nl
Y3VyZS5jb21vZG8ubmV0L0NQUzCBsAYDVR0fBIGoMIGlMDigNqA0hjJodHRwOi8vY3JsLmNv
bW9kby5uZXQvQ2xhc3MzU2VjdXJpdHlTZXJ2aWNlc18yLmNybDA6oDigNoY0aHR0cDovL2Ny
bC5jb21vZG9jYS5jb20vQ2xhc3MzU2VjdXJpdHlTZXJ2aWNlc18yLmNybDAtoCugKYEnQ2xh
c3MzU2VjdXJpdHlTZXJ2aWNlc18yQGNybC5jb21vZG8ubmV0MBEGCWCGSAGG+EIBAQQEAwIF
IDAfBgNVHREEGDAWgRRjYXJsQHlvdW5nYmxvb2RzLm9yZzANBgkqhkiG9w0BAQUFAAOCAQEA
EaaMLVvLJXcqlwH6p9u+o4mDJUwUl+gR9aY5yBzYmBAssDItbcXfIUQd3P4h1wsgB7mKtwIE
SFnoBSfvPwdYxnFMQ4785kko54RUs7U9aDSWVK8NMmIXafslg46L9uLChRVmMAuK7JztMusv
Q1PagMqypOzbsB6fzT0drbo6Z70rYBS5N4byU1I9wrv//jl7qj8JOqSA2L57BpCEiJGHzvJE
Mxd/UwJTS5MgSLK82XU6LZ0jZZMIM1tWLOtjEY2bAus5a79nTD8Z9Isq8cbbHt3fNhBdWOdw
f4Vr4BqEH0LZ7M/WyUj25fQr3zKjzv30cRqJlHDgkq+zT3aGn73viTGCBF4wggRaAgEBMIHy
MIHcMQswCQYDVQQGEwJHQjEXMBUGA1UEChMOQ29tb2RvIExpbWl0ZWQxHTAbBgNVBAsTFENv
bW9kbyBUcnVzdCBOZXR3b3JrMUYwRAYDVQQLEz1UZXJtcyBhbmQgQ29uZGl0aW9ucyBvZiB1
c2U6IGh0dHA6Ly93d3cuY29tb2RvLm5ldC9yZXBvc2l0b3J5MR8wHQYDVQQLExYoYykyMDAy
IENvbW9kbyBMaW1pdGVkMSwwKgYDVQQDEyNDb21vZG8gQ2xhc3MgMyBTZWN1cml0eSBTZXJ2
aWNlcyBDQQIRANO+/JTb13KkyXGyVrpA3igwCQYFKw4DAhoFAKCCAsEwGAYJKoZIhvcNAQkD
MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMDQwNTEwMTkyODAwWjAjBgkqhkiG9w0B
CQQxFgQUOWxrUUJqv8K8ekzaNTj0Q1WUp/4wUgYJKoZIhvcNAQkPMUUwQzAKBggqhkiG9w0D
BzAOBggqhkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcNAwIC
ASgwggEDBgkrBgEEAYI3EAQxgfUwgfIwgdwxCzAJBgNVBAYTAkdCMRcwFQYDVQQKEw5Db21v
ZG8gTGltaXRlZDEdMBsGA1UECxMUQ29tb2RvIFRydXN0IE5ldHdvcmsxRjBEBgNVBAsTPVRl
cm1zIGFuZCBDb25kaXRpb25zIG9mIHVzZTogaHR0cDovL3d3dy5jb21vZG8ubmV0L3JlcG9z
aXRvcnkxHzAdBgNVBAsTFihjKTIwMDIgQ29tb2RvIExpbWl0ZWQxLDAqBgNVBAMTI0NvbW9k
byBDbGFzcyAzIFNlY3VyaXR5IFNlcnZpY2VzIENBAhEA0778lNvXcqTJcbJWukDeKDCCAQUG
CyqGSIb3DQEJEAILMYH1oIHyMIHcMQswCQYDVQQGEwJHQjEXMBUGA1UEChMOQ29tb2RvIExp
bWl0ZWQxHTAbBgNVBAsTFENvbW9kbyBUcnVzdCBOZXR3b3JrMUYwRAYDVQQLEz1UZXJtcyBh
bmQgQ29uZGl0aW9ucyBvZiB1c2U6IGh0dHA6Ly93d3cuY29tb2RvLm5ldC9yZXBvc2l0b3J5
MR8wHQYDVQQLExYoYykyMDAyIENvbW9kbyBMaW1pdGVkMSwwKgYDVQQDEyNDb21vZG8gQ2xh
c3MgMyBTZWN1cml0eSBTZXJ2aWNlcyBDQQIRANO+/JTb13KkyXGyVrpA3igwDQYJKoZIhvcN
AQEBBQAEgYAP+0zdLBQ005hUONEWOKwvYFTV0h7b2U+/auZfN0s4Wz4gFXSDSVmaMZAYRnur
xVO1NWAtQmq23FQphU9iJ8HIAMcSYI3BifCIZTell6MkbQhXZ6D4ytwzI3ZpuH+VYSgxoKrI
bUu4NTzY6CNHFw4qWOTuQswm7o8Z8zzPnMOCsgAAAAAAAA==
--------------ms070108060207050503020303--
 
W

why the lucky stiff

Its said:
[ This would be my personal preference ]
Is there a facility to extend RedCloth with custom tags?

This would be great, specially if those tags can be nested.
Expect this in RedCloth 2.1.0. I think the idea will be:

- You can add new block tags. (i.e. bq., h1., h2., etc.)
- You can add new markup. (i.e. * -> <em>, ** -> <b>, etc.)
- You can add new entities. (i.e. -- -> &mdash;)
- RedCloth will come with a set of extended syntax that can be loaded,
if desired. (per DHH's suggestion that --- => <hr /> and cd. =>
<pre><code> be added.)

Yeah, cool.

_why
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,900
Latest member
Nell636132

Latest Threads

Top