This commit is contained in:
George Saines 2014-06-26 10:38:18 -07:00
commit a94053fd1d
78 changed files with 860 additions and 346 deletions

3
.gitignore vendored
View file

@ -44,6 +44,7 @@ always-ignore extensions
*.rej
*.vi
*.sass-cache
.zedstate
# OS or Editor folders
.cache
@ -86,4 +87,6 @@ login.coffee
# debugging
*.heapsnapshot
temp/
### If you add something here, copy it to the end of .npmignore, too. ###

View file

@ -68,6 +68,7 @@ always-ignore extensions
*.rej
*.vi
*.sass-cache
.zedstate
# OS or Editor folders
.cache
@ -95,6 +96,8 @@ bin/mongo/
# Karma coverage
coverage/
temp/
# local settings
login.coffee

View file

@ -1 +0,0 @@
{"split":"preview-2","session.current":["/app/styles/play/level/tome/spell.sass"],"session.open":{"/app/styles/play/level/tome/spell.sass":{"scrollTop":0,"scrollLeft":0,"selection":{"start":{"row":0,"column":0},"end":{"row":0,"column":0}},"lastUse":1402419134780,"undo":[],"redo":[]}},"window":{"width":1680,"height":1024,"top":22,"left":0}}

Binary file not shown.

After

(image error) Size: 2 KiB

Binary file not shown.

After

(image error) Size: 1.4 KiB

Binary file not shown.

After

(image error) Size: 9.4 KiB

Binary file not shown.

After

(image error) Size: 6.1 KiB

Binary file not shown.

After

(image error) Size: 16 KiB

Binary file not shown.

After

(image error) Size: 15 KiB

Binary file not shown.

After

(image error) Size: 3.7 KiB

Binary file not shown.

After

(image error) Size: 1.5 KiB

Binary file not shown.

After

(image error) Size: 17 KiB

Binary file not shown.

After

(image error) Size: 7.5 KiB

Binary file not shown.

After

(image error) Size: 20 KiB

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "български език", englishDescri
# required: "You need to log in before you can go that way."
home:
slogan: "Научи се да програмираш на JavaScript, докато играеш игра "
slogan: "Научи се да програмираш, докато играеш игра "
no_ie: "CodeCombat не работи под Internet Explorer 9 или по-стар. Съжалявам!"
no_mobile: "CodeCombat не е направен за мобилни устройства и може да не работи!"
play: "Играй"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
# required: "You need to log in before you can go that way."
home:
slogan: "Aprén a programar JavaScript tot Jugant"
slogan: "Aprén a programar tot Jugant"
no_ie: "CodeCombat no funciona en Internet Explorer 9 o versions anteriors. Perdó!"
no_mobile: "CodeCombat no ha estat dissenyat per dispositius mòbils i per tant no funcionarà!"
play: "Jugar"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
# required: "You need to log in before you can go that way."
home:
slogan: "Naučte se programování JavaScriptu při hraní více-hráčové programovací hry."
slogan: "Naučte se programování tu při hraní více-hráčové programovací hry."
no_ie: "Omlouváme se, ale CodeCombat boužel nefunguje v Internet Exploreru 9 nebo starším."
no_mobile: "CodeCombat není navržen pro mobilní zařízení a nemusí fungovat správně!"
play: "Hrát"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
# required: "You need to log in before you can go that way."
home:
slogan: "Lær at Kode Javascript ved at Spille et Spil"
slogan: "Lær at Kode ved at Spille et Spil"
no_ie: "CodeCombat kan desværre ikke køre i Internet Explorer 9 eller ældre. Beklager!"
no_mobile: "CodeCombat er ikke designet til mobile enheder og vil måske ikke virke!"
play: "Spil"

View file

@ -11,95 +11,95 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
delay_1_sec: "1 sekunde"
delay_3_sec: "3 sekunde"
delay_5_sec: "5 sekunde"
# manual: "Manual"
manual: "Aleitig"
# fork: "Fork"
play: "Spiele"
retry: "nomol versuche"
# watch: "Watch"
# unwatch: "Unwatch"
# submit_patch: "Submit Patch"
submit_patch: "Patch ireiche"
units:
second: "sekunde"
seconds: "sekunde"
minute: "minute"
minutes: "minute"
hour: "stund"
hours: "stunde"
# day: "day"
# days: "days"
# week: "week"
# weeks: "weeks"
# month: "month"
# months: "months"
# year: "year"
# years: "years"
second: "Sekunde"
seconds: "Sekunde"
minute: "Minute"
minutes: "Minute"
hour: "Stund"
hours: "Stunde"
day: "Tag"
days: "Täg"
week: "Wuche"
weeks: "Wuche"
month: "Monet"
months: "Mönet"
year: "Johr"
years: "Johr"
modal:
close: "beende"
okay: "Okaz"
close: "Beende"
okay: "Okay"
not_found:
page_not_found: "Siite nöd gfunde"
nav:
# play: "Levels"
# community: "Community"
# editor: "Editor"
# blog: "Blog"
# forum: "Forum"
# account: "Account"
# admin: "Admin"
# home: "Home"
play: "Levels"
community: "Community"
editor: "Editor"
blog: "Blog"
forum: "Forum"
account: "Account"
admin: "Admin"
home: "Home"
contribute: "Spende"
# legal: "Legal"
about: "Über"
contact: "Kontakt"
twitter_follow: "Folge"
employers: "agschtelti"
employers: "Mitarbeiter"
# versions:
# save_version_title: "Save New Version"
# new_major_version: "New Major Version"
versions:
save_version_title: "Neui Version speichere"
new_major_version: "Neui Hauptversion"
# cla_prefix: "To save changes, first you must agree to our"
# cla_url: "CLA"
# cla_suffix: "."
# cla_agree: "I AGREE"
# login:
# sign_up: "Create Account"
# log_in: "Log In"
# logging_in: "Logging In"
# log_out: "Log Out"
# recover: "recover account"
login:
sign_up: "Account erstelle"
log_in: "Ilogge"
logging_in: "Am Ilogge"
log_out: "Uslogge"
recover: "Account wiederherstelle"
# recover:
# recover_account_title: "Recover Account"
# send_password: "Send Recovery Password"
recover:
recover_account_title: "Account wiederherstelle"
send_password: "Recovery Password sende"
# signup:
# create_account_title: "Create Account to Save Progress"
# description: "It's free. Just need a couple things and you'll be good to go:"
# email_announcements: "Receive announcements by email"
# coppa: "13+ or non-USA "
# coppa_why: "(Why?)"
# creating: "Creating Account..."
# sign_up: "Sign Up"
# log_in: "log in with password"
# social_signup: "Or, you can sign up through Facebook or G+:"
# required: "You need to log in before you can go that way."
signup:
create_account_title: "Erstell en Account zum din Fortschritt speichere"
description: "Es isch gratis. Nur no es paar Sache und denn chas los goh:"
email_announcements: "Akündigunge per Mail erhalte"
coppa: "13+ or Nicht-Amerikaner "
coppa_why: "(Warum?)"
creating: "Account wird erstellt..."
sign_up: "Registriere"
log_in: "Mit Passwort ilogge"
social_signup: "Du chasch dich au mit Facebook oder G+ registriere:"
required: "Du muesch dich zersch ilogge befor du det dure chasch"
# home:
# slogan: "Learn to Code JavaScript by Playing a Game"
# no_ie: "CodeCombat does not run in Internet Explorer 9 or older. Sorry!"
# no_mobile: "CodeCombat wasn't designed for mobile devices and may not work!"
# play: "Play"
# old_browser: "Uh oh, your browser is too old to run CodeCombat. Sorry!"
# old_browser_suffix: "You can try anyway, but it probably won't work."
# campaign: "Campaign"
# for_beginners: "For Beginners"
# multiplayer: "Multiplayer"
# for_developers: "For Developers"
home:
slogan: "Lern, wiemer JavaScript programmiert indem du es Spiel spielsch!"
no_ie: "CodeCombat funktioniert uf InternetExplorer 9 und älter nid. Sorry!"
no_mobile: "CodeCombat isch nid für mobili Grät entwicklet worde und funktioniert vilicht nid!"
play: "Spiele"
old_browser: "Uh oh, din Browser isch z alt zum CodeCombat spiele. Sorry!"
old_browser_suffix: "Du chasches gliich probiere, aber es funktioniert worschinli nid."
campaign: "Kampagne"
for_beginners: "Für Afänger"
multiplayer: "Multiplayer"
for_developers: "Für Entwickler"
# play:
# choose_your_level: "Choose Your Level"
@ -132,47 +132,47 @@ module.exports = nativeDescription: "Deutsch (Schweiz)", englishDescription: "Ge
# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 15% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns."
diplomat_suggestion:
# title: "Help translate CodeCombat!"
# sub_heading: "We need your language skills."
title: "Hilf, CodeCombat z übersetze!"
sub_heading: "Mir bruuched dini Sprochfähigkeite."
pitch_body: "We develop CodeCombat in English, but we already have players all over the world. Many of them want to play in Swiss German but don't speak English, so if you can speak both, please consider signing up to be a Diplomat and help translate both the CodeCombat website and all the levels into Swiss German."
missing_translations: "Until we can translate everything into Swiss German, you'll see generic German or English when Swiss German isn't available."
# learn_more: "Learn more about being a Diplomat"
# subscribe_as_diplomat: "Subscribe as a Diplomat"
learn_more: "Lern meh drüber, en Diplomat zsii"
subscribe_as_diplomat: "Abonnier als en Diplomat"
# wizard_settings:
# title: "Wizard Settings"
# customize_avatar: "Customize Your Avatar"
wizard_settings:
title: "Zaubereristellige"
customize_avatar: "Pass din Avatar ah"
# active: "Active"
# color: "Color"
# group: "Group"
# clothes: "Clothes"
color: "Farb"
group: "Gruppe"
clothes: "Chleider"
# trim: "Trim"
# cloud: "Cloud"
# team: "Team"
# spell: "Spell"
# boots: "Boots"
cloud: "Wolke"
team: "Team"
spell: "Zauberspruch"
boots: "Stiefel"
# hue: "Hue"
# saturation: "Saturation"
saturation: "Sättigung"
# lightness: "Lightness"
# account_settings:
# title: "Account Settings"
# not_logged_in: "Log in or create an account to change your settings."
# autosave: "Changes Save Automatically"
# me_tab: "Me"
# picture_tab: "Picture"
# upload_picture: "Upload a picture"
# wizard_tab: "Wizard"
# password_tab: "Password"
# emails_tab: "Emails"
# admin: "Admin"
account_settings:
title: "Account Istellige"
not_logged_in: "Log dich ih oder erstelle en Account zum dini Istellige ändere."
autosave: "Änderige werded automatisch gspeicheret"
me_tab: "Ich"
picture_tab: "Bild"
upload_picture: "Es Bild ufelade"
wizard_tab: "Zauberer"
password_tab: "Passwort"
emails_tab: "E-Mails"
admin: "Admin"
# wizard_color: "Wizard Clothes Color"
# new_password: "New Password"
# new_password_verify: "Verify"
# email_subscriptions: "Email Subscriptions"
# email_announcements: "Announcements"
# email_announcements_description: "Get emails on the latest news and developments at CodeCombat."
# email_notifications: "Notifications"
new_password: "Neus Passwort"
new_password_verify: "Bestätige"
email_subscriptions: "E-Mail Abos"
email_announcements: "Akündigunge"
email_announcements_description: "Bechum Mails mit Neuigkeite und de neuste Entwicklige bi CodeCombat."
email_notifications: "Benachrichtigunge"
# email_notifications_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity."
# email_any_notes: "Any Notifications"
# email_any_notes_description: "Disable to stop all activity notification emails."

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
# required: "You need to log in before you can go that way."
home:
slogan: "Lerne spielend JavaScript"
slogan: "Lerne spielend Programmieren"
no_ie: "CodeCombat läuft nicht im IE8 oder älteren Browsern. Tut uns Leid!"
no_mobile: "CodeCombat ist nicht für Mobilgeräte optimiert und funktioniert möglicherweise nicht."
play: "Spielen"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Deutsch", englishDescription: "German", tra
# required: "You need to log in before you can go that way."
home:
slogan: "Lerne spielend JavaScript"
slogan: "Lerne spielend Programmieren"
no_ie: "CodeCombat läuft nicht im IE8 oder älteren Browsern. Tut uns Leid!"
no_mobile: "CodeCombat ist nicht für Mobilgeräte optimiert und funktioniert möglicherweise nicht."
play: "Spielen"

