Какой простой способ динамически генерировать JavaScript в Seaside?

Я пытаюсь добавить Disqus в блог, который пишу. Чтобы иметь дело с сессиями Seaside, мне нужно либо добавить уникальный disk_identifier, либо disqus_url в JS. Я переопределил метод #script моего компонента, но он может возвращать только строковый литерал.

Я вижу два варианта:

  1. Динамически сгенерируйте JS, сохраните его в файл и загрузите этот файл в мой компонент.
  2. Добавьте постоянную ссылку для каждой записи в блоге.

Есть ли более простой способ? Или один (или оба) из этих способов легко сделать? Я новичок в Smalltalk и Seaside и не знаю, как выполнить любую из этих двух вещей.


person xofz    schedule 25.01.2011    source источник


Ответы (2)


Да есть способ проще. Вы можете сгенерировать правильный код Discus JS непосредственно в методе #script. Он должен возвращать литерал String, но вы можете создать эту строку на лету. Например, с помощью WriteStream.

Ваши записи в блоге также нуждаются в постоянной ссылке. Вы можете использовать метод #initialRequest: для обработки этих постоянных ссылок.

person jan    schedule 26.01.2011
comment
Спасибо, Ян, произошла глупая ошибка при объединении моих строк JS. Есть ли руководство по созданию чистых URL-адресов в Seaside? Я нашел один в блоге Рамона Леона, но информация, похоже, устарела (первое переопределение метода теперь устарело). - person xofz; 27.01.2011

динамический javascript материал

если я прав, такой же сценарий вы получите и для таких вещей, как кнопки ретвита. (это то, что у меня есть под рукой, чтобы предоставить вам примеры).

What I did in my blog is a little specialized seaside component named BITRetweet that you configure with the permalink (and username and style preference). Forget the files stuff (that will only complicate things), everything is on the fly. It renders with this:

BITRetweet>>renderContentOn: html

html script with: self customizedJavascript.
html script url: self buttonJavascriptSource.

BITRetweet>>customizedJavascript

| script |

script := JSScript new.

script add: (('"',self permalink,'"') asJSObject assignTo: 'tweetmeme_url').

isCompact ifTrue:[
    script add: ('"compact"' asJSObject assignTo: 'tweetmeme_style')].

script add: (('"',username,'"') asJSObject assignTo: 'tweetmeme_source').
script add: (('"',shortener,'"') asJSObject assignTo: 'tweetmeme_service').

^ script 

BITRретвит>>>buttonJavascriptSource

"Answers the url to the source of the script for the button.
See: 
http://help.tweetmeme.com/2009/04/06/tweetmeme-button/"

^ 'http://tweetmeme.com/i/scripts/button.js'

и, наконец, небольшой хак для String, например:

Строка>>какJSObject

^ JSObject new alias: self

работа с постоянными ссылками

для части постоянных ссылок есть две вещи:

  1. создание его
  2. используя его (заставляя приложение реагировать, когда запрос приходит с ним)

для 1 вы можете сделать что-то вроде этого:

PostComponent>>updateUrl: anUrl

super updateUrl: anUrl.

anUrl addToPath: model asURLNice

Post>>asURLNice

"Answers the receiver in an (destructive) encoded 
way which is url friendly"

^ String streamContents: [:stream|
    self do:[:char|
        char isSeparator 
            ifTrue:[stream nextPut: $-]
            ifFalse:[
                char isAlphaNumeric ifTrue:[
                    stream nextPut: char asLowercase asNonDiacritical]]]]

and for 2 you have to do something like this in your main application component:

BlogApplication>>initialRequest: aRequestOrNil

| paths |

super initialRequest: aRequestOrNil.

aRequestOrNil ifNil:[^ nil].

(aRequestOrNil url asString endsWith: '/sitemap.xml') ifTrue:[
    ^ self respondSitemap].

paths := aRequestOrNil url path.
paths size < 2 ifTrue:[^nil].

(Post atURLTitle: paths last) ifNotNilDo: [:value | 
    ^ self readPost:  value].

живые примеры

Вы можете увидеть все это в действии в моем блоге или в выборочное творчество asNonDiacritical необходим мне, потому что я веду блог на трех языках, но DiacriticalSupport доступен в squeaksource если вам это нужно

получайте удовольствие от взлома

o/

person Sebastian Sastre    schedule 06.02.2011