View file

@ -90,7 +90,7 @@
required: "You need to log in before you can go that way."
home:
slogan: "Learn to Code JavaScript by Playing a Game"
slogan: "Learn to Code by Playing a Game"
no_ie: "CodeCombat does not run in Internet Explorer 9 or older. Sorry!"
no_mobile: "CodeCombat wasn't designed for mobile devices and may not work!"
play: "Play"
@ -426,6 +426,7 @@
tip_impossible: "It always seems impossible until it's done. - Nelson Mandela"
tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds"
tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay"
tip_hardware_problem: "Q: How many programmers does it take to change a light bulb? A: None, it's a hardware problem."
time_current: "Now:"
time_total: "Max:"
time_goto: "Go to:"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "español (América Latina)", englishDescrip
# required: "You need to log in before you can go that way."
home:
slogan: "Aprende a programar en JavaScript jugando"
slogan: "Aprende a programar jugando"
no_ie: "¡Lo sentimos! CodeCombat no funciona en Internet Explorer 9 o versiones anteriores."
no_mobile: "¡CodeCombat no fue diseñado para dispositivos móviles y quizás no funcione!"
play: "Jugar"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
required: "Tienes que estar reginstrado antes de poder seguir por aquí."
home:
slogan: "Aprende a programar JavaScript jugando"
slogan: "Aprende a programar jugando"
no_ie: "CodeCombat no funciona en Internet Explorer 9 o anteriores. ¡Lo sentimos!"
no_mobile: "¡CodeCombat no fue diseñado para dispositivos móviles y puede que no funcione!"
play: "Jugar"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "español", englishDescription: "Spanish", t
# required: "You need to log in before you can go that way."
home:
slogan: "Aprende a programar en JavaScript jugando"
slogan: "Aprende a programar jugando"
no_ie: "CodeCombat no funciona en Internet Explorer 9 o versiones anteriores. ¡Lo sentimos!"
no_mobile: "¡CodeCombat no fue diseñado para dispositivos móviles y quizás no funcione!"
play: "Jugar"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
# required: "You need to log in before you can go that way."
home:
slogan: "کد نویسی به زبان جاوااسکریپت را با بازی بیاموزید"
slogan: "کد نویسیا با بازی بیاموزید"
no_ie: "متاسفیم اما بازی بر روی مرورگر های اینترنت اکسپلورر نسخه ۹ به قبل اجرا نمی شود"
no_mobile: "این بازی برای دستگاه های موبایل طراحی نشده است و بر روی آن ها اجرا نمی شود"
play: "شروع بازی"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
required: "Vous devez être connecté pour voir cela"
home:
slogan: "Apprenez à coder en JavaScript tout en jouant"
slogan: "Apprenez à coder tout en jouant"
no_ie: "CodeCombat ne fonctionnera pas sous Internet Explorer 9 ou moins. Désolé !"
no_mobile: "CodeCombat n'a pas été créé pour les plateformes mobiles donc il est possible qu'il ne fonctionne pas correctement ! "
play: "Jouer"

View file

@ -3,7 +3,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
loading: "Töltés..."
saving: "Mentés..."
sending: "Küldés..."
# send: "Send"
send: "Küldés indítása"
cancel: "Mégse"
save: "Mentés"
# publish: "Publish"
@ -69,7 +69,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
login:
sign_up: "Regisztráció"
log_in: "Bejelentkezés"
# logging_in: "Logging In"
logging_in: "Bejelentkezés"
log_out: "Kijelentkezés"
recover: "meglévő fiók visszaállítása"
@ -90,7 +90,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
required: "Csak akkor mehetsz arra, ha már bejelentkeztél."
home:
slogan: "Tanulj meg JavaScript nyelven programozni, miközben játszol!"
slogan: "Tanulj meg nyelven programozni, miközben játszol!"
no_ie: "A CodeCombat nem támogatja az Internet Explorer 9, vagy korábbi verzióit. Bocsi!"
no_mobile: "A CodeCombat nem mobil eszközökre lett tervezve. Valószínűleg nem működik helyesen."
play: "Játssz!"
@ -194,8 +194,8 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
account_profile:
# settings: "Settings"
# edit_profile: "Edit Profile"
# done_editing: "Done Editing"
edit_profile: "Szerkeszd meg a profilodat"
done_editing: "Szerkesztés kész"
profile_for_prefix: "Profil "
profile_for_suffix: " számára"
# featured: "Featured"
@ -203,14 +203,14 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
looking_for: "Keres:"
last_updated: "Legutóbb napra-készre hozva:"
contact: "Kapcsolat"
# active: "Looking for interview offers now"
# inactive: "Not looking for offers right now"
active: "Azonnali interjú ajánlatokat keresek"
inactive: "Most éppen nem keresek interjú ajánlatokat"
# complete: "complete"
# next: "Next"
# next_city: "city?"
next: "Következő"
next_city: "Város?"
# next_country: "pick your country."
# next_name: "name?"
# next_short_description: "write a short description."
next_name: "Név?"
next_short_description: "adj egy rövid leírást."
# next_long_description: "describe your desired position."
# next_skills: "list at least five skills."
# next_work: "chronicle your work history."
@ -219,7 +219,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
# next_links: "add any personal or social links."
# next_photo: "add an optional professional photo."
# next_active: "mark yourself open to offers to show up in searches."
# example_blog: "Blog"
example_blog: "Blog"
# example_personal_site: "Personal Site"
# links_header: "Personal Links"
# links_blurb: "Link any other sites or profiles you want to highlight, like your GitHub, your LinkedIn, or your blog."

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
# required: "You need to log in before you can go that way."
home:
slogan: "Impara a programmare in JavaScript giocando"
slogan: "Impara a programmare giocando"
no_ie: "CodeCombat non supporta Internet Explorer 9 o browser precedenti. Ci dispiace!"
no_mobile: "CodeCombat non è stato progettato per dispositivi mobile e potrebbe non funzionare!"
play: "Gioca"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
# required: "You need to log in before you can go that way."
home:
slogan: "ゲームをプレイしてJavaScriptを学びましょう"
slogan: "ゲームをプレイして学びましょう"
no_ie: "大変申し訳ありませんが、ご利用のブラウザIE8以下はサポートされていません。(ChromeやFirefoxをご利用ください)"
no_mobile: "CodeCombat は携帯端末向けに制作されていないため、動作しない可能性があります。"
play: "ゲームスタート"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
# required: "You need to log in before you can go that way."
home:
slogan: "쉽고 간단한 게임으로 자바스크립트 배우기"
slogan: "쉽고 간단한 게임배우기"
no_ie: "죄송하지만 코드컴뱃은 인터넷 익스플로러 9에서는 동작하지 않습니다."
no_mobile: "코드 컴뱃은 모바일 기기용으로 제작되지 않았습니다. 아마 동작하지 않을 가능성이 높습니다."
play: "시작"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
# required: "You need to log in before you can go that way."
home:
slogan: "Belajar Kod JavaScript Dengan Permainan"
slogan: "Belajar Kod bDengan Permainan"
no_ie: "CodeCombat tidak berfungsi dalam Internet Explorer 9 dan terdahulu. Maaf!"
no_mobile: "CodeCombat tidak dibangunkan untuk telefon mudah-alih dan tablet dan tidak akan berfungsi!"
play: "Mula"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
# required: "You need to log in before you can go that way."
home:
slogan: "Lær å Kode JavaScript ved å Spille et Spill"
slogan: "Lær å Kode ved å Spille et Spill"
no_ie: "CodeCombat kjører ikke på IE8 eller eldre. Beklager!"
no_mobile: "CodeCombat ble ikke designet for mobile enheter, og vil muligens ikke virke!"
play: "Spill"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
# required: "You need to log in before you can go that way."
home:
slogan: "Leer programmeren in JavaScript door het spelen van een spel"
slogan: "Leer programmeren door het spelen van een spel"
no_ie: "CodeCombat werkt niet in IE8 of ouder. Sorry!"
no_mobile: "CodeCombat is niet gemaakt voor mobiele apparaten en werkt misschien niet!"
play: "Speel"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
# required: "You need to log in before you can go that way."
home:
slogan: "Leer programmeren in JavaScript door het spelen van een spel"
slogan: "Leer programmeren door het spelen van een spel"
no_ie: "CodeCombat werkt niet in IE8 of ouder. Sorry!"
no_mobile: "CodeCombat is niet gemaakt voor mobiele apparaten en werkt misschien niet!"
play: "Speel"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", t
# required: "You need to log in before you can go that way."
home:
slogan: "Leer programmeren in JavaScript door het spelen van een spel"
slogan: "Leer programmeren door het spelen van een spel"
no_ie: "CodeCombat werkt niet in IE8 of ouder. Sorry!"
no_mobile: "CodeCombat is niet gemaakt voor mobiele apparaten en werkt misschien niet!"
play: "Speel"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Norsk", englishDescription: "Norwegian", tr
# required: "You need to log in before you can go that way."
home:
slogan: "Lær å Kode JavaScript ved å Spille et Spill"
slogan: "Lær å Kode ved å Spille et Spill"
no_ie: "CodeCombat kjører ikke på IE8 eller eldre. Beklager!"
no_mobile: "CodeCombat ble ikke designet for mobile enheter, og vil muligens ikke virke!"
play: "Spill"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "język polski", englishDescription: "Polish
# required: "You need to log in before you can go that way."
home:
slogan: "Naucz się JavaScript grając"
slogan: "Naucz się programowania grając"
no_ie: "CodeCombat nie działa na Internet Explorer 9 lub starszym. Przepraszamy!"
no_mobile: "CodeCombat nie został zaprojektowany dla użądzeń przenośnych więc może nie działać!"
play: "Graj"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "português do Brasil", englishDescription:
# required: "You need to log in before you can go that way."
home:
slogan: "Aprenda a programar em JavaScript enquanto se diverte com um jogo."
slogan: "Aprenda a programar enquanto se diverte com um jogo."
no_ie: "CodeCombat não roda em versões mais antigas que o Internet Explorer 10. Desculpe!"
no_mobile: "CodeCombat não foi projetado para dispositivos móveis e pode não funcionar!"
play: "Jogar"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P
# required: "You need to log in before you can go that way."
home:
slogan: "Aprende a Programar JavaScript ao Jogar um Jogo"
slogan: "Aprende a Programar ao Jogar um Jogo"
no_ie: "O CodeCombat não corre em Internet Explorer 9 ou anterior. Desculpa!"
no_mobile: "O CodeCombat não foi desenhado para dispositivos móveis e pode não funcionar!"
play: "Jogar"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "português", englishDescription: "Portugues
# required: "You need to log in before you can go that way."
home:
slogan: "Aprenda a programar em JavaScript enquanto se diverte com um jogo."
slogan: "Aprenda a programar enquanto se diverte com um jogo."
no_ie: "CodeCombat não roda em versões mais antigas que o Internet Explorer 10. Desculpe!"
no_mobile: "CodeCombat não foi projetado para dispositivos móveis e pode não funcionar!"
play: "Jogar"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
# required: "You need to log in before you can go that way."
home:
slogan: "Învață sa scrii JavaScript jucându-te"
slogan: "Învață sa scrii cod jucându-te"
no_ie: "CodeCombat nu merge pe Internet Explorer 9 sau mai vechi. Scuze!"
no_mobile: "CodeCombat nu a fost proiectat pentru dispozitive mobile si s-ar putea sa nu meargă!"
play: "Joacă"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
required: "Войдите для того чтобы продолжить."
home:
slogan: "Научитесь программировать на JavaScript, играя в игру"
slogan: "Научитесь программировать, играя в игру"
no_ie: "CodeCombat не работает в IE8 или более старых версиях. Нам очень жаль!"
no_mobile: "CodeCombat не приспособлен для работы на мобильных устройствах и может не работать!"
play: "Играть"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
# required: "You need to log in before you can go that way."
home:
slogan: "Nauč sa programovať v Javascripte pomocou hry"
slogan: "Nauč sa programovať pomocou hry"
no_ie: "CodeCombat nefunguje v prehliadači Internet Explorer 9 a jeho starších verziách. Ospravedlňujeme sa."
no_mobile: "CodeCombat nebol navrhnutý pre mobilné zariadenia a nemusí na nich fungovať správne!"
play: "Hraj"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
# required: "You need to log in before you can go that way."
home:
slogan: "Научи да пишеш JavaScript играјући игру"
slogan: "Научи да пишеш код играјући игру"
no_ie: "CodeCombat не ради у IE8 и старијим верзијама. Жао нам је!"
no_mobile: "CodeCombat није дизајниран за мобилне уређаје и може да се деси да не ради!"
play: "Играј"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
# required: "You need to log in before you can go that way."
home:
slogan: "Lär dig att koda Javascript genom att spela ett spel."
slogan: "Lär dig att koda genom att spela ett spel."
no_ie: "CodeCombat fungerar tyvärr inte i IE8 eller äldre."
no_mobile: "CodeCombat är inte designat för mobila enhter och fungerar kanske inte!"
play: "Spela"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
# required: "You need to log in before you can go that way."
home:
slogan: "Oyun oynayarak JavaScript kodlamayı öğrenin"
slogan: "Oyun oynayarak kodlamayı öğrenin"
no_ie: "CodeCombat maalesef Internet Explorer 9 veya daha eski sürümlerde çalışmaz."
no_mobile: "CodeCombat mobil cihazlar için tasarlanmamıştır bu sebeple mobil cihazlarda çalışmayabilir."
play: "Oyna"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "українська мова", englishDesc
# required: "You need to log in before you can go that way."
home:
slogan: "Навчіться програмувати на JavaScript, граючи у гру"
slogan: "Навчіться програмувати, граючи у гру"
no_ie: "На жаль, CodeCombat не працює в IE8 чи більш старих версіях!"
no_mobile: "CodeCombat не призначений для мобільних приладів і може не працювати!"
play: "Грати"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
# required: "You need to log in before you can go that way."
home:
slogan: "Học mã Javascript bằng chơi Games"
slogan: "Học mã bằng chơi Games"
no_ie: "Codecombat không chạy trong Internet Explorer 9 hoặc cũ hơn. Xin lỗi!"
no_mobile: "Codecombat không được thiết kế cho các thiết bị di động và có thể không hoạt động được!"
play: "Chơi"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
# required: "You need to log in before you can go that way."
home:
slogan: "通过游戏学习 Javascript"
slogan: "通过游戏学习编程"
no_ie: "抱歉! Internet Explorer 9 等旧式预览器无法使用本网站。"
no_mobile: "CodeCombat 不是针对手机设备设计的,所以可能无法达到最好的体验!"
play: "开始游戏"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese
# required: "You need to log in before you can go that way."
home:
slogan: "通過玩遊戲學習Javascript 腳本語言"
slogan: "通過玩遊戲學習編程"
no_ie: "抱歉Internet Explorer 9 等舊的瀏覽器打不開此網站"
no_mobile: "CodeCombat 不是針對手機設備設計的,所以可能會出問題!"
play: "開始遊戲"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
# required: "You need to log in before you can go that way."
home:
slogan: "打遊戲來學 Javascript"
slogan: "打遊戲來學編程"
no_ie: "對弗住!箇網站叻 Internet Explorer 9 箇粒老個瀏覽器嘸處用。"
no_mobile: "CodeCombat 勿是照手機設備設計個,怪得嘸數达弗到頂讚個享受!"
play: "遊戲開打"

View file

@ -90,7 +90,7 @@ module.exports = nativeDescription: "中文", englishDescription: "Chinese", tra
# required: "You need to log in before you can go that way."
home:
slogan: "通过游戏学习Javascript脚本语言"
slogan: "通过游戏学习编程"
no_ie: "抱歉Internet Explorer 9等更旧的预览器打不开此网站"
no_mobile: "CodeCombat暂时没有手机版本可能无法运行!"
play: ""

View file

@ -26,14 +26,32 @@ PropertyDocumentationSchema = c.object {
name: {type: 'string', title: "Name", description: "Name of the property."}
# not actual JS types, just whatever they describe...
type: c.shortString(title: "Type", description: "Intended type of the property.")
description: {title: "Description", type: 'string', description: "Description of the property.", format: 'markdown', maxLength: 1000}
description:
oneOf: [
{title: "Description", type: 'string', description: "Description of the property.", maxLength: 1000, format: 'markdown'}
{
type: 'object',
title: "Language Descriptions",
description: "Property descriptions by code language.",
additionalProperties: {type: 'string', description: "Description of the property.", maxLength: 1000, format: 'markdown'}
}
]
args: c.array {title: "Arguments", description: "If this property has type 'function', then provide documentation for any function arguments."}, c.FunctionArgumentSchema
owner: {title: "Owner", type: 'string', description: 'Owner of the property, like "this" or "Math".'}
example: {title: "Example", type: 'string', description: 'An optional example code block.', format: 'javascript'}
example:
oneOf: [
{title: "Example", type: 'string', description: 'An optional example code block.', format: 'javascript'}
{
type: 'object',
title: "Language Examples",
description: "Examples by code language.",
additionalProperties: {type: 'string', description: 'An example code block.', format: 'javascript'} # TODO: not JS
}
]
snippets: c.object {
title: "Snippets",
title: "Snippets",
description: "List of snippets for the respective programming languages"
},
},
javascript: c.object {title: 'JavaScript'}, c.codeSnippet 'javascript'
coffeescript: c.object {title: 'CoffeeScript'}, c.codeSnippet 'coffee'
python: c.object {title: 'Python'}, c.codeSnippet 'python'
@ -47,8 +65,26 @@ PropertyDocumentationSchema = c.object {
default: {type: 'null'}
},
type: c.shortString(title: "Type", description: "Type of the return value")
example: c.shortString(title: "Example", description: "Example return value")
description: {title: "Description", type: 'string', description: "Description of the return value.", maxLength: 1000}
example:
oneOf: [
c.shortString(title: "Example", description: "Example return value")
{
type: 'object',
title: "Language Examples",
description: "Example return values by code language.",
additionalProperties: c.shortString(description: 'Example return value.', format: 'javascript') # TODO: not JS
}
]
description:
oneOf: [
{title: "Description", type: 'string', description: "Description of the return value.", maxLength: 1000}
{
type: 'object',
title: "Language Descriptions",
description: "Example return values by code language.",
additionalProperties: {type: 'string', description: "Description of the return value.", maxLength: 1000}
}
]
DependencySchema = c.object {
title: "Component Dependency"

View file

@ -164,8 +164,26 @@ me.FunctionArgumentSchema = me.object {
name: {type: 'string', pattern: me.identifierPattern, title: "Name", description: "Name of the function argument."}
# not actual JS types, just whatever they describe...
type: me.shortString(title: "Type", description: "Intended type of the argument.")
example: me.shortString(title: "Example", description: "Example value for the argument.")
description: {title: "Description", type: 'string', description: "Description of the argument.", maxLength: 1000}
example:
oneOf: [
me.shortString(title: "Example", description: "Example value for the argument.")
{
type: 'object',
title: "Language Examples",
description: "Examples by code language.",
additionalProperties: me.shortString(description: 'Example value for the argument.')
}
]
description:
oneOf: [
{title: "Description", type: 'string', description: "Description of the argument.", maxLength: 1000}
{
type: 'object',
title: "Language Descriptions",
description: "Example argument descriptions by code language.",
additionalProperties: {type: 'string', description: "Description of the argument.", maxLength: 1000}
}
]
"default":
title: "Default"
description: "Default value of the argument. (Your code should set this.)"

View file

@ -63,9 +63,6 @@ module.exports =
"next-game-pressed":
{} # TODO schema
"focus-editor":
{} # TODO schema
"end-current-script":
{} # TODO schema
@ -87,14 +84,14 @@ module.exports =
scriptRunning: { type: 'string' }
noteGroupRunning: { type: 'string' }
timeSinceLastScriptEnded: { type: 'number' }
scriptStates:
scriptStates:
type: 'object'
additionalProperties:
title: 'Script State'
type: 'object'
additionalProperties: false
properties:
timeSinceLastEnded:
timeSinceLastEnded:
type: 'number'
description: 'seconds since this script ended last'
timeSinceLastTriggered:
@ -143,7 +140,7 @@ module.exports =
additionalProperties: false
properties:
showModal: { type: 'boolean' }
"level-highlight-dom":
type: 'object'
additionalProperties: false

View file

@ -67,7 +67,29 @@ module.exports =
"tome:spell-shown":
{} # TODO schema
# TODO proposition: add tome to name
"focus-editor":
"tome:focus-editor":
{} # TODO schema
"tome:change-language":
title: "Tome Change Language"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when the Tome should update its programming language."
type: "object"
additionalProperties: false
properties:
language:
type: "string"
required: ["language"]
"tome:spell-changed-language":
title: "Spell Changed Language"
$schema: "http://json-schema.org/draft-04/schema#"
description: "Published when an individual spell has updated its code language."
type: "object"
additionalProperties: false
properties:
spell:
type: "object"
language:
type: "string"
required: ["spell"]

View file

@ -32,6 +32,7 @@
img
display: block
margin: 0 auto
@include transition(box-shadow .50s ease-in-out)
text-shadow: 2px 2px 5px black
@ -58,14 +59,160 @@
color: $yellow
font-size: 90px
font-family: Bangers
@include transition(color .10s linear)
@include transition(color .25s ease-in-out)
&:hover div
&:hover div, &.hovered div
color: lighten($yellow, 20%)
&:hover img
&:hover img, &.hovered img
filter: brightness(1.2)
-webkit-filter: brightness(1.2)
box-shadow: 0 0 5px black
box-shadow: 0 0 15px black
.code-language-logo
background-color: transparent
background-repeat: no-repeat
position: absolute
right: 35px
top: 15px
width: 50px
height: 50px
&.inverted
filter: invert(100%)
-webkit-filter: invert(100%)
.code-languages
margin: 10px 0 30px 0
&:hover
.code-language
opacity: 0.6
.code-language.selected-language:not(:hover)
opacity: 0.8
h2, h3
text-shadow: none
.code-wizard
opacity: 0.5
.code-language
cursor: pointer
text-align: center
position: relative
opacity: 0.6
&:hover
opacity: 1
h2, h3
text-shadow: 0px 0px 5px white
.code-wizard
display: block
opacity: 1
&.selected-language
opacity: 1
h2, h3
text-shadow: 0px 0px 5px white
.code-wizard
display: block
.code-wizard
position: absolute
background: transparent url(/images/pages/home/wizard.png) no-repeat
background-size: contain
width: 111px
height: 97px
display: none
.code-language-beta
background: transparent url(/images/pages/home/language_beta_sticker.png) no-repeat
background-size: contain
width: 100px
height: 32px
position: absolute
right: 20px
top: -7px
.primary-code-languages
#javascript
background: transparent url(/images/pages/home/language_js.png) no-repeat
padding-right: 150px
.code-wizard
left: 120px
#python
background: transparent url(/images/pages/home/language_python.png) no-repeat
padding-left: 150px
.code-wizard
right: 120px
.code-language
width: 498px
height: 153px
padding: 30px
margin: 0px 0 0 -6px
.code-wizard
top: -65px
h2
margin: 15px 0 5px
.secondary-code-languages
margin-left: -10px
.col-md-3
padding: 0px
.code-language
background: transparent url(/images/pages/home/language_background_small.png) no-repeat
width: 250px
height: 80px
margin: 20px 0 20px 0
padding: 20px 20px 20px 70px
.code-wizard
top: -51px
left: 89px
height: 63px
.code-language-logo
position: absolute
left: 15px
top: 17px
width: 50px
height: 50px
.code-language-beta
right: -15px
top: -16px
height: 24px
h3
margin: 0
padding: 0
#coffeescript .code-language-logo
background: transparent url(/images/pages/home/language_logo_coffeescript.png) no-repeat center
#clojure .code-language-logo
background: transparent url(/images/pages/home/language_logo_clojure.png) no-repeat center
#lua .code-language-logo
background: transparent url(/images/pages/home/language_logo_lua.png) no-repeat center
#io .code-language-logo
background: transparent url(/images/pages/home/language_logo_io.png) no-repeat center
#multiplayer-launch-modal
.modal-dialog

View file

@ -60,3 +60,29 @@
display: inline-block
margin-right: 3px
vertical-align: top
.code-language-logo
position: absolute
width: 20px
height: 20px
left: 12px
top: 34px
z-index: 10
background-color: transparent
background-repeat: no-repeat
background-size: contain
cursor: pointer
&.javascript
background-image: url(/images/pages/home/language_logo_javascript.png)
&.python
background-image: url(/images/pages/home/language_logo_python.png)
&.coffeescript
background-image: url(/images/pages/home/language_logo_coffeescript.png)
&.clojure
background-image: url(/images/pages/home/language_logo_clojure.png)
&.lua
background-image: url(/images/pages/home/language_logo_lua.png)
&.io
background-image: url(/images/pages/home/language_logo_io.png)

View file

@ -2,32 +2,62 @@ extends /templates/base
block content
h1#site-slogan(data-i18n="home.slogan") Learn to Code JavaScript by Playing a Game
h1#site-slogan(data-i18n="home.slogan") Learn to Code by Playing a Game
if frontPageContent == 'video'
//- if language is Chinese, we use youku, because China can't visit youtube.
//- otherwise, we use youtube.
if languageName == "zh-HANS"
#trailer-wrapper
<embed src="http://player.youku.com/player.php/sid/XNjk2Mzg5NjYw/v.swf" style="margin-left:15px; margin-top:8px;"allowFullScreen="true" quality="high" width="920" height="518" wmode="opaque"></embed>
img(src="/images/pages/home/video_border.png")
#mobile-trailer-wrapper
<embed src="http://player.youku.com/player.php/sid/XNjk2Mzg5NjYw/v.swf" style="margin-left:15px; margin-top:8px;"allowFullScreen="true" quality="high" width="280" height="158" wmode="opaque"></embed>
else
#trailer-wrapper
<iframe width="920" height="518" src="//www.youtube.com/embed/1zjaA13k-dA?rel=0&controls=0&modestbranding=1&showinfo=0&iv_load_policy=3&vq=hd720&wmode=transparent" frameborder="0" wmode="opaque" allowfullscreen></iframe>
img(src="/images/pages/home/video_border.png")
#mobile-trailer-wrapper
<iframe src="//www.youtube.com/embed/1zjaA13k-dA" frameborder="0" width="280" height="158"></iframe>
hr
else if frontPageContent == 'screenshot'
if me.isAdmin()
// Admin gate until fully tested
.code-languages
.primary-code-languages.row
.col-md-6
.code-language#javascript(data-code-language='javascript')
.code-wizard
h2 JavaScript
p The language of the web. Great for writing websites, web apps, HTML5 games, and servers.
.col-md-6
.code-language.beta#python(data-code-language='python')
.code-wizard
.code-language-beta
h2 Python
p Simple yet powerful, Python is a great general purpose programming language.
.secondary-code-languages.row
.col-md-3
.code-language.beta#coffeescript(data-code-language='coffeescript')
.code-language-logo
.code-wizard
.code-language-beta
h3 CoffeeScript
p Nicer JavaScript syntax
.col-md-3
.code-language.beta#clojure(data-code-language='clojure')
.code-language-logo
.code-wizard
.code-language-beta
h3 Clojure
p A modern Lisp
.col-md-3
.code-language.beta#lua(data-code-language='lua')
.code-language-logo
.code-wizard
.code-language-beta
h3 Lua
p Game scripting language
.col-md-3
.code-language.beta#io(data-code-language='io')
.code-language-logo
.code-wizard
.code-language-beta
h3 Io
p Simple but obscure
else
// Old
#front-screenshot
img(src="/images/pages/home/front_screenshot_01.png", alt="")
else if frontPageContent == 'nothing'
p &nbsp;
.alert.alert-danger.lt-ie10
strong(data-i18n="home.no_ie") CodeCombat does not run in Internet Explorer 9 or older. Sorry!
@ -49,6 +79,7 @@ block content
h3(data-i18n="home.campaign") Campaign
h4(data-i18n="home.for_beginners") For Beginners
.play-text(data-i18n="home.play") Play
.code-language-logo
a#multiplayer(href="/play/ladder")
div.game-mode-wrapper
@ -59,5 +90,6 @@ block content
h3(data-i18n="home.multiplayer") Multiplayer
h4(data-i18n="home.for_developers") For Developers
.play-text(data-i18n="home.play") Play
.code-language-logo
.clearfix

View file

@ -25,6 +25,7 @@
strong.tip(data-i18n='play_level.tip_impossible') It always seems impossible until it's done. - Nelson Mandela
strong.tip.rare(data-i18n='play_level.tip_baby_coders') In the future, even babies will be Archmages.
strong.tip.rare(data-i18n='play_level.tip_hardware_problem') Q: How many programmers does it take to change a light bulb? A: None, it's a hardware problem.
strong.tip.rare(data-i18n='play_level.tip_morale_improves') Loading will continue until morale improves.
strong.tip.rare(data-i18n='play_level.tip_all_species') We believe in equal opportunities to learn programming for all species.
strong.tip.rare(data-i18n='play_level.tip_reticulating') Reticulating spines.
@ -42,4 +43,4 @@
span= me.get('name') || 'Anoner'
.errors

View file

@ -2,7 +2,7 @@
i.icon-chevron-down
.thang-avatar-placeholder
code #{spell.name}(#{parameters})
code #{methodSignature}
.btn.btn-small.reload-code(title="Reload original code for " + spell.name)
i.icon-repeat

View file

@ -1,9 +1,10 @@
img(src="/images/level/code_palette_background.png").code-palette-background
.code-language-logo
ul(class="nav nav-pills" + (tabbed ? ' multiple-tabs' : ''))
each slug, group in entryGroupSlugs
li(class=group == "this" || slug == "available-spells" ? "active" : "")
a(data-toggle="pill", data-target='#palette-tab-' + slug)
h4= group
h4= entryGroupNames[group]
.tab-content
each slug, group in entryGroupSlugs
div(id="palette-tab-" + slug, class="tab-pane nano" + (group == "this" || slug == defaultGroupSlug ? " active" : ""))

View file

@ -11,11 +11,22 @@ if doc.example
p.example
strong Example:
div!= marked("```\n" + doc.example + "```")
else if doc.type == 'function'
else if doc.type == 'function' && argumentExamples.length
p.example
strong Example:
div
code= doc.owner + '.' + doc.name + '(' + argumentExamples.join(', ') + ');'
if language == 'javascript'
code= doc.owner + '.' + doc.name + '(' + argumentExamples.join(', ') + ');'
else if language == 'coffeescript'
code= doc.ownerName + (doc.ownerName == '@' ? '' : '.') + doc.name + ' ' + argumentExamples.join(', ')
else if language == 'python'
code= doc.ownerName + '.' + doc.name + '(' + argumentExamples.join(', ') + ')'
else if language == 'clojure'
code= '(.' + doc.name + ' ' + doc.ownerName + ' ' + argumentExamples.join(', ') + ')'
else if language == 'lua'
code= doc.ownerName + ':' + doc.name + '(' + argumentExamples.join(', ') + ')'
else if language == 'io'
code= (doc.ownerName == 'this' ? '' : doc.ownerName + ' ') + doc.name + '(' + argumentExamples.join(', ') + ')'
if (doc.type != 'function' && doc.type != 'snippet') || doc.name == 'now'
p.value

View file

@ -10,6 +10,9 @@ module.exports = class HomeView extends View
id: 'home-view'
template: template
events:
'click .code-language': 'onCodeLanguageSelected'
constructor: ->
super(arguments...)
ThangType.loadUniversalWizard()
@ -25,10 +28,7 @@ module.exports = class HomeView extends View
console.warn 'no more jquery browser version...'
c.isEnglish = (me.get('preferredLanguage') or 'en').startsWith 'en'
c.languageName = me.get('preferredLanguage')
# A/B test: https://github.com/codecombat/codecombat/issues/769
c.frontPageContent = {0: "video", 1: "screenshot", 2: "nothing"}[me.get('testGroupNumber') % 3]
application.tracker.identify frontPageContent: c.frontPageContent
application.tracker.trackEvent 'Front Page Content', frontPageContent: c.frontPageContent
c.codeLanguage = (me.get('aceConfig') ? {}).language or 'javascript'
c
afterRender: ->
@ -46,3 +46,26 @@ module.exports = class HomeView extends View
href[href.length-1] = lastLevel if href.length isnt 0
href = href.join("/")
playLink.attr("href", href)
codeLanguage = (me.get('aceConfig') ? {}).language or 'javascript'
@$el.find(".code-language[data-code-language=#{codeLanguage}]").addClass 'selected-language'
@updateLanguageLogos codeLanguage
updateLanguageLogos: (codeLanguage) ->
@$el.find('.game-mode-wrapper .code-language-logo').css('background-image', "url(/images/pages/home/language_logo_#{codeLanguage}.png)").toggleClass 'inverted', (codeLanguage in ['io', 'coffeescript'])
onCodeLanguageSelected: (e) ->
target = $(e.target).closest('.code-language')
codeLanguage = target.data('code-language')
@$el.find('.code-language').removeClass 'selected-language'
target.addClass 'selected-language'
aceConfig = me.get('aceConfig') ? {}
return if (aceConfig.language or 'javascript') is codeLanguage
aceConfig.language = codeLanguage
me.set 'aceConfig', aceConfig
me.save() # me.patch() doesn't work if aceConfig previously existed and we switched just once
firstButton = @$el.find('#beginner-campaign .game-mode-wrapper').delay(500).addClass('hovered', 500).delay(500).removeClass('hovered', 500)
lastButton = @$el.find('#multiplayer .game-mode-wrapper').delay(1000).addClass('hovered', 500).delay(500).removeClass('hovered', 500)
$('#page-container').animate {scrollTop: firstButton.offset().top - 100, easing: 'easeInOutCubic'}, 500
@updateLanguageLogos codeLanguage

View file

@ -28,7 +28,7 @@ module.exports = class ControlBarView extends View
'click #next-game-button': ->
Backbone.Mediator.publish 'next-game-pressed'
'click': -> Backbone.Mediator.publish 'focus-editor'
'click': -> Backbone.Mediator.publish 'tome:focus-editor'
constructor: (options) ->
@worldName = options.worldName

View file

@ -31,7 +31,7 @@ module.exports = class HUDView extends View
@$el.addClass 'no-selection'
onClick: (e) ->
Backbone.Mediator.publish 'focus-editor' unless $(e.target).parents('.thang-props').length
Backbone.Mediator.publish 'tome:focus-editor' unless $(e.target).parents('.thang-props').length
onFrameChanged: (e) ->
@timeProgress = e.progress
@ -126,7 +126,7 @@ module.exports = class HUDView extends View
if thangType.get('raster')
wrapper.empty().append($('<img />').attr('src', '/file/'+thangType.get('raster')))
else
stage = thangType.getPortraitStage options
return unless stage = thangType.getPortraitStage options
newCanvas = $(stage.canvas).addClass('thang-canvas')
wrapper.empty().append(newCanvas)
stage.update()

View file

@ -36,7 +36,7 @@ module.exports = class PlaybackView extends View
'click #zoom-out-button': -> Backbone.Mediator.publish('camera-zoom-out') unless @shouldIgnore()
'click #volume-button': 'onToggleVolume'
'click #play-button': 'onTogglePlay'
'click': -> Backbone.Mediator.publish 'focus-editor'
'click': -> Backbone.Mediator.publish 'tome:focus-editor'
'mouseenter #timeProgress': 'onProgressEnter'
'mouseleave #timeProgress': 'onProgressLeave'
'mousemove #timeProgress': 'onProgressHover'

View file

@ -46,7 +46,7 @@ module.exports = class CastButtonView extends View
Backbone.Mediator.publish 'tome:manual-cast', {}
onCastOptionsClick: (e) =>
Backbone.Mediator.publish 'focus-editor'
Backbone.Mediator.publish 'tome:focus-editor'
@castButtonGroup.removeClass 'open'
@setAutocastDelay $(e.target).attr 'data-delay'
false

View file

@ -0,0 +1,124 @@
popoverTemplate = require 'templates/play/level/tome/spell_palette_entry_popover'
{downTheChain} = require 'lib/world/world_utils'
window.Vector = require 'lib/world/vector' # So we can document it
safeJSONStringify = (input, maxDepth) ->
recursion = (input, path, depth) ->
output = {}
pPath = undefined
refIdx = undefined
path = path or ""
depth = depth or 0
depth++
return "{depth over " + maxDepth + "}" if maxDepth and depth > maxDepth
for p of input
pPath = ((if path then (path + ".") else "")) + p
if typeof input[p] is "function"
output[p] = "{function}"
else if typeof input[p] is "object"
refIdx = refs.indexOf(input[p])
if -1 isnt refIdx
output[p] = "{reference to " + refsPaths[refIdx] + "}"
else
refs.push input[p]
refsPaths.push pPath
output[p] = recursion(input[p], pPath, depth)
else
output[p] = input[p]
output
refs = []
refsPaths = []
maxDepth = maxDepth or 5
if typeof input is "object"
output = recursion(input)
else
output = input
JSON.stringify output, null, 1
module.exports = class DocFormatter
constructor: (@options) ->
@doc = _.cloneDeep options.doc
@fillOutDoc()
fillOutDoc: ->
if _.isString @doc
@doc = name: @doc, type: typeof @options.thang[@doc]
if @options.isSnippet
@doc.type = 'snippet'
@doc.owner = 'snippets'
@doc.shortName = @doc.shorterName = @doc.title = @doc.name
else
@doc.owner ?= 'this'
ownerName = @doc.ownerName = if @doc.owner isnt 'this' then @doc.owner else switch @options.language
when 'python', 'lua' then 'self'
when 'coffeescript' then '@'
else 'this'
if @doc.type is 'function'
sep = {clojure: ' '}[@options.language] ? ', '
argNames = (arg.name for arg in @doc.args ? []).join sep
argString = if argNames then '__ARGS__' else ''
@doc.shortName = switch @options.language
when 'coffeescript' then "#{ownerName}#{if ownerName is '@' then '' else '.'}#{@doc.name}#{if argString then ' ' + argString else '()'}"
when 'python' then "#{ownerName}.#{@doc.name}(#{argString})"
when 'lua' then "#{ownerName}:#{@doc.name}(#{argString})"
when 'clojure' then "(.#{@doc.name} #{ownerName}#{if argNames then ' ' + argString else ''})"
when 'io' then "#{if ownerName is 'this' then '' else ownerName + ' '}#{@doc.name}#{if argNames then '(' + argNames + ')' else ''}"
else "#{ownerName}.#{@doc.name}(#{argString});"
else
@doc.shortName = switch @options.language
when 'coffeescript' then "#{ownerName}#{if ownerName is '@' then '' else '.'}#{@doc.name}"
when 'python' then "#{ownerName}.#{@doc.name}"
when 'lua' then "#{ownerName}.#{@doc.name}"
when 'clojure' then "(.#{@doc.name} #{ownerName})"
when 'io' then "#{if ownerName is 'this' then '' else ownerName + ' '}#{@doc.name}"
else "#{ownerName}.#{@doc.name};"
@doc.shorterName = @doc.shortName
if @doc.type is 'function' and argString
@doc.shortName = @doc.shorterName.replace argString, argNames
@doc.shorterName = @doc.shorterName.replace argString, (if argNames.length > 6 then '...' else argNames)
if @options.language is 'javascript'
@doc.shorterName = @doc.shortName.replace ';', ''
if @doc.owner is 'this' or @options.tabbify
@doc.shorterName = @doc.shorterName.replace /^this\./, ''
@doc.title = if @options.shortenize then @doc.shorterName else @doc.shortName
# Grab the language-specific documentation for some sub-properties, if we have it.
toTranslate = [{obj: @doc, prop: 'example'}, {obj: @doc, prop: 'returns'}]
for arg in (@doc.args ? [])
toTranslate.push {obj: arg, prop: 'example'}, {obj: arg, prop: 'description'}
for {obj, prop} in toTranslate
if val = obj[prop]?[@options.language]
obj[prop] = val
else unless _.isString obj[prop]
obj[prop] = null
formatPopover: ->
content = popoverTemplate doc: @doc, language: @options.language, value: @formatValue(), marked: marked, argumentExamples: (arg.example or arg.default or arg.name for arg in @doc.args ? [])
owner = if @doc.owner is 'this' then @options.thang else window[@doc.owner]
content = content.replace /#{spriteName}/g, @options.thang.type ? @options.thang.spriteName # Prefer type, and excluded the quotes we'd get with @formatValue
content.replace /\#\{(.*?)\}/g, (s, properties) => @formatValue downTheChain(owner, properties.split('.'))
formatValue: (v) ->
return null if @doc.type is 'snippet'
return @options.thang.now() if @doc.name is 'now'
return '[Function]' if not v and @doc.type is 'function'
unless v?
if @doc.owner is 'this'
v = @options.thang[@doc.name]
else
v = window[@doc.owner][@doc.name] # grab Math or Vector
if @doc.type is 'number' and not isNaN v
if v == Math.round v
return v
return v.toFixed 2
if _.isString v
return "\"#{v}\""
if v?.id
return v.id
if v?.name
return v.name
if _.isArray v
return '[' + (@formatValue v2 for v2 in v).join(', ') + ']'
if _.isPlainObject v
return safeJSONStringify v, 2
v

View file

@ -41,7 +41,7 @@ module.exports = class Spell
@thangs = {}
@view = new SpellView {spell: @, session: @session, worker: @worker}
@view.render() # Get it ready and code loaded in advance
@tabView = new SpellListTabEntryView spell: @, supermodel: @supermodel
@tabView = new SpellListTabEntryView spell: @, supermodel: @supermodel, language: @language
@tabView.render()
@team = @permissions.readwrite[0] ? "common"
Backbone.Mediator.publish 'tome:spell-created', spell: @
@ -153,6 +153,7 @@ module.exports = class Spell
for thangId, spellThang of @thangs
spellThang.aether?.setLanguage @language
spellThang.castAether = null
Backbone.Mediator.publish 'tome:spell-changed-language', spell: @, language: @language
workerMessage =
function: "updateLanguageAether"
newLanguage: @language

View file

@ -13,6 +13,7 @@ module.exports = class SpellListEntryView extends View
subscriptions:
'tome:problems-updated': "onProblemsUpdated"
'tome:spell-changed-language': 'onSpellChangedLanguage'
'level-disable-controls': 'onDisableControls'
'level-enable-controls': 'onEnableControls'
'god:new-world-created': 'onNewWorld'
@ -30,11 +31,38 @@ module.exports = class SpellListEntryView extends View
getRenderData: (context={}) ->
context = super context
context.spell = @spell
context.parameters = (@spell.parameters or []).join ', '
context.methodSignature = @createMethodSignature()
context.thangNames = (thangID for thangID, spellThang of @spell.thangs when spellThang.thang.exists).join(', ') # + ", Marcus, Robert, Phoebe, Will Smith, Zap Brannigan, You, Gandaaaaalf"
context.showTopDivider = @showTopDivider
context
createMethodSignature: ->
parameters = (@spell.parameters or []).slice()
if @spell.language in ['python', 'lua']
parameters.unshift 'self'
else if @spell.language is 'io'
parameters.unshift '...'
paramString = parameters.join ', '
name = @spell.name
switch @spell.language
when 'io'
"#{name} := method(#{paramString})"
when 'clojure'
"(defn #{name} [#{paramString}] ...)"
when 'python'
"def #{name}(#{paramString}):"
when 'lua'
"function #{name}(#{paramString}) ... end"
when 'coffeescript'
if parameters.length
"@#{name} = (#{paramString}) ->"
else
"@#{name} = ->"
when 'javascript'
"function #{name}(#{paramString}) { ... }"
else
"#{name}(#{paramString})"
getPrimarySpellThang: ->
if @lastSelectedThang
spellThang = _.find @spell.thangs, (spellThang) => spellThang.thang.id is @lastSelectedThang.id
@ -42,7 +70,7 @@ module.exports = class SpellListEntryView extends View
for thangID, spellThang of @spell.thangs
continue unless spellThang.thang.exists
return spellThang # Just do the first one else
afterRender: ->
super()
return unless @options.showTopDivider # Don't repeat Thang avatars when not changed from previous entry
@ -92,6 +120,10 @@ module.exports = class SpellListEntryView extends View
return unless e.spell is @spell
@$el.toggleClass "user-code-problem", e.problems.length
onSpellChangedLanguage: (e) ->
return unless e.spell is @spell
@render() # So that we can update parameters if needed
onDisableControls: (e) -> @toggleControls e, false
onEnableControls: (e) -> @toggleControls e, true
toggleControls: (e, enabled) ->
@ -105,7 +137,7 @@ module.exports = class SpellListEntryView extends View
onNewWorld: (e) ->
@lastSelectedThang = e.world.thangMap[@lastSelectedThang.id] if @lastSelectedThang
destroy: ->
@avatar?.destroy()
super()

View file

@ -1,9 +1,8 @@
SpellListEntryView = require './spell_list_entry_view'
ThangAvatarView = require 'views/play/level/thang_avatar_view'
template = require 'templates/play/level/tome/spell_list_tab_entry'
popoverTemplate = require 'templates/play/level/tome/spell_palette_entry_popover'
LevelComponent = require 'models/LevelComponent'
{downTheChain} = require 'lib/world/world_utils'
DocFormatter = require './doc_formatter'
module.exports = class SpellListTabEntryView extends SpellListEntryView
template: template
@ -13,6 +12,7 @@ module.exports = class SpellListTabEntryView extends SpellListEntryView
'tome:spell-loaded': "onSpellLoaded"
'tome:spell-changed': "onSpellChanged"
'god:new-world-created': 'onNewWorld'
'tome:spell-changed-language': 'onSpellChangedLanguage'
events:
'click .spell-list-button': 'onDropdownClick'
@ -60,43 +60,16 @@ module.exports = class SpellListTabEntryView extends SpellListEntryView
found = true
break
return unless found
doc = _.clone doc
doc.owner = 'this'
doc.shortName = doc.shorterName = doc.title = "this.#{doc.name}();"
docFormatter = new DocFormatter doc: doc, thang: @thang, language: @options.language
@$el.find('code').popover(
animation: true
html: true
placement: 'bottom'
trigger: 'hover'
content: @formatPopover doc
content: docFormatter.formatPopover()
container: @$el.parent()
)
formatPopover: (doc) ->
content = popoverTemplate doc: doc, marked: marked, argumentExamples: (arg.example or arg.default or arg.name for arg in doc.args ? [])
owner = @thang
content = content.replace /#{spriteName}/g, @thang.type ? @thang.spriteName # Prefer type, and excluded the quotes we'd get with @formatValue
content.replace /\#\{(.*?)\}/g, (s, properties) => @formatValue downTheChain(owner, properties.split('.'))
formatValue: (v) ->
# TODO: refactor and move spell_palette_entry_view version of this somewhere else
# maybe think about making it common with what Aether does and the SpellDebugView, too
if _.isNumber v
if v == Math.round v
return v
return v.toFixed 2
if _.isString v
return "\"#{v}\""
if v?.id
return v.id
if v?.name
return v.name
if _.isArray v
return '[' + (@formatValue v2 for v2 in v).join(', ') + ']'
if _.isPlainObject v
return safeJSONStringify v, 2
v
onMouseEnterAvatar: (e) -> # Don't call super
onMouseLeaveAvatar: (e) -> # Don't call super
onClick: (e) -> # Don't call super
@ -125,6 +98,14 @@ module.exports = class SpellListTabEntryView extends SpellListEntryView
return unless e.spell is @spell
@updateReloadButton()
onSpellChangedLanguage: (e) ->
return unless e.spell is @spell
@options.language = e.language
@$el.find('code').popover 'destroy'
@render()
@docsBuilt = false
@buildDocs() if @thang
toggleControls: (e, enabled) ->
# Don't call super; do it differently
return if e.controls and not ('editor' in e.controls)

View file

@ -1,57 +1,8 @@
View = require 'views/kinds/CocoView'
template = require 'templates/play/level/tome/spell_palette_entry'
popoverTemplate = require 'templates/play/level/tome/spell_palette_entry_popover'
{me} = require 'lib/auth'
filters = require 'lib/image_filter'
{downTheChain} = require 'lib/world/world_utils'
window.Vector = require 'lib/world/vector' # So we can document it
safeJSONStringify = (input, maxDepth) ->
recursion = (input, path, depth) ->
output = {}
pPath = undefined
refIdx = undefined
path = path or ""
depth = depth or 0
depth++
return "{depth over " + maxDepth + "}" if maxDepth and depth > maxDepth
for p of input
pPath = ((if path then (path + ".") else "")) + p
if typeof input[p] is "function"
output[p] = "{function}"
else if typeof input[p] is "object"
refIdx = refs.indexOf(input[p])
if -1 isnt refIdx
output[p] = "{reference to " + refsPaths[refIdx] + "}"
else
refs.push input[p]
refsPaths.push pPath
output[p] = recursion(input[p], pPath, depth)
else
output[p] = input[p]
output
refs = []
refsPaths = []
maxDepth = maxDepth or 5
if typeof input is "object"
output = recursion(input)
else
output = input
JSON.stringify output, null, 1
# http://stackoverflow.com/a/987376/540620
$.fn.selectText = ->
el = @[0]
if document.body.createTextRange
range = document.body.createTextRange()
range.moveToElementText(el)
range.select()
else if window.getSelection
selection = window.getSelection()
range = document.createRange()
range.selectNodeContents(el)
selection.removeAllRanges()
selection.addRange(range)
DocFormatter = require './doc_formatter'
module.exports = class SpellPaletteEntryView extends View
tagName: 'div' # Could also try <code> instead of <div>, but would need to adjust colors
@ -73,25 +24,8 @@ module.exports = class SpellPaletteEntryView extends View
constructor: (options) ->
super options
@thang = options.thang
@doc = options.doc
if _.isString @doc
@doc = name: @doc, type: typeof @thang[@doc]
if options.isSnippet
@doc.type = @doc.owner = 'snippet'
@doc.shortName = @doc.shorterName = @doc.title = @doc.name
else
@doc.owner ?= 'this'
suffix = ''
if @doc.type is 'function'
argNames = (arg.name for arg in @doc.args ? []).join(', ')
argNames = '...' if argNames.length > 6
suffix = "(#{argNames})"
@doc.shortName = "#{@doc.owner}.#{@doc.name}#{suffix};"
if @doc.owner is 'this' or options.tabbify
@doc.shorterName = "#{@doc.name}#{suffix}"
else
@doc.shorterName = @doc.shortName.replace ';', ''
@doc.title = if options.shortenize then @doc.shorterName else @doc.shortName
@docFormatter = new DocFormatter options
@doc = @docFormatter.doc
getRenderData: ->
c = super()
@ -106,46 +40,15 @@ module.exports = class SpellPaletteEntryView extends View
html: true
placement: 'top'
trigger: 'manual' # Hover, until they click, which will then pin it until unclick.
content: @formatPopover()
content: @docFormatter.formatPopover()
container: '#tome-view'
)
@$el.on 'show.bs.popover', =>
Backbone.Mediator.publish 'tome:palette-hovered', thang: @thang, prop: @doc.name, entry: @
formatPopover: ->
content = popoverTemplate doc: @doc, value: @formatValue(), marked: marked, argumentExamples: (arg.example or arg.default or arg.name for arg in @doc.args ? [])
owner = if @doc.owner is 'this' then @thang else window[@doc.owner]
content = content.replace /#{spriteName}/g, @thang.type ? @thang.spriteName # Prefer type, and excluded the quotes we'd get with @formatValue
content.replace /\#\{(.*?)\}/g, (s, properties) => @formatValue downTheChain(owner, properties.split('.'))
formatValue: (v) ->
return null if @doc.type is 'snippet'
return @thang.now() if @doc.name is 'now'
return '[Function]' if not v and @doc.type is 'function'
unless v?
if @doc.owner is 'this'
v = @thang[@doc.name]
else
v = window[@doc.owner][@doc.name] # grab Math or Vector
if @doc.type is 'number' and not isNaN v
if v == Math.round v
return v
return v.toFixed 2
if _.isString v
return "\"#{v}\""
if v?.id
return v.id
if v?.name
return v.name
if _.isArray v
return '[' + (@formatValue v2 for v2 in v).join(', ') + ']'
if _.isPlainObject v
return safeJSONStringify v, 2
v
onMouseEnter: (e) ->
# Make sure the doc has the updated Thang so it can regenerate its prop value
@$el.data('bs.popover').options.content = @formatPopover()
@$el.data('bs.popover').options.content = @docFormatter.formatPopover()
@$el.popover('setContent')
@$el.popover 'show' unless @popoverPinned or @otherPopoverPinned
@ -173,7 +76,7 @@ module.exports = class SpellPaletteEntryView extends View
onFrameChanged: (e) ->
return unless e.selectedThang?.id is @thang.id
@options.thang = @thang = e.selectedThang # Update our thang to the current version
@options.thang = @thang = @docFormatter.options.thang = e.selectedThang # Update our thang to the current version
onPaletteHovered: (e) ->
return if e.entry is @

View file

@ -4,6 +4,7 @@ template = require 'templates/play/level/tome/spell_palette'
filters = require 'lib/image_filter'
SpellPaletteEntryView = require './spell_palette_entry_view'
LevelComponent = require 'models/LevelComponent'
EditorConfigModal = require '../modal/editor_config_modal'
N_ROWS = 4
@ -16,6 +17,10 @@ module.exports = class SpellPaletteView extends View
'level-disable-controls': 'onDisableControls'
'level-enable-controls': 'onEnableControls'
'surface:frame-changed': "onFrameChanged"
'tome:change-language': 'onTomeChangedLanguage'
events:
'click .code-language-logo': 'onEditEditorConfig'
constructor: (options) ->
super options
@ -26,6 +31,7 @@ module.exports = class SpellPaletteView extends View
c = super()
c.entryGroups = @entryGroups
c.entryGroupSlugs = @entryGroupSlugs
c.entryGroupNames = @entryGroupNames
c.tabbed = _.size(@entryGroups) > 1
c.defaultGroupSlug = @defaultGroupSlug
c
@ -39,14 +45,18 @@ module.exports = class SpellPaletteView extends View
for entry in entryColumn
col.append entry.el
entry.render() # Render after appending so that we can access parent container for popover
$('.nano').nanoScroller()
$('.nano').nanoScroller()
@updateCodeLanguage @options.language
updateCodeLanguage: (language) ->
@options.language = language
@$el.find('.code-language-logo').removeClass().addClass 'code-language-logo ' + language
createPalette: ->
lcs = @supermodel.getModels LevelComponent
allDocs = {}
for lc in lcs
for doc in (lc.get('propertyDocumentation') ? [])
doc = _.clone doc
allDocs['__' + doc.name] ?= []
allDocs['__' + doc.name].push doc
if doc.type is 'snippet' then doc.owner = 'snippets'
@ -90,7 +100,7 @@ module.exports = class SpellPaletteView extends View
return 'more' if entry.doc.owner is 'this' and entry.doc.name in (propGroups.more ? [])
entry.doc.owner
@entries = _.sortBy @entries, (entry) ->
order = ['this', 'more', 'Math', 'Vector', 'snippets']
order = ['this', 'more', 'Math', 'Vector', 'String', 'Object', 'Array', 'Function', 'snippets']
index = order.indexOf groupForEntry entry
index = String.fromCharCode if index is -1 then order.length else index
index += entry.doc.name
@ -102,13 +112,18 @@ module.exports = class SpellPaletteView extends View
@entryGroups[defaultGroup] = @entries
@defaultGroupSlug = _.string.slugify defaultGroup
@entryGroupSlugs = {}
@entryGroupNames = {}
for group, entries of @entryGroups
@entryGroupSlugs[group] = _.string.slugify group
@entryGroups[group] = _.groupBy entries, (entry, i) -> Math.floor i / N_ROWS
@entryGroupSlugs[group] = _.string.slugify group
@entryGroupNames[group] = group
if thisName = {coffeescript: '@', lua: 'self', clojure: 'self'}[@options.language]
if @entryGroupNames.this
@entryGroupNames.this = thisName
null
addEntry: (doc, shortenize, tabbify, isSnippet=false) ->
new SpellPaletteEntryView doc: doc, thang: @thang, shortenize: shortenize, tabbify: tabbify, isSnippet: isSnippet
new SpellPaletteEntryView doc: doc, thang: @thang, shortenize: shortenize, tabbify: tabbify, isSnippet: isSnippet, language: @options.language
onDisableControls: (e) -> @toggleControls e, false
onEnableControls: (e) -> @toggleControls e, true
@ -132,6 +147,15 @@ module.exports = class SpellPaletteView extends View
return unless e.selectedThang?.id is @thang.id
@options.thang = @thang = e.selectedThang # Update our thang to the current version
onTomeChangedLanguage: (e) ->
@updateCodeLanguage e.language
entry.destroy() for entry in @entries
@createPalette()
@render()
onEditEditorConfig: (e) ->
@openModalView new EditorConfigModal session: @options.session
destroy: ->
entry.destroy() for entry in @entries
@toggleBackground = null

View file

@ -42,7 +42,7 @@ module.exports = class SpellView extends View
'tome:spell-changed': 'onSpellChanged'
'level:session-will-save': 'onSessionWillSave'
'modal-closed': 'focus'
'focus-editor': 'focus'
'tome:focus-editor': 'focus'
'tome:spell-statement-index-updated': 'onStatementIndexUpdated'
'tome:change-language': 'onChangeLanguage'
'tome:change-config': 'onChangeEditorConfig'
@ -299,7 +299,10 @@ module.exports = class SpellView extends View
else
@ace.setValue source
@eventsSuppressed = false
@ace.resize true # hack: @ace may not have updated its text properly, so we force it to refresh
try
@ace.resize true # hack: @ace may not have updated its text properly, so we force it to refresh
catch error
console.warn "Error resizing ACE after an update:", error
# Called from CastButtonView initially and whenever the delay is changed
setAutocastDelay: (@autocastDelay) ->

View file

@ -163,7 +163,7 @@ module.exports = class TomeView extends View
@spellList.$el.hide()
onClick: (e) ->
Backbone.Mediator.publish 'focus-editor' unless $(e.target).parents('.popover').length
Backbone.Mediator.publish 'tome:focus-editor' unless $(e.target).parents('.popover').length
clearSpellView: ->
@spellView?.dismiss()
@ -202,7 +202,7 @@ module.exports = class TomeView extends View
updateSpellPalette: (thang, spell) ->
return unless thang and @spellPaletteView?.thang isnt thang and thang.programmableProperties or thang.apiProperties
@spellPaletteView = @insertSubView new SpellPaletteView thang: thang, supermodel: @supermodel, programmable: spell?.canRead()
@spellPaletteView = @insertSubView new SpellPaletteView thang: thang, supermodel: @supermodel, programmable: spell?.canRead(), language: spell?.language ? @options.session.get('codeLanguage'), session: @options.session
@spellPaletteView.toggleControls {}, spell.view.controlsEnabled if spell # TODO: know when palette should have been disabled but didn't exist
spellFor: (thang, spellName) ->

126
scripts/runAfterGit.coffee Normal file
View file

@ -0,0 +1,126 @@
# This is written in coffeescript. Run this using coffee, not node. (Line to yield nice warnings on node. :))
return console.log '------------------------------------------------- \n
Commandline utility written in Coffeescript to run all updates, download latest database and install it after you git pushed. \n
Params: \n
\t--skipupdates skips npm and bower update \n
\t--dldb: download the latest database (Over 300 mb!) \n
\t--resetdb: to reset the database and load dump from tmp. Will need a downloaded database or --dbdownload specified \n
\t--mongopath <.path/to/mongo>: to specify mongodb folder if not set in PATH. \n
\t--help: Yo fund this one already. \n
\n
May need an initial npm install upfront if newly checked out. \n
' if '--help' in process.argv
#TODO: MD5 Verification, using http://23.21.59.137/dump.md5 using digest stream https://github.com/jeffbski/digest-stream
dbDump = 'http://23.21.59.137/dump.tar.gz' # Don't change this unless you know what you're doing
dbLocalPath = '../temp'
fs = require 'fs'
tar = require 'tar'
spawn = require('child_process').spawn
http = require 'http'
fs = require 'fs'
zlib = require 'zlib'
Deferred = require 'JQDeferred'
#TODO: Could kill current coco server here.
mongopath = ''
useNext = false
for path in process.argv
if useNext
mongopath = path
break
useNext = path is '--mongopath'
mongopath += '/bin/' if mongopath.length
mongopath += 'mongodb' # mongodb is in path.
run = (proc, args) ->
deferred = Deferred()
spawned = spawn proc, args
spawned.stdout.on "data", (data) -> process.stdout.write data
spawned.stderr.on "data", (data) -> process.stderr.write data
spawned.on "exit", (code) ->
console.log proc + " exited with code " + code
# unless code is null doesn't seem to work
# deferred.reject()
deferred.resolve code
spawned.on "error", (code, error) ->
console.error proc + " failed!"
deferred.reject()
deferred.promise()
removeDir = (path) ->
if fs.existsSync(path)
fs.readdirSync(path).forEach (file) ->
current = path + "/" + file
if fs.lstatSync(current).isDirectory() # recurse
removeDir current
else # delete file
fs.unlinkSync current
fs.rmdirSync path
resetDB = ->
deferred = Deferred()
console.log "Dropping Database"
mongodrop = run "mongo", ["coco", "--eval", "db.dropDatabase()"]
mongodrop.fail -> console.error "Error occurred while dropping mongo. Make sure CoCo's MongoDB is running."
mongodrop.done ->
console.log "Restoring from dump."
mongorestore = run "mongorestore", [dbLocalPath]
mongorestore.always = deferred.resolve()
deferred.promise()
downloadDB = ->
deferred = Deferred()
#mongoose = require 'mongoose'
# TODO: What if mongo is not running?
console.log "Downloading Database dump. It's big. This may take a while..."
request = http.get dbDump, (response)->
unzip = response.pipe(zlib.createGunzip()).pipe(tar.Extract(path: dbLocalPath))
# Log download
currentChunk = 0
cur = 0
len = parseInt(response.headers['content-length'], 10)
total = len / 1048576 #1048576 - bytes in 1Megabyte
response.on 'data', (chunk) ->
cur += chunk.length
console.log 'DB dump download received chunk ' + currentChunk++ + ", " + (100.0 * cur / len).toFixed(2) + "% finished of " + total.toFixed(0) + " mb"
unzip.on('data', -> console.log "Unpacking zip...")
unzip.on('error', (err) -> console.log "An error occurred while downloading DB Dump: " + err)
unzip.on 'end', ->
console.log "Finished downloading."
deferred.resolve()
deferred.promise()
installUpdates = ->
deferred = Deferred()
npm = if process.platform is "win32" then "npm.cmd" else "npm"
npminstall = run npm, ['update']
npminstall.done ->
bowerinstall = run 'bower', ['update']
deferred.resolve()
deferred.promise()
cleanUpTmp = ->
removeDir dbLocalPath
unless '--skipupdates' in process.argv
installUpdates()
if '--resetdb' in process.argv
if '--dldb' in process.argv
downloadDB().done ->
resetDB().done ->
cleanUpTmp() if '--cleanup' in process.argv
else
resetDB().done ->
cleanUpTmp() if '--cleanup' in process.argv
else if '--dldb' in process.argv
downloadDB()
# TODO: Could advice to start SCOCODE.bat et al. here