diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..41f6371 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "scripts/parsers/odt.js"] + path = scripts/parsers/odt.js + url = https://github.com/codexa/odt.js.git + branch = master diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..a5fec2a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,16 @@ +# Calling all contributors! +Firetext delivers office capabilities to many Firefox OS users. We could really use your help! + +If you would like to talk to us, please join our chat on Gitter: [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/codexa/firetext?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +### Hack +Is the open web your passion? Do you dream in code? Well, head on over to our [Get Coding](https://github.com/codexa/firetext/wiki/Get-Coding) page, +and learn how to bring more productivity power to Firefox OS users! + +### Localize +Do you bridge the gap between cultures? Localize Firetext on [Transifex](https://www.transifex.com/projects/p/firetext/), and expand our global impact. + +### Donate +Do you have a feature/bug you want fixed? Donate to [Firetext on Bountysource](https://www.bountysource.com/teams/firetext) to expedite its development. + +Current bounties: [![](https://www.bountysource.com/badge/team?team_id=318&style=bounties_received)](https://www.bountysource.com/teams/firetext) diff --git a/README.md b/README.md index 24ed79a..430f418 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,24 @@ # Firetext ## About -Firetext is a word processor for Firefox OS [available on the Firefox Marketplace](https://marketplace.firefox.com/app/firetext). Firetext currently supports html and plain text files (more will be added later). -You can run Firetext on a Firefox OS device, on a [Firefox OS simulator](https://ftp.mozilla.org/pub/mozilla.org/labs/fxos-simulator/), or on the Firefox App Manager/WebIDE. +Firetext is an open-source word processor for Firefox OS, and is [available on the Firefox Marketplace](https://marketplace.firefox.com/app/firetext). + +You can run Firetext on a Firefox OS device, on a [Firefox OS simulator](https://ftp.mozilla.org/pub/mozilla.org/labs/fxos-simulator/), +or in Firefox/Chrome with a web server. Please see [our documentation](https://github.com/codexa/firetext/wiki/Get-Coding#set-up-a-development-environment) for instructions. ## Contribute -Firetext is kept alive by contributions from the community. -Please donate skills, time, or money to make this project better. - -Take an [issue](https://github.com/Codexa/Firetext/issues), translate the app on [Transifex](https://www.transifex.com/projects/p/firetext/) or contact [us](mailto:codexa.contact@gmail.com) to learn how you can help! +Firetext is kept alive by contributions from the community. Please donate skills, time, or money to make this project better. + +If you would like to talk to us, please join our chat on Gitter: [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/codexa/firetext?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +### Hack +Is the open web your passion? Do you dream in code? Well, head on over to our [Get Coding](https://github.com/codexa/firetext/wiki/Get-Coding) page, +and learn how to bring more productivity power to Firefox OS users! + +### Localize +Do you bridge the gap between cultures? Localize Firetext on [Transifex](https://www.transifex.com/projects/p/firetext/), and expand our global impact. + +### Donate +Do you have a feature/bug you want fixed? Donate to [Firetext on Bountysource](https://www.bountysource.com/teams/firetext) to expedite its development. -## Donate -Donate to [Firetext on Bountysource](https://www.bountysource.com/teams/firetext) to expedite development. Current bounties: [![](https://www.bountysource.com/badge/team?team_id=318&style=bounties_received)](https://www.bountysource.com/teams/firetext) +Current bounties: [![](https://www.bountysource.com/badge/team?team_id=318&style=bounties_received)](https://www.bountysource.com/teams/firetext) diff --git a/automation/.tx/config b/automation/.tx/config new file mode 100644 index 0000000..235e210 --- /dev/null +++ b/automation/.tx/config @@ -0,0 +1,8 @@ +[main] +host = https://www.transifex.com + +[firetext.appproperties] +file_filter = ../locales//app.properties +source_lang = en +type = MOZILLAPROPERTIES + diff --git a/automation/tx.exe b/automation/tx.exe new file mode 100644 index 0000000..cb0810d Binary files /dev/null and b/automation/tx.exe differ diff --git a/automation/update_locales.bat b/automation/update_locales.bat new file mode 100644 index 0000000..ca51963 --- /dev/null +++ b/automation/update_locales.bat @@ -0,0 +1 @@ +tx pull -r firetext.appproperties -a -s --minimum-perc 100 \ No newline at end of file diff --git a/editor/editor.html b/editor/editor.html deleted file mode 100644 index d6b6818..0000000 --- a/editor/editor.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - Firetext Editor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/editor/scripts/docIO.js b/editor/scripts/docIO.js deleted file mode 100644 index feda53e..0000000 --- a/editor/scripts/docIO.js +++ /dev/null @@ -1,101 +0,0 @@ -/* -* Document I/O -* Copyright (C) Codexa Organization 2013. -*/ - -'use strict' - -function initDocIO(doc, messageProxy) { - /* 0.4 - var docxeditor; - */ - var filetype; - - function watchDocument(filetype) { - // Add listener to update raw - doc.addEventListener('input', function() { - messageProxy.getPort().postMessage({ - command: "doc-changed", - html: doc.innerHTML, - filetype: filetype - }); - }); - } - - function load(content, ft) { - filetype = ft; - doc.innerHTML = ''; - switch (filetype) { - case ".txt": - content = firetext.parsers.plain.parse(content, "HTML"); - doc.innerHTML = content; - break; - /* 0.4 - case ".docx": - docxeditor = new firetext.parsers.DocxEditor(content); - content = result.HTMLout(); - doc.appendChild(content); - break; - */ - case ".html": - default: - doc.innerHTML = content; - break; - } - watchDocument(filetype); - } - - messageProxy.registerMessageHandler(function(e) { - var content; - var type; - switch (filetype) { - case ".html": - content = doc.innerHTML; - type = "text\/html"; - break; - case ".txt": - content = firetext.parsers.plain.encode(doc.innerHTML, "HTML"); - type = "text\/plain"; - break; - /* 0.4 - case ".docx": - content = docxeditor.generate("uint8array"); - application/vnd.openxmlformats-officedocument.wordprocessingml.document - break; - */ - default: - content = doc.textContent; - break; - } - - var contentView = new StringView(content); - messageProxy.getPort().postMessage({ - command: e.data.key, - content: contentView.toBase64(), - type: type - }); - }, "get-content-blob"); - - messageProxy.registerMessageHandler(function(e) { - load(e.data.content, e.data.filetype); - if(e.data.key) { - messageProxy.getPort().postMessage({ - command: e.data.key - }); - } - }, "load"); - - messageProxy.registerMessageHandler(function(e) { - var commands = e.data.commands - var commandStates = {}; - for(var i = 0; i < commands.length; i++) { - commandStates[commands[i]] = {}; - commandStates[commands[i]].state = document.queryCommandState(commands[i]); - commandStates[commands[i]].value = document.queryCommandValue(commands[i]); - } - messageProxy.getPort().postMessage({ - command: e.data.key, - commandStates: commandStates - }) - }, "query-command-states"); -} \ No newline at end of file diff --git a/editor/scripts/editorProxy.js b/editor/scripts/editorProxy.js deleted file mode 100644 index bff85c0..0000000 --- a/editor/scripts/editorProxy.js +++ /dev/null @@ -1,75 +0,0 @@ -/* -* Editor Communication Proxy -* Copyright (C) Codexa Organization 2013. -*/ - -'use strict' - -// Closure to isolate code from tampering by scripts in document -var mainClosure = function() { - // document to be edited - var doc; - - // WARNING: DO NOT REPLACE, THIS STRING IS REPLACED WITH THE ORIGIN AUTOMATICALLY WHEN LOADED FROM editorProxy.js - var mainOrigin = "[ORIGIN_OF_MAIN_DOCUMENT]"; - - // Overide popups - window.alert = null; - window.confirm = null; - window.prompt = null; - - // Proxy for communication with parent page - var parentMessageProxy; - - window.addEventListener("message", function(e){ - if(e.origin !== mainOrigin) { - throw new Error("origin did not match"); - } - if(e.data.command === "init" && e.ports.length) { - // Initialize Designer - document.documentElement.setAttribute('style','height: 100%; padding: 0; margin: 0;'); - document.body.setAttribute('style','height: 100%; padding: 0; margin: 0;'); - doc = document.createElement('DIV'); - doc.setAttribute('contentEditable', 'true'); - doc.id = 'tempEditDiv'; - doc.setAttribute('style','border: none; padding: 10px 10px 55px; font-size: 20px; outline: none; min-height: calc(100% - 20px); word-wrap: break-word;'); - document.body.appendChild(doc); - //doc = document.getElementById('tempEditDiv'); - document.execCommand('enableObjectResizing', false, 'true'); - - // register port - parentMessageProxy = new MessageProxy(e.ports[0]); - - // Hide and show toolbar. - // For reviewers, just in case this looks like a security problem: - // This frame is sandboxed, so I had to add the listeners to do this. - // The content CANNOT call any of the parents functions, so this is not a security issue. - doc.addEventListener('focus', function (event) { - parentMessageProxy.getPort().postMessage({ - command: "focus", - focus: true - }); - }); - doc.addEventListener('blur', function (event) { - parentMessageProxy.getPort().postMessage({ - command: "focus", - focus: false - }); - }); - - // initialize modules/register handlers - // night mode - initNight(doc, parentMessageProxy); - // editor I/O - initDocIO(doc, parentMessageProxy); - // format document - parentMessageProxy.registerMessageHandler(function(e) { document.execCommand(e.data.sCmd, false, e.data.sValue); }, "format") - - parentMessageProxy.getPort().start(); - // success - parentMessageProxy.getPort().postMessage({command: "init-success"}); - } - }, false); -} -mainClosure(); -mainClosure = undefined; diff --git a/editor/scripts/nightEditor.js b/editor/scripts/nightEditor.js deleted file mode 100644 index b49d8c7..0000000 --- a/editor/scripts/nightEditor.js +++ /dev/null @@ -1,10 +0,0 @@ -function initNight(doc, messageProxy){ - function nightEditor(nightMode) { - if(nightMode) { - doc.style.color = '#fff'; - } else { - doc.style.color = '#000'; - } - } - messageProxy.registerMessageHandler(function(e) { nightEditor(e.data.nightMode); }, "night"); -} \ No newline at end of file diff --git a/index.html b/index.html index ab3d7c1..f02902d 100755 --- a/index.html +++ b/index.html @@ -1,653 +1,701 @@ - + - - - - - - - + + + + + + + - Firetext - - - - + Firetext + + + + - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - + + + + + + + + + + + + + + - - - + + + + + + + + + + + + - - - - - - - - - - - - - + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + -
+
- - -
-
- - - - -

firetext

-
-
-
-
-

Recently opened Documents

-
    -
    -
    -

    Documents on this Device

    -
      -
      -
      -

      Documents on your Dropbox

      -
        -
        -
        -
        -
        - - - - -
        - - -
        - - - -
        -
        - - - - - - -

        -
        -
        -
          - - -
          - - - - -
          -
        -
        - - -
        - - -
        - - -
        - -
        -
        -

        Image location

        -
        - - - - - -
        -
        - - -
        - - -
        - -
        -
        -

        Would you like to save your changes?

        -
        - - - - - -
        -
        + + +
        +
        + + + + +

        firetext

        +
        +
        +
        +
        +

        +
          +
          +
          +

          +
            +
            +
            +

            +
              +
              +
              +
              +
              + + + + +
              + + +
              + + +
              + + +
              + + + +
              +
              + + + + + + +

              +
              +
              +
              +
              +
              +
              +
                + + +
              +
              + +
              + + +
              + + +
              + +
              +
              +

              +
              + + + + + +
              +
              + + +
              + + +
              + +
              +
              +

              +
              + + + + + +
              +
              - -
              - + +
              + diff --git a/locales/bg/app.properties b/locales/bg/app.properties new file mode 100644 index 0000000..08cc6a0 --- /dev/null +++ b/locales/bg/app.properties @@ -0,0 +1,109 @@ +about-firetext=Относно Файъртекст +alignment=Подравняване +allow-sdcard=Моля, позволете на Файъртекст да достъпи Вашата SD карта памет. +always-off=Винаги изключено +always-on=Винаги включено +auto=Автоматично +automatic-printing-failed=Не можем да принтираме този файл автоматично. Моля, изберете „Принтиране“ от браузъра си, ако това е възможно. +bold=Получер +cancel=Отказ +center=Центрирано +clear=Изчистване +clear-recents.innerHTML=Изчистване на скорошните файлове +click-compose-icon-to-create=Натиснете иконката за съставяне, за да създадете нов документ. +close=Затваряне +cloud=Облак +contains-special-characters=Специалните символи не са позволени. Моля прегледайте отново. +content-not-defined=Съдържанието не беше определено +could-not-initialize-filesystem=Грешка: файловата система не може да бъде достъпена +create=Създаване +credits=За създателите на Firetext +delete-selected=Изтриване на избраното +delete-unsuccessful=Неуспешно изтриване на файла. Подробности за грешката: +deselect-all=Размаркиране на всичко +design=Дизайн +documents=Документи +documents-device=Документи на това устройство +documents-dropbox=Документи във Вашия Дропбокс +done=Готово +dropbox-full=Вашият Дропбокс е пълен. Опресняването няма да помогне. +edit-docs=Редактиране на документи +editing=Редактиране +elements=Елементи +enable-autosave.innerHTML=Включване на автоматичното запазване +enable-file-previews.innerHTML=Включване на прегледа на файловете +enable-night-mode.innerHTML=Включване на нощния режим +enter-name=Моля въведете име за новия файл. +export=Изнасяне +file-creation-fail=Неуспешно създаване на файла. Подробности за грешката: +file-exists=Такъв файл вече съществува, моля изберете друго име. +firetext-support=Поддръжка на Firetext +formatting=Форматиране +help=Помощ +horizontal-rule=Хоризонтална линия +insert=Вмъкване +insert-image=Вмъкване на изображение +insert-link=Вмъкване на връзка +insert-table=Вмъкване на таблица +internal-storage=Вътрешно съхранение +invalid-location=Файлът не можа да бъде създаден. Моля, изберете валидно място. +image=Изображение +image-location=Местоположение на изображението +import=Внасяне +italic=Курсив +justified=Двустранно +language.innerHTML=Език на потребителския интерфейс +left=Ляво +link=Връзка +list=Списък +load-last-file.innerHTML=Зареждане на последния файл при стартриране +load-unsuccessful=Неуспешно зареждане. Подробности за грешката: +menu=Меню +needs-restart=Тази настройка ще бъде приложена след като Файъртекст бъде рестартиран. Искате ли да го рестартирате сега? +network-error=Изглежда мрежата Ви не е налична. Моля, проверете връзката си и опитайте отново +no=Не +no-dropbox-documents-found=Няма открити документи в Дропбокс +no-documents-found=Няма открити документи +no-files-selected=Няма избрани файлове +no-recent-documents=Няма скорошни документи +no-storage-method=Моля, настройте система за съхранение, за да можете да променяте файлове: +not-functional-link=Тази връзка не работи... +not-signed-in=Не сте вписани +number-of-columns.placeholder=Брой колони +number-of-rows.placeholder=Брой редове +numbered-list=Номериран списък +okay=Добре +open=Отваряне +other=Друго +path-not-defined=Пътят не беше определен +print=Принтиране +privacy=Лични данни +rate-firetext=Оценете Файъртекст +raw=Суров +recent-documents=Наскоро отваряни документи +recents-eliminated=Списъкът с наскоро отваряните от Вас документи беше изчистен успешно! +right=Дясно +save=Запазване +save-as=Запазване като +save-changes-question=Желаете ли да запазите промените си? +save-unsuccessful=Неуспешно запазване. Подробности за грешката: +select-all=Избиране на всички +select-language=Изберете език +send-error-stats.innerHTML=Изпращане на статистики за грешки +settings=Настройки +shared-sdcard=SD картата памет в устройството Ви не е споделена и затова не е достъпна. Опитайте да изключите възможността за USB съхранение от настройките. +strikethrough=Зачертан +successfully-saved=Успешно запазване +table=Таблица +the-web=Мрежата +tools=Инструменти +unable-to-get-sdcard=Неуспешно заемане на мястото, използвано от SD картата памет: +underline=Подчертан +unknown-error=Неизвестна грешка +use-dropbox.innerHTML=Използване на Дропбокс +valid-integer-value=Моля, въведете правилна стойност (например 2 или 5) +visual=Визуално +want-to-delete-singular=Желаете ли да изтриете този файл? +want-to-delete-plural=Желаете ли да изтриете тези файлове? +warning-unsupported-technology=Внимание: Вашият браузър не поддържа някои съществени функционалности, нужни на Файъртекст. Моля, изтеглете Файърфокс от https://mozilla.org/firefox. +yes=Да diff --git a/locales/bn-BD/app.properties b/locales/bn-BD/app.properties index 6796d3c..73f7557 100644 --- a/locales/bn-BD/app.properties +++ b/locales/bn-BD/app.properties @@ -1,104 +1,109 @@ -about-firetext = ফায়ারটেক্সট সম্পর্কে -alignment = একসারিতে সাজানো -allow-sdcard = অনুগ্রহপূর্বক ফায়ারটেক্সটকে আপনার এসডি কার্ড ব্যবহারের অনুমতি দিন -always-off = সবসময় বন্ধ -always-on = সবসময় চালু -auto = স্বয়ংক্রিয় -bold = মোটা -cancel = বাতিল করুন -center = মাঝখানে -clear = পরিষ্কার করা -clear-recents.innerHTML = তালিকায়সাম্প্রতিকগুলো পরিষ্কার করুন -click-compose-icon-to-create = নতুন নথি তৈরী করার জন্যে রচনা প্রতীকটি চাপুন। -close-document = নথি বন্ধ করুন -cloud = ক্লাউড -contains-special-characters = বিশেষ অক্ষরগুলোর অনুমতি নেই। অনুগ্রহ করে পুনরায় দেখুন। -content-not-defined = এই বিষয়বস্তুটি পূর্বে সংজ্ঞায়িত নয় -could-not-initialize-filesystem = ত্রুটি: ফাইলসিস্টেম চালু করা যাচ্ছে না -create-document = নথি তৈরী করা -create = তৈরী করা -credits = ফায়ারটেক্সট সম্মাননা -delete-selected = বাছাইকরাটুকু মুছে দিন -delete-unsuccessful = নথি মুছতে ব্যর্থ।\n\n\nত্রুটির বিস্তারিত:\n -deselect-all = সবগুলি অবাছাইকৃত -design = নকশা -document-actions = নথির কাজসমূহ -documents-device = এই যন্ত্রে থাকা নথিসমূহ -documents-dropbox = আপনার ড্রপবক্সের নথিসমূহ -done = সম্পন্ন হয়েছে -dropbox-full = আপনার ড্রপবক্স পূর্ণ হয়ে গিয়েছে। রিফ্রেশ করে লাভ হবে না। -edit-docs = নথিগুলি সম্পাদনা করুন -edit-with-zen-mode.innerHTML = সম্পাদনা করুন ঐকান্তিক রূপে -editing = সম্পাদনা করছে -elements = উপাদানসমূহ -enable-autosave.innerHTML = স্বয়ংক্রিয় সংরক্ষণ সক্ষম করুন -enable-file-previews.innerHTML = নথির পূর্বরূপ সক্ষম করুন -enable-night-mode.innerHTML = রাতের প্রক্রিয়াসক্ষম করুন -enter-name = অনুগ্রহ করে নতুন নথিটিকে একটি নাম দিন। -file-creation-fail = নথি তৈরিতে ব্যর্থ।\n\n\nত্রুটির বিস্তারিত:\n -file-exists = এই নথিটি ইতোমধ্যেই রয়েছে, অনুগ্রহ করে নতুন আরেকটি নাম বেছে নিন। -firetext-support = ফায়ারটেক্সট সমর্থন -formatting = সজ্জিত হচ্ছে -help = সহায়তা -horizontal-rule = অনুভূমিক রীতি -insert = প্রবেশ করান -insert-image = চিত্র প্রবেশ করান -insert-link = লিংক প্রবেশ করান -insert-table = সারনি প্রবেশ করান -internal-storage = অভ্যন্তরীণ সংরক্ষণাগার -image = চিত্র -image-location = চিত্রের অবস্থান -invalid-location = নথি তৈরি করতে পারছে না। অনুগ্রহপূর্বক একটি বৈধ অবস্থান নির্বাচন করুন। -italic = বাঁকানো -justified = ন্যায্যকৃত -language.innerHTML = ইন্টারফেসের ভাষা -left = বামে -link = লিংক -list = তালিকা -load-last-file.innerHTML = সর্বশেষ নথিটি লোড করুন চালু হতেই -load-unsuccessful = লোড করতে পারেনি।\n\n\nত্রুটির বিবরন:\n -menu = মেন্যু -network-error = আপনার নেটওয়ার্ক প্রাপ্য নয় বলেই মনে হচ্ছে।\n\n\nআপনার সংযোগ পরীক্ষা করুন এবং পুনরায় চেষ্টা করুন। -no = না -no-dropbox-documents-found = ড্রপবক্সের কোন নথি খুঁজে পায়নি -no-documents-found = কোন নথি পাওয়া যায়নি -no-files-selected = কোনো নথিই নির্বাচন করা হয়নি -no-recent-documents = কোন সাম্প্রতিক নথি নেই -no-storage-method = সংরক্ষন করার কোন মাধ্যম অাপনি নির্ধারন করেননি -not-signed-in = অাপনি সাইন ইন করেননি -number-of-columns.placeholder = কলামের সংখ্যা -number-of-rows.placeholder = সারির সংখ্যা -numbered-list = সংখ্যায়িত তালিকা -okay = ঠিক আছে -open-document = নথি খুলুন -other = অন্য কিছু -path-not-defined = পথটি নির্দেশিত নয় -privacy = গোপনীয়তা -rate-firetext = ফায়ারটেক্সটের গুনমান বিচার করুন -raw = অরূপান্তরিত -recent-documents = সাম্প্রতিককালে খোলা নথিগুলো -recents-eliminated = অাপনার সাম্প্রতিক নথিগুলোর তালিকা সফলভাবে বিলুপ্ত হয়েছে ! -right = ডানে -save-changes-question = আপনি কি আপনার করা পরিবর্তনগুলো সংরক্ষণ করতে চান? -save-document = নথি সংরক্ষণ করুন -save-unsuccessful = সংরক্ষণ করা যায়নি।\n\n\nত্রুটির বিবরন:\n -select-all = সবগুলো নির্বাচন করা -select-language = আপনার ভাষা বেছে নিন -send-error-stats.innerHTML = ত্রুটি পাঠানো পরিসংখ্যান -settings = সেটিংস -shared-sdcard = আপনার ডিভাইসের এস.ডি. কার্ড শেয়ার করা এবং সেজন্যেই এখন সুলভ নয়। সেটিংসে আপনার ইউএসবি গণ সংরক্ষণাগারটি অক্ষম করার চেষ্টা করুন। -strikethrough = মাঝবরাবরে দাগান্কিত করা -successfully-saved = সফলভাবে সংরক্ষিত। -table = সারনি -the-web = ওয়েব -tools = সরঞ্জামাদি -unable-to-get-sdcard = এসডি কার্ড কর্তৃক ব্যবহৃত স্থানটি পেতে ব্যর্থ: -underline = নিম্নরেখাংকণ -unknown-error = অজানা ত্রুটি -use-dropbox.innerHTML = ড্রপবক্সব্যবহার করুন -valid-integer-value = দয়া করে একটি বৈধ মান লিখুন (যেমন- 2 অথবা 5 ) -visual = দৃষ্টিলব্ধ -want-to-delete-singular = আপনি কি এই নথিটি মুছে ফেলতে চান? -want-to-delete-plural = আপনি কি এই নথিগুলো মুছে ফেলতে চান? -warning-unsupported-technology = সতর্কবার্তাঃ আপনার ব্রাউজারটি ফায়ারটেক্সট এর কিছু অত্যাবশ্যক প্রযুক্তিকে সমর্থন করে না। দয়া করে এখান থেকে https://mozilla.org/firefox ফায়ারফক্স নামিয়ে নিন। -yes = হ্যাঁ +about-firetext=ফায়ারটেক্সট সম্পর্কে +alignment=একসারিতে সাজানো +allow-sdcard=অনুগ্রহপূর্বক ফায়ারটেক্সটকে আপনার এসডি কার্ড ব্যবহারের অনুমতি দিন +always-off=সবসময় বন্ধ +always-on=সবসময় চালু +auto=স্বয়ংক্রিয় +automatic-printing-failed=আমরা স্বয়ংক্রিয়ভাবে এই ফাইল প্রিন্ট করতে পারবেন না. এটি পাওয়া যায় যদি আপনার ব্রাউজার ভিতর থেকে 'প্রিন্ট' নির্বাচন করুন. +bold=মোটা +cancel=বাতিল করুন +center=মাঝখানে +clear=পরিষ্কার করা +clear-recents.innerHTML=তালিকায়সাম্প্রতিকগুলো পরিষ্কার করুন +click-compose-icon-to-create=নতুন নথি তৈরী করার জন্যে রচনা প্রতীকটি চাপুন। +close=বন্ধ করুন +cloud=ক্লাউড +contains-special-characters=বিশেষ অক্ষরগুলোর অনুমতি নেই। অনুগ্রহ করে পুনরায় দেখুন। +content-not-defined=এই বিষয়বস্তুটি পূর্বে সংজ্ঞায়িত নয় +could-not-initialize-filesystem=ত্রুটি: ফাইলসিস্টেম চালু করা যাচ্ছে না +create=তৈরী করা +credits=ফায়ারটেক্সট সম্মাননা +delete-selected=বাছাইকরাটুকু মুছে দিন +delete-unsuccessful=নথি মুছতে ব্যর্থ। ত্রুটির বিস্তারিত: +deselect-all=সবগুলি অবাছাইকৃত +design=নকশা +documents=কাগজপত্র +documents-device=এই যন্ত্রে থাকা নথিসমূহ +documents-dropbox=আপনার ড্রপবক্সের নথিসমূহ +done=সম্পন্ন হয়েছে +dropbox-full=আপনার ড্রপবক্স পূর্ণ হয়ে গিয়েছে । বার বার রিফ্রেশ করে লাভ হবে না। +edit-docs=নথিগুলি সম্পাদনা করুন +editing=সম্পাদনা করছে +elements=উপাদানসমূহ +enable-autosave.innerHTML=স্বয়ংক্রিয় সংরক্ষণ সক্ষম করুন +enable-file-previews.innerHTML=নথির পূর্বরূপ সক্ষম করুন +enable-night-mode.innerHTML=রাতের প্রক্রিয়াসক্ষম করুন +enter-name=অনুগ্রহ করে নতুন নথিটিকে একটি নাম দিন। +export=রপ্তানি +file-creation-fail=নথি তৈরিতে ব্যর্থ। ত্রুটির বিস্তারিত: +file-exists=এই নথিটি ইতোমধ্যেই রয়েছে, অনুগ্রহ করে নতুন আরেকটি নাম বেছে নিন। +firetext-support=ফায়ারটেক্সট সমর্থন +formatting=সজ্জিত হচ্ছে +help=সহায়তা +horizontal-rule=অনুভূমিক রীতি +insert=প্রবেশ করান +insert-image=চিত্র প্রবেশ করান +insert-link=লিংক প্রবেশ করান +insert-table=সারনি প্রবেশ করান +internal-storage=অভ্যন্তরীণ সংরক্ষণাগার +invalid-location=নথি তৈরি করতে পারছে না। অনুগ্রহপূর্বক একটি বৈধ অবস্থান নির্বাচন করুন। +image=চিত্র +image-location=চিত্রের অবস্থান +import=আমদানি +italic=বাঁকানো +justified=ন্যায্যকৃত +language.innerHTML=ইন্টারফেসের ভাষা +left=বামে +link=লিংক +list=তালিকা +load-last-file.innerHTML=সর্বশেষ নথিটি লোড করুন চালু হতেই +load-unsuccessful=লোড করতে অসফল হয়েছে। ত্রুটির বিবরন: +menu=মেন্যু +needs-restart=এই সেটিং Firetext পুনরায় আরম্ভ করার পরে প্রয়োগ করা হবে. এখন পুর্নসূচনা করবেন? +network-error=আপনার নেটওয়ার্ক অপ্রাপ্য বলে মনে হচ্ছে। আপনার সংযোগ পরীক্ষা করুন এবং আবার চেষ্টা করুন। +no=না +no-dropbox-documents-found=ড্রপবক্সের কোন নথি খুঁজে পায়নি +no-documents-found=কোন নথি পাওয়া যায়নি +no-files-selected=কোনো নথিই নির্বাচন করা হয়নি +no-recent-documents=কোন সাম্প্রতিক নথি নেই +no-storage-method=সংরক্ষন করার কোন মাধ্যম অাপনি নির্ধারন করেননি: +not-functional-link=এই লিংকটি কার্যকরী নয় +not-signed-in=অাপনি সাইন ইন করেননি +number-of-columns.placeholder=কলামের সংখ্যা +number-of-rows.placeholder=সারির সংখ্যা +numbered-list=সংখ্যায়িত তালিকা +okay=ঠিক আছে +open=ওপেন +other=অন্য কিছু +path-not-defined=পথটি নির্দেশিত নয় +print=ছাপা +privacy=গোপনীয়তা +rate-firetext=ফায়ারটেক্সটের গুনমান বিচার করুন +raw=অরূপান্তরিত +recent-documents=সাম্প্রতিককালে খোলা নথিগুলো +recents-eliminated=অাপনার সাম্প্রতিক নথিগুলোর তালিকা সফলভাবে বিলুপ্ত হয়েছে ! +right=ডানে +save=সংরক্ষণ +save-as=হিসাবে সংরক্ষণ করুন +save-changes-question=আপনি কি আপনার করা পরিবর্তনগুলো সংরক্ষণ করতে চান? +save-unsuccessful=সংরক্ষণ করা যায়নি। ত্রুটির বিবরন: +select-all=সবগুলো নির্বাচন করা +select-language=আপনার ভাষা বেছে নিন +send-error-stats.innerHTML=ত্রুটি পাঠানো পরিসংখ্যান +settings=সেটিংস +shared-sdcard=আপনার ডিভাইসের এস.ডি. কার্ড শেয়ার করা এবং সেজন্যেই এখন সুলভ নয়। সেটিংসে আপনার ইউএসবি গণ সংরক্ষণাগারটি অক্ষম করার চেষ্টা করুন। +strikethrough=মাঝবরাবরে দাগান্কিত করা +successfully-saved=সফলভাবে সংরক্ষিত। +table=সারনি +the-web=ওয়েব +tools=সরঞ্জামাদি +unable-to-get-sdcard=এসডি কার্ড কর্তৃক ব্যবহৃত স্থানটি পেতে ব্যর্থ: +underline=নিম্নরেখাংকণ +unknown-error=অজানা ত্রুটি +use-dropbox.innerHTML=ড্রপবক্সব্যবহার করুন +valid-integer-value=দয়া করে একটি বৈধ মান লিখুন (যেমন- 2 অথবা 5 ) +visual=দৃষ্টিলব্ধ +want-to-delete-singular=আপনি কি এই নথিটি মুছে ফেলতে চান? +want-to-delete-plural=আপনি কি এই নথিগুলো মুছে ফেলতে চান? +warning-unsupported-technology=সতর্কবার্তাঃ আপনার ব্রাউজারটি ফায়ারটেক্সট এর কিছু অত্যাবশ্যক প্রযুক্তিকে সমর্থন করে না। দয়া করে এখান থেকে https://mozilla.org/firefox ফায়ারফক্স নামিয়ে নিন। +yes=হ্যাঁ diff --git a/locales/cs/app.properties b/locales/cs/app.properties index 20b58ed..a305b84 100644 --- a/locales/cs/app.properties +++ b/locales/cs/app.properties @@ -1,104 +1,109 @@ -about-firetext = O službě Firetext -alignment = Zarovnání -allow-sdcard = Povolte službě Firetext přístup k SD kartě. -always-off = Vždy vypnuto -always-on = Vždy zapnuto -auto = Automaticky -bold = Tučné -cancel = Zrušit -center = Na střed -clear = Vymazat -clear-recents.innerHTML = Vymazat seznam nedávných položek -click-compose-icon-to-create = Chcete-li vytvořit nový dokument, klikněte na ikonu Vytvořit. -close-document = Zavřít dokument -cloud = Cloud -contains-special-characters = Speciální znaky nejsou povoleny. Zkontrolujte obsah. -content-not-defined = Obsah nebyl definován. -could-not-initialize-filesystem = Chyba: Systém souborů nelze inicializovat. -create-document = Vytvořit dokument -create = Vytvořit -credits = Kredit služby Firetext -delete-selected = Odstranit vybrané -delete-unsuccessful = Odstranění souboru nebylo úspěšné.\n\nPodrobnosti o chybě: -deselect-all = Zrušit výběr všech -design = Návrh -document-actions = Akce dokumentů -documents-device = Dokumenty v tomto zařízení -documents-dropbox = Dokumenty ve službě Dropbox -done = Hotovo -dropbox-full = Vaše schránka služby Dropbox je plná. Aktualizace nepomůže. -edit-docs = Upravit dokumenty -edit-with-zen-mode.innerHTML = Upravit pomocí režimu Zen -editing = Úpravy -elements = Prvky -enable-autosave.innerHTML = Povolit automatické ukládání -enable-file-previews.innerHTML = Povolit zobrazení náhledů souborů -enable-night-mode.innerHTML = Povolit noční režim -enter-name = Zadejte název nového souboru. -file-creation-fail = Vytvoření souboru bylo neúspěšné.\n\nPodrobnosti o chybě: -file-exists = Tento soubor již neexistuje, zvolte jiný název. -firetext-support = Podpora služby Firetext -formatting = Formátování -help = Nápověda -horizontal-rule = Horizontální pravidlo -insert = Vložit -insert-image = Vložit obrázek -insert-link = Vložit odkaz -insert-table = Vložit tabulku -internal-storage = Vnitřní úložiště -image = Obrázek -image-location = Umístění obrázku -invalid-location = Soubor nelze vytvořit. Vyberte platné umístění. -italic = Kurzíva -justified = Do bloku -language.innerHTML = Jazyk rozhraní -left = Vlevo -link = Odkaz -list = Seznam -load-last-file.innerHTML = Při spuštění načíst poslední soubor -load-unsuccessful = Načtení nebylo úspěšné.\n\nPodrobnosti o chybě: -menu = Nabídka -network-error = Vaše síť pravděpodobně není k dispozici.\n\nZkontrolujte připojení a opakujte akci. -no = Ne -no-dropbox-documents-found = Nebyly nalezeny žádné dokumenty služby Dropbox. -no-documents-found = Nebyly nalezeny žádné dokumenty. -no-files-selected = Nebyly vybrány žádné soubory. -no-recent-documents = Nebyly zjištěny žádné nedávné dokumenty. -no-storage-method = Nemáte nastaven způsob ukládání. -not-signed-in = Nejste přihlášeni -number-of-columns.placeholder = Počet sloupců -number-of-rows.placeholder = Počet řádků -numbered-list = Číslovaný seznam -okay = OK -open-document = Otevřít dokument -other = Jiné -path-not-defined = Cesta nebyla definována. -privacy = Soukromí -rate-firetext = Hodnotit službu Firetext -raw = Nezpracované -recent-documents = Nedávno otevřené dokumenty -recents-eliminated = Váš seznam nedávných dokumentů byl úspěšně odstraněn. -right = Vpravo -save-changes-question = Chcete tyto změny uložit? -save-document = Uložit dokument -save-unsuccessful = Uložení nebylo úspěšné.\n\nPodrobnosti o chybě: -select-all = Vybrat vše -select-language = Vyberte jazyk -send-error-stats.innerHTML = Odeslat statistiky chyby -settings = Nastavení -shared-sdcard = Karta SDCard ve vašem zařízení je sdílená. Z toho důvodu není k dispozici. Zkuste v nastavení vypnout Velkokapacitní paměťové zařízení USB. -strikethrough = Přeškrtnout -successfully-saved = Úspěšně uloženo -table = Tabulka -the-web = Web -tools = Nástroje -unable-to-get-sdcard = Nelze získat prostor používaný kartou SDCard: -underline = Podtrhnout -unknown-error = Neznámá chyba -use-dropbox.innerHTML = Použít službu Dropbox -valid-integer-value = Zadejte platnou hodnotu (např. 2 nebo 5) -visual = Vizuální -want-to-delete-singular = Chcete tento soubor odstranit? -want-to-delete-plural = Chcete tyto soubory odstranit? -warning-unsupported-technology = Upozornění: Váš prohlížeč nepodporuje některou důležitou technologii služby Firetext. Stáhněte aplikaci Firefox z adresy https://mozilla.org/firefox. -yes = Ano +about-firetext=O službě Firetext +alignment=Zarovnání +allow-sdcard=Povolte službě Firetext přístup k SD kartě. +always-off=Vždy vypnuto +always-on=Vždy zapnuto +auto=Automaticky +automatic-printing-failed=Nemůžeme vytisknout tento soubor automaticky. Prosím, vyberte 'Tisk' zevnitř vašeho prohlížeče, pokud je k dispozici. +bold=Tučné +cancel=Zrušit +center=Na střed +clear=Vymazat +clear-recents.innerHTML=Vymazat seznam nedávných položek +click-compose-icon-to-create=Chcete-li vytvořit nový dokument, klikněte na ikonu Vytvořit. +close=Uzavřít +cloud=Cloud +contains-special-characters=Speciální znaky nejsou povoleny. Zkontrolujte obsah. +content-not-defined=Obsah nebyl definován. +could-not-initialize-filesystem=Chyba: Systém souborů nelze inicializovat. +create=Vytvořit +credits=Kredit služby Firetext +delete-selected=Odstranit vybrané +delete-unsuccessful=Odstranění souboru nebylo úspěšné. Podrobnosti o chybě: +deselect-all=Zrušit výběr všech +design=Návrh +documents=Dokumenty +documents-device=Dokumenty v tomto zařízení +documents-dropbox=Dokumenty ve službě Dropbox +done=Hotovo +dropbox-full=Vaše schránka služby Dropbox je plná. Aktualizace nepomůže. +edit-docs=Upravit dokumenty +editing=Úpravy +elements=Prvky +enable-autosave.innerHTML=Povolit automatické ukládání +enable-file-previews.innerHTML=Povolit zobrazení náhledů souborů +enable-night-mode.innerHTML=Povolit noční režim +enter-name=Zadejte název nového souboru. +export=Ke stažení +file-creation-fail=Vytvoření souboru bylo neúspěšné. Podrobnosti o chybě: +file-exists=Tento soubor již neexistuje, zvolte jiný název. +firetext-support=Podpora služby Firetext +formatting=Formátování +help=Nápověda +horizontal-rule=Horizontální pravidlo +insert=Vložit +insert-image=Vložit obrázek +insert-link=Vložit odkaz +insert-table=Vložit tabulku +internal-storage=Vnitřní úložiště +invalid-location=Soubor nelze vytvořit. Vyberte platné umístění. +image=Obrázek +image-location=Umístění obrázku +import=Importovat +italic=Kurzíva +justified=Do bloku +language.innerHTML=Jazyk rozhraní +left=Vlevo +link=Odkaz +list=Seznam +load-last-file.innerHTML=Při spuštění načíst poslední soubor +load-unsuccessful=Načtení nebylo úspěšné. Podrobnosti o chybě: +menu=Nabídka +needs-restart=Toto nastavení se projeví až po restartování Firetext. Restartovat nyní? +network-error=Vaše síť pravděpodobně není k dispozici. Zkontrolujte připojení a opakujte akci. +no=Ne +no-dropbox-documents-found=Nebyly nalezeny žádné dokumenty služby Dropbox. +no-documents-found=Nebyly nalezeny žádné dokumenty. +no-files-selected=Nebyly vybrány žádné soubory. +no-recent-documents=Nebyly zjištěny žádné nedávné dokumenty. +no-storage-method=Nemáte nastaven způsob ukládání: +not-functional-link=Tento odkaz není funkční ... +not-signed-in=Nejste přihlášeni +number-of-columns.placeholder=Počet sloupců +number-of-rows.placeholder=Počet řádků +numbered-list=Číslovaný seznam +okay=OK +open=Otevřít +other=Jiné +path-not-defined=Cesta nebyla definována. +print=Tisk +privacy=Soukromí +rate-firetext=Hodnotit službu Firetext +raw=Nezpracované +recent-documents=Nedávno otevřené dokumenty +recents-eliminated=Váš seznam nedávných dokumentů byl úspěšně odstraněn. +right=Vpravo +save=Uložit +save-as=Uložit jako +save-changes-question=Chcete tyto změny uložit? +save-unsuccessful=Uložení nebylo úspěšné. Podrobnosti o chybě: +select-all=Vybrat vše +select-language=Vyberte jazyk +send-error-stats.innerHTML=Odeslat statistiky chyby +settings=Nastavení +shared-sdcard=Karta SDCard ve vašem zařízení je sdílená. Z toho důvodu není k dispozici. Zkuste v nastavení vypnout Velkokapacitní paměťové zařízení USB. +strikethrough=Přeškrtnout +successfully-saved=Úspěšně uloženo +table=Tabulka +the-web=Web +tools=Nástroje +unable-to-get-sdcard=Nelze získat prostor používaný kartou SDCard: +underline=Podtrhnout +unknown-error=Neznámá chyba +use-dropbox.innerHTML=Použít službu Dropbox +valid-integer-value=Zadejte platnou hodnotu (např. 2 nebo 5) +visual=Vizuální +want-to-delete-singular=Chcete tento soubor odstranit? +want-to-delete-plural=Chcete tyto soubory odstranit? +warning-unsupported-technology=Upozornění: Váš prohlížeč nepodporuje některou důležitou technologii služby Firetext. Stáhněte aplikaci Firefox z adresy https://mozilla.org/firefox. +yes=Ano diff --git a/locales/de/app.properties b/locales/de/app.properties index ead89f1..e60d178 100644 --- a/locales/de/app.properties +++ b/locales/de/app.properties @@ -1,104 +1,109 @@ -about-firetext = Über Firetext -alignment = Ausrichtung -allow-sdcard = Bitte erlaube Firetext, auf deine SD-Karte zugreifen zu dürfen -always-off = Immer aus -always-on = Immer an -auto = Auto -bold = Fett -cancel = Abbrechen -center = Zentriert -clear = Klären -clear-recents.innerHTML = Liste der letzten geöffneten klären -click-compose-icon-to-create = Klicke auf das Erstellen-Icon um ein neues Dokument zu kreieren. -close-document = Dokument schließen -cloud = Wolke -contains-special-characters = Sonderzeichen sind nicht erlaubt. Bitte korrigieren. -content-not-defined = Der Inhalt wurde nicht definiert -could-not-initialize-filesystem = Fehler: konnte nicht Dateisystem initialisieren -create-document = Dokument erstellen -create = Erstellen -credits = Firetext Credits -delete-selected = Ausgewählten löschen -delete-unsuccessful = Löschen von Dateien nicht erfolgreich. \nFehlerdetails:\n -deselect-all = Auswahl aufheben -design = Design -document-actions = Dokument Aktionen -documents-device = Dokumente auf diesem Geräte -documents-dropbox = Dokumente auf Dropbox -done = Erledig -dropbox-full = Ihr Dropbox ist voll. Aktualisieren wird nicht helfen. -edit-docs = Docs bearbeiten -edit-with-zen-mode.innerHTML = Editieren mit Zen Mode -editing = Editieren -elements = Elemente -enable-autosave.innerHTML = automatisches Speichern aktivieren -enable-file-previews.innerHTML = Datei-Vorschau aktivieren -enable-night-mode.innerHTML = Nacht-Modus aktivieren -enter-name = Bitte einen Namen für die Datei eingeben. -file-creation-fail = File konnte nicht erstellt werden. \n\nFehler Details:\n -file-exists = Diese Datei ist bereits vorhanden, bitte wählen Sie einen anderen Namen. -firetext-support = Firetext Hilfe -formatting = Formatierung -help = Hilfe -horizontal-rule = Horizontales Lineal -insert = Einfügen -insert-image = Bild einfügen -insert-link = Link einfügen -insert-table = Tabelle einfügen -internal-storage = Interner Speicher -image = Bild -image-location = Bild Ablageort -invalid-location = Datei konnte nicht erstellt werden. Bitte wählen Sie eine gültige Position. -italic = Kursiv -justified = gerechtfertigt -language.innerHTML = Sprache der Schnittstelle -left = Links -link = Link -list = Liste -load-last-file.innerHTML = Beim Aufstarten letzte Datei laden -load-unsuccessful = Laden war nicht erfolgreich.\n\nFehler Details:\n -menu = Menu -network-error = Netzwerk ist nicht verfügbar.\n\nBitte Verbindung überprüfen und nochmals versuchen. -no = Nein -no-dropbox-documents-found = Keine Dropbox Dokumente gefunden -no-documents-found = Keine Dokumente gefunden -no-files-selected = Keine Dateien ausgewählt -no-recent-documents = Keine zuletzt geöffneten Dokumente -no-storage-method = Sie haben noch keine Speichermethode eingestellt -not-signed-in = Sie sind nicht angemeldet -number-of-columns.placeholder = Anzahl Spalten -number-of-rows.placeholder = Anzahl Zeilen -numbered-list = nummerierte Liste -okay = OK -open-document = Dokument öffnen -other = andere -path-not-defined = Der Pfad wurde nicht definiert -privacy = Privatsphäre -rate-firetext = Rate Firetext -raw = Roh -recent-documents = Zuletzt geöffneten Dokumente -recents-eliminated = Ihre zuletzt geöffneten Dokumenteliste wurde erfolgreich beseitigt -right = Rechts -save-changes-question = Willst du deine Änderungen speichern? -save-document = Dokument speichern -save-unsuccessful = Speichern war nicht erfolgreich.\n\nFehler Details:\n -select-all = alle auswählen -select-language = Wähle deine Sprache -send-error-stats.innerHTML = Sende Fehler-Statistik -settings = Einstellungen -shared-sdcard = Die SD-Karte auf dem Gerät ist freigegeben, und somit nicht nicht Verfügbar. Deaktivieren Sie USB-Massenspeicher in Ihren Einstellungen. -strikethrough = durchgestrichen -successfully-saved = Erfolgreich gespeichert -table = Tabelle -the-web = Das Web -tools = Werkzeuge -unable-to-get-sdcard = Der benutzte Speicher konnte nicht von der SD-Card abgerufen werden. -underline = Unterstreichen -unknown-error = Unbekannter Fehler -use-dropbox.innerHTML = Dropbox benutzen -valid-integer-value = Bitte einen gültigen Wert eingeben (wie 2 oder 5) -visual = visuell -want-to-delete-singular = Willst du dieses File löschen? -want-to-delete-plural = Willst du diese Files löschen? -warning-unsupported-technology = Achtung: Ihr Browser unterstützt keine der wichtigen Technologies die Firetext benutz . Bitte laden Sie Firefox von https://mozilla.org/firefox. -yes = Ja +about-firetext=Über Firetext +alignment=Ausrichtung +allow-sdcard=Bitte erlaube Firetext den Zugriff auf Deine SD-Karte. +always-off=Immer aus +always-on=Immer an +auto=Auto +automatic-printing-failed=Diese Datei kann nicht automatisch ausgedruckt werden. Bitte wähle die Funktion 'Drucken' direkt in deinem Browser, falls verfügbar. +bold=Fett +cancel=Abbrechen +center=Zentriert +clear=Löschen +clear-recents.innerHTML=Liste der zuletzt geöffneten Dateien löschen +click-compose-icon-to-create=Klicke auf das Icon für ein neues Dokument. +close=Schliessen +cloud=Wolke +contains-special-characters=Sonderzeichen sind nicht erlaubt. Bitte korrigieren. +content-not-defined=Inhalt nicht definiert +could-not-initialize-filesystem=Fehler: konnte Dateisystem nicht initialisieren. +create=Erstellen +credits=Firetext Danksagung +delete-selected=Ausgewählte löschen +delete-unsuccessful=Datei konnte nicht gelöscht werden. Fehlerdetails: +deselect-all=Auswahl aufheben +design=Design +documents=Dokumente +documents-device=Dokumente auf diesem Gerät +documents-dropbox=Dokumente in der Dropbox +done=Erledigt +dropbox-full=Deine Dropbox ist voll. Ein Refresh wird nicht helfen. +edit-docs=Dokumente bearbeiten +editing=Bearbeiten +elements=Elemente +enable-autosave.innerHTML=Automatisches Speichern aktivieren +enable-file-previews.innerHTML=Dateivorschau aktivieren +enable-night-mode.innerHTML=Nachtansicht aktivieren +enter-name=Bitte gib einen Namen für die Datei ein. +export=Exportieren +file-creation-fail=Datei konnte nicht erstellt werden. Fehlerdetails: +file-exists=Dieser Dateiname ist bereits vorhanden, bitte wähle einen anderen Namen. +firetext-support=Firetext-Hilfe +formatting=Formatierung +help=Hilfe +horizontal-rule=Horizontales Lineal +insert=Einfügen +insert-image=Bild einfügen +insert-link=Link einfügen +insert-table=Tabelle einfügen +internal-storage=Interner Speicher +invalid-location=Datei konnte nicht erstellt werden. Bitte wähle einen gültigen Speicherort. +image=Bild +image-location=Bild Speicherort +import=Importieren +italic=kursiv +justified=gerechtfertigt +language.innerHTML=Sprache +left=Links +link=Link +list=Liste +load-last-file.innerHTML=Beim Programmstart zuletzt geöffnete Datei laden +load-unsuccessful=Datei konnte nicht geladen werden. Fehlerdetails: +menu=Menü +needs-restart=Diese Einstellung wird wirksam, wenn Firetext neu gestartet wird. Jetzt neu starten? +network-error=Dein Netzwerk scheint nicht zur Verfügung zu stehen. Bitte überprüfe deine Verbindung und versuche es nochmals. +no=Nein +no-dropbox-documents-found=Keine Dokumente in der Dropbox gefunden. +no-documents-found=Keine Dokumente gefunden +no-files-selected=Keine Dateien ausgewählt +no-recent-documents=Keine zuletzt geöffneten Dokumente +no-storage-method=Richte bitte ein Ablagesystem ein, um Dateien zu ändern: +not-functional-link=Dieser Link funktioniert nicht... +not-signed-in=Du bist nicht angemeldet. +number-of-columns.placeholder=Anzahl Spalten +number-of-rows.placeholder=Anzahl Zeilen +numbered-list=nummerierte Liste +okay=OK +open=Öffnen +other=andere +path-not-defined=Der Pfad wurde nicht definiert. +print=Drucken +privacy=Privatsphäre +rate-firetext=Bewerte Firetext +raw=Roh +recent-documents=Zuletzt geöffnete Dokumente +recents-eliminated=Die Liste der zuletzt geöffneten Dokumente wurde erfolgreich geleert. +right=Rechts +save=Speichern +save-as=Speichern unter +save-changes-question=Willst Du die Änderungen speichern? +save-unsuccessful=Datei konnte nicht gespeichert werden. Fehlerdetails: +select-all=Alles auswählen +select-language=Wähle Deine Sprache +send-error-stats.innerHTML=Sende Fehlerstatistik +settings=Einstellungen +shared-sdcard=Die SD-Karte auf dem Gerät ist in Benutzung und daher nicht verfügbar. Deaktiviere den USB-Massenspeicher in den Einstellungen. +strikethrough=durchgestrichen +successfully-saved=Erfolgreich gespeichert +table=Tabelle +the-web=Das Internet +tools=Werkzeuge +unable-to-get-sdcard=Der gewünschte Inhalt konnte nicht von der SD-Karte abgerufen werden. +underline=Unterstreichen +unknown-error=Unbekannter Fehler +use-dropbox.innerHTML=Dropbox benutzen +valid-integer-value=Bitte gib einen gültigen Wert ein (z.B. 2) +visual=visuell +want-to-delete-singular=Willst Du diese Datei wirklich löschen? +want-to-delete-plural=Willst Du diese Dateien wirklich löschen? +warning-unsupported-technology=Achtung: Dein Browser unterstützt keine der von Firetext benutzten Technologien. Bitte lade die aktuelle Version des Firefox-Browsers über https://mozilla.com/firefox herunter +yes=Ja diff --git a/locales/en-US/app.properties b/locales/en-US/app.properties index a9f75ed..6b2c7ec 100644 --- a/locales/en-US/app.properties +++ b/locales/en-US/app.properties @@ -4,38 +4,38 @@ allow-sdcard=Please allow Firetext to access your SD card. always-off=Always off always-on=Always on auto=Auto +automatic-printing-failed=We cannot print this file automatically. Please select 'Print' from inside your browser if it is available. bold=Bold cancel=Cancel center=Center clear=Clear clear-recents.innerHTML=Clear recents list click-compose-icon-to-create=Click the compose icon to create a new document. -close-document=Close document +close=Close cloud=Cloud contains-special-characters=Special characters are not allowed. Please revise. content-not-defined=The content was not defined could-not-initialize-filesystem=Error: could not initialize filesystem -create-document=Create document create=Create credits=Firetext credits delete-selected=Delete selected -delete-unsuccessful=File deletion unsuccessful.\n\nError details:\n +delete-unsuccessful=File deletion unsuccessful. Error details: deselect-all=Deselect all design=Design -document-actions=Document actions +documents=Documents documents-device=Documents on this Device documents-dropbox=Documents on your Dropbox done=Done -dropbox-full=Your Dropbox is full. Refreshing will not help. +dropbox-full=Your Dropbox is full. Refreshing will not help. edit-docs=Edit docs -edit-with-zen-mode.innerHTML=Edit with zen mode editing=Editing elements=Elements enable-autosave.innerHTML=Enable autosave enable-file-previews.innerHTML=Enable file previews enable-night-mode.innerHTML=Enable night mode enter-name=Please enter a name for the new file. -file-creation-fail=File creation unsuccessful.\n\nError details:\n +export=Export +file-creation-fail=File creation unsuccessful. Error details: file-exists=This file already exists, please choose another name. firetext-support=Firetext support formatting=Formatting @@ -46,9 +46,10 @@ insert-image=Insert image insert-link=Insert link insert-table=Insert table internal-storage=Internal storage +invalid-location=Could not create file. Please choose a valid location. image=Image image-location=Image location -invalid-location=Could not create file. Please choose a valid location. +import=Import italic=Italic justified=Justified language.innerHTML=Interface language @@ -56,33 +57,36 @@ left=Left link=Link list=List load-last-file.innerHTML=Load last file on startup -load-unsuccessful=Load unsuccessful.\n\nError details:\n +load-unsuccessful=Load unsuccessful. Error details: menu=Menu -network-error=Your network appears to be unavailable.\n\nPlease check your connection and try again. +needs-restart=This setting will be applied after Firetext restarts. Restart now? +network-error=Your network appears to be unavailable. Please check your connection and try again. no=No no-dropbox-documents-found=No Dropbox documents found no-documents-found=No documents found no-files-selected=No files selected no-recent-documents=No recent documents -no-storage-method=You have not set up a storage method +no-storage-method=Please set up a storage system to modify files: not-functional-link=This link is not functional... not-signed-in=You are not signed in number-of-columns.placeholder=Number of columns number-of-rows.placeholder=Number of rows numbered-list=Numbered list okay=Okay -open-document=Open document +open=Open other=Other path-not-defined=The path was not defined +print=Print privacy=Privacy rate-firetext=Rate Firetext raw=Raw recent-documents=Recently opened documents recents-eliminated=Your recent documents list has been successfully eliminated! right=Right +save=Save +save-as=Save as save-changes-question=Would you like to save your changes? -save-document=Save document -save-unsuccessful=Save unsuccessful.\n\nError details:\n +save-unsuccessful=Save unsuccessful. Error details: select-all=Select all select-language=Select your language send-error-stats.innerHTML=Send error stats @@ -93,7 +97,7 @@ successfully-saved=Successfully saved table=Table the-web=The web tools=Tools -unable-to-get-sdcard=Unable to get the space used by the SDCard: +unable-to-get-sdcard=Unable to get the space used by the SDCard: underline=Underline unknown-error=Unknown error use-dropbox.innerHTML=Use Dropbox diff --git a/locales/eo/app.properties b/locales/eo/app.properties index 869aee5..b4c76c8 100644 --- a/locales/eo/app.properties +++ b/locales/eo/app.properties @@ -1,104 +1,109 @@ -about-firetext = Pri Firetext -alignment = Ĝisrandigo -allow-sdcard = Bonvole permesu Firetext atingi vian SD-karton. -always-off = Ĉiam malŝaltite -always-on = Ĉiam enŝaltite -auto = Aŭtomate -bold = Grase -cancel = Nuligi -center = Centrigite -clear = Vakigi -clear-recents.innerHTML = Vakigi recentaĵan liston -click-compose-icon-to-create = Presi la krean piktogramon por krei novan dokumenton. -close-document = Fermi dokumenton -cloud = Nube -contains-special-characters = Specialaj karaktroj ne estas permesitaj. Bonvole kontrolu vian dokumenton. -content-not-defined = La enhavo ne estas difinita -could-not-initialize-filesystem = Eraro: dosiersistemo nepravalorizeblas -create-document = Krei dokumenton -create = Krei -credits = Kreditoj pri Firetext -delete-selected = Forigi elekton -delete-unsuccessful = Forigo de dokumentoj fiakis.\n\nDetaloj pri eraro:\n -deselect-all = Malelektigi ĉion -design = Fasonado -document-actions = Agoj de dokumento -documents-device = Dokumentoj en ĉi tiu aparato -documents-dropbox = Dokumentoj en via konto ĉe Dropbox -done = Farite -dropbox-full = Via konto ĉe Dropbox estas plena. Aktualigado ne helpos. -edit-docs = Redakti dokumentojn -edit-with-zen-mode.innerHTML = Redakti per zena reĝimo -editing = Redaktado -elements = Eroj -enable-autosave.innerHTML = Enŝalti aŭtomatan konservadon -enable-file-previews.innerHTML = Enŝalti antaŭrigardon por dosieroj -enable-night-mode.innerHTML = Enŝalti noktan reĝimon -enter-name = Bonvole enigu nomon por la nova dosiero. -file-creation-fail = Kreado de dosiero fiaskis.\n\nDetaloj pri eraro:\n -file-exists = Ĉi tiu dosiero jam ekzistas. Bonvole elektu alian nomon. -firetext-support = Subteno por Firetext -formatting = Aranĝado -help = Helpo -horizontal-rule = Horizontala interlinio -insert = Enigi -insert-image = Enigi bildon -insert-link = Enigi ligilon -insert-table = Enigi tabelon -internal-storage = Ena amasmemorilo -image = Bildo -image-location = Lokado de bildo -invalid-location = Dosiero nekreeblas. Bonvole elektu validan lokadon. -italic = Korsive -justified = Ĝisrandigite -language.innerHTML = Interface language -left = Maldekstre -link = Ligilo -list = Listo -load-last-file.innerHTML = Meti lastan dosieron je startigo -load-unsuccessful = Metado fiaskis.\n\nDetaloj pri eraro:\n -menu = Menuo -network-error = Ŝajne, ke via reto nedisponeblas.\n\nBonvole kontrolu vian konekton kaj provu denove. -no = Ne -no-dropbox-documents-found = Neniu dokumento trovata en Dropbox -no-documents-found = Neniu dokumento trovata -no-files-selected = Neniu dosiero elektita -no-recent-documents = Neniu lasta dokumento -no-storage-method = Vi ne agordis metodon por konservado -not-signed-in = Vi ne ensalutis -number-of-columns.placeholder = Numero da kolumnoj -number-of-rows.placeholder = Numero da vicoj -numbered-list = Numerita listo -okay = Bone -open-document = Malfermi dokumenton -other = Alia -path-not-defined = La pado ne estas difinita -privacy = Privateco -rate-firetext = Voĉdoni por Firetext -raw = Krude -recent-documents = Laste malfermitaj dokumentoj -recents-eliminated = Via listo de lastaj dokumentoj estis sukcese forigita! -right = Dekstre -save-changes-question = Ĉu vi volas konservi viajn ŝanĝojn? -save-document = Konservi dokumenton -save-unsuccessful = Konservado fiaskis.\n\nDetaloj pri eraro:\n -select-all = Elekti ĉion -select-language = Elektu vian lingvon -send-error-stats.innerHTML = Sendi statistikojn pri eraroj -settings = Agordoj -shared-sdcard = La SD-karto en via aparato estas kunhavigita, do ĝi nedisponeblas. Klopodu malŝalti trajton por USB-amasmemorilo en viaj agordoj. -strikethrough = Trastrekite -successfully-saved = Sukcese konserivite -table = Tabelo -the-web = La reto -tools = Iloj -unable-to-get-sdcard = Spaco uzata en bia SD-karto neobteneblas: -underline = Substrekite -unknown-error = Nekonata eraro -use-dropbox.innerHTML = Uzi Dropbox -valid-integer-value = Bonvole tajpu validan valoron (ekz. 2 aŭ 5) -visual = Vide -want-to-delete-singular = Ĉu vi volas forigi ĉi tiun dosieron? -want-to-delete-plural = Ĉu vi volas forigi ĉi tiujn dosierojn? -warning-unsupported-technology = Atentu: via retumilo ne subtenas kelkajn gravajn trajtojn de Firetext. Bonvole elŝutu Firefox el https://mozilla.org/firefox. -yes = Jes +about-firetext=Pri Firetext +alignment=Ĝisrandigo +allow-sdcard=Bonvole permesu Firetext atingi vian SD-karton. +always-off=Ĉiam malŝaltite +always-on=Ĉiam enŝaltite +auto=Aŭtomate +automatic-printing-failed=La programaro ne presas la dosierojn aŭtomate. Bonvole elektu "Presi" en via retumilo se ĝi disponeblas. +bold=Grase +cancel=Nuligi +center=Centrigite +clear=Vakigi +clear-recents.innerHTML=Vakigi recentaĵan liston +click-compose-icon-to-create=Presi la krean piktogramon por krei novan dokumenton. +close=Fermi +cloud=Nube +contains-special-characters=Specialaj karaktroj ne estas permesitaj. Bonvole kontrolu vian dokumenton. +content-not-defined=La enhavo ne estas difinita +could-not-initialize-filesystem=Eraro: dosiersistemo nepravalorizeblas +create=Krei +credits=Kreditoj pri Firetext +delete-selected=Forigi elekton +delete-unsuccessful=Forigo de dokumentoj fiakis. Detaloj pri eraro: +deselect-all=Malelektigi ĉion +design=Fasonado +documents=Dokumentoj +documents-device=Dokumentoj en ĉi tiu aparato +documents-dropbox=Dokumentoj en via konto ĉe Dropbox +done=Farite +dropbox-full=Via konto ĉe Dropbox estas plena. Aktualigado ne helpos. +edit-docs=Redakti dokumentojn +editing=Redaktado +elements=Eroj +enable-autosave.innerHTML=Enŝalti aŭtomatan konservadon +enable-file-previews.innerHTML=Enŝalti antaŭrigardon por dosieroj +enable-night-mode.innerHTML=Enŝalti noktan reĝimon +enter-name=Bonvole enigu nomon por la nova dosiero. +export=Elporti +file-creation-fail=Kreado de dosiero fiaskis. Detaloj pri eraro: +file-exists=Ĉi tiu dosiero jam ekzistas. Bonvole elektu alian nomon. +firetext-support=Subteno por Firetext +formatting=Aranĝado +help=Helpo +horizontal-rule=Horizontala interlinio +insert=Enigi +insert-image=Enigi bildon +insert-link=Enigi ligilon +insert-table=Enigi tabelon +internal-storage=Ena amasmemorilo +invalid-location=Dosiero nekreeblas. Bonvole elektu validan lokadon. +image=Bildo +image-location=Lokado de bildo +import=Enporti +italic=Korsive +justified=Ĝisrandigite +language.innerHTML=Interface language +left=Maldekstre +link=Ligilo +list=Listo +load-last-file.innerHTML=Meti lastan dosieron je startigo +load-unsuccessful=Metado fiaskis. Detaloj pri eraro: +menu=Menuo +needs-restart=Ĉi tiu agordo estos aplikata post restartigo de Firetext. Ĉu restartigi nun? +network-error=Ŝajne, ke via reto nedisponeblas. Bonvole kontrolu vian konekton kaj provu denove. +no=Ne +no-dropbox-documents-found=Neniu dokumento trovata en Dropbox +no-documents-found=Neniu dokumento trovata +no-files-selected=Neniu dosiero elektita +no-recent-documents=Neniu lasta dokumento +no-storage-method=Bonvole agordi memorsistemon por redakti dosierojn: +not-functional-link=Ĉi tiu ligilo ne funkcias... +not-signed-in=Vi ne ensalutis +number-of-columns.placeholder=Numero da kolumnoj +number-of-rows.placeholder=Numero da vicoj +numbered-list=Numerita listo +okay=Bone +open=Malfermita +other=Alia +path-not-defined=La pado ne estas difinita +print=Presi +privacy=Privateco +rate-firetext=Voĉdoni por Firetext +raw=Krude +recent-documents=Laste malfermitaj dokumentoj +recents-eliminated=Via listo de lastaj dokumentoj estis sukcese forigita! +right=Dekstre +save=Konservi +save-as=Konservi kiel +save-changes-question=Ĉu vi volas konservi viajn ŝanĝojn? +save-unsuccessful=Konservado fiaskis. Detaloj pri eraro: +select-all=Elekti ĉion +select-language=Elektu vian lingvon +send-error-stats.innerHTML=Sendi statistikojn pri eraroj +settings=Agordoj +shared-sdcard=La SD-karto en via aparato estas kunhavigita, do ĝi nedisponeblas. Klopodu malŝalti trajton por USB-amasmemorilo en viaj agordoj. +strikethrough=Trastrekite +successfully-saved=Sukcese konserivite +table=Tabelo +the-web=La reto +tools=Iloj +unable-to-get-sdcard=Spaco uzata en bia SD-karto neobteneblas: +underline=Substrekite +unknown-error=Nekonata eraro +use-dropbox.innerHTML=Uzi Dropbox +valid-integer-value=Bonvole tajpu validan valoron (ekz. 2 aŭ 5) +visual=Vide +want-to-delete-singular=Ĉu vi volas forigi ĉi tiun dosieron? +want-to-delete-plural=Ĉu vi volas forigi ĉi tiujn dosierojn? +warning-unsupported-technology=Atentu: via retumilo ne subtenas kelkajn gravajn trajtojn de Firetext. Bonvole elŝutu Firefox el https://mozilla.org/firefox. +yes=Jes diff --git a/locales/es/app.properties b/locales/es/app.properties index fa971fb..d5f4fa1 100644 --- a/locales/es/app.properties +++ b/locales/es/app.properties @@ -1,104 +1,109 @@ -about-firetext = Acerca de Firetext -alignment = Alineación -allow-sdcard = Por favor, permita a Firetext acceder a su tarjeta SD. -always-off = Nunca activo -always-on = Siempre activo -auto = Automático -bold = Negritas -cancel = Cancelar -center = Centrar -clear = Limpiar -clear-recents.innerHTML = Limpiar la lista de recientes -click-compose-icon-to-create = Haga clic en el icono de escritura para crear un nuevo documento. -close-document = Cerrar documento -cloud = La nube -contains-special-characters = Los caracteres especiales no están permitidos. Por favor, revise. -content-not-defined = El contenido no fue definido -could-not-initialize-filesystem = Error: no puede inicializar el sistema de archivos. -create-document = Crear documento -create = Crear -credits = Créditos de Firetext -delete-selected = Eliminar seleccionado -delete-unsuccessful = Falló la eliminación del archivo.\n\nDetalles del error:\n -deselect-all = Deseleccionar todo -design = Diseño -document-actions = Acciones de documentos -documents-device = Documentos en este dispositivo -documents-dropbox = Documentos en su Dropbox -done = Hecho -dropbox-full = Su Dropbox está lleno. Refrescar no será de ayuda. -edit-docs = Editar documentos -edit-with-zen-mode.innerHTML = Editar en modo zen -editing = Editando -elements = Elementos -enable-autosave.innerHTML = Autoguardado -enable-file-previews.innerHTML = Previsualización de archivos -enable-night-mode.innerHTML = Modo nocturno -enter-name = Por favor, ingrese un nombre para el nuevo archivo. -file-creation-fail = Falló la creación del archivo.\n\nDetalles del error:\n -file-exists = Este archivo ya existe, por favor, escoja otro nombre. -firetext-support = Soporte de Firetext -formatting = Formato -help = Ayuda -horizontal-rule = Regla horizontal -insert = Insertar -insert-image = Insertar imagen -insert-link = Insertar enlace -insert-table = Insertar tabla -internal-storage = Almacenamiento interno -image = Imagen -image-location = Ubicación de imagen -invalid-location = No se pudo crear el archivo. Por favor, escoja una ubicación válida. -italic = Itálicas -justified = Justificado -language.innerHTML = Idioma de la interfaz -left = Izquierda -link = Enlace -list = Lista -load-last-file.innerHTML = Cargar último archivo al inicio -load-unsuccessful = Falló la carga.\n\nDetalles del error:\n -menu = Menú -network-error = Su red parece no estar disponible.\n\nPor favor, revise su conexión y pruebe nuevamente. -no = No -no-dropbox-documents-found = No se encontraron documentos en Dropbox -no-documents-found = No se encontraron documentos -no-files-selected = No hay archivos seleccionados -no-recent-documents = No hay documentos recientes -no-storage-method = No ha configurado un método de almacenamiento -not-signed-in = No ha iniciado sesión -number-of-columns.placeholder = Número de columnas -number-of-rows.placeholder = Número de filas -numbered-list = Lista numerada -okay = Aceptar -open-document = Abrir documento -other = Otro -path-not-defined = La dirección no fue definida -privacy = Privacidad -rate-firetext = Evaluar Firetext -raw = Fuente -recent-documents = Documentos abiertos recientemente -recents-eliminated = ¡Su lista de documentos recientes ha sido eliminada exitosamente! -right = Derecha -save-changes-question = ¿Desea guardar sus cambios? -save-document = Guardar documento -save-unsuccessful = Falló la operación de guardado.\n\nDetalles del error:\n -select-all = Seleccionar todo -select-language = Seleccione su idioma -send-error-stats.innerHTML = Enviar estadísticas de errores -settings = Ajustes -shared-sdcard = La tarjeta SD en su dispositivo está compartida, y por ello no se encuentra disponible. Intente desactivar Almacenamiento USB en sus ajustes. -strikethrough = Tachar -successfully-saved = Guardado exitosamente -table = Tabla -the-web = La web -tools = Herramientas -unable-to-get-sdcard = No puede obtener el espacio utilizado por la tarjeta de memoria SD: -underline = Subrayar -unknown-error = Error desconocido -use-dropbox.innerHTML = Usar Dropbox -valid-integer-value = Por favor, ingrese un valor válido (Por ej. 2 ó 5) -visual = Visual -want-to-delete-singular = ¿Desea eliminar este archivo? -want-to-delete-plural = ¿Desea eliminar estos archivos? -warning-unsupported-technology = Advertencia: Su navegador no soporta parte de la tecnología vital de Firetext. Por favor, descargue Firefox desde https://mozilla.org/firefox. -yes = Sí +about-firetext=Acerca de Firetext +alignment=Alineación +allow-sdcard=Por favor, permita a Firetext acceder a su tarjeta SD. +always-off=Nunca activo +always-on=Siempre activo +auto=Automático +automatic-printing-failed=No pudimos imprimir este archivo automáticamente. Por favor, seleccione 'Imprimir' dentro de su navegador si es que es posible. +bold=Negritas +cancel=Cancelar +center=Centrar +clear=Limpiar +clear-recents.innerHTML=Limpiar la lista de recientes +click-compose-icon-to-create=Haga clic en el icono de escritura para crear un nuevo documento. +close=Cerrar +cloud=La nube +contains-special-characters=Los caracteres especiales no están permitidos. Por favor, revise. +content-not-defined=El contenido no fue definido +could-not-initialize-filesystem=Error: no puede inicializar el sistema de archivos. +create=Crear +credits=Créditos de Firetext +delete-selected=Eliminar seleccionado +delete-unsuccessful=Falló la eliminación del archivo. Detalles del error: +deselect-all=Deseleccionar todo +design=Diseño +documents=Documentos +documents-device=Documentos en este dispositivo +documents-dropbox=Documentos en su Dropbox +done=Hecho +dropbox-full=Su Dropbox está lleno. Refrescar no será de ayuda. +edit-docs=Editar documentos +editing=Editando +elements=Elementos +enable-autosave.innerHTML=Autoguardado +enable-file-previews.innerHTML=Previsualización de archivos +enable-night-mode.innerHTML=Modo nocturno +enter-name=Por favor, ingrese un nombre para el nuevo archivo. +export=Exportar +file-creation-fail=Falló la creación del archivo. Detalles del error: +file-exists=Este archivo ya existe, por favor, escoja otro nombre. +firetext-support=Soporte de Firetext +formatting=Formato +help=Ayuda +horizontal-rule=Regla horizontal +insert=Insertar +insert-image=Insertar imagen +insert-link=Insertar enlace +insert-table=Insertar tabla +internal-storage=Almacenamiento interno +invalid-location=No se pudo crear el archivo. Por favor, escoja una ubicación válida. +image=Imagen +image-location=Ubicación de imagen +import=Importar +italic=Itálicas +justified=Justificado +language.innerHTML= Idioma de la interfaz +left=Izquierda +link=Enlace +list=Lista +load-last-file.innerHTML=Cargar último archivo al inicio +load-unsuccessful=Falló la carga. Detalles del error: +menu=Menú +needs-restart=Este ajuste será aplicado la próxima vez que Firetext sea iniciado. ¿Reiniciar ahora? +network-error=Su red parece no estar disponible. Por favor, revise su conexión y pruebe nuevamente. +no=No +no-dropbox-documents-found=No se encontraron documentos en Dropbox +no-documents-found=No se encontraron documentos +no-files-selected=No hay archivos seleccionados +no-recent-documents=No hay documentos recientes +no-storage-method=Por favor, escoja un sistema de almacenamiento en el cual modificar archivos: +not-functional-link=Este enlace no es funcional... +not-signed-in=No ha iniciado sesión +number-of-columns.placeholder=Número de columnas +number-of-rows.placeholder=Número de filas +numbered-list=Lista numerada +okay=Aceptar +open=Abrir +other=Otro +path-not-defined=La dirección no fue definida +print=Imprimir +privacy=Privacidad +rate-firetext=Evaluar Firetext +raw=Fuente +recent-documents=Documentos abiertos recientemente +recents-eliminated=¡Su lista de documentos recientes ha sido eliminada exitosamente! +right=Derecha +save=Guardar +save-as=Guardar como +save-changes-question=¿Desea guardar sus cambios? +save-unsuccessful=Falló el guardado. Detalles del error: +select-all=Seleccionar todo +select-language=Seleccione su idioma +send-error-stats.innerHTML=Enviar estadísticas de errores +settings=Ajustes +shared-sdcard=La tarjeta SD en su dispositivo está compartida, y por ello no se encuentra disponible. Intente desactivar Almacenamiento USB en sus ajustes. +strikethrough=Tachar +successfully-saved=Guardado exitosamente +table=Tabla +the-web=La web +tools=Herramientas +unable-to-get-sdcard=No puede obtener el espacio utilizado por la tarjeta de memoria SD: +underline=Subrayar +unknown-error=Error desconocido +use-dropbox.innerHTML=Usar Dropbox +valid-integer-value=Por favor, ingrese un valor válido (Por ej. 2 ó 5) +visual=Visual +want-to-delete-singular=¿Desea eliminar este archivo? +want-to-delete-plural=¿Desea eliminar estos archivos? +warning-unsupported-technology=Advertencia: Su navegador no soporta parte de la tecnología vital de Firetext. Por favor, descargue Firefox desde https://mozilla.org/firefox. +yes=Sí diff --git a/locales/fr/app.properties b/locales/fr/app.properties index 4aa5e56..fcc8ddd 100644 --- a/locales/fr/app.properties +++ b/locales/fr/app.properties @@ -1,104 +1,109 @@ -about-firetext = A propos de Firetext -alignment = Alignement -allow-sdcard = Permettre à Firetext d’accéder à votre carte SD -always-off = Toujours off -always-on = Toujours on -auto = Auto -bold = Gras -cancel = Annuler -center = Centré -clear = Supprimer -clear-recents.innerHTML = Effacer liste récente -click-compose-icon-to-create = Cliquez sur l’icône d'écriture pour créer un nouveau document. -close-document = Fermer document -cloud = Cloud -contains-special-characters = Caractères spéciaux non autorisés. Corriger s'il vous plait. -content-not-defined = Le contenu n'a pas été défini -could-not-initialize-filesystem = Erreur : ne peut pas initialiser les fichiers systèmes -create-document = Créer un document -create = Créer -credits = Crédits Firetext -delete-selected = Supprimer sélection -delete-unsuccessful = Suppression de fichier échouée.\n\nDétails erreur:\n -deselect-all = Désélectionner tout -design = Style -document-actions = Document actions -documents-device = Documents sur l'appareil -documents-dropbox = Documents sur votre Dropbox -done = Fait -dropbox-full = Votre Dropbox est pleine. Réactualiser n'aidera pas. -edit-docs = Éditer docs -edit-with-zen-mode.innerHTML = Éditer avec mode zen -editing = Correction -elements = Éléments -enable-autosave.innerHTML = Activer sauvegarde auto -enable-file-previews.innerHTML = Activer prévisualisation des fichiers -enable-night-mode.innerHTML = Activer mode nuit -enter-name = Entrez un nom pour le nouveau fichier. -file-creation-fail = Création de fichier échouée.\n\nDétails erreur:\n -file-exists = Ce fichier existe déjà, choisissez un autre nom. -firetext-support = Firetext support -formatting = Formatage -help = Aide -horizontal-rule = Barre horizontale -insert = Insérer -insert-image = Insérer image -insert-link = Insérer lien -insert-table = Insérer tableau -internal-storage = Stockage interne -image = Image -image-location = Localisation image -invalid-location = Ne peut pas créer le fichier. Choisissez une location valide. -italic = Italique -justified = Justifié -language.innerHTML = Langage interface -left = Gauche -link = Lien -list = Liste -load-last-file.innerHTML = Charger dernier fichier à l'ouverture -load-unsuccessful = Échec du chargement.\n\nDétails erreur:\n -menu = Menu -network-error = Votre réseau semble être indisponible.\n\nVérifiez votre connexion et réessayez. -no = Non -no-dropbox-documents-found = Aucun document Dropbox trouvé -no-documents-found = Aucun documents trouvés -no-files-selected = Pas de fichiers sélectionnés -no-recent-documents = Pas de documents récents -no-storage-method = Vous n'avez pas réglé de méthode stockage -not-signed-in = Vous n’êtes pas connectés -number-of-columns.placeholder = Nombre de colonnes -number-of-rows.placeholder = Nombre de lignes -numbered-list = Liste numéroté -okay = D'accord -open-document = Ouvrir document -other = Autre -path-not-defined = Dossier non défini -privacy = Confidentialité -rate-firetext = Noter Firetext -raw = Code brut -recent-documents = Documents ouverts récemment -recents-eliminated = Votre liste de documents récents a été supprimée avec succès! -right = Droit -save-changes-question = Voulez-vous sauver vos changements? -save-document = Sauvegarder document -save-unsuccessful = Sauvegarder échouée.\n\nDétails erreur:\n -select-all = Sélectionner tout -select-language = Sélectionnez votre langage -send-error-stats.innerHTML = Envoyer statistiques d'erreurs -settings = Paramètres -shared-sdcard = La carte SD sur votre appareil est partagée et n'est donc pas disponible.\nEssayez de désactiver USB Mass Storage dans vos paramètre. -strikethrough = Barré -successfully-saved = Sauvegarde réussie -table = Tableau -the-web = Internet -tools = Outils -unable-to-get-sdcard = Impossible d'accéder à l'espace utilisé par la carte SD: -underline = Souligné -unknown-error = Erreur inconnue -use-dropbox.innerHTML = Utiliser Dropbox -valid-integer-value = Entrez une valeur valide (2 ou 5) -visual = Aperçu -want-to-delete-singular = Voulez-vous vraiment supprimer ce fichier ? -want-to-delete-plural = Voulez vous vraiment supprimer ces fichiers? -warning-unsupported-technology = Attention : Votre navigateur ne supporte pas certaines technologies nécessaires à Firetext. Télécharger Firefox depuis https://mozilla.org/firefox. -yes = Oui +about-firetext=A propos de Firetext +alignment=Alignement +allow-sdcard=Permettre à Firetext d’accéder à votre carte SD +always-off=Toujours off +always-on=Toujours on +auto=Auto +automatic-printing-failed=Nous ne pouvons pas imprimer automatiquement ce fichier. Veuillez sélectionner « Imprimer » depuis votre navigateur si cette fonction est disponible. +bold=Gras +cancel=Annuler +center=Centré +clear=Supprimer +clear-recents.innerHTML=Effacer liste récente +click-compose-icon-to-create=Cliquez sur l’icône d'écriture pour créer un nouveau document. +close=Fermer +cloud=Cloud +contains-special-characters=Caractères spéciaux non autorisés. Corriger s'il vous plait. +content-not-defined=Le contenu n'a pas été défini +could-not-initialize-filesystem=Erreur : ne peut pas initialiser les fichiers systèmes +create=Créer +credits=Crédits Firetext +delete-selected=Supprimer sélection +delete-unsuccessful=La suppression du fichier a échoué. Détails du problème : +deselect-all=Désélectionner tout +design=Style +documents=Documents +documents-device=Documents sur l'appareil +documents-dropbox=Documents sur votre Dropbox +done=Fait +dropbox-full=Votre Dropbox est pleine. Rafraîchir ne servira à rien. +edit-docs=Éditer docs +editing=Correction +elements=Éléments +enable-autosave.innerHTML=Activer sauvegarde auto +enable-file-previews.innerHTML=Activer prévisualisation des fichiers +enable-night-mode.innerHTML=Activer mode nuit +enter-name=Entrez un nom pour le nouveau fichier. +export=Exporter +file-creation-fail=La création du fichier a échoué. Détails du problème : +file-exists=Ce fichier existe déjà, choisissez un autre nom. +firetext-support=Firetext support +formatting=Formatage +help=Aide +horizontal-rule=Barre horizontale +insert=Insérer +insert-image=Insérer image +insert-link=Insérer lien +insert-table=Insérer tableau +internal-storage=Stockage interne +invalid-location=Impossible de créer ce fichier. Veuillez choisir un emplacement valide. +image=Image +image-location=Localisation image +import=Importer +italic=Italique +justified=Justifié +language.innerHTML=Langage interface +left=Gauche +link=Lien +list=Liste +load-last-file.innerHTML=Charger dernier fichier à l'ouverture +load-unsuccessful=Le chargement a échoué. Détails du problème : +menu=Menu +needs-restart=Ce réglage sera appliqué après le redémarrage de Firetext. Souhaitez-vous redémarrer maintenant ? +network-error=Votre réseau semble être indisponible. Veuillez vérifier votre connexion et réessayer. +no=Non +no-dropbox-documents-found=Aucun document Dropbox trouvé +no-documents-found=Aucun documents trouvés +no-files-selected=Pas de fichiers sélectionnés +no-recent-documents=Pas de documents récents +no-storage-method=Veuillez installer un système de stockage pour modifier les fichiers : +not-functional-link=Ce lien n'est pas opérationnel… +not-signed-in=Vous n’êtes pas connectés +number-of-columns.placeholder=Nombre de colonnes +number-of-rows.placeholder=Nombre de lignes +numbered-list=Liste numéroté +okay=D'accord +open=Ouvrir +other=Autre +path-not-defined=Dossier non défini +print=Imprimer +privacy=Confidentialité +rate-firetext=Noter Firetext +raw=Code brut +recent-documents=Documents ouverts récemment +recents-eliminated=Votre liste de documents récents a été supprimée avec succès! +right=Droit +save=Enregistrer +save-as=Enregistrer sous +save-changes-question=Voulez-vous sauver vos changements? +save-unsuccessful=L'enregistrement a échoué. Détails du problème : +select-all=Sélectionner tout +select-language=Sélectionnez votre langage +send-error-stats.innerHTML=Envoyer statistiques d'erreurs +settings=Paramètres +shared-sdcard=La carte SD sur votre appareil est partagée et n'est donc pas disponible.\nEssayez de désactiver USB Mass Storage dans vos paramètre. +strikethrough=Barré +successfully-saved=Sauvegarde réussie +table=Tableau +the-web=Internet +tools=Outils +unable-to-get-sdcard=Impossible d'accéder à l'espace utilisé par la carte SD: +underline=Souligné +unknown-error=Erreur inconnue +use-dropbox.innerHTML=Utiliser Dropbox +valid-integer-value=Entrez une valeur valide (2 ou 5) +visual=Aperçu +want-to-delete-singular=Voulez-vous vraiment supprimer ce fichier ? +want-to-delete-plural=Voulez vous vraiment supprimer ces fichiers? +warning-unsupported-technology=Attention : Votre navigateur ne supporte pas certaines technologies nécessaires à Firetext. Télécharger Firefox depuis https://mozilla.org/firefox. +yes=Oui diff --git a/locales/he/app.properties b/locales/he/app.properties index fbcea70..fe996db 100644 --- a/locales/he/app.properties +++ b/locales/he/app.properties @@ -1,104 +1,109 @@ -about-firetext = אודות Firetext -alignment = יישור -allow-sdcard = נא הרשה ל-Firetext לגשת לכרטיס ה-SD שלך. -always-off = תמיד מכובה -always-on = תמיד דלוק -auto = אוטומטי -bold = מודגש -cancel = ביטול -center = מרכז -clear = נקה -clear-recents.innerHTML = נקה רשימת מסמכים אחרונים -click-compose-icon-to-create = לחץ על אייקון חיבור מסמך כדי ליצור מסמך חדש. -close-document = סגור מסמך -cloud = ענן -contains-special-characters = תווים מיוחדים לא מורשים. נא ערוך. -content-not-defined = התוכן לא הוגדר -could-not-initialize-filesystem = שגיאה: לא ניתן לאתחל את מערכת הקבצים -create-document = צור מסמך -create = צור -credits = תודות וזכויות יוצרים של Firetext -delete-selected = מחק הנבחר -delete-unsuccessful = מחיקת קובץ לא מוצלחת.\n\nפרטי השגיאה: -deselect-all = בטל בחירה של הכל -design = עיצוב -document-actions = פעולות המסמך -documents-device = מסמכים על התקן זה -documents-dropbox = מסמכים על ה-Dropbox שלך -done = בוצע -dropbox-full = ה-Dropbox שלך מלא. רענון לא יעזור. -edit-docs = ערוך מסמכים -edit-with-zen-mode.innerHTML = ערוך במצב זן -editing = עריכה -elements = גורמים -enable-autosave.innerHTML = הפעל שמירה אוטומטית -enable-file-previews.innerHTML = הפעל תצוגה מקדימה של קבצים -enable-night-mode.innerHTML = הפעל מצב לילה -enter-name = נא הזן שם לקובץ החדש. -file-creation-fail = יצירת קובץ לא מוצלחת.\n\nפרטי השגיאה:\n -file-exists = קובץ זה כבר קיים, בחר נא שם אחר. -firetext-support = תמיכת Firetext -formatting = עיצוב -help = עזרה -horizontal-rule = קו אופקי -insert = הכנס -insert-image = הכנס תמונה -insert-link = הכנס קישור -insert-table = הכנס טבלה -internal-storage = אחסון פנימי -image = תמונה -image-location = מיקום התמונה -invalid-location = לא ניתן ליצור קובץ. בחר נא מיקום חוקי. -italic = נטוי -justified = מיושר -language.innerHTML = שפת הממשק -left = שמאל -link = קישור -list = רשימה -load-last-file.innerHTML = טען קובץ אחרון בזמן ההפעלה -load-unsuccessful = טעינה לא מוצלחת.\n\nפרטי השגיאה:\n -menu = תפריט -network-error = הרשת שלך כנראה לא נגישה.\n\nאנא בדוק את החיבור שלך ונסה שוב. -no = לא -no-dropbox-documents-found = לא נמצאו מסמכי Dropbox -no-documents-found = לא נמצאו מסמכים -no-files-selected = לא נבחרו קבצים -no-recent-documents = אין מסמכים אחרונים -no-storage-method = לא הגדרת שיטת אחסון -not-signed-in = אתה לא מחובר -number-of-columns.placeholder = מספר הטורים -number-of-rows.placeholder = מספר השורות -numbered-list = רשימה ממוספרת -okay = בסדר -open-document = פתח מסמך -other = אחר -path-not-defined = הנתיב לא הוגדר -privacy = פרטיות -rate-firetext = דרג את Firetext -raw = גולמי -recent-documents = מסמכים שנפתחו לאחרונה -recents-eliminated = רשימת המסמכים האחרונים שלך נוקתה בהצלחה! -right = ימין -save-changes-question = תרצה לשמור את השינויים שלך? -save-document = שמור מסמך -save-unsuccessful = שמירה לא מוצלחת.\n\nפרטי השגיאה:\n -select-all = בחר הכל -select-language = בחר את השפה שלך -send-error-stats.innerHTML = שלח סטטיסטיקות שגיאה -settings = הגדרות -shared-sdcard = כרטיס ה-SD בהתקן שלך משותף ולכן לא נגיש. נסה לבטל הגדרת התקן אחסון USB. -strikethrough = קו חוצה -successfully-saved = נשמר בהצלחה -table = טבלה -the-web = האינטרנט -tools = כלים -unable-to-get-sdcard = לא ניתן לקבל את השטח המשמש את כרטיס ה-SD: -underline = קו תחתי -unknown-error = שגיאה לא ידועה -use-dropbox.innerHTML = השתמש ב-Dropbox -valid-integer-value = נא הכנס ערך חוקי (כמו 2 או 5) -visual = ויזואלי -want-to-delete-singular = תרצה למחוק את הקובץ הזה? -want-to-delete-plural = תרצה למחוק את הקבצים האלו? -warning-unsupported-technology = אזהרה: הדפדפן שלך לא תומך בטכנולוגיה חיונית מסוימת של פיירפוקס. נא להוריד פיירפוקס מכאן https://mozilla.org/firefox -yes = כן +about-firetext=אודות Firetext +alignment=יישור +allow-sdcard=נא הרשה ל-Firetext לגשת לכרטיס ה-SD שלך. +always-off=תמיד מכובה +always-on=תמיד דלוק +auto= אוטומטי +automatic-printing-failed=אנחנו לא יכולים להדפיס קובץ זה באופן אוטומטי. אנא בחר 'הדפסה' מתוך הדפדפן שלך, אם הוא זמין. +bold=מודגש +cancel=ביטול +center=מרכז +clear=נקה +clear-recents.innerHTML=נקה רשימת מסמכים אחרונים +click-compose-icon-to-create=לחץ על אייקון חיבור מסמך כדי ליצור מסמך חדש. +close=קרוב +cloud=ענן +contains-special-characters=תווים מיוחדים לא מורשים. נא ערוך. +content-not-defined=התוכן לא הוגדר +could-not-initialize-filesystem=שגיאה: לא ניתן לאתחל את מערכת הקבצים +create=צור +credits=תודות וזכויות יוצרים של Firetext +delete-selected=מחק הנבחר +delete-unsuccessful=מחיקת קובץ לא מוצלחת. פרטי השגיאה: +deselect-all=בטל בחירה של הכל +design=עיצוב +documents=מסמכים +documents-device=מסמכים על התקן זה +documents-dropbox=מסמכים על ה-Dropbox שלך +done=בוצע +dropbox-full=ה-Dropbox שלך מלא. רענון לא יעזור. +edit-docs=ערוך מסמכים +editing=עריכה +elements=גורמים +enable-autosave.innerHTML=הפעל שמירה אוטומטית +enable-file-previews.innerHTML=הפעל תצוגה מקדימה של קבצים +enable-night-mode.innerHTML=הפעל מצב לילה +enter-name=נא הזן שם לקובץ החדש. +export=היצוא +file-creation-fail=יצירת קובץ לא מוצלחת. פרטי השגיאה: +file-exists=קובץ זה כבר קיים, בחר נא שם אחר. +firetext-support=תמיכת Firetext +formatting=עיצוב +help=עזרה +horizontal-rule=קו אופקי +insert=הכנס +insert-image=הכנס תמונה +insert-link=הכנס קישור +insert-table=הכנס טבלה +internal-storage=אחסון פנימי +invalid-location=לא ניתן ליצור קובץ. בחר נא מיקום חוקי. +image=תמונה +image-location=מיקום התמונה +import=היבוא +italic=נטוי +justified=מיושר +language.innerHTML=שפת הממשק +left=שמאל +link=קישור +list=רשימה +load-last-file.innerHTML=טען קובץ אחרון בזמן ההפעלה +load-unsuccessful=טעינה לא מוצלחת. פרטי השגיאה: +menu=תפריט +needs-restart=הגדרה זו תיושם לאחר הפעלה מחדש של Firetext. הפעל מחדש עכשיו? +network-error=הרשת שלך כנראה לא נגישה. אנא בדוק את החיבור שלך ונסה שוב. +no=לא +no-dropbox-documents-found=לא נמצאו מסמכי Dropbox +no-documents-found=לא נמצאו מסמכים +no-files-selected=לא נבחרו קבצים +no-recent-documents=אין מסמכים אחרונים +no-storage-method=לא הגדרת שיטת אחסון: +not-functional-link=הקישור הזה לא בשימוש... +not-signed-in=אתה לא מחובר +number-of-columns.placeholder=מספר הטורים +number-of-rows.placeholder=מספר השורות +numbered-list=רשימה ממוספרת +okay=בסדר +open=פתוח +other=אחר +path-not-defined=הנתיב לא הוגדר +print=ההדפסה +privacy= פרטיות +rate-firetext=דרג את Firetext +raw=גולמי +recent-documents=מסמכים שנפתחו לאחרונה +recents-eliminated=רשימת המסמכים האחרונים שלך נוקתה בהצלחה! +right=ימין +save=שמור +save-as=שמירה כ +save-changes-question=תרצה לשמור את השינויים שלך? +save-unsuccessful=שמירה לא מוצלחת. פרטי השגיאה: +select-all=בחר הכל +select-language=בחר את השפה שלך +send-error-stats.innerHTML=שלח סטטיסטיקות שגיאה +settings=הגדרות +shared-sdcard=כרטיס ה-SD בהתקן שלך משותף ולכן לא נגיש. נסה לבטל הגדרת התקן אחסון USB. +strikethrough=קו חוצה +successfully-saved=נשמר בהצלחה +table=טבלה +the-web=האינטרנט +tools=כלים +unable-to-get-sdcard=לא ניתן לקבל את השטח המשמש את כרטיס ה-SD: +underline=קו תחתי +unknown-error=שגיאה לא ידועה +use-dropbox.innerHTML=השתמש ב-Dropbox +valid-integer-value=נא הכנס ערך חוקי (כמו 2 או 5) +visual=ויזואלי +want-to-delete-singular=תרצה למחוק את הקובץ הזה? +want-to-delete-plural=תרצה למחוק את הקבצים האלו? +warning-unsupported-technology=אזהרה: הדפדפן שלך לא תומך בטכנולוגיה חיונית מסוימת של פיירפוקס. נא להוריד פיירפוקס מכאן https://mozilla.org/firefox +yes=כן diff --git a/locales/hu/app.properties b/locales/hu/app.properties new file mode 100644 index 0000000..3b88b8f --- /dev/null +++ b/locales/hu/app.properties @@ -0,0 +1,109 @@ +about-firetext=Firetext névjegy +alignment=Igazítás +allow-sdcard=Kérem, engedélyezze a Firetext-nek az SD kártya elérését. +always-off=Mindig ki +always-on=Mindig be +auto=Automatikus +automatic-printing-failed=Nem tudjuk nyomtatni a fájlt automatikusan. Kérjük, válassza ki a "Print" belülről a böngésző, ha elérhető. +bold=Félkövér +cancel=Mégsem +center=Középre +clear=Törlés +clear-recents.innerHTML=Előzmények törlése lista FIXME +click-compose-icon-to-create=Kattintson a Szerkesztés ikonra új dokumentum létrehozásához. +close=Bezár +cloud=Felhő +contains-special-characters=Speciális karaktereket nem lehet használni. Kérem, ellenőrizze! +content-not-defined=A tartalom nincs meghatározva +could-not-initialize-filesystem=Hiba: Nem lehet inicializálni a fájlrendszert +create=Létrehozás +credits=Firetext készítők +delete-selected=Kijelölt törlése +delete-unsuccessful=Fájl törlése sikertelen. Hiba részletei: +deselect-all=Kijelölés törlése +design=Kinézet +documents=Dokumentumok +documents-device=Dokumentumok az eszközön +documents-dropbox=Dokumentumok a Dropbox-on +done=Kész +dropbox-full=A Dropbox-a betellt. A frissítés nem segít. +edit-docs=Dokumentumok szerkesztése +editing=Szerkesztés +elements=Elemek +enable-autosave.innerHTML=automentés engedélyezése +enable-file-previews.innerHTML=Fájl előnézet engedélyezése +enable-night-mode.innerHTML=Éjszakai mód engedélyezése +enter-name=Kérem adjon meg egy nevet az új fájlnak. +export=Kiviteli +file-creation-fail=A fájl létrehozása sikertelen. Hiba részletei: +file-exists=A fájl már létezik, kérem, válasszon egy másik nevet. +firetext-support=Firetext támogatás +formatting=Formázás +help=Súgó +horizontal-rule=Vízszintes vonal +insert=Beszúrás +insert-image=Kép beszúrása +insert-link=Hivatkozás beszúrása +insert-table=Táblázat beszúrása +internal-storage=Belső tároló +invalid-location=Nem sikerült létrehozni a fájlt. Kérem, válasszon egy érvényes helyet. +image=Kép +image-location=Kép helye +import=Importál +italic=Dőlt +justified=Igazított +language.innerHTML=A felület nyelve +left=Bal +link=Hivatkozás +list=Lista +load-last-file.innerHTML=Előző fájl megnyitása induláskor +load-unsuccessful=A betöltés sikertelen. Hiba részletei: +menu=Menü +needs-restart=Ez a beállítás után alkalmazandó Firetext újraindul. Újraindítja most? +network-error=Úgy tűnik, a hálózat elérhetetlen. Ellenőrizze a kapcsolatát és próbálja újra. +no=Nem +no-dropbox-documents-found=Nem található dokumentum a Dropbox-on +no-documents-found=Dokumentum nem található +no-files-selected=Nincs kiválasztva fájl +no-recent-documents=Nincsenek előzőleg megnyitott dokumentumok +no-storage-method=Nincs tárolási mód beállítva: +not-functional-link=Ez a hivatkozás nem működik... +not-signed-in=Nincs bejelentkezve +number-of-columns.placeholder=Oszlopok száma +number-of-rows.placeholder=Sorok száma +numbered-list=Sorszámozott lista +okay=Ok +open=Megnyitása +other=Egyéb +path-not-defined=Az útvonal nem volt definiálva. +print=Nyomtatás +privacy=Magánszféra +rate-firetext=A Firetext ajánlása +raw=Nyers +recent-documents=Előzőleg megnyitott dokumentumok +recents-eliminated=Az előzőleg megnyitott dokumentumok listája sikeresen ki lett ürítve. +right=Jobb +save=Mentése +save-as=Mentés másként +save-changes-question=El szeretné menteni a változtatásokat? +save-unsuccessful=Mentés sikertelen. Hiba részletei: +select-all=Összes kijelölése +select-language=Nyelv választása +send-error-stats.innerHTML=Hiba küldés statisztikák +settings=Beállítások +shared-sdcard=Az eszközében lévő SD kártya megosztott, ezért nem elérhető. Kérem, tiltsa le az USB tároló opciót a beállításokban. +strikethrough=Áthúzott +successfully-saved=Sikeresen mentve +table=Táblázat +the-web=Internet +tools=Eszközök +unable-to-get-sdcard=Nem tudom lekérdezni az SD kártyán a foglalt helyet. +underline=Aláhúzás +unknown-error=Ismeretlen hiba +use-dropbox.innerHTML=Dropbox használata +valid-integer-value=Kérem, adjon meg egy érvényes értéket (pl. 2 vagy 5) +visual=Kinézet +want-to-delete-singular=Biztosan törölni szeretné ezt a fájlt? +want-to-delete-plural=Biztosan törölni szeretné ezeket a fájlokat? +warning-unsupported-technology=Figyelem: Az ön böngészője nem támogat bizonyos Firetext technológiákat. Kérem, töltse le a Firefox-ot a https://mozilla.org/firefox címről. +yes=Igen diff --git a/locales/id/app.properties b/locales/id/app.properties index 81e81b0..325fc9a 100644 --- a/locales/id/app.properties +++ b/locales/id/app.properties @@ -1,104 +1,109 @@ -about-firetext = Tentang Firetext -alignment = Penyelarasan -allow-sdcard = Harap ijinkan Firetext untuk mengakses kartu SD anda. -always-off = Selalu deaktif -always-on = Selalu aktif -auto = Auto -bold = Tebal -cancel = Batalkan -center = Tengah -clear = Bersihkan -clear-recents.innerHTML = Bersihkan daftar sebelumnya -click-compose-icon-to-create = Klik pada ikon susun untuk membuat berkas baru -close-document = Tutup dokumen -cloud = Awan -contains-special-characters = Karakter khusus tidak dibolehkan. Mohon diperbaiki. -content-not-defined = Konten tidak terdefinisikan -could-not-initialize-filesystem = Kesalahan: Tidak dapat menginisialisasi filesystem -create-document = Membuat berkas -create = Membuat -credits = Kredit Firetext -delete-selected = Hapus yang terpilih -delete-unsuccessful = Gagal menghapus berkas.\n\nDetil kesalahan:\n -deselect-all = Batalkan pemilihan semua -design = Desain -document-actions = Aksi dokumen -documents-device = Dokumen di perangkat Anda -documents-dropbox = Dokunen di Dropbox Anda -done = Selesai -dropbox-full = Dropbox Anda penuh. Refresh tidak akan membantu -edit-docs = Sunting dokumen -edit-with-zen-mode.innerHTML = Sunting dengan mode zen -editing = Penyuntingan -elements = Elemen -enable-autosave.innerHTML = Aktifkan penyimpanan otomatis -enable-file-previews.innerHTML = Aktifkan pratinjau berkas -enable-night-mode.innerHTML = Aktifkan mode malam -enter-name = Masukkan nama untuk berkas baru -file-creation-fail = Gagal membuat berkas.\n\nDetil kesalahan:\n -file-exists = Berkas telah ada sebelumnya, silakan pilih nama lainnya -firetext-support = Dukungan Firetext -formatting = Memformat -help = Panduan -horizontal-rule = Garis horisontal -insert = Sisipkan -insert-image = Sisipkan gambar -insert-link = Sisipkan tautan -insert-table = Sisipkan tabel -internal-storage = Penyimpanan internal -image = Gambar -image-location = Lokasi gambar -invalid-location = Tidak dapat membuat berkas. Silakan pilih lokasi yang tepat -italic = Miring -justified = Rata kiri-kanan -language.innerHTML = Antarmuka bahasa -left = Kiri -link = Tautan -list = Daftar -load-last-file.innerHTML = Muat berkas terakhir saat memulai -load-unsuccessful = Gagal memuat.\n\nDetil kesalahan:\n -menu = Menu -network-error = Anda sepertinya tidak terhubung dengan jaringan.\n\nSilakan periksa koneksi Anda dan coba kembali. -no = Tidak -no-dropbox-documents-found = Dokumen Dropbox tidak ditemukan -no-documents-found = Dokumen tidak ditemukan -no-files-selected = Tidak ada berkas yang dipilih -no-recent-documents = Tidak ada dokumen sebelumnya -no-storage-method = Anda belum menentukan metode penyimpanan -not-signed-in = Anda belum mendaftar -number-of-columns.placeholder = Jumlah kolom -number-of-rows.placeholder = Jumlah baris -numbered-list = Daftar dengan nomor -okay = OK -open-document = Buka dokumen -other = Lainnya -path-not-defined = Letak tidak terdefinisikan -privacy = Privasi -rate-firetext = Nilai Firetext -raw = Mentah -recent-documents = Dokumen-dokumen yang sebelumnya dibuka -recents-eliminated = Daftar dokumen Anda sebelumnya telah berhasil dihapus! -right = Kanan -save-changes-question = Apakah anda ingin menyimpan perubahan yang telah dilakukan? -save-document = Simpan dokumen -save-unsuccessful = Gagal menyimpan.\n\nDetil kesalahan:\n -select-all = Pilih semua -select-language = Pilihan bahasa -send-error-stats.innerHTML = Kirimkan statistik kesalahan -settings = Pengaturan -shared-sdcard = SD Card pada perangkat Anda bersama, dan dengan demikian tidak tersedia. Coba nonaktifkan USB Mass Storage dalam pengaturan Anda. -strikethrough = Line melalui -successfully-saved = Berhasil tersimpan -table = Tabel -the-web = Web -tools = Alat -unable-to-get-sdcard = Tidak dapat mendapatkan ruang yang digunakan oleh kartu SD: -underline = Garis bawah -unknown-error = Kesalahan yang tidak terdefinisikan -use-dropbox.innerHTML = Gunakan Dropbox -valid-integer-value = Mohon isi nilai yang benar (contoh: 2 atau 5) -visual = Visual -want-to-delete-singular = Anda ingin menghapus berkas ini? -want-to-delete-plural = Anda ingin menghapus berkas-berkas berikut ini? -warning-unsupported-technology = Peringata: Peramban anda tidak mendukung beberapa teknologi vital yang digunakan Firetext. Silakan unduh Firefox dari https://mozilla.org/firefox. -yes = Ya +about-firetext=Tentang Firetext +alignment=Penyelarasan +allow-sdcard=Harap ijinkan Firetext untuk mengakses kartu SD anda. +always-off=Selalu deaktif +always-on=Selalu aktif +auto=Auto +automatic-printing-failed=Kita tidak dapat mencetak file ini secara otomatis. Silakan pilih 'Cetak' dari dalam browser Anda jika tersedia. +bold=Tebal +cancel=Batalkan +center=Tengah +clear=Bersihkan +clear-recents.innerHTML=Bersihkan daftar sebelumnya +click-compose-icon-to-create=Klik pada ikon susun untuk membuat berkas baru +close=Tutup +cloud=Awan +contains-special-characters=Karakter khusus tidak dibolehkan. Mohon diperbaiki. +content-not-defined=Konten tidak terdefinisikan +could-not-initialize-filesystem=Kesalahan: Tidak dapat menginisialisasi filesystem +create=Membuat +credits=Kredit Firetext +delete-selected=Hapus yang terpilih +delete-unsuccessful=Gagal menghapus berkas. Detil kesalahan: +deselect-all=Batalkan pemilihan semua +design=Desain +documents=Dokumen +documents-device=Dokumen di perangkat Anda +documents-dropbox=Dokunen di Dropbox Anda +done=Selesai +dropbox-full=Dropbox Anda penuh. Refresh tidak akan membantu. +edit-docs=Sunting dokumen +editing=Penyuntingan +elements=Elemen +enable-autosave.innerHTML=Aktifkan penyimpanan otomatis +enable-file-previews.innerHTML=Aktifkan pratinjau berkas +enable-night-mode.innerHTML=Aktifkan mode malam +enter-name=Masukkan nama untuk berkas baru +export=Ekspor +file-creation-fail=Gagal membuat berkas. Detil kesalahan: +file-exists=Berkas telah ada sebelumnya, silakan pilih nama lainnya +firetext-support=Dukungan Firetext +formatting=Memformat +help=Panduan +horizontal-rule=Garis horisontal +insert=Sisipkan +insert-image=Sisipkan gambar +insert-link=Sisipkan tautan +insert-table=Sisipkan tabel +internal-storage=Penyimpanan internal +invalid-location=Tidak dapat membuat berkas. Silakan pilih lokasi yang tepat. +image=Gambar +image-location=Lokasi gambar +import=Impor +italic=Miring +justified=Rata kiri-kanan +language.innerHTML=Antarmuka bahasa +left=Kiri +link=Tautan +list=Daftar +load-last-file.innerHTML=Muat berkas terakhir saat memulai +load-unsuccessful=Gagal memuat. Detil kesalahan: +menu=Menu +needs-restart=Pengaturan ini akan diterapkan setelah Firetext restart. Restart sekarang? +network-error=Anda sepertinya tidak terhubung dengan jaringan. Silakan periksa koneksi Anda dan coba kembali. +no=Tidak +no-dropbox-documents-found=Dokumen Dropbox tidak ditemukan +no-documents-found=Dokumen tidak ditemukan +no-files-selected=Tidak ada berkas yang dipilih +no-recent-documents=Tidak ada dokumen sebelumnya +no-storage-method=Anda belum menentukan metode penyimpanan: +not-functional-link=Link ini tidak fungsional. +not-signed-in=Anda belum mendaftar +number-of-columns.placeholder=Jumlah kolom +number-of-rows.placeholder=Jumlah baris +numbered-list=Daftar dengan nomor +okay=OK +open=Terbuka +other=Lainnya +path-not-defined=Letak tidak terdefinisikan +print=Cetak +privacy=Privasi +rate-firetext=Nilai Firetext +raw=Mentah +recent-documents=Dokumen-dokumen yang sebelumnya dibuka +recents-eliminated=Daftar dokumen Anda sebelumnya telah berhasil dihapus! +right=Kanan +save=Simpan +save-as=Simpan sebagai +save-changes-question=Apakah anda ingin menyimpan perubahan yang telah dilakukan? +save-unsuccessful=Gagal menyimpan. Detil kesalahan: +select-all=Pilih semua +select-language=Pilihan bahasa +send-error-stats.innerHTML=Kirimkan statistik kesalahan +settings=Pengaturan +shared-sdcard=SD Card pada perangkat Anda bersama, dan dengan demikian tidak tersedia. Coba nonaktifkan USB Mass Storage dalam pengaturan Anda. +strikethrough=Line melalui +successfully-saved=Berhasil tersimpan +table=Tabel +the-web=Web +tools=Alat +unable-to-get-sdcard=Tidak dapat mendapatkan ruang yang digunakan oleh kartu SD: +underline=Garis bawah +unknown-error=Kesalahan yang tidak terdefinisikan +use-dropbox.innerHTML=Gunakan Dropbox +valid-integer-value=Mohon isi nilai yang benar (contoh: 2 atau 5) +visual=Visual +want-to-delete-singular=Anda ingin menghapus berkas ini? +want-to-delete-plural=Anda ingin menghapus berkas-berkas berikut ini? +warning-unsupported-technology=Peringata: Peramban anda tidak mendukung beberapa teknologi vital yang digunakan Firetext. Silakan unduh Firefox dari https://mozilla.org/firefox. +yes=Ya diff --git a/locales/it/app.properties b/locales/it/app.properties index 5c49a7b..7d1be2d 100644 --- a/locales/it/app.properties +++ b/locales/it/app.properties @@ -1,104 +1,109 @@ -about-firetext = Informazioni su Firetext -alignment = Allineamento -allow-sdcard = Permetti a Firetext di accedere alla tua scheda SD -always-off = Sempre disattivato -always-on = Sempre attivato -auto = Automatico -bold = Grassetto -cancel = Cancella -center = Centrato -clear = Pulisci -clear-recents.innerHTML = Pulisci lista dei file recenti -click-compose-icon-to-create = Premi l'icona di scrittura per creare un nuovo documento. -close-document = Chiudi documento -cloud = Cloud -contains-special-characters = I caratteri speciali non sono permessi. Controlla il tuo testo. -content-not-defined = Il contenuto non è stato definito -could-not-initialize-filesystem = Errore: non è stato possibile inizializzare il filesystem -create-document = Crea documento -create = Crea -credits = Crediti di Firetext -delete-selected = Elimina selezione -delete-unsuccessful = Eliminazione file senza successo\n\nDettagli errore: -deselect-all = Deseleziona tutto -design = Design -document-actions = Azioni del documento -documents-device = Documenti in questo dispositivo -documents-dropbox = Documenti su Dropbox -done = Fatto -dropbox-full = Il tuo account di Dropbox è pieno. Aggiornare non risolve il problema. -edit-docs = Modifica documenti -edit-with-zen-mode.innerHTML = Modifica in modalità zen -editing = Modifica -elements = Elementi -enable-autosave.innerHTML = Abilita salvataggio automatico -enable-file-previews.innerHTML = Abilita anteprima file -enable-night-mode.innerHTML = Abilita modalità notturna -enter-name = Inserisci un nome per il file nuovo. -file-creation-fail = Creazione file senza successo.\n\nDettagli errore: -file-exists = Questo file esiste già. Inserisci un altro nome. -firetext-support = Supporto per Firetext -formatting = Formattazione -help = Aiuto -horizontal-rule = Riga orizzontale -insert = Inserisci -insert-image = Inserisci immagine -insert-link = Inserisci URL -insert-table = Inserisci tabella -internal-storage = Spazio interno -image = Immagine -image-location = Posizione immagine -invalid-location = Non è stato possibile creare il file. Seleziona una posizione valida. -italic = Corsivo -justified = Giustificato -language.innerHTML = Lingua dell'interfaccia -left = Destra -link = Link -list = Lista -load-last-file.innerHTML = Carica l'ultimo file all'avvio -load-unsuccessful = Caricamento senza successo.\n\nDettagli errore:\n -menu = Menù -network-error = La tua connessione sembra non essere disponibile.\n\nVerifica la tua connessione e riprova. -no = No -no-dropbox-documents-found = Nessun documento trovato su Dropbox -no-documents-found = Nessun documento trovato -no-files-selected = Nessun file selezionato -no-recent-documents = Nessun documento recente -no-storage-method = Non hai impostato un metodo di salvataggio -not-signed-in = Non hai fatto il login -number-of-columns.placeholder = Numero di colonne -number-of-rows.placeholder = Numero di righe -numbered-list = Lista numerata -okay = Ok -open-document = Apri documento -other = Altro -path-not-defined = Il percorso non è definito -privacy = Privacy -rate-firetext = Vota Firetext -raw = Sorgente -recent-documents = Documenti aperti recentemente -recents-eliminated = La lista dei tuoi documenti recenti è stata eliminata con successo! -right = Sinistra -save-changes-question = Vuoi salvare le tue modifiche? -save-document = Salva documento -save-unsuccessful = Salvataggio non riuscito.\n\nDettagli errore:\n -select-all = Seleziona tutto -select-language = Seleziona la tua lingua -send-error-stats.innerHTML = Invia le statistiche d'errore -settings = Impostazioni -shared-sdcard = La scheda SD del tuo dispositivo è condivisa e questo non è disponibile. Prova a disattivare la l'impostazione della memoria USB. -strikethrough = Sottolineato sopra -successfully-saved = Salvato con successo -table = Tabella -the-web = Il web -tools = Strumenti -unable-to-get-sdcard = Non è stato possibile ottenere lo spazio libero dalla scheda SD: -underline = Sottolineato -unknown-error = Errore sconosciuto -use-dropbox.innerHTML = Usa Dropbox -valid-integer-value = Inserisci un valore valido (es. 2 o 5) -visual = Visuale -want-to-delete-singular = Vuoi cancellare questo file? -want-to-delete-plural = Vuoi cancellare questi file? -warning-unsupported-technology = Attenzione: il tuo browser non supporta alcune funzioni vitali della tecnologia di Firetext. Scarica Firefox da https://mozilla.org/firefox. -yes = Sì +about-firetext=Informazioni su Firetext +alignment=Allineamento +allow-sdcard=Permetti a Firetext di accedere alla tua scheda SD +always-off=Sempre disattivato +always-on=Sempre attivato +auto=Automatico +automatic-printing-failed=Non possiamo stampare i file automaticamente. Seleziona 'Stampa' dal tuo browser se è disponibile nel tuo browser. +bold=Grassetto +cancel=Cancella +center=Centrato +clear=Pulisci +clear-recents.innerHTML=Pulisci lista dei file recenti +click-compose-icon-to-create=Premi l'icona di scrittura per creare un nuovo documento. +close=Chiudi +cloud=Cloud +contains-special-characters=I caratteri speciali non sono permessi. Controlla il tuo testo. +content-not-defined=Il contenuto non è stato definito +could-not-initialize-filesystem=Errore: non è stato possibile inizializzare il filesystem +create=Crea +credits=Crediti di Firetext +delete-selected=Elimina selezione +delete-unsuccessful=Il file non è stato eliminato. Dettagli dell'errore: +deselect-all=Deseleziona tutto +design=Design +documents=Documenti +documents-device=Documenti in questo dispositivo +documents-dropbox=Documenti su Dropbox +done=Fatto +dropbox-full=Il tuo Dropbox è pieno. Ricaricare non risolverà il problema. +edit-docs=Modifica documenti +editing=Modifica +elements=Elementi +enable-autosave.innerHTML=Abilita salvataggio automatico +enable-file-previews.innerHTML=Abilita anteprima file +enable-night-mode.innerHTML=Abilita modalità notturna +enter-name=Inserisci un nome per il file nuovo. +export=Esporta +file-creation-fail=Il file non è stato creato. Dettagli dell'errore: +file-exists=Questo file esiste già. Inserisci un altro nome. +firetext-support=Supporto per Firetext +formatting=Formattazione +help=Aiuto +horizontal-rule=Riga orizzontale +insert=Inserisci +insert-image=Inserisci immagine +insert-link=Inserisci URL +insert-table=Inserisci tabella +internal-storage=Spazio interno +invalid-location=Non è stato possibile creare il file. Scegli un altro percorso. +image=Immagine +image-location=Posizione immagine +import=Importa +italic=Corsivo +justified=Giustificato +language.innerHTML=Lingua dell'interfaccia +left=Destra +link=Link +list=Lista +load-last-file.innerHTML=Carica l'ultimo file all'avvio +load-unsuccessful=Caricamento senza successo. Dettagli dell'errore: +menu=Menù +needs-restart=Queste impostazioni saranno disponibili al riavvio di FireText. Riavvia ora? +network-error=La tua connessione sembra non disponibile. Verifica la connessione e prova di nuovo. +no=No +no-dropbox-documents-found=Nessun documento trovato su Dropbox +no-documents-found=Nessun documento trovato +no-files-selected=Nessun file selezionato +no-recent-documents=Nessun documento recente +no-storage-method=Imposta uno spazio per modificare i file: +not-functional-link=Questo link non funziona... +not-signed-in=Non hai fatto il login +number-of-columns.placeholder=Numero di colonne +number-of-rows.placeholder=Numero di righe +numbered-list=Lista numerata +okay=Ok +open=Apri +other=Altro +path-not-defined=Il percorso non è definito +print=Stampa +privacy=Privacy +rate-firetext=Vota Firetext +raw=Sorgente +recent-documents=Documenti aperti recentemente +recents-eliminated=La lista dei tuoi documenti recenti è stata eliminata con successo! +right=Sinistra +save=Salva +save-as=Salva come +save-changes-question=Vuoi salvare le tue modifiche? +save-unsuccessful=Salvataggio senza successo: Dettagli dell'errore: +select-all=Seleziona tutto +select-language=Seleziona la tua lingua +send-error-stats.innerHTML=Invia le statistiche d'errore +settings=Impostazioni +shared-sdcard=La scheda SD del tuo dispositivo è condivisa e questo non è disponibile. Prova a disattivare la l'impostazione della memoria USB. +strikethrough=Sottolineato sopra +successfully-saved=Salvato con successo +table=Tabella +the-web=Il web +tools=Strumenti +unable-to-get-sdcard=Non è stato possibile ottenere lo spazio libero dalla scheda SD: +underline=Sottolineato +unknown-error=Errore sconosciuto +use-dropbox.innerHTML=Usa Dropbox +valid-integer-value=Inserisci un valore valido (es. 2 o 5) +visual=Visuale +want-to-delete-singular=Vuoi cancellare questo file? +want-to-delete-plural=Vuoi cancellare questi file? +warning-unsupported-technology=Attenzione: il tuo browser non supporta alcune funzioni vitali della tecnologia di Firetext. Scarica Firefox da https://mozilla.org/firefox. +yes=Sì diff --git a/locales/locales.ini b/locales/locales.ini index ed55dd9..e65203a 100644 --- a/locales/locales.ini +++ b/locales/locales.ini @@ -1,5 +1,8 @@ @import url(en-US/app.properties) +[bg] +@import url(bg/app.properties) + [bn-BD] @import url(bn-BD/app.properties) @@ -24,6 +27,9 @@ [he] @import url(he/app.properties) +[hu] +@import url(hu/app.properties) + [id] @import url(id/app.properties) diff --git a/locales/nl/app.properties b/locales/nl/app.properties index 3308b1d..b2d40b7 100644 --- a/locales/nl/app.properties +++ b/locales/nl/app.properties @@ -1,104 +1,109 @@ -about-firetext = Over Firetext -alignment = Uitlijning -allow-sdcard = Geef aub permissie aan Firetext om de SD kaart te gebruiken. -always-off = Altijd uit -always-on = Altijd aan -auto = Automatisch -bold = Dikgedrukt -cancel = Annuleren -center = Midden -clear = Verwijderen -clear-recents.innerHTML = Verwijder recent lijst -click-compose-icon-to-create = Klik op het maak icoon om een nieuw document te maken. -close-document = Sluit document -cloud = Cloud -contains-special-characters = Speciale tekens zijn niet toegestaan, gelieve dit te herzien. -content-not-defined = De inhoud was niet gedefinieerd. -could-not-initialize-filesystem = Fout: het bestandssysteem kon niet worden geïnitialiseerd -create-document = Document aanmaken -create = Aanmaken -credits = Met dank aan -delete-selected = Verwijder het geselecteerde -delete-unsuccessful = Verwijderen van bestand mislukt\n\nFoutdetails:\n -deselect-all = Alles deselecteren -design = Ontwerp -document-actions = Documentacties -documents-device = Documenten op dit apparaat -documents-dropbox = Documenten in uw Dropbox -done = Gereed -dropbox-full = Uw Dropbox is vol. Vernieuwen helpt niet. -edit-docs = Documenten bewerken -edit-with-zen-mode.innerHTML = Bewerken in de minimalistische modus -editing = Bewerken -elements = Elementen -enable-autosave.innerHTML = Automatisch opslaan inschakelen -enable-file-previews.innerHTML = Bestandsvoorvertoning inschakelen -enable-night-mode.innerHTML = Nachtmodus inschakelen -enter-name = Voer een naam in voor het nieuwe bestand -file-creation-fail = Aanmaken van bestand mislukt\n\nFoutdetails:\n -file-exists = Dit bestand bestaat al, kies alstublieft een andere naam -firetext-support = Firetext-ondersteuning -formatting = Opmaak -help = Help -horizontal-rule = Horizontale lijn -insert = Invoegen -insert-image = Afbeelding invoegen -insert-link = Link invoegen -insert-table = Tabel invoegen -internal-storage = Interne opslag -image = Afbeelding -image-location = Afbeeldingslocatie -invalid-location = Het bestand kon niet worden aangemaakt. Kies een geldige locatie. -italic = Cursief -justified = Uitvullen -language.innerHTML = Interfacetaal -left = Links -link = Koppeling -list = Lijst -load-last-file.innerHTML = Laatste bestand laden bij het opstarten -load-unsuccessful = Laden mislukt.\n\nFoutdetails:\n -menu = Menu -network-error = Uw netwerk lijkt niet beschikbaar te zijn.\n\nControleer uw verbinding en probeer het opnieuw. -no = Nee -no-dropbox-documents-found = Geen Dropbox-documenten gevonden -no-documents-found = Geen documenten gevonden -no-files-selected = Geen bestanden geselecteerd -no-recent-documents = Geen recente bestanden -no-storage-method = U hebt geen opslagmethode ingesteld -not-signed-in = U bent niet ingelogd -number-of-columns.placeholder = Aantal kolommen -number-of-rows.placeholder = Aantal rijen -numbered-list = Genummerde lijst -okay = OK -open-document = Document openen -other = Andere -path-not-defined = Het pad was niet ingesteld -privacy = Privacy -rate-firetext = Firetext beoordelen -raw = Onbewerkt -recent-documents = Recent geopende documenten -recents-eliminated = Uw lijst met recent geopende documenten is gewist! -right = Rechts -save-changes-question = Wilt u uw wijzigingen opslaan= -save-document = Document opslaan -save-unsuccessful = Opslaan mislukt.\n\nFoutdetails:\n -select-all = Alles selecteren -select-language = Selecteer uw taal -send-error-stats.innerHTML = Foutstatistieken verzenden -settings = Instellingen -shared-sdcard = De SD-kaart van uw apparaat is niet beschikbaar omdat deze gedeeld is. Probeer USB-opslag uit te schakelen in de instellingen. -strikethrough = Doorhalen -successfully-saved = Succesvol opgeslagen -table = Tabel -the-web = Het internet -tools = Gereedschap -unable-to-get-sdcard = Het is niet gelukt om door de SD-kaart gebruikte ruimte op te halen: -underline = Onderstrepen -unknown-error = Onbekende fout -use-dropbox.innerHTML = Gebruik Dropbox -valid-integer-value = Voer een geldige waarde in (bijv. 2 of 5) -visual = Visueel -want-to-delete-singular = Wilt u dit bestand verwijderen? -want-to-delete-plural = Wilt u deze bestanden verwijderen? -warning-unsupported-technology = Waarschuwing: Uw browser ondersteunt sommige door Firetext vereiste techniek niet. Download Firefox van https://mozilla.org/firefox -yes = Ja +about-firetext=Over Firetext +alignment=Uitlijning +allow-sdcard=Geef aub permissie aan Firetext om de SD kaart te gebruiken. +always-off=Altijd uit +always-on=Altijd aan +auto=Automatisch +automatic-printing-failed=Wij kunnen dit bestand niet automatisch afgedrukt. Selecteer 'Print' in in je browser als deze beschikbaar is. +bold=Dikgedrukt +cancel=Annuleren +center=Midden +clear=Verwijderen +clear-recents.innerHTML=Verwijder recent lijst +click-compose-icon-to-create=Klik op het maak icoon om een nieuw document te maken. +close=Sluiten +cloud=Cloud +contains-special-characters=Speciale tekens zijn niet toegestaan, gelieve dit te herzien. +content-not-defined=De inhoud was niet gedefinieerd. +could-not-initialize-filesystem=Fout: het bestandssysteem kon niet worden geïnitialiseerd +create=Aanmaken +credits=Met dank aan +delete-selected=Verwijder het geselecteerde +delete-unsuccessful=Verwijderen van bestand mislukt. Foutdetails: +deselect-all=Alles deselecteren +design=Ontwerp +documents=Documenten +documents-device=Documenten op dit apparaat +documents-dropbox=Documenten in uw Dropbox +done=Gereed +dropbox-full=Uw Dropbox is vol. Vernieuwen helpt niet. +edit-docs=Documenten bewerken +editing=Bewerken +elements=Elementen +enable-autosave.innerHTML=Automatisch opslaan inschakelen +enable-file-previews.innerHTML=Bestandsvoorvertoning inschakelen +enable-night-mode.innerHTML=Nachtmodus inschakelen +enter-name=Voer een naam in voor het nieuwe bestand +export=Export +file-creation-fail=Aanmaken van bestand mislukt. Foutdetails: +file-exists=Dit bestand bestaat al, kies alstublieft een andere naam +firetext-support=Firetext-ondersteuning +formatting=Opmaak +help=Help +horizontal-rule=Horizontale lijn +insert=Invoegen +insert-image=Afbeelding invoegen +insert-link=Link invoegen +insert-table=Tabel invoegen +internal-storage=Interne opslag +invalid-location=Het bestand kon niet worden aangemaakt. Kies een geldige locatie. +image=Afbeelding +image-location=Afbeeldingslocatie +import=Importeren +italic=Cursief +justified=Uitvullen +language.innerHTML=Interfacetaal +left=Links +link=Koppeling +list=Lijst +load-last-file.innerHTML=Laatste bestand laden bij het opstarten +load-unsuccessful=Laden mislukt. Foutdetails: +menu=Menu +needs-restart=Deze instelling wordt toegepast nadat Firetext opnieuw opgestart. Nu opnieuw opstarten? +network-error=Uw netwerk lijkt niet beschikbaar te zijn. Controleer uw verbinding en probeer het opnieuw. +no=Nee +no-dropbox-documents-found=Geen Dropbox-documenten gevonden +no-documents-found=Geen documenten gevonden +no-files-selected=Geen bestanden geselecteerd +no-recent-documents=Geen recente bestanden +no-storage-method=U hebt geen opslagmethode ingesteld: +not-functional-link=Deze link is niet functioneel. +not-signed-in=U bent niet ingelogd +number-of-columns.placeholder=Aantal kolommen +number-of-rows.placeholder=Aantal rijen +numbered-list=Genummerde lijst +okay=OK +open=Open +other=Andere +path-not-defined=Het pad was niet ingesteld +print=Afdruk +privacy=Privacy +rate-firetext=Firetext beoordelen +raw=Onbewerkt +recent-documents=Recent geopende documenten +recents-eliminated=Uw lijst met recent geopende documenten is gewist! +right=Rechts +save=Opslaan +save-as=Opslaan als +save-changes-question=Wilt u uw wijzigingen opslaan? +save-unsuccessful=Opslaan mislukt. Foutdetails: +select-all=Alles selecteren +select-language=Selecteer uw taal +send-error-stats.innerHTML=Foutstatistieken verzenden +settings=Instellingen +shared-sdcard=De SD-kaart van uw apparaat is niet beschikbaar omdat deze gedeeld is. Probeer USB-opslag uit te schakelen in de instellingen. +strikethrough=Doorhalen +successfully-saved=Succesvol opgeslagen +table=Tabel +the-web=Het internet +tools=Gereedschap +unable-to-get-sdcard=Het is niet gelukt om door de SD-kaart gebruikte ruimte op te halen: +underline=Onderstrepen +unknown-error=Onbekende fout +use-dropbox.innerHTML=Gebruik Dropbox +valid-integer-value=Voer een geldige waarde in (bijv. 2 of 5) +visual=Visueel +want-to-delete-singular=Wilt u dit bestand verwijderen? +want-to-delete-plural=Wilt u deze bestanden verwijderen? +warning-unsupported-technology=Waarschuwing: Uw browser ondersteunt sommige door Firetext vereiste techniek niet. Download Firefox van https://mozilla.org/firefox +yes=Ja diff --git a/locales/pl/app.properties b/locales/pl/app.properties index 09b87af..8ff6474 100644 --- a/locales/pl/app.properties +++ b/locales/pl/app.properties @@ -1,104 +1,109 @@ -about-firetext = Informacje o Firetext -alignment = Wyrównanie -allow-sdcard = Pozwól aplikacji Firetext na dostęp do Twojej karty SD. -always-off = Zawsze wyłączone -always-on = Zawsze włączone -auto = Automat. -bold = Pogrubienie -cancel = Anuluj -center = Środek -clear = Wyczyść -clear-recents.innerHTML = Wyczyść listę ostatnio używanych -click-compose-icon-to-create = Aby utworzyć nowy dokument, kliknij ikonę redagowania. -close-document = Zamknij dokument -cloud = Chmura -contains-special-characters = Znaki specjalne są niedozwolone. Popraw. -content-not-defined = Zawartość nie została zdefiniowana -could-not-initialize-filesystem = Błąd: nie można zainicjować systemu plików -create-document = Utwórz dokument -create = Utwórz -credits = Twórcy aplikacji Firetext -delete-selected = Usuń zaznaczone -delete-unsuccessful = Usuwanie pliku nie powiodło się.\n\nSzczegóły błędu: -deselect-all = Usuń zaznaczenie wszystkich -design = Projekt -document-actions = Akcje dot. dokumentu -documents-device = Dokumenty na tym urządzeniu -documents-dropbox = Dokumenty w Twojej skrzynce Dropbox -done = Gotowe -dropbox-full = Twoja skrzynka Dropbox jest pełna. Odświeżanie nie pomoże. -edit-docs = Edytuj dokumenty -edit-with-zen-mode.innerHTML = Edytuj za pomocą trybu zen -editing = Edytowanie -elements = Elementy -enable-autosave.innerHTML = Włącz zapis automatyczny -enable-file-previews.innerHTML = Włącz podgląd plików -enable-night-mode.innerHTML = Włącz tryb nocny -enter-name = Wprowadź nazwę dla nowego pliku. -file-creation-fail = Utworzenie pliku nie powiodło się.\n\nSzczegóły błędu: -file-exists = Ten plik już istnieje, wybierz inną nazwę. -firetext-support = Pomoc techniczna dla Firetext -formatting = Formatowanie -help = Pomoc -horizontal-rule = Linijka pozioma -insert = Wstaw -insert-image = Wstaw obraz -insert-link = Wstaw łącze -insert-table = Wstaw tabelę -internal-storage = Wewnętrzna pamięć masowa -image = Obraz -image-location = Położenie obrazu -invalid-location = Nie można utworzyć pliku. Wybierz poprawne położenie. -italic = Kursywa -justified = Wyjustowane -language.innerHTML = Język interfejsu -left = Z lewej -link = Łącze -list = Lista -load-last-file.innerHTML = Wczytaj ostatni plik przy uruchamianiu -load-unsuccessful = Wczytywanie nie powiodło się.\n\nSzczegóły błędu: -menu = Menu -network-error = Sieć jest prawdopodobnie niedostępna.\n\nSprawdź połączenie i spróbuj ponownie. -no = Brak -no-dropbox-documents-found = Nie znaleziono dokumentów w Dropbox -no-documents-found = Nie znaleziono żadnych dokumentów -no-files-selected = Nie wybrano żadnych plików -no-recent-documents = Brak ostatnio używanych dokumentów -no-storage-method = Nie skonfigurowano metody zapisu -not-signed-in = Użytkownik niezalogowany -number-of-columns.placeholder = Liczba kolumn -number-of-rows.placeholder = Liczba wierszy -numbered-list = Lista numerowana -okay = W porządku -open-document = Otwórz dokument -other = Inne -path-not-defined = Ścieżka nie została zdefiniowana -privacy = Prywatność -rate-firetext = Oceń Firetext -raw = Nieprzetworzone -recent-documents = Ostatnio otwarte dokumenty -recents-eliminated = Lista Twoich ostatnio używanych dokumentów została pomyślnie usunięta! -right = Z prawej -save-changes-question = Czy chcesz zapisać zmiany? -save-document = Zapisz dokument -save-unsuccessful = Zapis nie powiódł się.\n\nSzczegóły błędu: -select-all = Zaznacz wszystko -select-language = Wybierz język -send-error-stats.innerHTML = Statystyki błędu wysyłania -settings = Ustawienia -shared-sdcard = Karta SD w Twoim urządzeniu jest współużytkowana i dlatego jest niedostępna. Spróbuj wyłączyć w ustawieniach pamięć masową USB. -strikethrough = Przekreślenie -successfully-saved = Pomyślnie zapisano -table = Tabela -the-web = Sieć -tools = Narzędzia -unable-to-get-sdcard = Nie można odzyskać miejsca zajętego na karcie SD: -underline = Podkreślenie -unknown-error = Nieznany błąd -use-dropbox.innerHTML = Użyj usługi Dropbox -valid-integer-value = Wprowadź poprawną wartość (np. 2 lub 5) -visual = Wizualne -want-to-delete-singular = Czy chcesz usunąć ten plik? -want-to-delete-plural = Czy chcesz usunąć te pliki? -warning-unsupported-technology = Ostrzeżenie: Twoja przeglądarka nie obsługuje niektórych istotnych technologii aplikacji Firetext. Pobierz przeglądarkę Firefox ze strony https://mozilla.org/firefox. -yes = Tak +about-firetext=Informacje o Firetext +alignment=Wyrównanie +allow-sdcard=Pozwól aplikacji Firetext na dostęp do Twojej karty SD. +always-off=Zawsze wyłączone +always-on=Zawsze włączone +auto=Automat. +automatic-printing-failed=Nie można automatycznie wydrukować ten plik. Proszę wybrać opcję "Drukuj" z wnętrza swojej przeglądarce, jeśli jest on dostępny. +bold=Pogrubienie +cancel=Anuluj +center=Środek +clear=Wyczyść +clear-recents.innerHTML=Wyczyść listę ostatnio używanych +click-compose-icon-to-create=Aby utworzyć nowy dokument, kliknij ikonę redagowania. +close=Zamknij +cloud=Chmura +contains-special-characters=Znaki specjalne są niedozwolone. Popraw. +content-not-defined=Zawartość nie została zdefiniowana +could-not-initialize-filesystem=Błąd: nie można zainicjować systemu plików +create=Utwórz +credits=Twórcy aplikacji Firetext +delete-selected=Usuń zaznaczone +delete-unsuccessful=Usuwanie pliku nie powiodło się. Szczegóły błędu: +deselect-all=Usuń zaznaczenie wszystkich +design=Projekt +documents=Dokumenty +documents-device=Dokumenty na tym urządzeniu +documents-dropbox=Dokumenty w Twojej skrzynce Dropbox +done=Gotowe +dropbox-full=Twoja skrzynka Dropbox jest pełna. Odświeżanie nie pomoże. +edit-docs=Edytuj dokumenty +editing=Edytowanie +elements=Elementy +enable-autosave.innerHTML=Włącz zapis automatyczny +enable-file-previews.innerHTML=Włącz podgląd plików +enable-night-mode.innerHTML=Włącz tryb nocny +enter-name=Wprowadź nazwę dla nowego pliku. +export=Eksport +file-creation-fail=Utworzenie pliku nie powiodło się. Szczegóły błędu: +file-exists=Ten plik już istnieje, wybierz inną nazwę. +firetext-support=Pomoc techniczna dla Firetext +formatting=Formatowanie +help=Pomoc +horizontal-rule=Linijka pozioma +insert=Wstaw +insert-image=Wstaw obraz +insert-link=Wstaw łącze +insert-table=Wstaw tabelę +internal-storage=Wewnętrzna pamięć masowa +invalid-location=Nie można utworzyć pliku. Wybierz poprawne położenie. +image=Obraz +image-location=Położenie obrazu +import=Importuj +italic=Kursywa +justified=Wyjustowane +language.innerHTML=Język interfejsu +left=Z lewej +link=Łącze +list=Lista +load-last-file.innerHTML=Wczytaj ostatni plik przy uruchamianiu +load-unsuccessful=Wczytywanie nie powiodło się. Szczegóły błędu: +menu=Menu +needs-restart=To ustawienie zostanie zastosowane po ponownym uruchomieniu Firetext. Uruchom ponownie teraz? +network-error=Sieć jest prawdopodobnie niedostępna. Sprawdź połączenie i spróbuj ponownie. +no=Brak +no-dropbox-documents-found=Nie znaleziono dokumentów w Dropbox +no-documents-found=Nie znaleziono żadnych dokumentów +no-files-selected=Nie wybrano żadnych plików +no-recent-documents=Brak ostatnio używanych dokumentów +no-storage-method=Nie skonfigurowano metody zapisu: +not-functional-link=Ten link nie jest funkcjonalny... +not-signed-in=Użytkownik niezalogowany +number-of-columns.placeholder=Liczba kolumn +number-of-rows.placeholder=Liczba wierszy +numbered-list=Lista numerowana +okay=W porządku +open=Otwórz +other=Inne +path-not-defined=Ścieżka nie została zdefiniowana +print=Drukować +privacy=Prywatność +rate-firetext=Oceń Firetext +raw=Nieprzetworzone +recent-documents=Ostatnio otwarte dokumenty +recents-eliminated=Lista Twoich ostatnio używanych dokumentów została pomyślnie usunięta! +right=Z prawej +save=Zapisz +save-as=Zapisz jako +save-changes-question=Czy chcesz zapisać zmiany? +save-unsuccessful=Zapis nie powiódł się. Szczegóły błędu: +select-all=Zaznacz wszystko +select-language=Wybierz język +send-error-stats.innerHTML=Statystyki błędu wysyłania +settings=Ustawienia +shared-sdcard=Karta SD w Twoim urządzeniu jest współużytkowana i dlatego jest niedostępna. Spróbuj wyłączyć w ustawieniach pamięć masową USB. +strikethrough=Przekreślenie +successfully-saved=Pomyślnie zapisano +table=Tabela +the-web=Sieć +tools=Narzędzia +unable-to-get-sdcard=Nie można odzyskać miejsca zajętego na karcie SD: +underline=Podkreślenie +unknown-error=Nieznany błąd +use-dropbox.innerHTML=Użyj usługi Dropbox +valid-integer-value=Wprowadź poprawną wartość (np. 2 lub 5) +visual=Wizualne +want-to-delete-singular=Czy chcesz usunąć ten plik? +want-to-delete-plural=Czy chcesz usunąć te pliki? +warning-unsupported-technology=Ostrzeżenie: Twoja przeglądarka nie obsługuje niektórych istotnych technologii aplikacji Firetext. Pobierz przeglądarkę Firefox ze strony https://mozilla.org/firefox. +yes=Tak diff --git a/locales/pt-BR/app.properties b/locales/pt-BR/app.properties index 8dfdd96..ae811e0 100644 --- a/locales/pt-BR/app.properties +++ b/locales/pt-BR/app.properties @@ -1,104 +1,109 @@ -about-firetext = Sobre o Firetext -alignment = Alinhamento -allow-sdcard = Por favor, permita que o Firetext acesse seu cartão SD. -always-off = Sempre desligado -always-on = Sempre ligado -auto = Auto -bold = Negrito -cancel = Cancelar -center = Centralizar -clear = Limpar -clear-recents.innerHTML = Limpar lista de recentes -click-compose-icon-to-create = Clique no ícone Compor para criar um novo documento. -close-document = Fechar documento -cloud = Nuvem -contains-special-characters = Caracteres especiais não são possíveis. Por favor, corrija. -content-not-defined = O conteúdo não foi definido -could-not-initialize-filesystem = Erro: não foi possível inicializar o sistema de arquivos -create-document = Criar documento -create = Criar -credits = Créditos do Firetext -delete-selected = Apagar selecionado -delete-unsuccessful = Exclusão do arquivo malsucedida.\n\nDetalhes do erro: -deselect-all = Desmarcar tudo -design = Design -document-actions = Ações do documento -documents-device = Documentos neste Dispositivo -documents-dropbox = Documentos em seu Dropbox -done = Feito -dropbox-full = O seu Dropbox está cheio. Atualizar a página não irá ajudar. -edit-docs = Editar documentos -edit-with-zen-mode.innerHTML = Edite com o modo zen -editing = Edição -elements = Elementos -enable-autosave.innerHTML = Habilitar salvamento automático -enable-file-previews.innerHTML = Habilitar pré-visualização do arquivo -enable-night-mode.innerHTML = Habilitar modo noturno -enter-name = Por favor, digite um nome para o novo arquivo. -file-creation-fail = Criação de arquivo malsucedida.\n\nDetalhes do erro:\n -file-exists = Este arquivo já existe, por favor, escolha outro nome -firetext-support = Suporte ao Firetext -formatting = Formatação -help = Ajuda -horizontal-rule = Régua horizontal -insert = Inserir -insert-image = Inserir imagem -insert-link = Inserir link -insert-table = Inserir tabela -internal-storage = Memória Interna -image = Imagem -image-location = Localização da imagem -invalid-location = Não foi possível criar o arquivo. Por favor, escolha um local válido -italic = Itálico -justified = Justificado -language.innerHTML = Idioma da interface -left = Alinhar à esquerda -link = Link -list = Lista -load-last-file.innerHTML = Carregar último arquivo na inicialização -load-unsuccessful = Carregamento malsucedido.\n\nDetalhes do erro: -menu = Menu -network-error = Sua rede aparenta estar indisponível.\n\nPor favor, verifique sua conexão e tente novamente. -no = Não -no-dropbox-documents-found = Nenhum documento do Dropbox encontrado -no-documents-found = Nenhum documento encontrado -no-files-selected = Nenhum arquivo selecionado -no-recent-documents = Nenhum documento recente -no-storage-method = Você não configurou o método de armazenamento -not-signed-in = Você não está conectado -number-of-columns.placeholder = Número de colunas -number-of-rows.placeholder = Número de linhas -numbered-list = Lista numerada -okay = Certo -open-document = Abrir documento -other = Outro -path-not-defined = O destino não foi definido -privacy = Privacidade -rate-firetext = Avaliar o Firetext -raw = Raw -recent-documents = Documentos abertos recentemente -recents-eliminated = Sua lista de documentos recentes foi eliminada com sucesso! -right = Alinhar à direita -save-changes-question = Você gostaria de salvar suas modificações? -save-document = Salvar documento -save-unsuccessful = Salvamento malsucedido.\n\nDetalhes do erro: -select-all = Selecionar tudo -select-language = Selecione o seu idioma -send-error-stats.innerHTML = Estatísticas do envio de relatório de erro -settings = Configurações -shared-sdcard = O cartão SD em seu dispositivo está no modo Compartilhar Mídia e por isso não está disponível. Tente desativar o Modo de Compartilhamento em Massa USB em suas configurações. -strikethrough = Riscado -successfully-saved = Salvo com sucesso -table = Tabela -the-web = A web -tools = Ferramentas -unable-to-get-sdcard = Incapaz de acessar o espaço utilizado pelo cartão SD: -underline = Sublinhar -unknown-error = Erro desconhecido -use-dropbox.innerHTML = Usar Dropbox -valid-integer-value = Por favor, insira um valor válido (p.ex. 2 ou 5) -visual = Visual -want-to-delete-singular = Você quer apagar este arquivo? -want-to-delete-plural = Você quer deletar estes arquivos? -warning-unsupported-technology = Atenção: O seu navegador não tem suporte à imprescindível tecnologia Firetext. Por favor, faça o download do navegador Firefox em https://mozilla.org/firefox. -yes = Sim +about-firetext=Sobre o Firetext +alignment=Alinhamento +allow-sdcard=Por favor, permita que o Firetext acesse seu cartão SD. +always-off=Sempre desligado +always-on=Sempre ligado +auto=Auto +automatic-printing-failed=Não podemos imprimir esse arquivo automaticamente. Por favor, selecione "Imprimir" a partir de dentro do seu navegador se ele estiver disponível. +bold=Negrito +cancel=Cancelar +center=Centralizar +clear=Limpar +clear-recents.innerHTML=Limpar lista de recentes +click-compose-icon-to-create=Clique no ícone Compor para criar um novo documento. +close=Fechado +cloud=Nuvem +contains-special-characters=Caracteres especiais não são possíveis. Por favor, corrija. +content-not-defined=O conteúdo não foi definido +could-not-initialize-filesystem=Erro: não foi possível inicializar o sistema de arquivos +create=Criar +credits=Créditos do Firetext +delete-selected=Apagar selecionado +delete-unsuccessful=Exclusão do arquivo malsucedida. Detalhes do erro: +deselect-all=Desmarcar tudo +design=Design +documents=Documentos +documents-device=Documentos neste Dispositivo +documents-dropbox=Documentos em seu Dropbox +done=Feito +dropbox-full=O seu Dropbox está cheio. Atualizar a página não irá ajudar. +edit-docs=Editar documentos +editing=Edição +elements=Elementos +enable-autosave.innerHTML=Habilitar salvamento automático +enable-file-previews.innerHTML=Habilitar pré-visualização do arquivo +enable-night-mode.innerHTML=Habilitar modo noturno +enter-name=Por favor, digite um nome para o novo arquivo. +export=Baixar +file-creation-fail=Criação de arquivo malsucedida. Detalhes do erro: +file-exists=Este arquivo já existe, por favor, escolha outro nome +firetext-support=Suporte ao Firetext +formatting=Formatação +help=Ajuda +horizontal-rule=Régua horizontal +insert=Inserir +insert-image=Inserir imagem +insert-link=Inserir link +insert-table=Inserir tabela +internal-storage=Memória Interna +invalid-location=Não foi possível criar o arquivo. Por favor, escolha um local válido. +image=Imagem +image-location=Localização da imagem +import=Importar +italic=Itálico +justified=Justificado +language.innerHTML=Idioma da interface +left=Alinhar à esquerda +link=Link +list=Lista +load-last-file.innerHTML=Carregar último arquivo na inicialização +load-unsuccessful=Carregamento malsucedido. Detalhes do erro: +menu=Menu +needs-restart=Esta definição será aplicada após Firetext reiniciado. Reiniciar agora? +network-error=Sua rede aparenta estar indisponível. Por favor, verifique sua conexão e tente novamente. +no=Não +no-dropbox-documents-found=Nenhum documento do Dropbox encontrado +no-documents-found=Nenhum documento encontrado +no-files-selected=Nenhum arquivo selecionado +no-recent-documents=Nenhum documento recente +no-storage-method=Você não configurou o método de armazenamento: +not-functional-link=Este link não está funcionando ... +not-signed-in=Você não está conectado +number-of-columns.placeholder=Número de colunas +number-of-rows.placeholder=Número de linhas +numbered-list=Lista numerada +okay=Certo +open=Aberto +other=Outro +path-not-defined=O destino não foi definido +print=Imprimir +privacy=Privacidade +rate-firetext=Avaliar o Firetext +raw=Raw +recent-documents=Documentos abertos recentemente +recents-eliminated=Sua lista de documentos recentes foi eliminada com sucesso! +right=Alinhar à direita +save=Salvar +save-as=Salvar como +save-changes-question=Você gostaria de salvar suas modificações? +save-unsuccessful=Salvamento malsucedido. Detalhes do erro: +select-all=Selecionar tudo +select-language=Selecione o seu idioma +send-error-stats.innerHTML=Estatísticas do envio de relatório de erro +settings=Configurações +shared-sdcard=O cartão SD em seu dispositivo está no modo Compartilhar Mídia e por isso não está disponível. Tente desativar o Modo de Compartilhamento em Massa USB em suas configurações. +strikethrough=Riscado +successfully-saved=Salvo com sucesso +table=Tabela +the-web=A web +tools=Ferramentas +unable-to-get-sdcard=Incapaz de acessar o espaço utilizado pelo cartão SD: +underline=Sublinhar +unknown-error=Erro desconhecido +use-dropbox.innerHTML=Usar Dropbox +valid-integer-value=Por favor, insira um valor válido (p.ex. 2 ou 5) +visual=Visual +want-to-delete-singular=Você quer apagar este arquivo? +want-to-delete-plural=Você quer deletar estes arquivos? +warning-unsupported-technology=Atenção: O seu navegador não tem suporte à imprescindível tecnologia Firetext. Por favor, faça o download do navegador Firefox em https://mozilla.org/firefox. +yes=Sim diff --git a/locales/ro/app.properties b/locales/ro/app.properties index 0b46c98..3f508fa 100644 --- a/locales/ro/app.properties +++ b/locales/ro/app.properties @@ -1,104 +1,109 @@ -about-firetext = Despre Firetext -alignment = Aliniere -allow-sdcard = Te rugăm să permiți aplicației Firetext să-ți acceseze cardul SD. -always-off = Mereu dezactivat -always-on = Mereu activat -auto = Automat -bold = Aldin -cancel = Renunță -center = Centru -clear = Curăță -clear-recents.innerHTML = Curăță lista recentă -click-compose-icon-to-create = Clic pe iconița de compunere pentru a crea un document nou. -close-document = Închide documentul -cloud = Cloud -contains-special-characters = Caracterele speciale nu sunt permise. Te rugăm să corectezi. -content-not-defined = Conținutul nu a fost definit -could-not-initialize-filesystem = Eroare: nu se poate inițializa sistemul de fişiere -create-document = Creează document -create = Creează -credits = Meritele pt. Firetext -delete-selected = Șterge selecția -delete-unsuccessful = Nu s-a reușit ștergerea fișierului.\n\nDetalii despre eroare:\n -deselect-all = Deselectează tot -design = Proiectare -document-actions = Acțiuni pt. document -documents-device = Documente pe dispozitiv -documents-dropbox = Documente pe Dropbox-ul tău -done = Gata -dropbox-full = Dropbox-ul tău este plin. Reîmprospătarea nu va ajuta. -edit-docs = Editează documente -edit-with-zen-mode.innerHTML = Editează cu modul zen -editing = Editare -elements = Elemente -enable-autosave.innerHTML = Activează autosalvarea -enable-file-previews.innerHTML = Activează previzionări pt. fișiere -enable-night-mode.innerHTML = Activează modul nocturn -enter-name = Te rugăm să introduci un nume pentru fișierul nou. -file-creation-fail = Nu s-a reușit crearea fişierului.\n\nDetalii despre eroare:\n -file-exists = Acest fișier există deja, te rugăm să selectezi alt nume. -firetext-support = Asistență Firetext -formatting = Formatare -help = Ajutor -horizontal-rule = Riglă orizontală -insert = Inserează -insert-image = Inserează imagine -insert-link = Inserează link -insert-table = Inserează tabel -internal-storage = Stocare internă -image = Imagine -image-location = Locația imaginii -invalid-location = Nu se poate crea fișierul. Te rugăm să alegi o locație validă. -italic = Cursiv -justified = Aliniat -language.innerHTML = Limba pt. interfață -left = Stânga -link = Link -list = Listă -load-last-file.innerHTML = Încarcă ultimul fișier la pornire -load-unsuccessful = Nu s-a reuşit încărcarea.\n\nDetalii despre eroare:\n -menu = Meniu -network-error = Conexiunea pare să nu fie disponibilă.\n\nTe rugăm să verifici conexiunea și să încerci din nou. -no = Nu -no-dropbox-documents-found = Niciun document găsit pe Dropbox -no-documents-found = Niciun document găsit -no-files-selected = Niciun fișier selectat -no-recent-documents = Niciun document recent -no-storage-method = Nu ai configurat nicio metodă de stocare -not-signed-in = Nu ești autentificat -number-of-columns.placeholder = Număr de coloane -number-of-rows.placeholder = Număr de rânduri -numbered-list = Listă numerotată -okay = Ok -open-document = Deschide documentul -other = Altul -path-not-defined = Calea nu a fost definită -privacy = Confidențialitate -rate-firetext = Evaluează Firetext -raw = Raw -recent-documents = Documente deschise recent -recents-eliminated = Lista documentelor recente a fost eliminată cu succes! -right = Dreapta -save-changes-question = Dorești să salvezi modificările? -save-document = Salvează documentul -save-unsuccessful = Nu s-a reușit salvarea.\n\nDetalii despre eroare:\n -select-all = Selectează tot -select-language = Selectează limba -send-error-stats.innerHTML = Trimite statistici ale erorilor -settings = Setări -shared-sdcard = Cardul SD de pe dispozitiv este partajat și, prin urmare, indisponibil. Încearcă să dezactivezi stocarea în masă USB din Setări. -strikethrough = Tăiere text cu o linie -successfully-saved = Salvat cu succes -table = Tabel -the-web = Web -tools = Unelte -unable-to-get-sdcard = Nu se poate obține spațiul folosit de către cardul SD: -underline = Subliniere -unknown-error = Eroare necunoscută -use-dropbox.innerHTML = Folosește Dropbox -valid-integer-value = Te rugăm să introduci o valoare validă (ex: 2 sau 5) -visual = Vizual -want-to-delete-singular = Dorești să ștergi acest fișier? -want-to-delete-plural = Dorești să ștergi aceste fișiere? -warning-unsupported-technology = Avertisment: Navigatorul tău nu suportă unele tehnologii vitale Firetext. Te rugăm să descarci Firefox de pe https://mozilla.org/firefox. -yes = Da +about-firetext=Despre Firetext +alignment=Aliniere +allow-sdcard=Te rugăm să permiți aplicației Firetext să-ți acceseze cardul SD. +always-off=Mereu dezactivat +always-on=Mereu activat +auto=Automat +automatic-printing-failed=Nu putem tipări acest fișier automat. Te rugăm să selectezi 'Tipărește' din browser dacă este disponibil. +bold=Aldin +cancel=Renunță +center=Centru +clear=Curăță +clear-recents.innerHTML=Curăță lista recentă +click-compose-icon-to-create=Clic pe iconița de compunere pentru a crea un document nou. +close=Închide +cloud=Cloud +contains-special-characters=Caracterele speciale nu sunt permise. Te rugăm să corectezi. +content-not-defined=Conținutul nu a fost definit +could-not-initialize-filesystem=Eroare: nu se poate inițializa sistemul de fişiere +create=Creează +credits=Meritele pt. Firetext +delete-selected=Șterge selecția +delete-unsuccessful=Ștergerea fișierului fără succes. Detaliile erorii: +deselect-all=Deselectează tot +design=Proiectare +documents=Documente +documents-device=Documente pe dispozitiv +documents-dropbox=Documente pe Dropbox-ul tău +done=Gata +dropbox-full=Dropbox-ul tău este plin. Reîmprospătarea nu va ajuta. +edit-docs=Editează documente +editing=Editare +elements=Elemente +enable-autosave.innerHTML=Activează autosalvarea +enable-file-previews.innerHTML=Activează previzionări pt. fișiere +enable-night-mode.innerHTML=Activează modul nocturn +enter-name=Te rugăm să introduci un nume pentru fișierul nou. +export=Exportă +file-creation-fail=Crearea fișierului fără succes. Detaliile erorii: +file-exists=Acest fișier există deja, te rugăm să selectezi alt nume. +firetext-support=Asistență Firetext +formatting=Formatare +help=Ajutor +horizontal-rule=Riglă orizontală +insert=Inserează +insert-image=Inserează imagine +insert-link=Inserează link +insert-table=Inserează tabel +internal-storage=Stocare internă +invalid-location=Nu se poate crea fişierul. Te rugăm să alegi o locaţie validă. +image=Imagine +image-location=Locația imaginii +import=Importă +italic=Cursiv +justified=Aliniat +language.innerHTML=Limba pt. interfață +left=Stânga +link=Link +list=Listă +load-last-file.innerHTML=Încarcă ultimul fișier la pornire +load-unsuccessful=Încărcare fără succes. Detaliile erorii: +menu=Meniu +needs-restart=Această setare va fi aplicată după ce Firetext repornește. Repornești acum? +network-error=Conexiunea pare să nu fie disponibilă. Te rugăm să verifici conexiunea și să încerci din nou. +no=Nu +no-dropbox-documents-found=Niciun document găsit pe Dropbox +no-documents-found=Niciun document găsit +no-files-selected=Niciun fișier selectat +no-recent-documents=Niciun document recent +no-storage-method=Te rugăm să configurezi un sistem de stocare pentru a modifica fișierele: +not-functional-link=Linkul nu este funcțional... +not-signed-in=Nu ești autentificat +number-of-columns.placeholder=Număr de coloane +number-of-rows.placeholder=Număr de rânduri +numbered-list=Listă numerotată +okay=Ok +open=Deschide +other=Altul +path-not-defined=Calea nu a fost definită +print=Tipărește +privacy=Confidențialitate +rate-firetext=Evaluează Firetext +raw=Raw +recent-documents=Documente deschise recent +recents-eliminated=Lista documentelor recente a fost eliminată cu succes! +right=Dreapta +save=Salvează +save-as=Salvează ca +save-changes-question=Dorești să salvezi modificările? +save-unsuccessful=Salvare fără succes. Detaliile erorii: +select-all=Selectează tot +select-language=Selectează limba +send-error-stats.innerHTML=Trimite statistici ale erorilor +settings=Setări +shared-sdcard=Cardul SD de pe dispozitiv este partajat și, prin urmare, indisponibil. Încearcă să dezactivezi stocarea în masă USB din Setări. +strikethrough=Tăiere text cu o linie +successfully-saved=Salvat cu succes +table=Tabel +the-web=Web +tools=Unelte +unable-to-get-sdcard=Nu se poate obține spațiul folosit de către cardul SD: +underline=Subliniere +unknown-error=Eroare necunoscută +use-dropbox.innerHTML=Folosește Dropbox +valid-integer-value=Te rugăm să introduci o valoare validă (ex: 2 sau 5) +visual=Vizual +want-to-delete-singular=Dorești să ștergi acest fișier? +want-to-delete-plural=Dorești să ștergi aceste fișiere? +warning-unsupported-technology=Avertisment: Navigatorul tău nu suportă unele tehnologii vitale Firetext. Te rugăm să descarci Firefox de pe https://mozilla.org/firefox. +yes=Da diff --git a/locales/ru/app.properties b/locales/ru/app.properties index 1ae011c..5c7ded5 100644 --- a/locales/ru/app.properties +++ b/locales/ru/app.properties @@ -1,104 +1,109 @@ -about-firetext = О Firetext -alignment = Выравнивание -allow-sdcard = Пожалуйста, предоставьте Firetext доступ к SD карточке. -always-off = Всегда отключен -always-on = Всегда включен -auto = Автоматически -bold = Жирный -cancel = Отмена -center = Центр -clear = Очистить -clear-recents.innerHTML = Очистить список свежих -click-compose-icon-to-create = Для создания нового документа нажмите кнопку «Создать». -close-document = Закрыть документ -cloud = Облако -contains-special-characters = Нельзя пользоваться спецсимволами. Пожалуйста, поправьте. -content-not-defined = Содержимое не определено -could-not-initialize-filesystem = Ошибка: не могу инициировать файловую систему -create-document = Создать документ -create = Создать -credits = Firetext кредитов -delete-selected = Удалить выбранные -delete-unsuccessful = Удаление файла не удалось.\n\nОшибка:\n -deselect-all = Снять выделение со всех -design = Дизайн -document-actions = Действия о документе -documents-device = Документы на этом устройстве -documents-dropbox = Документы на Dropbox -done = Готово -dropbox-full = У Вас переполнилась Dropbox. Обновление не поможет. -edit-docs = Редактировать документы -edit-with-zen-mode.innerHTML = Редактировать в режиме zen -editing = Редактирование -elements = Элементы -enable-autosave.innerHTML = Включить автосохранение -enable-file-previews.innerHTML = Включить превьюшки файлов -enable-night-mode.innerHTML = Включить ночной режим -enter-name = Пожалуйста, введите наименование нового файла. -file-creation-fail = Создание файла не удалось.\n\nОшибка:\n -file-exists = Файл уже существует. Пожалуйста, введите другое имя. -firetext-support = Поддержва Firetext -formatting = Форматирование -help = Справка -horizontal-rule = Горизонтальная линия -insert = Вставить -insert-image = Вставить картинку -insert-link = Вставить ссылку -insert-table = Вставить таблицу -internal-storage = Встроенная память -image = Картинка -image-location = Путь к картинке -invalid-location = Не могу создать файл. Пожалуйста, выберите правильный путь. -italic = Курсив -justified = Выравнивание по обоим краям -language.innerHTML = Язык интерфейса -left = Выравнивание по левому краю -link = Ссылка -list = Список -load-last-file.innerHTML = Загружать последний файл на запуске -load-unsuccessful = Загрузка не удалась.\n\nОшибка:\n -menu = Меню -network-error = Сеть недоступна.\n\nПроверьте связь и попробуйте ещё раз. -no = Нет -no-dropbox-documents-found = Не найдено документов в Dropbox -no-documents-found = Документов не найдено -no-files-selected = Файлы не выбраны -no-recent-documents = Нет свежих документов -no-storage-method = Вы не указали способ хранения -not-signed-in = Вы не представились -number-of-columns.placeholder = Количество столбцов -number-of-rows.placeholder = Количество рядов -numbered-list = Нумерованный список -okay = ОК -open-document = Открыть документ -other = Другие -path-not-defined = Путь не указан -privacy = Приватность -rate-firetext = Оцените Firetext -raw = Сырой -recent-documents = Свежие документы -recents-eliminated = Ваш список свежих документов очищен! -right = Выравнивание по правому краю -save-changes-question = Сохранить изменения? -save-document = Сохранить документ -save-unsuccessful = Сохранить не удалось.\n\nОшибка:\n -select-all = Выделить все -select-language = Выберите язык -send-error-stats.innerHTML = Отправить статистику ошибок -settings = Параметры -shared-sdcard = SD-карточка занята, не могу пользоваться! Попробуйте отключить USB-накопитель в приложении Параметры. -strikethrough = Вычёркивание -successfully-saved = Успешно сохранил -table = Таблица -the-web = Интернет -tools = Инструменты -unable-to-get-sdcard = Не могу оценить занятое место на SD-карточке -underline = Подчёркивание -unknown-error = Неизвестная ошибка -use-dropbox.innerHTML = Пользоваться Dropbox -valid-integer-value = Введите осмысленное значение (например, 2 или 5) -visual = Графический -want-to-delete-singular = Удалить файл? -want-to-delete-plural = Удалить эти файлы? -warning-unsupported-technology = Внимание: Ваш браузер не поддерживает существенные требуемые Firetext свойства. Пожалуйста, скачайте Firefox на https://mozilla.org/firefox. -yes = Да +about-firetext=О Firetext +alignment=Выравнивание +allow-sdcard=Пожалуйста, предоставьте Firetext доступ к SD карточке. +always-off=Всегда отключен +always-on=Всегда включен +auto=Автоматически +automatic-printing-failed=Мы не можем напечатать этот файл автоматически. Пожалуйста, выберите "Печать" изнутри вашем браузере, если это возможно. +bold=Жирный +cancel=Отмена +center=Центр +clear=Очистить +clear-recents.innerHTML=Очистить список свежих +click-compose-icon-to-create=Для создания нового документа нажмите кнопку «Создать». +close=закрыть +cloud=Облако +contains-special-characters=Нельзя пользоваться спецсимволами. Пожалуйста, поправьте. +content-not-defined=Содержимое не определено +could-not-initialize-filesystem=Ошибка: не могу инициировать файловую систему +create=Создать +credits=Firetext кредитов +delete-selected=Удалить выбранные +delete-unsuccessful=Удаление файла не удалось. Ошибка: +deselect-all=Снять выделение со всех +design=Дизайн +documents=документы +documents-device=Документы на этом устройстве +documents-dropbox=Документы на Dropbox +done=Готово +dropbox-full=У Вас переполнилась Dropbox. Обновление не поможет. +edit-docs=Редактировать документы +editing=Редактирование +elements=Элементы +enable-autosave.innerHTML=Включить автосохранение +enable-file-previews.innerHTML=Включить превьюшки файлов +enable-night-mode.innerHTML=Включить ночной режим +enter-name=Пожалуйста, введите наименование нового файла. +export=скачать +file-creation-fail=Создание файла не удалось. Ошибка: +file-exists=Файл уже существует. Пожалуйста, введите другое имя. +firetext-support=Поддержва Firetext +formatting=Форматирование +help=Справка +horizontal-rule=Горизонтальная линия +insert=Вставить +insert-image=Вставить картинку +insert-link=Вставить ссылку +insert-table=Вставить таблицу +internal-storage=Встроенная память +invalid-location=Не могу создать файл. Пожалуйста, выберите правильный путь. +image=Картинка +image-location=Путь к картинке +import=ввозить +italic=Курсив +justified=Выравнивание по обоим краям +language.innerHTML=Язык интерфейса +left=Выравнивание по левому краю +link=Ссылка +list=Список +load-last-file.innerHTML=Загружать последний файл на запуске +load-unsuccessful=Загрузка не удалась. Ошибка: +menu=Меню +needs-restart=Эта установка будет применяться после Firetext перезагрузки. Перезагрузить сейчас? +network-error=Сеть недоступна. Проверьте связь и попробуйте ещё раз. +no=Нет +no-dropbox-documents-found=Не найдено документов в Dropbox +no-documents-found=Документов не найдено +no-files-selected=Файлы не выбраны +no-recent-documents=Нет свежих документов +no-storage-method=Вы не указали способ хранения: +not-functional-link=Эта ссылка не работает. +not-signed-in=Вы не представились +number-of-columns.placeholder=Количество столбцов +number-of-rows.placeholder=Количество рядов +numbered-list=Нумерованный список +okay=ОК +open=Открыть +other=Другие +path-not-defined=Путь не указан +print=печать +privacy=Приватность +rate-firetext=Оцените Firetext +raw=Сырой +recent-documents=Свежие документы +recents-eliminated=Ваш список свежих документов очищен! +right=Выравнивание по правому краю +save=Сохранить +save-as=Сохранить как +save-changes-question=Сохранить изменения? +save-unsuccessful=Сохранить не удалось. Ошибка: +select-all=Выделить все +select-language=Выберите язык +send-error-stats.innerHTML=Отправить статистику ошибок +settings=Параметры +shared-sdcard=SD-карточка занята, не могу пользоваться! Попробуйте отключить USB-накопитель в приложении Параметры. +strikethrough=Вычёркивание +successfully-saved=Успешно сохранил +table=Таблица +the-web=Интернет +tools=Инструменты +unable-to-get-sdcard=Не могу оценить занятое место на SD-карточке +underline=Подчёркивание +unknown-error=Неизвестная ошибка +use-dropbox.innerHTML=Пользоваться Dropbox +valid-integer-value=Введите осмысленное значение (например, 2 или 5) +visual=Графический +want-to-delete-singular=Удалить файл? +want-to-delete-plural=Удалить эти файлы? +warning-unsupported-technology=Внимание: Ваш браузер не поддерживает существенные требуемые Firetext свойства. Пожалуйста, скачайте Firefox на https://mozilla.org/firefox. +yes=Да diff --git a/locales/zh-CN/app.properties b/locales/zh-CN/app.properties index 295fd5c..a22e327 100644 --- a/locales/zh-CN/app.properties +++ b/locales/zh-CN/app.properties @@ -1,104 +1,109 @@ -about-firetext = 关于 Firetext -alignment = 对齐 -allow-sdcard = 请允许 Firetext 访问您的 SD 卡。 -always-off = 总是关 -always-on = 总是开 -auto = 自动 -bold = 粗体 -cancel = 取消 -center = 居中 -clear = 清除 -clear-recents.innerHTML = 清除最近项目列表 -click-compose-icon-to-create = 点击撰写图标创建一个新文档。 -close-document = 关闭文档 -cloud = 云 -contains-special-characters = 不允许特殊字符。请修改。 -content-not-defined = 内容没有定义 -could-not-initialize-filesystem = 错误:无法初始化文件系统 -create-document = 创建文档 -create = 创建 -credits = Firetext 贡献者 -delete-selected = 删除选中 -delete-unsuccessful = 文件删除失败。\n\n错误详情:\n -deselect-all = 取消所有 -design = 设计 -document-actions = 文档操作 -documents-device = 此设备上的文档 -documents-dropbox = 您的 Dropbox 上的文档 -done = 完成 -dropbox-full = 您的 Dropbox 已满,刷新并无效果。 -edit-docs = 编辑文档 -edit-with-zen-mode.innerHTML = 在禅境模式下编辑 -editing = 编辑中 -elements = 元素 -enable-autosave.innerHTML = 启用自动保存 -enable-file-previews.innerHTML = 启用文件预览 -enable-night-mode.innerHTML = 启用夜间模式 -enter-name = 为新文件起个名吧。 -file-creation-fail = 文件创建未成功。\n\n错误详情:\n -file-exists = 此文件已存在,请选择其他名称。 -firetext-support = Firetext 支持 -formatting = 格式 -help = 帮助 -horizontal-rule = 水平线 -insert = 插入 -insert-image = 插入图像 -insert-link = 插入链接 -insert-table = 插入表格 -internal-storage = 内部存储 -image = 图像 -image-location = 图像位置 -invalid-location = 无法创建文件。请选择有效的位置。 -italic = 斜体 -justified = 两端对齐 -language.innerHTML = 界面语言 -left = 居左 -link = 链接 -list = 列表 -load-last-file.innerHTML = 启动时载入上一次的文件 -load-unsuccessful = 载入失败。\n\n错误详情:\n -menu = 菜单 -network-error = 您的网络看起来不可用。\n\n请检查您的连接并重试。 -no = 否 -no-dropbox-documents-found = 没有找到 Dropbox 文档 -no-documents-found = 没有找到文档 -no-files-selected = 没有选中文件 -no-recent-documents = 没有最近的文档 -no-storage-method = 您还没有设置一个存储方案 -not-signed-in = 您未登录 -number-of-columns.placeholder = 列数 -number-of-rows.placeholder = 行数 -numbered-list = 编号列表 -okay = 良好 -open-document = 打开文档 -other = 其他 -path-not-defined = 路径没有定义 -privacy = 私有 -rate-firetext = 评价 Firetext -raw = 原始 -recent-documents = 最近打开的文档 -recents-eliminated = 您的最近文档列表已成功清除! -right = 居右 -save-changes-question = 您要保存更改吗? -save-document = 保存文档 -save-unsuccessful = 保存失败。\n\n错误详情:\n -select-all = 选择所有 -select-language = 选择您的语言 -send-error-stats.innerHTML = 发送错误统计 -settings = 设置 -shared-sdcard = 您的设备上的 SD 卡处于共享状态并因此不可用。请尝试在您的设置中禁用 USB 大容量存储。 -strikethrough = 删除线 -successfully-saved = 保存成功 -table = 表格 -the-web = 网络 -tools = 工具 -unable-to-get-sdcard = 无法获得 SD 卡的已用空间: -underline = 下划线 -unknown-error = 未知错误 -use-dropbox.innerHTML = 使用 Dropbox -valid-integer-value = 请输入有效的数值(例如 2 或 5) -visual = 可视 -want-to-delete-singular = 您要删除此文件吗? -want-to-delete-plural = 您要删除这些文件吗? -warning-unsupported-technology = 警告:您的浏览器不支持 Firetext 的部分重要技术。请从 https://mozilla.org/firefox 下载 Firefox。 -yes = 是 +about-firetext=关于 Firetext +alignment=对齐 +allow-sdcard=请允许 Firetext 访问您的 SD 卡。 +always-off=总是关 +always-on=总是开 +auto=自动 +automatic-printing-failed=我们无法自动打印此文件。请在您的浏览器内选择“打印”(如果可用)。 +bold=粗体 +cancel=取消 +center=居中 +clear=清除 +clear-recents.innerHTML=清除最近项目列表 +click-compose-icon-to-create=点击撰写图标创建一个新文档。 +close=关闭 +cloud=云 +contains-special-characters=不允许特殊字符。请修改。 +content-not-defined=内容没有定义 +could-not-initialize-filesystem=错误:无法初始化文件系统 +create=创建 +credits=Firetext 贡献者 +delete-selected=删除选中 +delete-unsuccessful=文件删除失败。错误详情: +deselect-all=取消所有 +design=设计 +documents=文档 +documents-device=此设备上的文档 +documents-dropbox=您的 Dropbox 上的文档 +done=完成 +dropbox-full=您的 Dropbox 已满。刷新并不会产生效果。 +edit-docs=编辑文档 +editing=编辑中 +elements=元素 +enable-autosave.innerHTML=启用自动保存 +enable-file-previews.innerHTML=启用文件预览 +enable-night-mode.innerHTML=启用夜间模式 +enter-name=为新文件起个名吧。 +export=导出 +file-creation-fail=文件创建未成功。错误详情: +file-exists=此文件已存在,请选择其他名称。 +firetext-support=Firetext 支持 +formatting=格式 +help=帮助 +horizontal-rule=水平线 +insert=插入 +insert-image=插入图像 +insert-link=插入链接 +insert-table=插入表格 +internal-storage=内部存储 +invalid-location=无法创建文件。请选择有效的位置。 +image=图像 +image-location=图像位置 +import=导入 +italic=斜体 +justified=两端对齐 +language.innerHTML=界面语言 +left=居左 +link=链接 +list=列表 +load-last-file.innerHTML=启动时载入上一次的文件 +load-unsuccessful=载入失败。错误详情: +menu=菜单 +needs-restart=此设置在 Firetext 重启后被应用。立即重启? +network-error=您的网络看起来不可用。请检查您的连接并重试。 +no=否 +no-dropbox-documents-found=没有找到 Dropbox 文档 +no-documents-found=没有找到文档 +no-files-selected=没有选中文件 +no-recent-documents=没有最近的文档 +no-storage-method=请设置一个存储修改文件的系统: +not-functional-link=此链接无功能... +not-signed-in=您未登录 +number-of-columns.placeholder=列数 +number-of-rows.placeholder=行数 +numbered-list=编号列表 +okay=良好 +open=打开 +other=其他 +path-not-defined=路径没有定义 +print=打印 +privacy=私有 +rate-firetext=评价 Firetext +raw=原始 +recent-documents=最近打开的文档 +recents-eliminated=您的最近文档列表已成功清除! +right=居右 +save=保存 +save-as=另存为 +save-changes-question=您要保存更改吗? +save-unsuccessful=保存失败。错误详情: +select-all=选择所有 +select-language=选择您的语言 +send-error-stats.innerHTML=发送错误统计 +settings=设置 +shared-sdcard=您的设备上的 SD 卡处于共享状态并因此不可用。请尝试在您的设置中禁用 USB 大容量存储。 +strikethrough=删除线 +successfully-saved=保存成功 +table=表格 +the-web=网络 +tools=工具 +unable-to-get-sdcard=无法获得 SD 卡的已用空间: +underline=下划线 +unknown-error=未知错误 +use-dropbox.innerHTML=使用 Dropbox +valid-integer-value=请输入有效的数值(例如 2 或 5) +visual=可视 +want-to-delete-singular=您要删除此文件吗? +want-to-delete-plural=您要删除这些文件吗? +warning-unsupported-technology=警告:您的浏览器不支持 Firetext 的部分重要技术。请从 https://mozilla.org/firefox 下载 Firefox。 +yes=是 diff --git a/manifest.webapp b/manifest.webapp index 3ac2646..b775e97 100644 --- a/manifest.webapp +++ b/manifest.webapp @@ -1,7 +1,7 @@ { "name": "Firetext", "description": "The word processor for Firefox OS", - "version": "0.3.3", + "version": "0.4", "type": "privileged", "launch_path": "/index.html", "developer": { @@ -16,7 +16,10 @@ "256": "/style/icons/app/256.png" }, "default_locale": "en-US", - "locales": { + "locales": { + "bg": { + "description": "Програмата за текстова обработка на Файърфокс ОС" + }, "bn-BD": { "description": "ফায়ারফক্স ওএস এর জন্য ওয়ার্ড প্রসেসর" }, @@ -38,6 +41,9 @@ "he": { "description": "מעבד התמלילים ל-Firefox OS" }, + "hu": { + "description": "A Firefox OS szövegszerkesztője" + }, "id": { "description": "Pengolah kata untuk Firefox OS" }, diff --git a/modules/editor/editor.html b/modules/editor/editor.html new file mode 100644 index 0000000..a2828f8 --- /dev/null +++ b/modules/editor/editor.html @@ -0,0 +1,47 @@ + + + + + + + + Firetext Editor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/editor/scripts/contentscript.js b/modules/editor/scripts/contentscript.js new file mode 100644 index 0000000..292f5be --- /dev/null +++ b/modules/editor/scripts/contentscript.js @@ -0,0 +1,90 @@ +(function(mainOrigin, _parentMessageProxy, initNight, filetype, odtdoc, readOnly) { + function fixupDocument() { + if(document.body.children.length === 0) { + document.body.appendChild(document.createElement('br')); + } + if(filetype === '.odt') { + try { + odtdoc.setHTML(getHTML()); + } catch(e) { + document.execCommand('undo'); + evt.stopImmediatePropagation(); + } + } + } + + var parentMessageProxy = new MessageProxy(); + parentMessageProxy.setSend(parent); + parentMessageProxy.setRecv(window); + parentMessageProxy.setMessageHandlers(_parentMessageProxy.getMessageHandlers()); + + // Initialize Designer + if(!readOnly) { + document.documentElement.contentEditable = "true"; + document.execCommand('enableObjectResizing', false, 'true'); + } + + // Hide and show toolbar. + // For reviewers, just in case this looks like a security problem: + // This frame is sandboxed, so I had to add the listeners to do this. + // The content CANNOT call any of the parents functions, so this is not a security issue. + window.addEventListener('focus', function (event) { + parentMessageProxy.postMessage({ + command: "focus", + focus: true + }); + }); + window.addEventListener('blur', function (event) { + parentMessageProxy.postMessage({ + command: "focus", + focus: false + }); + }); + + // Keyboard shortcuts + document.addEventListener('keypress', function (event) { + if((event.ctrlKey || event.metaKey) && !event.shiftKey) { + if(event.which === 98) { // b + document.execCommand('bold'); + } else if(event.which === 105) { // i + document.execCommand('italic'); + } else if(event.which === 117) { // u + document.execCommand('underline'); + } else { + return; + } + event.preventDefault(); + } + }); + + // Fix up document + document.addEventListener('input', fixupDocument); + fixupDocument(); + + // night mode + initNight(document, parentMessageProxy); + + // format document + parentMessageProxy.registerMessageHandler(function(e) { document.execCommand(e.data.sCmd, false, e.data.sValue); }, "format") + + function getHTML() { + /*** This function is duplicated in docIO.js ***/ + var doctype = document.doctype; + var doctypeString = doctype ? '' : ''; + return doctypeString + document.documentElement.outerHTML.replace(/<(style|link)[^>]*_firetext_remove=""[^>]*>[^<>]*(?:<\/\1>)?/g, '').replace(' _firetext_night=""', ''); + } + + // Add listener to update raw + document.addEventListener('input', function() { + parentMessageProxy.postMessage({ + command: "doc-changed", + html: getHTML(), + filetype: filetype + }); + }); +})(mainOrigin, parentMessageProxy, initNight, filetype, odtdoc, readOnly); diff --git a/modules/editor/scripts/docIO.js b/modules/editor/scripts/docIO.js new file mode 100644 index 0000000..35f8458 --- /dev/null +++ b/modules/editor/scripts/docIO.js @@ -0,0 +1,147 @@ +/* +* Document I/O +* Copyright (C) Codexa Organization 2013. +*/ + +'use strict' + +function initDocIO(document, messageProxy, loadCallback) { + /* 0.4 + var docxeditor; + */ + var odtdoc; + var filetype; + + // Unsupported odt features flag + var readOnly; + + function getHTML() { + /*** This function is duplicated in contentscript.js ***/ + var doctype = document.doctype; + var doctypeString = doctype ? '' : ''; + return doctypeString + document.documentElement.outerHTML.replace(/<(style|link)[^>]*_firetext_remove=""[^>]*>[^<>]*(?:<\/\1>)?/g, '').replace(' _firetext_night=""', ''); + } + function getText() { + return document.documentElement.textContent; + } + + function load(content, ft) { + // Check for night + var wasNight = false + if (document.documentElement.hasAttribute('_firetext_night')) { + wasNight = true; + } + + filetype = ft; + readOnly = false; + document.open(); + switch (filetype) { + case ".txt": + content = firetext.parsers.plain.parse(content, "HTML"); + document.write(content); + break; + case ".odt": + odtdoc = new ODTDocument(content); + var html = odtdoc.getHTMLUnsafe(); + try { + html = odtdoc.getHTML(); + } catch(e) { + readOnly = true; + } + document.write(html); + break; + /* 0.4 + case ".docx": + docxeditor = new firetext.parsers.DocxEditor(content); + content = result.HTMLout(); + doc.appendChild(content); + break; + */ + case ".html": + default: + if(!/' + content; + document.write(content); + break; + } + document.close(); + + if (wasNight) { + nightEditor(true); + } + + loadCallback(filetype, odtdoc, readOnly); + } + + messageProxy.registerMessageHandler(function(e) { + var content; + var type; + var binary = false; + switch (filetype) { + case ".html": + content = getHTML(); + if(!/]+charset/.test(content)) content = content.replace('', ''); + type = "text\/html"; + break; + case ".txt": + content = firetext.parsers.plain.encode(getHTML(), "HTML"); + type = "text\/plain"; + break; + case ".odt": + if(!readOnly) odtdoc.setHTML(getHTML()); + content = odtdoc.getODT({type: 'string'}); + type = "application\/vnd.oasis.opendocument.text"; + binary = true; + break; + /* 0.4 + case ".docx": + content = docxeditor.generate("uint8array"); + application/vnd.openxmlformats-officedocument.wordprocessingml.document + break; + */ + default: + content = getText(); + break; + } + + messageProxy.postMessage({ + command: e.data.key, + content: binary ? btoa(content) : new StringView(content).toBase64(), + type: type + }); + }, "get-content-blob"); + + messageProxy.registerMessageHandler(function(e) { + messageProxy.postMessage({ + command: e.data.key, + content: getHTML() + }); + }, "get-content-html"); + + messageProxy.registerMessageHandler(function(e) { + load(e.data.content, e.data.filetype); + if(e.data.key) { + messageProxy.postMessage({ + command: e.data.key + }); + } + }, "load"); + + messageProxy.registerMessageHandler(function(e) { + var commands = e.data.commands + var commandStates = {}; + for(var i = 0; i < commands.length; i++) { + commandStates[commands[i]] = {}; + commandStates[commands[i]].state = document.queryCommandState(commands[i]); + commandStates[commands[i]].value = document.queryCommandValue(commands[i]); + } + messageProxy.postMessage({ + command: e.data.key, + commandStates: commandStates + }) + }, "query-command-states"); +} diff --git a/modules/editor/scripts/editor.js b/modules/editor/scripts/editor.js new file mode 100644 index 0000000..77a8cb4 --- /dev/null +++ b/modules/editor/scripts/editor.js @@ -0,0 +1,65 @@ +/* +* Editor Communication Proxy +* Copyright (C) Codexa Organization 2013. +*/ + +'use strict' + +// Closure to isolate code from tampering by scripts in document +var mainClosure = function() { + // document to be edited + var doc; + + // WARNING: DO NOT REPLACE, THIS STRING IS REPLACED WITH THE ORIGIN AUTOMATICALLY WHEN LOADED FROM editorProxy.js + var mainOrigin = "[ORIGIN_OF_MAIN_DOCUMENT]"; + + // Overide popups + window.alert = null; + window.confirm = null; + window.prompt = null; + + // Proxy for communication with parent page + var parentMessageProxy = new MessageProxy(); + parentMessageProxy.setSend(parent); + parentMessageProxy.setRecv(window); + + parentMessageProxy.registerMessageHandler(function(e){ + if(e.origin !== mainOrigin) { + throw new Error("origin did not match"); + } + + // initialize modules/register handlers + // night mode + initNight(doc, parentMessageProxy); + + var content_styles = document.querySelectorAll('link[data-for-content]'); + + var content_scripts = document.querySelectorAll('script[data-for-content]'); + + initDocIO(document, parentMessageProxy, function loadCallback(filetype, odtdoc, readOnly) { + window.mainOrigin = mainOrigin; + window.parentMessageProxy = parentMessageProxy; + window.initNight = initNight; + window.filetype = filetype; + window.odtdoc = odtdoc; + window.readOnly = readOnly; + + // Content styles + [].forEach.call(content_styles, function(content_style) { + content_style.setAttribute('_firetext_remove', ''); + content_style.setAttribute('type', 'text/css'); + document.head.appendChild(document.adoptNode(content_style)); + }); + + // Content scripts + [].forEach.call(content_scripts, function(content_script) { + window.eval(atob(content_script.src.split(',')[1])); + }); + }); + + // success + parentMessageProxy.postMessage({command: "init-success"}); + }, "init"); +} +mainClosure(); +mainClosure = undefined; diff --git a/modules/editor/scripts/editor_night.js b/modules/editor/scripts/editor_night.js new file mode 100644 index 0000000..3cc58f3 --- /dev/null +++ b/modules/editor/scripts/editor_night.js @@ -0,0 +1,12 @@ +function initNight(document, messageProxy){ + messageProxy.registerMessageHandler(function(e) { nightEditor(e.data.nightMode); }, "night"); +} + +function nightEditor(nightMode) { + var html = document.getElementsByTagName('html')[0]; + if(nightMode) { + document.documentElement.setAttribute('_firetext_night', ''); + } else { + document.documentElement.removeAttribute('_firetext_night'); + } +} \ No newline at end of file diff --git a/modules/editor/style/editor.css b/modules/editor/style/editor.css new file mode 100644 index 0000000..eccf8b7 --- /dev/null +++ b/modules/editor/style/editor.css @@ -0,0 +1,100 @@ +html { + padding: 0; + margin: 0 auto; + max-width: 690px; + position: relative; +} + +[_firetext_night] { + background-color: #000000; +} + +body { + padding: 10px 10px 65px; + margin: 0; + font-size: 20px; + outline: none; + word-wrap: break-word; +} + +[_firetext_night] body, [_firetext_night] img { + filter: url('data:image/svg+xml;utf8,#invertBrightness'); + -webkit-filter: invert(100%) hue-rotate(180deg); + filter: invert(100%) hue-rotate(180deg); +} + +html:before, +html:after, +body:before, +body:after { + display: block; + position: absolute; + content: " "; + box-sizing: border-box; + width: 8px; + height: 8px; + margin: -8px 2px; + border: 1px solid #999; + pointer-events: none; +} + +[_firetext_night]:before, +[_firetext_night]:after, +[_firetext_night] body:before, +[_firetext_night] body:after { + border-color: rgb(127, 127, 127); +} + +html:before { + top: 10px; + border-top-width: 0; + border-left-width: 0; +} + +html:after { + margin-top: -65px; + border-bottom-width: 0; + border-left-width: 0; +} + +body:before { + right: 0; + border-top-width: 0; + border-right-width: 0; +} + +body:after { + right: 0; + margin-top: 0; + border-bottom-width: 0; + border-right-width: 0; +} + +@media (min-width: 767px) { + html { + padding-top: 65px; + padding-bottom: 65px; + background-color: #efefef; + } + + body { + border: 1px solid #ddd; + box-shadow: 0 0 5px #ddd; + padding-bottom: 10px; + background-color: #ffffff; + } + + html:before, + body:before { + top: 75px; + z-index: 1; + } + + html:after { + margin-top: -10px; + } + + body { + margin: -1px; + } +} diff --git a/modules/printButton/printButton.html b/modules/printButton/printButton.html new file mode 100644 index 0000000..a69fed0 --- /dev/null +++ b/modules/printButton/printButton.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/printButton/scripts/printButton.js b/modules/printButton/scripts/printButton.js new file mode 100644 index 0000000..35a0746 --- /dev/null +++ b/modules/printButton/scripts/printButton.js @@ -0,0 +1,96 @@ +window.addEventListener('DOMContentLoaded', function() { + // Proxy for communication with parent page + var parentMessageProxy = new MessageProxy(); + parentMessageProxy.setSend(parent); + parentMessageProxy.setRecv(window); + + window.addEventListener('click', function() { + var win = window.open(URL.createObjectURL(new Blob([ + "", + ], {type: 'text/html'}))); + var key = parentMessageProxy.registerMessageHandler(function(e){ + win.postMessage({ + content: + e.data.content + .replace('', [ + '', + ' ', // Default to utf-8 + ' ' + e.data.filename.replace(/</g, '<') + e.data.filetype + '', + ' ', + '', + ].join('\n')) + .replace('', [ + "", + "", + "", + ].join('\n')) + }, '*'); + }, null, true); + parentMessageProxy.postMessage({ + command: "print-button-pressed", + key: key + }); + }); +}); \ No newline at end of file diff --git a/modules/printButton/style/printButton.css b/modules/printButton/style/printButton.css new file mode 100644 index 0000000..ae93f8e --- /dev/null +++ b/modules/printButton/style/printButton.css @@ -0,0 +1,4 @@ +html { + height: 100%; + cursor: pointer; +} \ No newline at end of file diff --git a/scripts/cloud/cloud.js b/scripts/cloud/cloud.js index 4ad5442..53b3214 100644 --- a/scripts/cloud/cloud.js +++ b/scripts/cloud/cloud.js @@ -17,7 +17,7 @@ var cloud = {}; cloud.init = function () { // Dropbox cloud.dropbox.init(); - if (firetext.settings.get('dropbox.enabled') == 'true') { + if (firetext.settings.get('dropbox.enabled') == 'true' && cloud.dropbox.auth) { // Error Handler cloud.dropbox.auth.onError.addListener(function (error) { if (window.console) { @@ -89,44 +89,15 @@ cloud.init = function () { } } - /* 0.4 - // Google Drive - if (firetext.settings.get('gdrive.enabled') == 'true') { - // Code to get Google Drive files - updateDocLists(); - - // Show UI Elements - welcomeGoogleArea.style.display = 'block'; - openDialogGoogleArea.style.display = 'block'; - locationGoogle = document.createElement('option'); - locationGoogle.textContent = 'Google Drive'; - locationSelect.appendChild(locationGoogle); - } else { - // Hide/Remove UI elements - welcomeGoogleArea.style.display = 'none'; - openDialogGoogleArea.style.display = 'none'; - if (locationGoogle) { - locationSelect.removeChild(locationGoogle); - locationGoogle = undefined; - } - - // Remove Google recents - var driveRecents = firetext.recents.get(); - for (var i = 0; i < driveRecents.length; i++) { - if (driveRecents[i][4] == 'gdrive') { - firetext.recents.remove([driveRecents[i][0], driveRecents[i][1], driveRecents[i][2]], driveRecents[i][3], driveRecents[i][4]); - } - } - } - */ - updateAddDialog(); }; cloud.updateDocLists = function (lists) { if (firetext.settings.get('dropbox.enabled') == 'true' && cloud.dropbox.client) { + spinner(); cloud.dropbox.enumerate('/Documents/', function(DOCS) { buildDocList(DOCS, [welcomeDropboxList, openDialogDropboxList], "dropbox-documents-found", 'dropbox'); + spinner('hide'); }); } } diff --git a/scripts/cloud/dropbox.js b/scripts/cloud/dropbox.js index 0f95cff..0c4ac91 100644 --- a/scripts/cloud/dropbox.js +++ b/scripts/cloud/dropbox.js @@ -19,16 +19,18 @@ cloud.dropbox.client = undefined; /* Auth ------------------------*/ cloud.dropbox.init = function(){ - cloud.dropbox.auth = new Dropbox.Client({ - key: "CBB0GYTWGYA=|aeSB7VBcIP94mzfQPoykIzGm++Z97KtaDn2snjXCGQ==" - }); + if (urls.dropboxAuth) { + cloud.dropbox.auth = new Dropbox.Client({ + key: "CBB0GYTWGYA=|aeSB7VBcIP94mzfQPoykIzGm++Z97KtaDn2snjXCGQ==" + }); - cloud.dropbox.auth.authDriver(new Dropbox.Drivers.Popup({ - rememberUser: true, - receiverUrl: urls.dropboxAuth - })); + cloud.dropbox.auth.authDriver(new Dropbox.Drivers.Popup({ + rememberUser: true, + receiverUrl: urls.dropboxAuth + })); - cloud.dropbox.auth.onAuth = new CustomEvent('cloud.dropbox.authed'); + cloud.dropbox.auth.onAuth = new CustomEvent('cloud.dropbox.authed'); + } } @@ -50,7 +52,7 @@ cloud.dropbox.enumerate = function (directory, callback) { entries[i].push(''); // Only get documents - if (entries[i][2] != '.txt' && entries[i][2] != '.html' && entries[i][2] != '.htm') { // 0.4 && entries[i][2] != '.docx') { + if (entries[i][2] != '.txt' && entries[i][2] != '.html' && entries[i][2] != '.htm' && entries[i][2] != '.odt') { // 0.4 && entries[i][2] != '.docx') { entries.splice(i, 1); i = (i - 1); } @@ -77,9 +79,11 @@ cloud.dropbox.enumerate = function (directory, callback) { } }; -cloud.dropbox.load = function (path, callback) { +cloud.dropbox.load = function (path, filetype, callback) { if (cloud.dropbox.client && path) { - cloud.dropbox.client.readFile(path, function(e, d) { + cloud.dropbox.client.readFile(path, { + binary: filetype === '.odt', + }, function(e, d) { // Hide spinner spinner('hide'); @@ -151,12 +155,12 @@ cloud.dropbox.error = function (error) { case Dropbox.ApiError.OVER_QUOTA: // The user is over their Dropbox quota. // Tell them their Dropbox is full. Refreshing the page won't help. - alert(navigator.mozL10n.get('dropbox-full')); + firetext.notify(navigator.mozL10n.get('dropbox-full')); break; case Dropbox.ApiError.NETWORK_ERROR: - alert(navigator.mozL10n.get('network-error')); + firetext.notify(navigator.mozL10n.get('network-error')); break; case Dropbox.ApiError.RATE_LIMITED: diff --git a/scripts/editorLoader.js b/scripts/editorLoader.js deleted file mode 100644 index c6b668e..0000000 --- a/scripts/editorLoader.js +++ /dev/null @@ -1,63 +0,0 @@ -var loadEditor = (function () { - var editorURL; - var loadEditor = function loadEditor(callback) { - if(editorURL) { - callback(editorURL); - return; - } - var editorDoc; - - var editorReq = new XMLHttpRequest(); - editorReq.open("GET", "editor/editor.html", true); - editorReq.responseType = "document"; - editorReq.overrideMimeType("text/html"); - editorReq.addEventListener("load", function(e) { - if(this.status === 200) { - editorDoc = this.response; - var scriptTags = editorDoc.querySelectorAll("script"); - var scripts = {}; - for (var i = 0; i < scriptTags.length; i++) { - if(scriptTags[i].src) { - (function() { - var scriptURL = new URI(scriptTags[i].src, new URI("editor", location.href)).toString(); - if(!scripts[scriptURL]) { - scripts[scriptURL] = []; - var scriptReq = new XMLHttpRequest(); - scriptReq.open("GET", scriptURL, true); - scriptReq.responseType = "text"; - scriptReq.addEventListener("load", function(e) { - var done = true; - if(this.status === 200) { - var inlineScript = editorDoc.createElement("script"); - var scriptText = this.response; - scriptText = scriptText.replace(/\[ORIGIN_OF_MAIN_DOCUMENT\]/g, window.location.origin ? window.location.origin : window.location.protocol + "//" + window.location.host); - inlineScript.type = "text/javascript"; - inlineScript.src = "data:text/javascript;base64," + btoa(scriptText); - scripts[scriptURL][0].parentNode.replaceChild(inlineScript, scripts[scriptURL][0]); - for (var i = 1; i < scripts[scriptURL].length; i++) { - scripts[scriptURL][i].parentNode.removeChild(scripts[scriptURL][i]); - } - delete scripts[scriptURL]; - for(var x in scripts) { - done = false; - break; - } - if (done) { - var editorBlob = new Blob([editorDoc.documentElement.outerHTML], {type: "text/html"}) - editorURL = URL.createObjectURL ? URL.createObjectURL(editorBlob) : URL.webkitCreateObjectURL ? URL.webkitCreateObjectURL(editorBlob) : null; - callback(editorURL); - } - } - }, false); - scriptReq.send(); - } - scripts[scriptURL].push(scriptTags[i]); - })(); - } - } - } - }, false); - editorReq.send(); - } - return loadEditor; -})(); \ No newline at end of file diff --git a/scripts/firetext.js b/scripts/firetext.js index be5ed4e..40eefeb 100644 --- a/scripts/firetext.js +++ b/scripts/firetext.js @@ -21,13 +21,13 @@ firetext.initialized = new CustomEvent('firetext.initialized'); firetext.isInitialized = false; var html = document.getElementsByTagName('html')[0], head = document.getElementsByTagName("head")[0]; var themeColor = document.getElementById("theme-color"); -var loadSpinner, editor, toolbar, toolbarInterval, editWindow, editState, rawEditor, tabRaw, tabDesign; -var deviceType, fileChanged, saveTimeout, saving, tempAutozen, urls={}, version = '0.3.3'; +var loadSpinner, editor, toolbar, toolbarInterval, editWindow, editState, rawEditor, rawEditorElement, tempText, tabRaw, tabDesign, printButton; +var deviceType, fileChanged, saveTimeout, saving, urls={}, version = '0.4'; var bold, boldCheckbox, italic, italicCheckbox, justifySelect, strikethrough, strikethroughCheckbox; var underline, underlineCheckbox; var locationLegend, locationSelect, locationDevice, locationDropbox; -var bugsense, bugsenseKey = ''; -var editorMessageProxy; +var bugsenseInitialized = false, bugsenseKey = ''; +var editorMessageProxy, editorURL; // Lists var welcomeDocsList, welcomeDeviceArea, welcomeDeviceList, openDialogDeviceArea, openDialogDeviceList; @@ -41,42 +41,115 @@ var appCache = window.applicationCache; ------------------------*/ window.addEventListener('DOMContentLoaded', function() {firetext.init();}, false); -firetext.init = function () { +firetext.init = function () { + // l10n catch + navigator.mozL10n.once(function () { + // Select elements + initElements(); + + // Load modules + initModules(function() { + // Update Doc Lists + updateDocLists(); + + // Check for recent file, and if found, load it. + if (firetext.settings.get('autoload') == 'true') { + var lastDoc = [firetext.settings.get('autoload.dir'), firetext.settings.get('autoload.name'), firetext.settings.get('autoload.ext'), firetext.settings.get('autoload.loc')]; + if (firetext.settings.get('autoload.wasEditing') == 'true') { + // Wait until Dropbox is authenticated + if (lastDoc[3] == 'dropbox') { + if (firetext.settings.get('dropbox.enabled') == 'true') { + window.addEventListener('cloud.dropbox.authed', function() { + loadToEditor(lastDoc[0], lastDoc[1], lastDoc[2], lastDoc[3]); + spinner('hide'); + }); + } else { + spinner('hide'); + } + } else { + loadToEditor(lastDoc[0], lastDoc[1], lastDoc[2], lastDoc[3]); + spinner('hide'); + } + } else { + regions.nav('welcome'); + spinner('hide'); + } + } else { + regions.nav('welcome'); + spinner('hide'); + } + + // Create listeners + initListeners(); + + // Dispatch init event + window.dispatchEvent(firetext.initialized); + firetext.isInitialized = true; + }); + }); +}; + +function initModules(callback) { // Initialize Bugsense bugsenseInit(); - // Initialize l10n - navigator.mozL10n.once(function () { - + // Fix menu before url request + fixMenu(true); + // Initialize urls - getURLs(function(){ + initURLs(function(){ + // Modify links in menu fixMenu(); + + // Initialize cloud services + cloud.init(); }); + + // Find device type + checkDevice(); // Initialize Settings firetext.settings.init(); - // Initialize language handler + // Initialize Language firetext.language(firetext.settings.get('language')); - // Find device type - checkDevice(); - - // Initialize gestures + // Initialize Gestures initGestures(); + + // Initialize night + night(); + + // Initialize extIcon + extIcon(); + + // Initalize recent docs + firetext.recents.init(); + + // Initialize IO + firetext.io.init(null, function() { + callback(); + }); + + // Initialize print button + initPrintButton(function() { + + }); +} - /* Select important elements for later */ +function initElements() { // Misc loadSpinner = document.getElementById('loadSpinner'); spinner(); tabDesign = document.getElementById('tab-design'); tabRaw = document.getElementById('tab-raw'); editor = document.getElementById('editor'); - rawEditor = document.getElementById('rawEditor'); + rawEditorElement = document.getElementById('rawEditor'); toolbar = document.getElementById('edit-zone'); editWindow = document.getElementById('edit'); locationLegend = document.getElementById('locationLegend'); - locationSelect = document.getElementById('createDialogFileLocation'); + locationSelect = document.getElementById('createDialogFileLocation'); + printButton = document.getElementById('printButton'); // Lists welcomeDocsList = document.getElementById('welcome-docs-list'); @@ -90,7 +163,7 @@ firetext.init = function () { welcomeDropboxList = document.getElementById('welcome-dropbox-list'); openDialogDropboxArea = document.getElementById('open-dialog-dropbox-area'); openDialogDropboxList = document.getElementById('open-dialog-dropbox-list'); - + // Formatting bold = document.getElementById('bold'); boldCheckbox = document.getElementById('boldCheckbox'); @@ -101,95 +174,32 @@ firetext.init = function () { strikethroughCheckbox = document.getElementById('strikethroughCheckbox'); underline = document.getElementById('underline'); underlineCheckbox = document.getElementById('underlineCheckbox'); - - // Initalize recent docs - firetext.recents.init(); - - // Initialize the editor - initEditor(function() { - // Init extIcon - extIcon(); - - // Add event listeners - toolbar.addEventListener( - 'mousedown', function mouseDown(event) { - event.preventDefault(); - event.target.classList.toggle('active'); - } - ); - toolbar.addEventListener( - 'mouseup', function mouseDown(event) { - if (event.target.classList.contains('sticky') != true) { - event.target.classList.remove('active'); - } - } - ); - editWindow.addEventListener( - 'mouseenter', function mouseDown(event) { - editor.focus(); - } - ); - - document.getElementById('welcome-main-area').addEventListener( - 'contextmenu', function contextmenu(event) { - event.preventDefault(); - editDocs(); - } - ); - - // Initialize IO - firetext.io.init(null, function() { - // Update Doc Lists - updateDocLists(); - - // Initialize sharing - cloud.init(); - - // Check for recent file, and if found, load it. - if (firetext.settings.get('autoload') == 'true') { - var lastDoc = [firetext.settings.get('autoload.dir'), firetext.settings.get('autoload.name'), firetext.settings.get('autoload.ext'), firetext.settings.get('autoload.loc')]; - var wasEditing = firetext.settings.get('autoload.wasEditing'); - - // Navigate to welcome region - regions.nav('welcome'); - - // Load file - if (wasEditing == 'true') { - // Wait until Dropbox is authenticated - if (lastDoc[3] == 'dropbox') { - if (firetext.settings.get('dropbox.enabled') == 'true') { - window.addEventListener('cloud.dropbox.authed', function() { - spinner('hide'); - loadToEditor(lastDoc[0], lastDoc[1], lastDoc[2], lastDoc[3]); - }); - } else { - spinner('hide'); - } - } else { - spinner('hide'); - loadToEditor(lastDoc[0], lastDoc[1], lastDoc[2], lastDoc[3]); - } - } else { - spinner('hide'); - } - } else { - spinner('hide'); - regions.nav('welcome'); +} + +function initListeners() { + // Add event listeners + toolbar.addEventListener( + 'mousedown', function mouseDown(event) { + event.preventDefault(); + event.target.classList.toggle('active'); + } + ); + toolbar.addEventListener( + 'mouseup', function mouseDown(event) { + if (event.target.classList.contains('sticky') != true) { + event.target.classList.remove('active'); } - - // Night - night(); - - // Dispatch init event - window.dispatchEvent(firetext.initialized); - firetext.isInitialized = true; - }); - }); - - }); -}; + } + ); + welcomeDocsList.addEventListener( + 'contextmenu', function contextmenu(event) { + event.preventDefault(); + editDocs(); + } + ); +} -function getURLs(callback) { +function initURLs(callback) { var xhr = new XMLHttpRequest(); xhr.open('post','http://firetext.codexa.bugs3.com/',true); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); @@ -205,33 +215,44 @@ function getURLs(callback) { xhr.send('request=urls&version='+version); } -function fixMenu() { - var tempElements = []; +function fixMenu(soft) { + var tempElements = [], tempLinks = []; var urlNames = ['about','support','credits','rate']; // Find empty urls urlNames.forEach(function(v){ if (!urls[v]) { tempElements = addMenuElementsToArray(tempElements, document.querySelectorAll('[data-type="sidebar"] nav [data-click-location="'+v+'"]')); + } else { + tempLinks = addMenuElementsToArray(tempLinks, document.querySelectorAll('[data-type="sidebar"] nav [data-click-location="'+v+'"]')); + for (var i = 0; i < tempLinks.length; i++) { + tempLinks[i].parentNode.classList.remove('hidden-item'); + } } }); - // Remove list items - for (var i = 0; i < tempElements.length; i++) { - var tempParent = tempElements[i].parentNode.parentNode; - if (tempParent) { - tempParent.removeChild(tempElements[i].parentNode); + if (soft === true) { + for (var i = 0; i < tempElements.length; i++) { + tempElements[i].parentNode.classList.add('hidden-item'); + } + } else { + // Remove list items + for (var i = 0; i < tempElements.length; i++) { + var tempParent = tempElements[i].parentNode.parentNode; + if (tempParent) { + tempParent.removeChild(tempElements[i].parentNode); + } } - } - // Remove empty lists - var tempLists = document.querySelectorAll('[data-type="sidebar"] nav ul'); - for (var i = 0; i < tempLists.length; i++) { - if (tempLists[i].childElementCount == 0) { - if (tempLists[i].previousElementSibling) { - tempLists[i].parentNode.removeChild(tempLists[i].previousElementSibling); + // Remove empty lists + var tempLists = document.querySelectorAll('[data-type="sidebar"] nav ul'); + for (var i = 0; i < tempLists.length; i++) { + if (tempLists[i].childElementCount == 0) { + if (tempLists[i].previousElementSibling) { + tempLists[i].parentNode.removeChild(tempLists[i].previousElementSibling); + } + tempLists[i].parentNode.removeChild(tempLists[i]); } - tempLists[i].parentNode.removeChild(tempLists[i]); } } } @@ -248,28 +269,38 @@ function addMenuElementsToArray(array, elements) { ------------------------*/ function updateAddDialog() { if (locationSelect.length < 1) { - // Disable elements - document.getElementById('add-dialog-create-button').style.pointerEvents = 'none'; - document.getElementById('add-dialog-create-button').style.color = '#999'; - document.querySelector('#add [role="main"]').style.display = 'none'; - - // Create notice - if (!document.getElementById('no-storage-notice')) { - var noStorageNotice = document.createElement('div'); - noStorageNotice.id = 'no-storage-notice'; - noStorageNotice.classList.add('redAlert'); - noStorageNotice.textContent = navigator.mozL10n.get('no-storage-method'); - document.getElementById('add').insertBefore(noStorageNotice, document.querySelector('#add [role="main"]')); - } + [].forEach.call(document.getElementsByClassName('create-dialog'), function(createDialog) { + // Disable elements + createDialog.getElementsByClassName('create-button')[0].style.pointerEvents = 'none'; + createDialog.getElementsByClassName('create-button')[0].style.color = '#999'; + createDialog.querySelector('[role="main"]').style.display = 'none'; + + // Show notice + var noStorageNotice = createDialog.getElementsByClassName('no-storage-notice')[0]; + if (noStorageNotice.classList.contains('hidden-item')) { + noStorageNotice.classList.remove('hidden-item'); + } + }); } else { - // Enable elements - document.getElementById('add-dialog-create-button').setAttribute('style', 'pointer-events: auto;'); - document.querySelector('#add [role="main"]').style.display = 'block'; - - // Remove notice if present - if (document.getElementById('no-storage-notice')) { - document.getElementById('no-storage-notice').parentNode.removeChild(document.getElementById('no-storage-notice')); - } + [].forEach.call(document.getElementsByClassName('create-dialog'), function(createDialog) { + // Disable elements + createDialog.getElementsByClassName('create-button')[0].style.pointerEvents = ''; + createDialog.getElementsByClassName('create-button')[0].style.color = ''; + createDialog.querySelector('[role="main"]').style.display = ''; + + // Hide location select if only one option exists + if (locationSelect.length === 1) { + locationLegend.style.display = 'none'; + } else { + locationLegend.style.display = 'block'; + } + + // Hide notice + var noStorageNotice = createDialog.getElementsByClassName('no-storage-notice')[0]; + if (!noStorageNotice.classList.contains('hidden-item')) { + noStorageNotice.classList.add('hidden-item'); + } + }); } } @@ -278,14 +309,10 @@ function updateAddDialog() { ------------------------*/ function bugsenseInit() { if (bugsenseKey) { - if (firetext.settings.get('stats.enabled') != 'false') { - bugsense = new Bugsense({ appversion: version, apiKey: bugsenseKey }); - } else { - bugsense = null; - } - } else { - if (firetext.settings.get('stats.enabled') != 'false') { - firetext.settings.save('stats.enabled','false'); + if (firetext.settings.get('stats.enabled') != 'false' && + !bugsenseInitialized) { + Bugsense.initAndStartSession({ appname: 'Firetext', appVersion: version, apiKey: bugsenseKey }); + bugsenseInitialized = true; } } } @@ -306,8 +333,10 @@ function updateDocLists(lists) { if (lists.indexOf('all') != '-1' | lists.indexOf('internal') != '-1') { // Internal + spinner(); firetext.io.enumerate('/', function(DOCS) { buildDocList(DOCS, [welcomeDeviceList, openDialogDeviceList], "documents-found", 'internal'); + spinner('hide'); }); } @@ -491,9 +520,6 @@ function cleanForPreview(text, documentType) { return htmlNode.innerHTML; } return text; - case ".docx": - console.warn("cleanForPreview docx not implemented text = %s.", text); - return text; } } @@ -501,24 +527,29 @@ function sortByCellIndex(a,b) { return a.cellIndex - b.cellIndex; } -function buildDocListItems(DOCS, listElms, description, output, location, preview) { +function buildDocListItems(DOCS, listElms, description, output, location, preview, error) { // Handle description if (!description) { description = ''; } - if (firetext.settings.get('previews.enabled') != 'false') { - switch (DOCS[0][2]) { + if (preview && firetext.settings.get('previews.enabled') != 'false') { + switch (error ? ".txt" : DOCS[0][2]) { case ".txt": - description = firetext.parsers.plain.parse(cleanForPreview(description, DOCS[0][2]), "HTML"); + description = firetext.parsers.plain.parse(cleanForPreview(description, ".txt"), "HTML"); break; case ".docx": - var tmp = document.createElement("DIV"); - var docx = new DocxEditor(description); - tmp.appendChild(docx.HTMLout()); - description = tmp.innerHTML; + case ".odt": + if(DOCS[0][2] === ".docx") { + var tmp = document.createElement("DIV"); + var docx = new DocxEditor(description); + tmp.appendChild(docx.HTMLout()); + description = tmp.innerHTML; + } else { + description = new JSZip(description).file('content.xml').asText(); + } case ".html": - description = cleanForPreview(description, DOCS[0][2]); + description = cleanForPreview(description, ".html"); break; default: break; @@ -569,11 +600,11 @@ function buildDocListItems(DOCS, listElms, description, output, location, previe // build next item if (preview == true) { - firetext.io.load(DOCS[1][0], DOCS[1][1], DOCS[1][2], function (result) { - buildDocListItems(DOCS.slice(1, DOCS.length), listElms, result, output, location, preview); + firetext.io.load(DOCS[1][0], DOCS[1][1], DOCS[1][2], function (result, error) { + buildDocListItems(DOCS.slice(1, DOCS.length), listElms, result, output, location, preview, error); }, location); } else { - buildDocListItems(DOCS.slice(1, DOCS.length), listElms, null, output, location); + buildDocListItems(DOCS.slice(1, DOCS.length), listElms, null, output, location, preview, true); } } @@ -592,11 +623,11 @@ function buildDocList(DOCS, listElms, display, location, preview) { // build next item if (preview == true) { - firetext.io.load(DOCS[0][0], DOCS[0][1], DOCS[0][2], function (result) { - buildDocListItems(DOCS, listElms, result, "", location, preview); + firetext.io.load(DOCS[0][0], DOCS[0][1], DOCS[0][2], function (result, error) { + buildDocListItems(DOCS, listElms, result, "", location, preview, error); }, location); } else { - buildDocListItems(DOCS, listElms, null, "", location, preview); + buildDocListItems(DOCS, listElms, null, "", location, preview, true); } } else { // No docs message @@ -644,17 +675,8 @@ function buildEditDocList(DOCS, listElm, display, location) { /* Display ------------------------*/ -// Make save banner hidden after 4 seconds -function hideSaveBanner() { - window.setTimeout(function() { - document.getElementById("save-banner").hidden = true; - }, 4000); -} - -// Show the banner -function showSaveBanner() { - document.getElementById("save-banner").hidden = false; - hideSaveBanner(); +function showSaveBanner(filepath) { + firetext.notify(navigator.mozL10n.get('successfully-saved')+' '+filepath); } // File Extension Icon on Create new file @@ -671,70 +693,77 @@ function extIcon() { /* Editor ------------------------*/ function initEditor(callback) { - loadEditor(function(editorURL) { - editor.onload = null; - editor.src = editorURL; - editor.onload = function() { - var editorMessageChannel = new MessageChannel(); - // See: scripts/messages.js - editorMessageProxy = new MessageProxy(editorMessageChannel.port1); - // Successful initialization - editorMessageProxy.registerMessageHandler(function(e) { - // Initialize Raw Editor - rawEditor.setAttribute('contentEditable', 'true'); - rawEditor.addEventListener('focus',function(){ - processActions('data-focus', rawEditor); - }); - rawEditor.addEventListener('blur',function(){ - processActions('data-blur', rawEditor); - }); - - // Nav to the design tab - regions.tab(document.querySelector('#editTabs'), 'design'); + if (editorURL) { + app.modules.fill(editorURL, editor, function() { + editorCommunication(function(){ + callback(); + }); + }); + } else { + app.modules.load('modules/editor/editor.html', editor, function(u) { + editorURL = u; + editorCommunication(function(){ callback(); + }); + }, true, true); + } +} + +function editorCommunication(callback) { + editor.onload = null; + editor.onload = function() { + // Stop listening to editor + if(editorMessageProxy) editorMessageProxy.setRecv(null); - // Initialize Night Mode - night(); - }, "init-success", true); - - editorMessageProxy.registerMessageHandler(function(e) { - fileChanged = true; - if(e.data.filetype === ".html") { - rawEditor.textContent = e.data.html; - } - autosave(); - }, "doc-changed"); + // See: scripts/messages.js + editorMessageProxy = new MessageProxy(); + editorMessageProxy.setSend(editor.contentWindow); + editorMessageProxy.setRecv(window); + // Successful initialization + editorMessageProxy.registerMessageHandler(function(e) { + callback(); + }, "init-success", true); + + editorMessageProxy.registerMessageHandler(function(e) { + tempText = e.data.html; + fileChanged = true; + autosave(); + }, "doc-changed"); - // editor focus and blur - editorMessageProxy.registerMessageHandler(function(e) { - if(e.data.focus) { - processActions('data-focus', editor); - } else { - processActions('data-blur', editor); - } - }, "focus"); - Window.postMessage(editor.contentWindow, {command: "init"}, "*", [editorMessageChannel.port2]); - editorMessageProxy.getPort().start(); + // editor focus and blur + editorMessageProxy.registerMessageHandler(function(e) { + if(e.data.focus) { + processActions('data-focus', editor); + } else { + processActions('data-blur', editor); + } + }, "focus"); + editorMessageProxy.postMessage({command: "init"}); + + editor.onload = function() { + editorMessageProxy.setSend(editor.contentWindow); } - }) + } } function watchDocument(filetype) { if(filetype === ".html") { - prettyPrint(); // Add listener to update design - rawEditor.addEventListener('input', function() { + rawEditor.on('change', function() { fileChanged = true; - var callbackKey = editorMessageProxy.registerMessageHandler(function(e) { autosave(); }, null, true); - editorMessageProxy.getPort().postMessage({ + editorMessageProxy.registerMessageHandler(function(e) { autosave(); }, 'autosave-ready'); + editorMessageProxy.postMessage({ command: "load", - content: rawEditor.textContent, + content: rawEditor.getValue(), filetype: ".html", - key: callbackKey + key: 'autosave-ready' }); }); - rawEditor.addEventListener('blur', function() { - prettyPrint(); + rawEditor.on('focus', function() { + processActions('data-focus',rawEditorElement); + }); + rawEditor.on('blur', function() { + processActions('data-blur',rawEditorElement); }); } } @@ -745,7 +774,7 @@ function forceAutosave() { function autosave(force) { if (firetext.settings.get('autosave') != 'false') { - if (!saveTimeout | force == true) { + if (!saveTimeout || force == true) { if (saving != true) { // Add timeout for saving saveTimeout = window.setTimeout(saveFromEditor, 1000); @@ -866,7 +895,7 @@ function deleteSelected(confirmed) { } else if (selected.length > 1) { var confirmDeletion = confirm(navigator.mozL10n.get('want-to-delete-plural')); } else { - alert(navigator.mozL10n.get('no-files-selected')); + firetext.notify(navigator.mozL10n.get('no-files-selected')); return; } if (confirmDeletion != true) { @@ -897,7 +926,7 @@ function deleteSelected(confirmed) { /* Format ------------------------*/ function formatDoc(sCmd, sValue) { - editorMessageProxy.getPort().postMessage({ + editorMessageProxy.postMessage({ command: "format", sCmd: sCmd, sValue: sValue @@ -955,7 +984,7 @@ function updateToolbar() { strikethroughCheckbox.checked = false; } }, null, true); - editorMessageProxy.getPort().postMessage({ + editorMessageProxy.postMessage({ command: "query-command-states", commands: ["bold", "italic", "justifyCenter", "justifyFull", "justifyRight", "underline", "strikeThrough"], key: key @@ -1044,6 +1073,8 @@ function processActions(eventAttribute, target) { regions.sidebar(target.getAttribute(eventAttribute + '-id'), target.getAttribute(eventAttribute + '-state')); } else if (calledFunction == 'saveFromEditor') { saveFromEditor(true, true); + } else if (calledFunction == 'downloadFile') { + download(); } else if (calledFunction == 'closeFile') { // Check if file is changed. If so, prompt the user to save it. if (firetext.settings.get('autosave') == 'false' && fileChanged == true) { @@ -1078,6 +1109,10 @@ function processActions(eventAttribute, target) { } } else if (calledFunction == 'createFromDialog') { createFromDialog(); + } else if (calledFunction == 'uploadFromDialog') { + uploadFromDialog(); + } else if (calledFunction == 'saveAsFromDialog') { + saveAsFromDialog(); } else if (calledFunction == 'editDocs') { editDocs(); } else if (calledFunction == 'extIcon') { @@ -1096,12 +1131,12 @@ function processActions(eventAttribute, target) { } } else if (calledFunction == 'clearCreateForm') { clearCreateForm(); + } else if (calledFunction == 'clearSaveAsForm') { + clearSaveAsForm(); } else if (calledFunction == 'fullscreen') { if (target.getAttribute(eventAttribute + '-state') == 'off') { - tempAutozen = false; editFullScreen(false); } else { - tempAutozen = true; editFullScreen(); } } else if (calledFunction == 'browser') { @@ -1121,7 +1156,7 @@ function processActions(eventAttribute, target) { // Fix for empty locations if(!browseLocation || browseLocation==''){ - alert(navigator.mozL10n.get('not-functional-link')); + firetext.notify(navigator.mozL10n.get('not-functional-link')); return; } @@ -1140,14 +1175,18 @@ function processActions(eventAttribute, target) { } formatDoc('justify'+justifyDirection); } else if (calledFunction == 'hideToolbar') { - if (document.getElementById('currentFileType').textContent != '.txt' && - target.id === 'editor') { - document.getElementById('edit-bar').style.display = 'none'; - editor.classList.add('no-toolbar'); + if (deviceType != 'desktop') { + if (document.getElementById('currentFileType').textContent != '.txt' && + document.getElementById('currentFileType').textContent != '.odt' && + target.id === 'editor') { + document.getElementById('edit-bar').style.display = 'none'; + editor.classList.add('no-toolbar'); + } + document.getElementById('hide-keyboard-button').classList.add('shown'); } - document.getElementById('hide-keyboard-button').classList.add('shown'); } else if (calledFunction == 'showToolbar') { if (document.getElementById('currentFileType').textContent != '.txt' && + document.getElementById('currentFileType').textContent != '.odt' && target.id === 'editor') { document.getElementById('edit-bar').style.display = 'block'; editor.classList.remove('no-toolbar'); @@ -1169,7 +1208,7 @@ function processActions(eventAttribute, target) { } regions.nav('hyperlink'); }, null, true); - editorMessageProxy.getPort().postMessage({ + editorMessageProxy.postMessage({ command: "query-command-states", commands: ["createLink"], key: key @@ -1235,7 +1274,7 @@ function processActions(eventAttribute, target) { var rows = parseInt(document.getElementById('table-rows').value); var cols = parseInt(document.getElementById('table-columns').value); } else { - alert(navigator.mozL10n.get('valid-integer-value')); + firetext.notify(navigator.mozL10n.get('valid-integer-value')); return; } @@ -1270,7 +1309,7 @@ function processActions(eventAttribute, target) { document.getElementById('table-columns').value = null; } else if (calledFunction == 'clearRecents') { firetext.recents.reset(); - alert(navigator.mozL10n.get('recents-eliminated')); + firetext.notify(navigator.mozL10n.get('recents-eliminated')); } } } @@ -1297,7 +1336,7 @@ function checkDevice() { } if (window.opera) { - alert(navigator.mozL10n.get('warning-unsupported-technology')); + firetext.notify(navigator.mozL10n.get('warning-unsupported-technology')); } }; @@ -1307,6 +1346,10 @@ function clearCreateForm() { extIcon(); } +function clearSaveAsForm() { + document.getElementById('saveAsDialogFileName').value = ''; +} + function spinner(state) { if (state == 'hide') { loadSpinner.classList.remove('shown'); @@ -1316,7 +1359,9 @@ function spinner(state) { } function editFullScreen(enter) { - if (enter != false) { // current working methods + if (enter === true || + enter != false && + !html.classList.contains('fullscreen')) { // current working methods // Make app fullscreen if (document.documentElement.requestFullscreen) { document.documentElement.requestFullscreen(); @@ -1325,12 +1370,6 @@ function editFullScreen(enter) { } else if (document.documentElement.webkitRequestFullscreen) { document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); } - - // Special editor UI - document.querySelector('#edit header:first-child').style.display = 'none'; - document.getElementById('editTabs').setAttribute('data-items', '4.1'); - document.querySelector('#editTabs .tabToolbar').classList.add('visible'); - html.classList.add('fullscreen'); } else { // Exit fullscreen if (document.cancelFullScreen) { @@ -1340,11 +1379,75 @@ function editFullScreen(enter) { } else if (document.webkitCancelFullScreen) { document.webkitCancelFullScreen(); } - + } +} + +function onFullScreenChange() { + if ( + document.fullscreenElement || + document.mozFullScreenElement || + document.webkitFullscreenElement + ) { + // Special editor UI + html.classList.add('fullscreen'); + document.querySelector('#editor-zen-button span').classList.remove('icon-fs'); + document.querySelector('#editor-zen-button span').classList.add('icon-efs'); + } else { // Regular editor UI - document.querySelector('#edit header:first-child').style.display = 'block'; - document.getElementById('editTabs').setAttribute('data-items', '2'); - document.querySelector('#editTabs .tabToolbar').classList.remove('visible'); html.classList.remove('fullscreen'); + document.querySelector('#editor-zen-button span').classList.remove('icon-efs'); + document.querySelector('#editor-zen-button span').classList.add('icon-fs'); + } +} + +function onFullScreenError() { + firetext.notify('Could not enter into fullscreen.'); +} + +document.addEventListener('fullscreenchange', onFullScreenChange); +document.addEventListener('mozfullscreenchange', onFullScreenChange); +document.addEventListener('webkitfullscreenchange', onFullScreenChange); + +document.addEventListener('fullscreenerror', onFullScreenError); +document.addEventListener('mozfullscreenerror', onFullScreenError); +document.addEventListener('webkitfullscreenerror', onFullScreenError); + +/* Print button +------------------------*/ +function initPrintButton(callback) { + app.modules.load('modules/printButton/printButton.html', printButton, function() { + printButtonCommunication(function(){ + callback(); + }); + }, true, true); +} + +function printButtonCommunication(callback) { + printButton.onload = null; + printButton.onload = function() { + // See: scripts/messages.js + var printButtonMessageProxy = new MessageProxy(); + printButtonMessageProxy.setSend(printButton.contentWindow); + printButtonMessageProxy.setRecv(window); + + printButtonMessageProxy.registerMessageHandler(function(printEvt) { + var key = editorMessageProxy.registerMessageHandler(function(editorEvt){ + var filename = document.getElementById('currentFileName').textContent; + var filetype = document.getElementById('currentFileType').textContent; + + printButtonMessageProxy.postMessage({ + command: printEvt.data.key, + filename: filename, + filetype: filetype, + content: editorEvt.data.content, + 'automatic-printing-failed': navigator.mozL10n.get('automatic-printing-failed') + }); + }, null, true); + editorMessageProxy.postMessage({ + command: "get-content-html", + key: key + }); + regions.nav('edit'); + }, "print-button-pressed"); } } diff --git a/scripts/io.js b/scripts/io.js index 1f26504..7348b5c 100644 --- a/scripts/io.js +++ b/scripts/io.js @@ -13,7 +13,7 @@ firetext.io = {}; /* Variables ------------------------*/ -var storage, deviceAPI, locationDevice +var storage, deviceAPI, locationDevice; /* Init @@ -36,13 +36,14 @@ firetext.io.init = function (api, callback) { if (this.result != "available") { deviceAPI = null; storage = null; - alert(navigator.mozL10n.get('shared-sdcard')); + firetext.notify(navigator.mozL10n.get('shared-sdcard')); firetext.io.init('file', callback); return; } else { storage.onchange = function (change) { updateDocLists(['internal', 'recents']); } + enableInternalStorage(); callback(); } }; @@ -50,7 +51,7 @@ firetext.io.init = function (api, callback) { request.onerror = function () { deviceAPI = null; storage = null; - alert(navigator.mozL10n.get('unable-to-get-sdcard') + this.error); + firetext.notify(navigator.mozL10n.get('unable-to-get-sdcard') + this.error.name); firetext.io.init('file', callback); return; }; @@ -59,7 +60,7 @@ firetext.io.init = function (api, callback) { window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; if (window.requestFileSystem) { var onFSError = function() { - alert(navigator.mozL10n.get('could-not-initialize-filesystem')); + firetext.notify(navigator.mozL10n.get('could-not-initialize-filesystem')); deviceAPI = 'none'; disableInternalStorage(); callback(); @@ -70,6 +71,7 @@ firetext.io.init = function (api, callback) { storage = fs; storage.root.getDirectory("Documents/", {create: true}); deviceAPI = 'file'; + enableInternalStorage(); callback(); }, onFSError); } else { @@ -94,13 +96,16 @@ firetext.io.init = function (api, callback) { return; } } - +} + +function enableInternalStorage() { // Create storage option locationDevice = document.createElement('option'); locationDevice.value = 'internal'; locationDevice.setAttribute('data-l10n-id','internal-storage'); locationDevice.textContent = navigator.mozL10n.get('internal-storage'); locationSelect.appendChild(locationDevice); + updateAddDialog(); } function disableInternalStorage() { @@ -117,7 +122,7 @@ firetext.io.enumerate = function (directory, callback) { var FILES = []; // Put directory in proper form - if (directory.length > 1 && directory[0] == '/') { + if (directory[0] == '/') { directory = directory.slice(1); } if (directory[directory.length - 1] != '/') { @@ -134,9 +139,9 @@ firetext.io.enumerate = function (directory, callback) { cursor.onerror = function() { if (cursor.error.name == 'SecurityError') { - alert(navigator.mozL10n.get('allow-sdcard')); + firetext.notify(navigator.mozL10n.get('allow-sdcard')); } else { - alert(navigator.mozL10n.get('load-unsuccessful')+cursor.error.name); + firetext.notify(navigator.mozL10n.get('load-unsuccessful')+cursor.error.name); } }; cursor.onsuccess = function() { @@ -157,8 +162,8 @@ firetext.io.enumerate = function (directory, callback) { // Don't get any files but docs if (!thisFile[1] | thisFile[3] != 'text/html' && - thisFile[3] != 'text/plain') { /* 0.4 && - thisFile[3] != 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {*/ + thisFile[3] != 'text/plain' && + thisFile[2] != '.odt') { cursor.continue(); return; } @@ -215,7 +220,7 @@ firetext.io.enumerate = function (directory, callback) { fileparts = results[i].name.split("."); filetype = fileparts.length >= 2 ? "." + fileparts[fileparts.length - 1] : ""; filename = filetype.length >= 2 ? fileparts.slice(0, -1).join("") : fileparts[0]; - if (filetype !== ".txt" && filetype !== ".html") { // 0.4 && filetype !== ".docx") { + if (filetype !== ".txt" && filetype !== ".html" && filetype !== ".odt") { continue; } FILES.push([directory, filename, filetype]); @@ -228,7 +233,7 @@ firetext.io.enumerate = function (directory, callback) { if(err.code == FileError.NOT_FOUND_ERR) { callback(); } else { - alert(navigator.mozL10n.get('load-unsuccessful')+err.code); + firetext.notify(navigator.mozL10n.get('load-unsuccessful')+err.code); } }); } @@ -239,63 +244,19 @@ firetext.io.enumerate = function (directory, callback) { /* File IO ------------------------*/ -function createFromDialog() { - var directory = 'Documents/'; - var location = document.getElementById('createDialogFileLocation').value; - var filename = document.getElementById('createDialogFileName').value; - var filetype = document.getElementById('createDialogFileType').value; - if (filename == null | filename == undefined | filename == '') { - alert(navigator.mozL10n.get('enter-name')); - return; - } else if (!isValidFileName(filename)) { - alert(navigator.mozL10n.get('contains-special-characters')); - return; - } - - // Navigate back to the previous screen - regions.navBack(); - - // Convert location to lower case - location = location.toLowerCase(); - + +function createAndOpen(location, directory, filename, filetype, contentBlob) { // Save the file - if (!location | location == '' | location == 'internal') { - - // Get mime - var type = "text"; - switch (filetype) { - case ".html": - type = "text\/html"; - break; - case ".txt": - type = "text\/plain"; - break; - /* 0.4 - case ".docx": - type = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; - break; - */ - default: - break; - } - var contentBlob; - //if (type === "application/vnd.openxmlformats-officedocument.wordprocessingml.document") { - // contentBlob = new Blob([firetext.parsers.DocxEditor.blank], {type: type}); - //} else { - contentBlob = new Blob([' '], { "type" : type }); - //} + if (!location | location == '' | location == 'internal') { if (deviceAPI == 'deviceStorage') { - // Make directory accurate - directory = ('/sdcard/'+directory); - var filePath = (directory + filename + filetype); var req = storage.addNamed(contentBlob, filePath); req.onerror = function () { if (this.error.name == "NoModificationAllowedError" | this.error.name == "FileExistsError") { - alert(navigator.mozL10n.get('file-exists')); + firetext.notify(navigator.mozL10n.get('file-exists')); } else { - alert(navigator.mozL10n.get('file-creation-fail')+this.error.name); + firetext.notify(navigator.mozL10n.get('file-creation-fail')+this.error.name); } }; req.onsuccess = function () { @@ -314,29 +275,29 @@ function createFromDialog() { loadToEditor(directory, filename, filetype, 'internal'); } e.target.onerror = function(e) { - alert(navigator.mozL10n.get('file-creation-fail')+e.message); + firetext.notify(navigator.mozL10n.get('file-creation-fail')+e.message); } }; fileWriter.onerror = function(e) { - alert(navigator.mozL10n.get('file-creation-fail')+e.message); + firetext.notify(navigator.mozL10n.get('file-creation-fail')+e.message); }; fileWriter.truncate(0); }, function(err) { - alert(navigator.mozL10n.get('file-creation-fail')+err.code); + firetext.notify(navigator.mozL10n.get('file-creation-fail')+err.code); }); }, function(err) { if(err.code === FileError.INVALID_MODIFICATION_ERR) { - alert(navigator.mozL10n.get('file-exists')); + firetext.notify(navigator.mozL10n.get('file-exists')); } else { - alert(navigator.mozL10n.get('file-creation-fail')+err.code); + firetext.notify(navigator.mozL10n.get('file-creation-fail')+err.code); } }); } } else if (location == 'dropbox') { directory = ('/' + directory); - firetext.io.save(directory, filename, filetype, ' ', false, function () { + firetext.io.save(directory, filename, filetype, contentBlob, false, function () { // Load to editor loadToEditor(directory, filename, filetype, location); @@ -344,8 +305,38 @@ function createFromDialog() { updateDocLists(['cloud']); }, location); } else { - alert(navigator.mozL10n.get('invalid-location')); + firetext.notify(navigator.mozL10n.get('invalid-location')); } +} + +function createFromDialog() { + var directory = 'Documents/'; + var location = document.getElementById('createDialogFileLocation').value; // Moved back and forth in regions.js + var filename = document.getElementById('createDialogFileName').value; + var filetype = document.getElementById('createDialogFileType').value; + if (filename == null | filename == undefined | filename == '') { + firetext.notify(navigator.mozL10n.get('enter-name')); + return; + } else if (!isValidFileName(filename)) { + firetext.notify(navigator.mozL10n.get('contains-special-characters')); + return; + } + + // Navigate back to the previous screen + regions.navBack(); + + // Convert location to lower case + location = location.toLowerCase(); + + // Get default file contents + var contentData = firetext.io.getDefaultContent(filetype); + + // Get mime + var type = firetext.io.getMime(filetype); + + var contentBlob = new Blob([contentData], { "type" : type }); + + createAndOpen(location, directory, filename, filetype, contentBlob); // Clear file fields document.getElementById('createDialogFileName').value = ''; @@ -353,6 +344,74 @@ function createFromDialog() { extIcon(); } +function uploadFromDialog() { + var directory = 'Documents/'; + var location = document.getElementById('createDialogFileLocation').value; // Moved back and forth in regions.js + var files = document.getElementById('uploadDialogFiles').files; + + // Navigate back to the previous screen + regions.navBack(); + + // Convert location to lower case + location = location.toLowerCase(); + + for (var i = 0; i < files.length; i++) { + var file = files[i]; + + if(file.name.lastIndexOf(".") !== -1) { + var filename = file.name.substr(0, file.name.lastIndexOf(".")); + var filetype = file.name.substr(file.name.lastIndexOf(".")); + } else { + var filename = file.name; + var filetype = ""; + } + + if (filename == null | filename == undefined | filename == '') { + continue; + } else if (!isValidFileName(filename)) { + firetext.notify(navigator.mozL10n.get('contains-special-characters')); + continue; + } + + if (['text/html', 'text/plain', 'application/vnd.oasis.opendocument.text'].indexOf(file.type) === -1) { + continue; + } + + createAndOpen(location, directory, filename, filetype, file); + } + + // Clear file fields + document.getElementById('uploadDialogFiles').value = ''; +} + +function saveAsFromDialog() { + var directory = 'Documents/'; + var location = document.getElementById('createDialogFileLocation').value; // Moved back and forth in regions.js + var filename = document.getElementById('saveAsDialogFileName').value; + var filetype = document.getElementById('currentFileType').textContent; // Current filetype + if (filename == null | filename == undefined | filename == '') { + firetext.notify(navigator.mozL10n.get('enter-name')); + return; + } else if (!isValidFileName(filename)) { + firetext.notify(navigator.mozL10n.get('contains-special-characters')); + return; + } + + // Navigate back to the previous screen + regions.navBack(); + + // Convert location to lower case + location = location.toLowerCase(); + + var key = editorMessageProxy.registerMessageHandler(function(e){ + createAndOpen(location, directory, filename, filetype, new Blob([StringView.base64ToBytes(e.data.content)], {type: e.data.type})); + }, null, true); + editorMessageProxy.postMessage({ + command: "get-content-blob", + key: key + }); +} + function isValidFileName(filename) { return (/^[a-zA-Z0-9-\._ ]+$/.test(filename) && !(/\.\./.test(filename)) && !(/\.$/.test(filename))); } @@ -370,65 +429,84 @@ function saveFromEditor(banner, spinner) { var key = editorMessageProxy.registerMessageHandler(function(e){ firetext.io.save(directory, filename, filetype, new Blob([StringView.base64ToBytes(e.data.content)], {type: e.data.type}), banner, function(){ fileChanged = false; }, location, spinner); }, null, true); - editorMessageProxy.getPort().postMessage({ + editorMessageProxy.postMessage({ + command: "get-content-blob", + key: key + }); +} + +function download() { + // Select elements + var location = document.getElementById('currentFileLocation').textContent; + var directory = document.getElementById('currentFileDirectory').textContent; + var filename = document.getElementById('currentFileName').textContent; + var filetype = document.getElementById('currentFileType').textContent; + + var key = editorMessageProxy.registerMessageHandler(function(e){ + saveAs(new Blob([StringView.base64ToBytes(e.data.content)], {type: e.data.type}), filename + filetype); + }, null, true); + editorMessageProxy.postMessage({ command: "get-content-blob", key: key }); } function loadToEditor(directory, filename, filetype, location, editable) { - // Clear editor - rawEditor.textContent = ''; + // Reset variables + tempText = undefined; + + // Initialize raw editor + if (!rawEditor) { + rawEditor = CodeMirror(rawEditorElement, { + lineNumbers: true + }); + } // Set file name and type document.getElementById('currentFileLocation').textContent = location; document.getElementById('currentFileDirectory').textContent = directory; document.getElementById('currentFileName').textContent = filename; document.getElementById('currentFileType').textContent = filetype; - - // Set alert banner name and type - document.getElementById('save-banner-name').textContent = (directory + filename); - document.getElementById('save-banner-type').textContent = filetype; + [].forEach.call(document.getElementsByClassName('file-name'), function(element) { + element.textContent = filename + filetype; + }); // Show/hide toolbar switch (filetype) { - /* 0.4 - case ".docx": - */ case ".html": - document.getElementById('edit-bar').style.display = 'block'; // 0.2 only - editor.classList.remove('no-toolbar'); // 0.2 only + document.getElementById('edit-bar').style.display = 'block'; + editor.classList.remove('no-toolbar'); toolbar.classList.remove('hidden'); break; case ".txt": + case ".odt": default: - document.getElementById('edit-bar').style.display = 'none'; // 0.2 only - editor.classList.add('no-toolbar'); // 0.2 only + document.getElementById('edit-bar').style.display = 'none'; + editor.classList.add('no-toolbar'); toolbar.classList.add('hidden'); break; } // Fill editor - firetext.io.load(directory, filename, filetype, function(result, error) { + firetext.io.load(directory, filename, filetype, function(result, error, fileInfo) { if (!error) { initEditor(function() { - editorMessageProxy.getPort().postMessage({ + editorMessageProxy.postMessage({ command: "load", content: result, filetype: filetype }); switch (filetype) { case ".txt": - /* 0.4 - case ".docx": - */ - tabRaw.classList.add('hidden'); - regions.tab(document.querySelector('#editTabs'), 'design'); + case ".odt": + document.querySelector('[data-tab-id="raw"]').classList.add('hidden-item'); + tabRaw.classList.add('hidden-item'); break; case ".html": default: - rawEditor.textContent = result; - tabRaw.classList.remove('hidden'); + document.querySelector('[data-tab-id="raw"]').classList.remove('hidden-item'); + tabRaw.classList.remove('hidden-item'); + rawEditor.swapDoc(new CodeMirror.Doc(result, 'text/html')); break; } @@ -446,22 +524,24 @@ function loadToEditor(directory, filename, filetype, location, editable) { toolbarInterval = window.setInterval(updateToolbar, 100); // Add file to recent docs - firetext.recents.add([directory, filename, filetype], location); + firetext.recents.add([fileInfo[0], fileInfo[1], fileInfo[2]], location); // Show editor regions.nav('edit'); + regions.tab(document.querySelector('#editTabs'), 'design'); // Hide save button if autosave is enabled if (firetext.settings.get('autosave') != 'false') { document.getElementById('editorSaveButton').style.display = 'none'; - document.getElementById('zenSaveButton').style.display = 'none'; } else { document.getElementById('editorSaveButton').style.display = 'inline-block'; - document.getElementById('zenSaveButton').style.display = 'inline-block'; } + + // Re-initialize night + night(); }) } else { - alert(navigator.mozL10n.get('load-unsuccessful')+result); + firetext.notify(navigator.mozL10n.get('load-unsuccessful')+result); } }, location); } @@ -480,11 +560,11 @@ firetext.io.save = function (directory, filename, filetype, contentBlob, showBan // Save file if (deviceAPI == 'deviceStorage') { - var req = storage.addNamed(contentBlob, filePath); + var req = storage.addNamed(contentBlob, filePath); req.onsuccess = function () { // Show banner or hide spinner if (showBanner) { - showSaveBanner(); + showSaveBanner(filePath); } if (showSpinner == true) { spinner('hide'); @@ -503,10 +583,10 @@ firetext.io.save = function (directory, filename, filetype, contentBlob, showBan }, location, showSpinner); }; req2.onerror = function () { - alert(navigator.mozL10n.get('save-unsuccessful')+this.error.name); + firetext.notify(navigator.mozL10n.get('save-unsuccessful')+this.error.name); } } else { - alert(navigator.mozL10n.get('save-unsuccessful')+this.error.name); + firetext.notify(navigator.mozL10n.get('save-unsuccessful')+this.error.name); } saving = false; }; @@ -517,7 +597,7 @@ firetext.io.save = function (directory, filename, filetype, contentBlob, showBan e.target.onwriteend = function(e) { // Show banner or hide spinner if (showBanner) { - showSaveBanner(); + showSaveBanner(filePath); } if (showSpinner == true) { spinner('hide'); @@ -529,30 +609,30 @@ firetext.io.save = function (directory, filename, filetype, contentBlob, showBan } e.target.onerror = function(e) { saving = false; - alert(navigator.mozL10n.get('save-unsuccessful')+e.message); + firetext.notify(navigator.mozL10n.get('save-unsuccessful')+e.message); } e.target.write(contentBlob); }; fileWriter.onerror = function(e) { saving = false; - alert(navigator.mozL10n.get('save-unsuccessful')+e.message); + firetext.notify(navigator.mozL10n.get('save-unsuccessful')+e.message); }; fileWriter.truncate(0); }, function(err) { saving = false; - alert(navigator.mozL10n.get('save-unsuccessful')+err.code); + firetext.notify(navigator.mozL10n.get('save-unsuccessful')+err.code); }); }, function(err) { saving = false; - alert(navigator.mozL10n.get('load-unsuccessful')+err.code); + firetext.notify(navigator.mozL10n.get('load-unsuccessful')+err.code); }); } } else if (location == 'dropbox') { cloud.dropbox.save(filePath, contentBlob, showSpinner, function () { // Show banner if (showBanner) { - showSaveBanner(); + showSaveBanner(filePath); } // Finish @@ -587,29 +667,28 @@ firetext.io.load = function (directory, filename, filetype, callback, location) var file = req.result; var reader = new FileReader(); - /* 0.4 - if (filetype == ".docx") { + if (filetype == ".odt") { reader.readAsArrayBuffer(file); } else { reader.readAsText(file); } - */ - - // 0.3 only - reader.readAsText(file); reader.onerror = function () { // Hide spinner spinner('hide'); - alert(navigator.mozL10n.get('load-unsuccessful')+this.error.name); + firetext.notify(navigator.mozL10n.get('load-unsuccessful')+this.error.name); callback(this.error.name, true); }; reader.onload = function () { // Hide spinner spinner('hide'); - callback(this.result); + // Update file info + var thisFile = firetext.io.split(file.name); + thisFile[3] = file.type; + + callback(this.result,undefined,thisFile); }; }; req.onerror = function () { @@ -617,7 +696,7 @@ firetext.io.load = function (directory, filename, filetype, callback, location) // New file, leave user to edit and save it } else { - alert(navigator.mozL10n.get('load-unsuccessful')+this.error.name); + firetext.notify(navigator.mozL10n.get('load-unsuccessful')+this.error.name); } // Hide spinner @@ -632,37 +711,32 @@ firetext.io.load = function (directory, filename, filetype, callback, location) // Hide spinner spinner('hide'); - alert(navigator.mozL10n.get('load-unsuccessful')+this.error.name); + firetext.notify(navigator.mozL10n.get('load-unsuccessful')+this.error.name); callback(this.error.name, true); }; reader.onload = function () { // Hide spinner spinner('hide'); - callback(this.result); + callback(this.result, undefined, [directory, filename, filetype]); }; - /* 0.4 - if (filetype === ".docx") { + if (filetype === ".odt") { reader.readAsArrayBuffer(file); } else { reader.readAsText(file); } - */ - - // 0.3 only - reader.readAsText(file); }, function(err) { - alert(navigator.mozL10n.get('load-unsuccessful')+err.code); + firetext.notify(navigator.mozL10n.get('load-unsuccessful')+err.code); // Hide spinner spinner('hide'); }); }, function(err) { if (err.code === FileError.NOT_FOUND_ERR) { - alert(navigator.mozL10n.get('load-unsuccessful')+err.code); + firetext.notify(navigator.mozL10n.get('load-unsuccessful')+err.code); } else { - alert(navigator.mozL10n.get('load-unsuccessful')+err.code); + firetext.notify(navigator.mozL10n.get('load-unsuccessful')+err.code); } // Hide spinner @@ -670,11 +744,11 @@ firetext.io.load = function (directory, filename, filetype, callback, location) }); } } else if (location = 'dropbox') { - cloud.dropbox.load(filePath, function (result, error) { + cloud.dropbox.load(filePath, filetype, function (result, error) { // Hide spinner spinner('hide'); - callback(result, error); + callback(result, error, [directory, filename, filetype]); }); } }; @@ -688,17 +762,17 @@ firetext.io.delete = function (name, location) { // Code to show a deleted banner } req.onerror = function () { - // Code to show an error banner (the alert is temporary) - alert(navigator.mozL10n.get('delete-unsuccessful')+this.error.name); + // Code to show an error banner (the firetext.notify is temporary) + firetext.notify(navigator.mozL10n.get('delete-unsuccessful')+this.error.name); } } else if (deviceAPI == 'file') { storage.root.getFile(path, {}, function(fileEntry) { fileEntry.remove(function() { }, function(err) { - alert(navigator.mozL10n.get('delete-unsuccessful')+err.code); + firetext.notify(navigator.mozL10n.get('delete-unsuccessful')+err.code); }); }, function(err) { - alert(navigator.mozL10n.get('delete-unsuccessful')+err.code); + firetext.notify(navigator.mozL10n.get('delete-unsuccessful')+err.code); }); } } else if (location == 'dropbox') { @@ -714,6 +788,55 @@ firetext.io.rename = function (directory, name, type, newname, location) { }, location); }; +firetext.io.getDefaultContent = function (extension) { + var contentData; + switch (extension) { + case ".html": + contentData = [ + '', + '', + '', + ' ', + '', + '', + '
              ', + '', + '', + '' + ].join('\n'); + break; + case ".txt": + contentData = ' '; + break; + case ".odt": + contentData = 'blabla'; + break; + default: + contentData = ' '; + break; + } + return contentData; +}; + +firetext.io.getMime = function (extension) { + var type; + switch (extension) { + case ".html": + type = "text/html"; + break; + case ".txt": + type = "text/plain"; + break; + case ".odt": + type = "application/vnd.oasis.opendocument.text"; + break; + default: + type = "application/octet-stream"; + break; + } + return type; +} + firetext.io.split = function (path) { var file = new Array(); file[0] = path.substring(0, (path.lastIndexOf('/') + 1)); diff --git a/scripts/lib/URI.js b/scripts/lib/URI.js deleted file mode 100644 index 626837f..0000000 --- a/scripts/lib/URI.js +++ /dev/null @@ -1,53 +0,0 @@ -/*! URI.js v1.12.0 http://medialize.github.com/URI.js/ */ -/* build contains: URI.js */ -(function(p,r){"object"===typeof exports?module.exports=r(require("./punycode"),require("./IPv6"),require("./SecondLevelDomains")):"function"===typeof define&&define.amd?define(["./punycode","./IPv6","./SecondLevelDomains"],r):p.URI=r(p.punycode,p.IPv6,p.SecondLevelDomains,p)})(this,function(p,r,v,w){function e(a,b){if(!(this instanceof e))return new e(a,b);void 0===a&&(a="undefined"!==typeof location?location.href+"":"");this.href(a);return void 0!==b?this.absoluteTo(b):this}function s(a){return a.replace(/([.*+?^=!:${}()|[\]\/\\])/g, -"\\$1")}function y(a){return void 0===a?"Undefined":String(Object.prototype.toString.call(a)).slice(8,-1)}function l(a){return"Array"===y(a)}function x(a,b){var c,e;if(l(b)){c=0;for(e=b.length;c]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u2018\u2019]))/ig;e.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u201e\u2018\u2019]+$/};e.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"};e.invalid_hostname_characters= -/[^a-zA-Z0-9\.-]/;e.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src"};e.getDomAttribute=function(a){if(a&&a.nodeName){var b=a.nodeName.toLowerCase();return"input"===b&&"image"!==a.type?void 0:e.domAttributes[b]}};e.encode=z;e.decode=decodeURIComponent;e.iso8859=function(){e.encode=escape;e.decode=unescape};e.unicode=function(){e.encode=z;e.decode=decodeURIComponent};e.characters= -{pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/ig,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}}};e.encodeQuery= -function(a,b){var c=e.encode(a+"");return b?c.replace(/%20/g,"+"):c};e.decodeQuery=function(a,b){a+="";try{return e.decode(b?a.replace(/\+/g,"%20"):a)}catch(c){return a}};e.recodePath=function(a){a=(a+"").split("/");for(var b=0,c=a.length;be)return a.charAt(0)===b.charAt(0)&&"/"===a.charAt(0)?"/":"";if("/"!==a.charAt(e)||"/"!==b.charAt(e))e=a.substring(0,e).lastIndexOf("/");return a.substring(0,e+1)};e.withinString=function(a,b,c){c||(c={});var g=c.start||e.findUri.start,d=c.end||e.findUri.end,k=c.trim||e.findUri.trim,h=/[a-z0-9-]=["']?$/i;for(g.lastIndex=0;;){var n=g.exec(a);if(!n)break;n=n.index;if(c.ignoreHtml){var l=a.slice(Math.max(n-3,0), -n);if(l&&h.test(l))continue}var l=n+a.slice(n).search(d),m=a.slice(n,l).replace(k,"");c.ignore&&c.ignore.test(m)||(l=n+m.length,m=b(m,n,l,a),a=a.slice(0,n)+m+a.slice(l),g.lastIndex=n+m.length)}g.lastIndex=0;return a};e.ensureValidHostname=function(a){if(a.match(e.invalid_hostname_characters)){if(!p)throw new TypeError("Hostname '"+a+"' contains characters other than [A-Z0-9.-] and Punycode.js is not available");if(p.toASCII(a).match(e.invalid_hostname_characters))throw new TypeError("Hostname '"+ -a+"' contains characters other than [A-Z0-9.-]");}};e.noConflict=function(a){if(a)return a={URI:this.noConflict()},URITemplate&&"function"==typeof URITemplate.noConflict&&(a.URITemplate=URITemplate.noConflict()),r&&"function"==typeof r.noConflict&&(a.IPv6=r.noConflict()),SecondLevelDomains&&"function"==typeof SecondLevelDomains.noConflict&&(a.SecondLevelDomains=SecondLevelDomains.noConflict()),a;w.URI===this&&(w.URI=C);return this};d.build=function(a){if(!0===a)this._deferred_build=!0;else if(void 0=== -a||this._deferred_build)this._string=e.build(this._parts),this._deferred_build=!1;return this};d.clone=function(){return new e(this)};d.valueOf=d.toString=function(){return this.build(!1)._string};q={protocol:"protocol",username:"username",password:"password",hostname:"hostname",port:"port"};u=function(a){return function(b,c){if(void 0===b)return this._parts[a]||"";this._parts[a]=b||null;this.build(!c);return this}};for(m in q)d[m]=u(q[m]);q={query:"?",fragment:"#"};u=function(a,b){return function(c, -e){if(void 0===c)return this._parts[a]||"";null!==c&&(c+="",c.charAt(0)===b&&(c=c.substring(1)));this._parts[a]=c;this.build(!e);return this}};for(m in q)d[m]=u(m,q[m]);q={search:["?","query"],hash:["#","fragment"]};u=function(a,b){return function(c,e){var d=this[a](c,e);return"string"===typeof d&&d.length?b+d:d}};for(m in q)d[m]=u(q[m][1],q[m][0]);d.pathname=function(a,b){if(void 0===a||!0===a){var c=this._parts.path||(this._parts.hostname?"/":"");return a?e.decodePath(c):c}this._parts.path=a?e.recodePath(a): -"/";this.build(!b);return this};d.path=d.pathname;d.href=function(a,b){var c;if(void 0===a)return this.toString();this._string="";this._parts=e._parts();var g=a instanceof e,d="object"===typeof a&&(a.hostname||a.path||a.pathname);a.nodeName&&(d=e.getDomAttribute(a),a=a[d]||"",d=!1);!g&&d&&void 0!==a.pathname&&(a=a.toString());if("string"===typeof a)this._parts=e.parse(a,this._parts);else if(g||d)for(c in g=g?a._parts:a,g)t.call(this._parts,c)&&(this._parts[c]=g[c]);else throw new TypeError("invalid input"); -this.build(!b);return this};d.is=function(a){var b=!1,c=!1,d=!1,f=!1,k=!1,h=!1,l=!1,m=!this._parts.urn;this._parts.hostname&&(m=!1,c=e.ip4_expression.test(this._parts.hostname),d=e.ip6_expression.test(this._parts.hostname),b=c||d,k=(f=!b)&&v&&v.has(this._parts.hostname),h=f&&e.idn_expression.test(this._parts.hostname),l=f&&e.punycode_expression.test(this._parts.hostname));switch(a.toLowerCase()){case "relative":return m;case "absolute":return!m;case "domain":case "name":return f;case "sld":return k; -case "ip":return b;case "ip4":case "ipv4":case "inet4":return c;case "ip6":case "ipv6":case "inet6":return d;case "idn":return h;case "url":return!this._parts.urn;case "urn":return!!this._parts.urn;case "punycode":return l}return null};var D=d.protocol,E=d.port,F=d.hostname;d.protocol=function(a,b){if(void 0!==a&&a&&(a=a.replace(/:(\/\/)?$/,""),!a.match(e.protocol_expression)))throw new TypeError("Protocol '"+a+"' contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]");return D.call(this, -a,b)};d.scheme=d.protocol;d.port=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a&&(0===a&&(a=null),a&&(a+="",":"===a.charAt(0)&&(a=a.substring(1)),a.match(/[^0-9]/))))throw new TypeError("Port '"+a+"' contains characters other than [0-9]");return E.call(this,a,b)};d.hostname=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a){var c={};e.parseHost(a,c);a=c.hostname}return F.call(this,a,b)};d.host=function(a,b){if(this._parts.urn)return void 0===a?"":this; -if(void 0===a)return this._parts.hostname?e.buildHost(this._parts):"";e.parseHost(a,this._parts);this.build(!b);return this};d.authority=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a)return this._parts.hostname?e.buildAuthority(this._parts):"";e.parseAuthority(a,this._parts);this.build(!b);return this};d.userinfo=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.username)return"";var c=e.buildUserinfo(this._parts);return c.substring(0, -c.length-1)}"@"!==a[a.length-1]&&(a+="@");e.parseUserinfo(a,this._parts);this.build(!b);return this};d.resource=function(a,b){var c;if(void 0===a)return this.path()+this.search()+this.hash();c=e.parse(a);this._parts.path=c.path;this._parts.query=c.query;this._parts.fragment=c.fragment;this.build(!b);return this};d.subdomain=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.length-this.domain().length- -1;return this._parts.hostname.substring(0,c)||""}c=this._parts.hostname.length-this.domain().length;c=this._parts.hostname.substring(0,c);c=RegExp("^"+s(c));a&&"."!==a.charAt(a.length-1)&&(a+=".");a&&e.ensureValidHostname(a);this._parts.hostname=this._parts.hostname.replace(c,a);this.build(!b);return this};d.domain=function(a,b){if(this._parts.urn)return void 0===a?"":this;"boolean"===typeof a&&(b=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.match(/\./g); -if(c&&2>c.length)return this._parts.hostname;c=this._parts.hostname.length-this.tld(b).length-1;c=this._parts.hostname.lastIndexOf(".",c-1)+1;return this._parts.hostname.substring(c)||""}if(!a)throw new TypeError("cannot set domain empty");e.ensureValidHostname(a);!this._parts.hostname||this.is("IP")?this._parts.hostname=a:(c=RegExp(s(this.domain())+"$"),this._parts.hostname=this._parts.hostname.replace(c,a));this.build(!b);return this};d.tld=function(a,b){if(this._parts.urn)return void 0===a?"": -this;"boolean"===typeof a&&(b=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.lastIndexOf("."),c=this._parts.hostname.substring(c+1);return!0!==b&&v&&v.list[c.toLowerCase()]?v.get(this._parts.hostname)||c:c}if(a)if(a.match(/[^a-zA-Z0-9-]/))if(v&&v.is(a))c=RegExp(s(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(c,a);else throw new TypeError("TLD '"+a+"' contains characters other than [A-Z0-9]");else{if(!this._parts.hostname|| -this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");c=RegExp(s(this.tld())+"$");this._parts.hostname=this._parts.hostname.replace(c,a)}else throw new TypeError("cannot set TLD empty");this.build(!b);return this};d.directory=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path&&!this._parts.hostname)return"";if("/"===this._parts.path)return"/";var c=this._parts.path.length-this.filename().length-1,c=this._parts.path.substring(0, -c)||(this._parts.hostname?"/":"");return a?e.decodePath(c):c}c=this._parts.path.length-this.filename().length;c=this._parts.path.substring(0,c);c=RegExp("^"+s(c));this.is("relative")||(a||(a="/"),"/"!==a.charAt(0)&&(a="/"+a));a&&"/"!==a.charAt(a.length-1)&&(a+="/");a=e.recodePath(a);this._parts.path=this._parts.path.replace(c,a);this.build(!b);return this};d.filename=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path||"/"===this._parts.path)return""; -var c=this._parts.path.lastIndexOf("/"),c=this._parts.path.substring(c+1);return a?e.decodePathSegment(c):c}c=!1;"/"===a.charAt(0)&&(a=a.substring(1));a.match(/\.?\//)&&(c=!0);var d=RegExp(s(this.filename())+"$");a=e.recodePath(a);this._parts.path=this._parts.path.replace(d,a);c?this.normalizePath(b):this.build(!b);return this};d.suffix=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path||"/"===this._parts.path)return"";var c=this.filename(),d=c.lastIndexOf("."); -if(-1===d)return"";c=c.substring(d+1);c=/^[a-z0-9%]+$/i.test(c)?c:"";return a?e.decodePathSegment(c):c}"."===a.charAt(0)&&(a=a.substring(1));if(c=this.suffix())d=a?RegExp(s(c)+"$"):RegExp(s("."+c)+"$");else{if(!a)return this;this._parts.path+="."+e.recodePath(a)}d&&(a=e.recodePath(a),this._parts.path=this._parts.path.replace(d,a));this.build(!b);return this};d.segment=function(a,b,c){var e=this._parts.urn?":":"/",d=this.path(),k="/"===d.substring(0,1),d=d.split(e);void 0!==a&&"number"!==typeof a&& -(c=b,b=a,a=void 0);if(void 0!==a&&"number"!==typeof a)throw Error("Bad segment '"+a+"', must be 0-based integer");k&&d.shift();0>a&&(a=Math.max(d.length+a,0));if(void 0===b)return void 0===a?d:d[a];if(null===a||void 0===d[a])if(l(b)){d=[];a=0;for(var h=b.length;a - * Chrome: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.57 Safari/534.24" - * Opera: "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.7; U; en) Presto/2.7.62 Version/11.01" - * Safari: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1" - * IE: "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)" - * IE>=11: "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; Media Center PC 6.0; rv:11.0) like Gecko" - * Firefox: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0) Gecko/20100101 Firefox/4.0" - * iPhone: "Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5" - * iPad: "Mozilla/5.0 (iPad; U; CPU OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5", - * Android: "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; T-Mobile G2 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" - * Touchpad: "Mozilla/5.0 (hp-tabled;Linux;hpwOS/3.0.5; U; en-US)) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.83 Safari/534.6 TouchPad/1.0" - * PhantomJS: "Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.5.0 Safari/534.34" - */ - - var ua = navigator.userAgent - , t = true - , ie = /(msie|trident)/i.test(ua) - , chrome = /chrome|crios/i.test(ua) - , phantom = /phantom/i.test(ua) - , safari = /safari/i.test(ua) && !chrome && !phantom - , iphone = /iphone/i.test(ua) - , ipad = /ipad/i.test(ua) - , touchpad = /touchpad/i.test(ua) - , android = /android/i.test(ua) - , opera = /opera/i.test(ua) || /opr/i.test(ua) - , firefox = /firefox/i.test(ua) - , gecko = /gecko\//i.test(ua) - , seamonkey = /seamonkey\//i.test(ua) - , webkitVersion = /version\/(\d+(\.\d+)?)/i - , firefoxVersion = /firefox\/(\d+(\.\d+)?)/i - , o - - function detect() { - - if (ie) return { - name: 'Internet Explorer' - , msie: t - , version: ua.match(/(msie |rv:)(\d+(\.\d+)?)/i)[2] - } - if (opera) return { - name: 'Opera' - , opera: t - , version: ua.match(webkitVersion) ? ua.match(webkitVersion)[1] : ua.match(/opr\/(\d+(\.\d+)?)/i)[1] - } - if (chrome) return { - name: 'Chrome' - , webkit: t - , chrome: t - , version: ua.match(/(?:chrome|crios)\/(\d+(\.\d+)?)/i)[1] - } - if (phantom) return { - name: 'PhantomJS' - , webkit: t - , phantom: t - , version: ua.match(/phantomjs\/(\d+(\.\d+)+)/i)[1] - } - if (touchpad) return { - name: 'TouchPad' - , webkit: t - , touchpad: t - , version : ua.match(/touchpad\/(\d+(\.\d+)?)/i)[1] - } - if (iphone || ipad) { - o = { - name : iphone ? 'iPhone' : 'iPad' - , webkit: t - , mobile: t - , ios: t - , iphone: iphone - , ipad: ipad - } - // WTF: version is not part of user agent in web apps - if (webkitVersion.test(ua)) { - o.version = ua.match(webkitVersion)[1] - } - return o - } - if (android) return { - name: 'Android' - , webkit: t - , android: t - , mobile: t - , version: (ua.match(webkitVersion) || ua.match(firefoxVersion))[1] - } - if (safari) return { - name: 'Safari' - , webkit: t - , safari: t - , version: ua.match(webkitVersion)[1] - } - if (gecko) { - o = { - name: 'Gecko' - , gecko: t - , mozilla: t - , version: ua.match(firefoxVersion)[1] - } - if (firefox) { - o.name = 'Firefox'; - o.firefox = t; - } - return o - } - if (seamonkey) return { - name: 'SeaMonkey' - , seamonkey: t - , version: ua.match(/seamonkey\/(\d+(\.\d+)?)/i)[1] - } - return {} - } - - var bowser = detect() - - // Graded Browser Support - // http://developer.yahoo.com/yui/articles/gbs - if ((bowser.msie && bowser.version >= 8) || - (bowser.chrome && bowser.version >= 10) || - (bowser.firefox && bowser.version >= 4.0) || - (bowser.safari && bowser.version >= 5) || - (bowser.opera && bowser.version >= 10.0)) { - bowser.a = t; - } - - else if ((bowser.msie && bowser.version < 8) || - (bowser.chrome && bowser.version < 10) || - (bowser.firefox && bowser.version < 4.0) || - (bowser.safari && bowser.version < 5) || - (bowser.opera && bowser.version < 10.0)) { - bowser.c = t - } else bowser.x = t - - return bowser -}); - -"use strict"; -/* - * Bugsense JavaScript SDK v1.1.1 - * http://bugsense.com/ - * - * Copyright 2013 Splunk Inc. - * - */ - -var extend = function(obj) { - each(slice.call(arguments, 1), function(source) { - if (source) { - for (var prop in source) { - obj[prop] = source[prop]; - } - } - }); - return obj; -} -var _has = function(object, key) { - return Object.prototype.hasOwnProperty.call(object, key); -} - -// BEGIN - Extracted from Zepto -var escape = encodeURIComponent; - -Object.keys = Object.keys || function(o) { - var result = []; - for(var name in o) { - if (o.hasOwnProperty(name)) - result.push(name); - } - return result; -}; - -var isObject = function isObject ( instance ) { - return instance instanceof Object; -}; -var array = [] - -var slice = array.slice; - -var isArray = function isArray ( instance ) { - return instance instanceof Array; -}; - -var isValidKeyValue = function isValidKeyValue ( instance ) { - return ( typeof(instance) == 'string' || typeof(instance) == 'number' || typeof(instance) == 'boolean' ); -}; - -/** - * Simple forEach, implements jQuery/Zepto api, sort of, and most likely breaks with arrays: LOL - * @param {Object} obj To be iterated - * @param {Object} iterator Iterator function - */ -var forEach = function forEach ( obj, iterator ) { - Array.prototype.forEach.call( Object.keys( obj ), function ( key ) { - iterator( key, obj[ key ] ); - } ); -}; - -var each = function(obj, iterator, context) { - if (obj == null) return; - var nativeForEach = Array.prototype.forEach; - if (nativeForEach && obj.forEach === nativeForEach) { - obj.forEach(iterator, context); - } else if (obj.length === +obj.length) { - for (var i = 0, length = obj.length; i < length; i++) { - if (iterator.call(context, obj[i], i, obj) === breaker) return; - } - } else { - var keys = _.keys(obj); - for (var i = 0, length = keys.length; i < length; i++) { - if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return; - } - } -}; - -var serialize = function serialize ( params, obj, traditional, scope ) { - var array = isArray( obj ); - - forEach( obj, function ( key, value ) { - if ( scope ) { key = traditional ? scope : scope + '[' + (array ? '' : key) + ']'; } - - // handle data in serializeArray() format - if ( !scope && array ) { - params.add( value.name, value.value ); - // recurse into nested objects - } else if ( traditional ? isArray( value ) : isObject( value ) ) { - serialize( params, value, traditional, key ); - } else { - params.add( key, value ); - } - }); -}; - -var param = function param ( obj, traditional ) { - var params = []; - params.add = function( k, v ){ this.push( escape( k ) + '=' + escape( v ) ); }; - serialize( params, obj, traditional ); - // return params.join( '&' ).replace( /%20/g, '+' ); - return params.join( '&' ); -}; - // END - Extracted from Zepto - -var guid_generator = function GUIDGenerator() { - var S4 = function () { - return Math.floor( - Math.random() * 0x10000 /* 65536 */ - ).toString(16); - }; - return ( - S4() + S4() + "-" + - S4() + "-" + - S4() + "-" + - S4() + "-" + - S4() + S4() + S4() - ); -} - -// Extracted from Backbone; -// Regular expression used to split event strings. -var eventSplitter = /\s+/; - -// Implement fancy features of the Events API such as multiple event -// names `"change blur"` and jQuery-style event maps `{change: action}` -// in terms of the existing API. -var eventsApi = function(obj, action, name, rest) { - if (!name) return true; - - // Handle event maps. - if (typeof name === 'object') { - for (var key in name) { - obj[action].apply(obj, [key, name[key]].concat(rest)); - } - return false; - } - - // Handle space separated event names. - if (eventSplitter.test(name)) { - var names = name.split(eventSplitter); - for (var i = 0, l = names.length; i < l; i++) { - obj[action].apply(obj, [names[i]].concat(rest)); - } - return false; - } - - return true; -}; - -// A difficult-to-believe, but optimized internal dispatch function for -// triggering events. Tries to keep the usual cases speedy (most internal -// Backbone events have 3 arguments). -var triggerEvents = function(events, args) { - var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2]; - switch (args.length) { - case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return; - case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return; - case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return; - case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return; - default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); - } -}; -var _once = function(func) { - var ran = false, memo; - return function() { - if (ran) return memo; - ran = true; - memo = func.apply(this, arguments); - func = null; - return memo; - }; -}; - -var TraceKit = { - linesOfContext: 11 -}; -var UNKNOWN_FUNCTION = ''; -TraceKit.computeStackTrace = (function computeStackTraceWrapper() { - var debug = false, - sourceCache = {}; - function loadSource(url) { - try { - var getXHR = function() { - try { - return new window.XMLHttpRequest(); - } catch (e) { - // explicitly bubble up the exception if not found - return new window.ActiveXObject('Microsoft.XMLHTTP'); - } - }; - - var request = getXHR(); - request.open('GET', url, false); - request.send(''); - return request.responseText; - } catch (e) { - return ''; - } - } - - function getSource(url) { - if (!_has(sourceCache, url)) { - // URL needs to be able to fetched within the acceptable domain. Otherwise, - // cross-domain errors will be triggered. - var source = ''; - if (url.indexOf(document.domain) !== -1) { - source = loadSource(url); - } - sourceCache[url] = source ? source.split('\n') : []; - } - - return sourceCache[url]; - } - function guessFunctionName(url, lineNo) { - var reFunctionArgNames = /function ([^(]*)\(([^)]*)\)/, - reGuessFunction = /['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/, - line = '', - maxLines = 10, - source = getSource(url), - m; - - if (!source.length) { - return UNKNOWN_FUNCTION; - } - - // Walk backwards from the first line in the function until we find the line which - // matches the pattern above, which is the function definition - for (var i = 0; i < maxLines; ++i) { - line = source[lineNo - i] + line; - - if (line) { - if ((m = reGuessFunction.exec(line))) { - return m[1]; - } else if ((m = reFunctionArgNames.exec(line))) { - return m[1]; - } - } - } - - return UNKNOWN_FUNCTION; - } - function gatherContext(url, line) { - var source = getSource(url); - - if (!source.length) { - return null; - } - - var context = [], - // linesBefore & linesAfter are inclusive with the offending line. - // if linesOfContext is even, there will be one extra line - // *before* the offending line. - linesBefore = Math.floor(TraceKit.linesOfContext / 2), - // Add one extra line if linesOfContext is odd - linesAfter = linesBefore + (TraceKit.linesOfContext % 2), - start = Math.max(0, line - linesBefore - 1), - end = Math.min(source.length, line + linesAfter - 1); - - line -= 1; // convert to 0-based index - - for (var i = start; i < end; ++i) { - if (source[i]) { - context.push(source[i]); - } - } - - return context.length > 0 ? context : null; - } - - function escapeRegExp(text) { - return text.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g, '\\$&'); - } - function escapeCodeAsRegExpForMatchingInsideHTML(body) { - return escapeRegExp(body).replace('<', '(?:<|<)').replace('>', '(?:>|>)').replace('&', '(?:&|&)').replace('"', '(?:"|")').replace(/\s+/g, '\\s+'); - } - function findSourceInUrls(re, urls) { - var source, m; - for (var i = 0, j = urls.length; i < j; ++i) { - // console.log('searching', urls[i]); - if ((source = getSource(urls[i])).length) { - source = source.join('\n'); - if ((m = re.exec(source))) { - // console.log('Found function in ' + urls[i]); - - return { - 'url': urls[i], - 'line': source.substring(0, m.index).split('\n').length, - 'column': m.index - source.lastIndexOf('\n', m.index) - 1 - }; - } - } - } - - // console.log('no match'); - - return null; - } - function findSourceInLine(fragment, url, line) { - var source = getSource(url), - re = new RegExp('\\b' + escapeRegExp(fragment) + '\\b'), - m; - - line -= 1; - - if (source && source.length > line && (m = re.exec(source[line]))) { - return m.index; - } - - return null; - } - function findSourceByFunctionBody(func) { - var urls = [window.location.href], - scripts = document.getElementsByTagName('script'), - body, - code = '' + func, - codeRE = /^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/, - eventRE = /^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/, - re, - parts, - result; - - for (var i = 0; i < scripts.length; ++i) { - var script = scripts[i]; - if (script.src) { - urls.push(script.src); - } - } - - if (!(parts = codeRE.exec(code))) { - re = new RegExp(escapeRegExp(code).replace(/\s+/g, '\\s+')); - } - - else { - var name = parts[1] ? '\\s+' + parts[1] : '', - args = parts[2].split(',').join('\\s*,\\s*'); - - body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\s+/g, '\\s+'); - re = new RegExp('function' + name + '\\s*\\(\\s*' + args + '\\s*\\)\\s*{\\s*' + body + '\\s*}'); - } - - if ((result = findSourceInUrls(re, urls))) { - return result; - } - if ((parts = eventRE.exec(code))) { - var event = parts[1]; - body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]); - - // look for a function defined in HTML as an onXXX handler - re = new RegExp('on' + event + '=[\\\'"]\\s*' + body + '\\s*[\\\'"]', 'i'); - - if ((result = findSourceInUrls(re, urls[0]))) { - return result; - } - - // look for ??? - re = new RegExp(body); - - if ((result = findSourceInUrls(re, urls))) { - return result; - } - } - - return null; - } - - function computeStackTraceFromStackProp(ex) { - if (!ex.stack) { - return null; - } - - var chrome = /^\s*at (?:((?:\[object object\])?\S+(?: \[as \S+\])?) )?\(?((?:file|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i, - gecko = /^\s*(\S*)(?:\((.*?)\))?@((?:file|http|https).*?):(\d+)(?::(\d+))?\s*$/i, - lines = ex.stack.split('\n'), - stack = [], - parts, - element, - reference = /^(.*) is undefined$/.exec(ex.message); - - for (var i = 0, j = lines.length; i < j; ++i) { - if ((parts = gecko.exec(lines[i]))) { - element = { - 'url': parts[3], - 'func': parts[1] || UNKNOWN_FUNCTION, - 'args': parts[2] ? parts[2].split(',') : '', - 'line': +parts[4], - 'column': parts[5] ? +parts[5] : null - }; - } else if ((parts = chrome.exec(lines[i]))) { - element = { - 'url': parts[2], - 'func': parts[1] || UNKNOWN_FUNCTION, - 'line': +parts[3], - 'column': parts[4] ? +parts[4] : null - }; - } else { - continue; - } - - if (!element.func && element.line) { - element.func = guessFunctionName(element.url, element.line); - } - - if (element.line) { - element.context = gatherContext(element.url, element.line); - } - - stack.push(element); - } - - if (stack[0] && stack[0].line && !stack[0].column && reference) { - stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line); - } - - if (!stack.length) { - return null; - } - - return { - 'mode': 'stack', - 'name': ex.name, - 'message': ex.message, - 'url': document.location.href, - 'stack': stack, - 'useragent': navigator.userAgent - }; - } - function computeStackTraceFromStacktraceProp(ex) { - // Access and store the stacktrace property before doing ANYTHING - // else to it because Opera is not very good at providing it - // reliably in other circumstances. - var stacktrace = ex.stacktrace; - - var testRE = / line (\d+), column (\d+) in (?:]+)>|([^\)]+))\((.*)\) in (.*):\s*$/i, - lines = stacktrace.split('\n'), - stack = [], - parts; - - for (var i = 0, j = lines.length; i < j; i += 2) { - if ((parts = testRE.exec(lines[i]))) { - var element = { - 'line': +parts[1], - 'column': +parts[2], - 'func': parts[3] || parts[4], - 'args': parts[5] ? parts[5].split(',') : [], - 'url': parts[6] - }; - - if (!element.func && element.line) { - element.func = guessFunctionName(element.url, element.line); - } - if (element.line) { - try { - element.context = gatherContext(element.url, element.line); - } catch (exc) {} - } - - if (!element.context) { - element.context = [lines[i + 1]]; - } - - stack.push(element); - } - } - - if (!stack.length) { - return null; - } - - return { - 'mode': 'stacktrace', - 'name': ex.name, - 'message': ex.message, - 'url': document.location.href, - 'stack': stack, - 'useragent': navigator.userAgent - }; - } - function computeStackTraceFromOperaMultiLineMessage(ex) { - var lines = ex.message.split('\n'); - if (lines.length < 4) { - return null; - } - - var lineRE1 = /^\s*Line (\d+) of linked script ((?:file|http|https)\S+)(?:: in function (\S+))?\s*$/i, - lineRE2 = /^\s*Line (\d+) of inline#(\d+) script in ((?:file|http|https)\S+)(?:: in function (\S+))?\s*$/i, - lineRE3 = /^\s*Line (\d+) of function script\s*$/i, - stack = [], - scripts = document.getElementsByTagName('script'), - inlineScriptBlocks = [], - parts, - i, - len, - source; - - for (i in scripts) { - if (_has(scripts, i) && !scripts[i].src) { - inlineScriptBlocks.push(scripts[i]); - } - } - - for (i = 2, len = lines.length; i < len; i += 2) { - var item = null; - if ((parts = lineRE1.exec(lines[i]))) { - item = { - 'url': parts[2], - 'func': parts[3], - 'line': +parts[1] - }; - } else if ((parts = lineRE2.exec(lines[i]))) { - item = { - 'url': parts[3], - 'func': parts[4] - }; - var relativeLine = (+parts[1]); // relative to the start of the } - *
            • define style rules. See the example page for examples. - *
            • mark the {@code
              } and {@code } tags in your source with
              - *    {@code class=prettyprint.}
              - *    You can also use the (html deprecated) {@code } tag, but the pretty
              - *    printer needs to do more substantial DOM manipulations to support that, so
              - *    some css styles may not be preserved.
              - * </ol>
              - * That's it.  I wanted to keep the API as simple as possible, so there's no
              - * need to specify which language the code is in, but if you wish, you can add
              - * another class to the {@code <pre>} or {@code <code>} element to specify the
              - * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
              - * starts with "lang-" followed by a file extension, specifies the file type.
              - * See the "lang-*.js" files in this directory for code that implements
              - * per-language file handlers.
              - * <p>
              - * Change log:<br>
              - * cbeust, 2006/08/22
              - * <blockquote>
              - *   Java annotations (start with "@") are now captured as literals ("lit")
              - * </blockquote>
              - * @requires console
              - */
              -
              -// JSLint declarations
              -/*global console, document, navigator, setTimeout, window, define */
              -
              -/** @define {boolean} */
              -var IN_GLOBAL_SCOPE = true;
              -
              -/**
              - * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
              - * UI events.
              - * If set to {@code false}, {@code prettyPrint()} is synchronous.
              - */
              -window['PR_SHOULD_USE_CONTINUATION'] = true;
              -
              -/**
              - * Pretty print a chunk of code.
              - * @param {string} sourceCodeHtml The HTML to pretty print.
              - * @param {string} opt_langExtension The language name to use.
              - *     Typically, a filename extension like 'cpp' or 'java'.
              - * @param {number|boolean} opt_numberLines True to number lines,
              - *     or the 1-indexed number of the first line in sourceCodeHtml.
              - * @return {string} code as html, but prettier
              - */
              -var prettyPrintOne;
              -/**
              - * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
              - * {@code class=prettyprint} and prettify them.
              - *
              - * @param {Function} opt_whenDone called when prettifying is done.
              - * @param {HTMLElement|HTMLDocument} opt_root an element or document
              - *   containing all the elements to pretty print.
              - *   Defaults to {@code document.body}.
              - */
              -var prettyPrint;
              -
              -
              -(function () {
              -  var win = window;
              -  // Keyword lists for various languages.
              -  // We use things that coerce to strings to make them compact when minified
              -  // and to defeat aggressive optimizers that fold large string constants.
              -  var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
              -  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," + 
              -      "double,enum,extern,float,goto,inline,int,long,register,short,signed," +
              -      "sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];
              -  var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
              -      "new,operator,private,protected,public,this,throw,true,try,typeof"];
              -  var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignof,align_union,asm,axiom,bool," +
              -      "concept,concept_map,const_cast,constexpr,decltype,delegate," +
              -      "dynamic_cast,explicit,export,friend,generic,late_check," +
              -      "mutable,namespace,nullptr,property,reinterpret_cast,static_assert," +
              -      "static_cast,template,typeid,typename,using,virtual,where"];
              -  var JAVA_KEYWORDS = [COMMON_KEYWORDS,
              -      "abstract,assert,boolean,byte,extends,final,finally,implements,import," +
              -      "instanceof,interface,null,native,package,strictfp,super,synchronized," +
              -      "throws,transient"];
              -  var CSHARP_KEYWORDS = [JAVA_KEYWORDS,
              -      "as,base,by,checked,decimal,delegate,descending,dynamic,event," +
              -      "fixed,foreach,from,group,implicit,in,internal,into,is,let," +
              -      "lock,object,out,override,orderby,params,partial,readonly,ref,sbyte," +
              -      "sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort," +
              -      "var,virtual,where"];
              -  var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
              -      "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
              -      "throw,true,try,unless,until,when,while,yes";
              -  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
              -      "debugger,eval,export,function,get,null,set,undefined,var,with," +
              -      "Infinity,NaN"];
              -  var PERL_KEYWORDS = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for," +
              -      "goto,if,import,last,local,my,next,no,our,print,package,redo,require," +
              -      "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
              -  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
              -      "elif,except,exec,finally,from,global,import,in,is,lambda," +
              -      "nonlocal,not,or,pass,print,raise,try,with,yield," +
              -      "False,True,None"];
              -  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
              -      "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
              -      "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
              -      "BEGIN,END"];
              -   var RUST_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "as,assert,const,copy,drop," +
              -      "enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv," +
              -      "pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"];
              -  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
              -      "function,in,local,set,then,until"];
              -  var ALL_KEYWORDS = [
              -      CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS,
              -      PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];
              -  var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;
              -
              -  // token style names.  correspond to css classes
              -  /**
              -   * token style for a string literal
              -   * @const
              -   */
              -  var PR_STRING = 'str';
              -  /**
              -   * token style for a keyword
              -   * @const
              -   */
              -  var PR_KEYWORD = 'kwd';
              -  /**
              -   * token style for a comment
              -   * @const
              -   */
              -  var PR_COMMENT = 'com';
              -  /**
              -   * token style for a type
              -   * @const
              -   */
              -  var PR_TYPE = 'typ';
              -  /**
              -   * token style for a literal value.  e.g. 1, null, true.
              -   * @const
              -   */
              -  var PR_LITERAL = 'lit';
              -  /**
              -   * token style for a punctuation string.
              -   * @const
              -   */
              -  var PR_PUNCTUATION = 'pun';
              -  /**
              -   * token style for plain text.
              -   * @const
              -   */
              -  var PR_PLAIN = 'pln';
              -
              -  /**
              -   * token style for an sgml tag.
              -   * @const
              -   */
              -  var PR_TAG = 'tag';
              -  /**
              -   * token style for a markup declaration such as a DOCTYPE.
              -   * @const
              -   */
              -  var PR_DECLARATION = 'dec';
              -  /**
              -   * token style for embedded source.
              -   * @const
              -   */
              -  var PR_SOURCE = 'src';
              -  /**
              -   * token style for an sgml attribute name.
              -   * @const
              -   */
              -  var PR_ATTRIB_NAME = 'atn';
              -  /**
              -   * token style for an sgml attribute value.
              -   * @const
              -   */
              -  var PR_ATTRIB_VALUE = 'atv';
              -
              -  /**
              -   * A class that indicates a section of markup that is not code, e.g. to allow
              -   * embedding of line numbers within code listings.
              -   * @const
              -   */
              -  var PR_NOCODE = 'nocode';
              -
              -  
              -  
              -  /**
              -   * A set of tokens that can precede a regular expression literal in
              -   * javascript
              -   * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
              -   * has the full list, but I've removed ones that might be problematic when
              -   * seen in languages that don't support regular expression literals.
              -   *
              -   * <p>Specifically, I've removed any keywords that can't precede a regexp
              -   * literal in a syntactically legal javascript program, and I've removed the
              -   * "in" keyword since it's not a keyword in many languages, and might be used
              -   * as a count of inches.
              -   *
              -   * <p>The link above does not accurately describe EcmaScript rules since
              -   * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
              -   * very well in practice.
              -   *
              -   * @private
              -   * @const
              -   */
              -  var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
              -  
              -  // CAVEAT: this does not properly handle the case where a regular
              -  // expression immediately follows another since a regular expression may
              -  // have flags for case-sensitivity and the like.  Having regexp tokens
              -  // adjacent is not valid in any language I'm aware of, so I'm punting.
              -  // TODO: maybe style special characters inside a regexp as punctuation.
              -
              -  /**
              -   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
              -   * matches the union of the sets of strings matched by the input RegExp.
              -   * Since it matches globally, if the input strings have a start-of-input
              -   * anchor (/^.../), it is ignored for the purposes of unioning.
              -   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
              -   * @return {RegExp} a global regex.
              -   */
              -  function combinePrefixPatterns(regexs) {
              -    var capturedGroupIndex = 0;
              -  
              -    var needToFoldCase = false;
              -    var ignoreCase = false;
              -    for (var i = 0, n = regexs.length; i < n; ++i) {
              -      var regex = regexs[i];
              -      if (regex.ignoreCase) {
              -        ignoreCase = true;
              -      } else if (/[a-z]/i.test(regex.source.replace(
              -                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
              -        needToFoldCase = true;
              -        ignoreCase = false;
              -        break;
              -      }
              -    }
              -  
              -    var escapeCharToCodeUnit = {
              -      'b': 8,
              -      't': 9,
              -      'n': 0xa,
              -      'v': 0xb,
              -      'f': 0xc,
              -      'r': 0xd
              -    };
              -  
              -    function decodeEscape(charsetPart) {
              -      var cc0 = charsetPart.charCodeAt(0);
              -      if (cc0 !== 92 /* \\ */) {
              -        return cc0;
              -      }
              -      var c1 = charsetPart.charAt(1);
              -      cc0 = escapeCharToCodeUnit[c1];
              -      if (cc0) {
              -        return cc0;
              -      } else if ('0' <= c1 && c1 <= '7') {
              -        return parseInt(charsetPart.substring(1), 8);
              -      } else if (c1 === 'u' || c1 === 'x') {
              -        return parseInt(charsetPart.substring(2), 16);
              -      } else {
              -        return charsetPart.charCodeAt(1);
              -      }
              -    }
              -  
              -    function encodeEscape(charCode) {
              -      if (charCode < 0x20) {
              -        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
              -      }
              -      var ch = String.fromCharCode(charCode);
              -      return (ch === '\\' || ch === '-' || ch === ']' || ch === '^')
              -          ? "\\" + ch : ch;
              -    }
              -  
              -    function caseFoldCharset(charSet) {
              -      var charsetParts = charSet.substring(1, charSet.length - 1).match(
              -          new RegExp(
              -              '\\\\u[0-9A-Fa-f]{4}'
              -              + '|\\\\x[0-9A-Fa-f]{2}'
              -              + '|\\\\[0-3][0-7]{0,2}'
              -              + '|\\\\[0-7]{1,2}'
              -              + '|\\\\[\\s\\S]'
              -              + '|-'
              -              + '|[^-\\\\]',
              -              'g'));
              -      var ranges = [];
              -      var inverse = charsetParts[0] === '^';
              -  
              -      var out = ['['];
              -      if (inverse) { out.push('^'); }
              -  
              -      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
              -        var p = charsetParts[i];
              -        if (/\\[bdsw]/i.test(p)) {  // Don't muck with named groups.
              -          out.push(p);
              -        } else {
              -          var start = decodeEscape(p);
              -          var end;
              -          if (i + 2 < n && '-' === charsetParts[i + 1]) {
              -            end = decodeEscape(charsetParts[i + 2]);
              -            i += 2;
              -          } else {
              -            end = start;
              -          }
              -          ranges.push([start, end]);
              -          // If the range might intersect letters, then expand it.
              -          // This case handling is too simplistic.
              -          // It does not deal with non-latin case folding.
              -          // It works for latin source code identifiers though.
              -          if (!(end < 65 || start > 122)) {
              -            if (!(end < 65 || start > 90)) {
              -              ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
              -            }
              -            if (!(end < 97 || start > 122)) {
              -              ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
              -            }
              -          }
              -        }
              -      }
              -  
              -      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
              -      // -> [[1, 12], [14, 14], [16, 17]]
              -      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
              -      var consolidatedRanges = [];
              -      var lastRange = [];
              -      for (var i = 0; i < ranges.length; ++i) {
              -        var range = ranges[i];
              -        if (range[0] <= lastRange[1] + 1) {
              -          lastRange[1] = Math.max(lastRange[1], range[1]);
              -        } else {
              -          consolidatedRanges.push(lastRange = range);
              -        }
              -      }
              -  
              -      for (var i = 0; i < consolidatedRanges.length; ++i) {
              -        var range = consolidatedRanges[i];
              -        out.push(encodeEscape(range[0]));
              -        if (range[1] > range[0]) {
              -          if (range[1] + 1 > range[0]) { out.push('-'); }
              -          out.push(encodeEscape(range[1]));
              -        }
              -      }
              -      out.push(']');
              -      return out.join('');
              -    }
              -  
              -    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
              -      // Split into character sets, escape sequences, punctuation strings
              -      // like ('(', '(?:', ')', '^'), and runs of characters that do not
              -      // include any of the above.
              -      var parts = regex.source.match(
              -          new RegExp(
              -              '(?:'
              -              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
              -              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
              -              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
              -              + '|\\\\[0-9]+'  // a back-reference or octal escape
              -              + '|\\\\[^ux0-9]'  // other escape sequence
              -              + '|\\(\\?[:!=]'  // start of a non-capturing group
              -              + '|[\\(\\)\\^]'  // start/end of a group, or line start
              -              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
              -              + ')',
              -              'g'));
              -      var n = parts.length;
              -  
              -      // Maps captured group numbers to the number they will occupy in
              -      // the output or to -1 if that has not been determined, or to
              -      // undefined if they need not be capturing in the output.
              -      var capturedGroups = [];
              -  
              -      // Walk over and identify back references to build the capturedGroups
              -      // mapping.
              -      for (var i = 0, groupIndex = 0; i < n; ++i) {
              -        var p = parts[i];
              -        if (p === '(') {
              -          // groups are 1-indexed, so max group index is count of '('
              -          ++groupIndex;
              -        } else if ('\\' === p.charAt(0)) {
              -          var decimalValue = +p.substring(1);
              -          if (decimalValue) {
              -            if (decimalValue <= groupIndex) {
              -              capturedGroups[decimalValue] = -1;
              -            } else {
              -              // Replace with an unambiguous escape sequence so that
              -              // an octal escape sequence does not turn into a backreference
              -              // to a capturing group from an earlier regex.
              -              parts[i] = encodeEscape(decimalValue);
              -            }
              -          }
              -        }
              -      }
              -  
              -      // Renumber groups and reduce capturing groups to non-capturing groups
              -      // where possible.
              -      for (var i = 1; i < capturedGroups.length; ++i) {
              -        if (-1 === capturedGroups[i]) {
              -          capturedGroups[i] = ++capturedGroupIndex;
              -        }
              -      }
              -      for (var i = 0, groupIndex = 0; i < n; ++i) {
              -        var p = parts[i];
              -        if (p === '(') {
              -          ++groupIndex;
              -          if (!capturedGroups[groupIndex]) {
              -            parts[i] = '(?:';
              -          }
              -        } else if ('\\' === p.charAt(0)) {
              -          var decimalValue = +p.substring(1);
              -          if (decimalValue && decimalValue <= groupIndex) {
              -            parts[i] = '\\' + capturedGroups[decimalValue];
              -          }
              -        }
              -      }
              -  
              -      // Remove any prefix anchors so that the output will match anywhere.
              -      // ^^ really does mean an anchored match though.
              -      for (var i = 0; i < n; ++i) {
              -        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
              -      }
              -  
              -      // Expand letters to groups to handle mixing of case-sensitive and
              -      // case-insensitive patterns if necessary.
              -      if (regex.ignoreCase && needToFoldCase) {
              -        for (var i = 0; i < n; ++i) {
              -          var p = parts[i];
              -          var ch0 = p.charAt(0);
              -          if (p.length >= 2 && ch0 === '[') {
              -            parts[i] = caseFoldCharset(p);
              -          } else if (ch0 !== '\\') {
              -            // TODO: handle letters in numeric escapes.
              -            parts[i] = p.replace(
              -                /[a-zA-Z]/g,
              -                function (ch) {
              -                  var cc = ch.charCodeAt(0);
              -                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
              -                });
              -          }
              -        }
              -      }
              -  
              -      return parts.join('');
              -    }
              -  
              -    var rewritten = [];
              -    for (var i = 0, n = regexs.length; i < n; ++i) {
              -      var regex = regexs[i];
              -      if (regex.global || regex.multiline) { throw new Error('' + regex); }
              -      rewritten.push(
              -          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
              -    }
              -  
              -    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
              -  }
              -
              -  /**
              -   * Split markup into a string of source code and an array mapping ranges in
              -   * that string to the text nodes in which they appear.
              -   *
              -   * <p>
              -   * The HTML DOM structure:</p>
              -   * <pre>
              -   * (Element   "p"
              -   *   (Element "b"
              -   *     (Text  "print "))       ; #1
              -   *   (Text    "'Hello '")      ; #2
              -   *   (Element "br")            ; #3
              -   *   (Text    "  + 'World';")) ; #4
              -   * </pre>
              -   * <p>
              -   * corresponds to the HTML
              -   * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>
              -   *
              -   * <p>
              -   * It will produce the output:</p>
              -   * <pre>
              -   * {
              -   *   sourceCode: "print 'Hello '\n  + 'World';",
              -   *   //                     1          2
              -   *   //           012345678901234 5678901234567
              -   *   spans: [0, #1, 6, #2, 14, #3, 15, #4]
              -   * }
              -   * </pre>
              -   * <p>
              -   * where #1 is a reference to the {@code "print "} text node above, and so
              -   * on for the other text nodes.
              -   * </p>
              -   *
              -   * <p>
              -   * The {@code} spans array is an array of pairs.  Even elements are the start
              -   * indices of substrings, and odd elements are the text nodes (or BR elements)
              -   * that contain the text for those substrings.
              -   * Substrings continue until the next index or the end of the source.
              -   * </p>
              -   *
              -   * @param {Node} node an HTML DOM subtree containing source-code.
              -   * @param {boolean} isPreformatted true if white-space in text nodes should
              -   *    be considered significant.
              -   * @return {Object} source code and the text nodes in which they occur.
              -   */
              -  function extractSourceSpans(node, isPreformatted) {
              -    var nocode = /(?:^|\s)nocode(?:\s|$)/;
              -  
              -    var chunks = [];
              -    var length = 0;
              -    var spans = [];
              -    var k = 0;
              -  
              -    function walk(node) {
              -      var type = node.nodeType;
              -      if (type == 1) {  // Element
              -        if (nocode.test(node.className)) { return; }
              -        for (var child = node.firstChild; child; child = child.nextSibling) {
              -          walk(child);
              -        }
              -        var nodeName = node.nodeName.toLowerCase();
              -        if ('br' === nodeName || 'li' === nodeName) {
              -          chunks[k] = '\n';
              -          spans[k << 1] = length++;
              -          spans[(k++ << 1) | 1] = node;
              -        }
              -      } else if (type == 3 || type == 4) {  // Text
              -        var text = node.nodeValue;
              -        if (text.length) {
              -          if (!isPreformatted) {
              -            text = text.replace(/[ \t\r\n]+/g, ' ');
              -          } else {
              -            text = text.replace(/\r\n?/g, '\n');  // Normalize newlines.
              -          }
              -          // TODO: handle tabs here?
              -          chunks[k] = text;
              -          spans[k << 1] = length;
              -          length += text.length;
              -          spans[(k++ << 1) | 1] = node;
              -        }
              -      }
              -    }
              -  
              -    walk(node);
              -  
              -    return {
              -      sourceCode: chunks.join('').replace(/\n$/, ''),
              -      spans: spans
              -    };
              -  }
              -
              -  /**
              -   * Apply the given language handler to sourceCode and add the resulting
              -   * decorations to out.
              -   * @param {number} basePos the index of sourceCode within the chunk of source
              -   *    whose decorations are already present on out.
              -   */
              -  function appendDecorations(basePos, sourceCode, langHandler, out) {
              -    if (!sourceCode) { return; }
              -    var job = {
              -      sourceCode: sourceCode,
              -      basePos: basePos
              -    };
              -    langHandler(job);
              -    out.push.apply(out, job.decorations);
              -  }
              -
              -  var notWs = /\S/;
              -
              -  /**
              -   * Given an element, if it contains only one child element and any text nodes
              -   * it contains contain only space characters, return the sole child element.
              -   * Otherwise returns undefined.
              -   * <p>
              -   * This is meant to return the CODE element in {@code <pre><code ...>} when
              -   * there is a single child element that contains all the non-space textual
              -   * content, but not to return anything where there are multiple child elements
              -   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
              -   * is textual content.
              -   */
              -  function childContentWrapper(element) {
              -    var wrapper = undefined;
              -    for (var c = element.firstChild; c; c = c.nextSibling) {
              -      var type = c.nodeType;
              -      wrapper = (type === 1)  // Element Node
              -          ? (wrapper ? element : c)
              -          : (type === 3)  // Text Node
              -          ? (notWs.test(c.nodeValue) ? element : wrapper)
              -          : wrapper;
              -    }
              -    return wrapper === element ? undefined : wrapper;
              -  }
              -
              -  /** Given triples of [style, pattern, context] returns a lexing function,
              -    * The lexing function interprets the patterns to find token boundaries and
              -    * returns a decoration list of the form
              -    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
              -    * where index_n is an index into the sourceCode, and style_n is a style
              -    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
              -    * all characters in sourceCode[index_n-1:index_n].
              -    *
              -    * The stylePatterns is a list whose elements have the form
              -    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
              -    *
              -    * Style is a style constant like PR_PLAIN, or can be a string of the
              -    * form 'lang-FOO', where FOO is a language extension describing the
              -    * language of the portion of the token in $1 after pattern executes.
              -    * E.g., if style is 'lang-lisp', and group 1 contains the text
              -    * '(hello (world))', then that portion of the token will be passed to the
              -    * registered lisp handler for formatting.
              -    * The text before and after group 1 will be restyled using this decorator
              -    * so decorators should take care that this doesn't result in infinite
              -    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
              -    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
              -    * '<script>foo()<\/script>', which would cause the current decorator to
              -    * be called with '<script>' which would not match the same rule since
              -    * group 1 must not be empty, so it would be instead styled as PR_TAG by
              -    * the generic tag rule.  The handler registered for the 'js' extension would
              -    * then be called with 'foo()', and finally, the current decorator would
              -    * be called with '<\/script>' which would not match the original rule and
              -    * so the generic tag rule would identify it as a tag.
              -    *
              -    * Pattern must only match prefixes, and if it matches a prefix, then that
              -    * match is considered a token with the same style.
              -    *
              -    * Context is applied to the last non-whitespace, non-comment token
              -    * recognized.
              -    *
              -    * Shortcut is an optional string of characters, any of which, if the first
              -    * character, gurantee that this pattern and only this pattern matches.
              -    *
              -    * @param {Array} shortcutStylePatterns patterns that always start with
              -    *   a known character.  Must have a shortcut string.
              -    * @param {Array} fallthroughStylePatterns patterns that will be tried in
              -    *   order if the shortcut ones fail.  May have shortcuts.
              -    *
              -    * @return {function (Object)} a
              -    *   function that takes source code and returns a list of decorations.
              -    */
              -  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
              -    var shortcuts = {};
              -    var tokenizer;
              -    (function () {
              -      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
              -      var allRegexs = [];
              -      var regexKeys = {};
              -      for (var i = 0, n = allPatterns.length; i < n; ++i) {
              -        var patternParts = allPatterns[i];
              -        var shortcutChars = patternParts[3];
              -        if (shortcutChars) {
              -          for (var c = shortcutChars.length; --c >= 0;) {
              -            shortcuts[shortcutChars.charAt(c)] = patternParts;
              -          }
              -        }
              -        var regex = patternParts[1];
              -        var k = '' + regex;
              -        if (!regexKeys.hasOwnProperty(k)) {
              -          allRegexs.push(regex);
              -          regexKeys[k] = null;
              -        }
              -      }
              -      allRegexs.push(/[\0-\uffff]/);
              -      tokenizer = combinePrefixPatterns(allRegexs);
              -    })();
              -
              -    var nPatterns = fallthroughStylePatterns.length;
              -
              -    /**
              -     * Lexes job.sourceCode and produces an output array job.decorations of
              -     * style classes preceded by the position at which they start in
              -     * job.sourceCode in order.
              -     *
              -     * @param {Object} job an object like <pre>{
              -     *    sourceCode: {string} sourceText plain text,
              -     *    basePos: {int} position of job.sourceCode in the larger chunk of
              -     *        sourceCode.
              -     * }</pre>
              -     */
              -    var decorate = function (job) {
              -      var sourceCode = job.sourceCode, basePos = job.basePos;
              -      /** Even entries are positions in source in ascending order.  Odd enties
              -        * are style markers (e.g., PR_COMMENT) that run from that position until
              -        * the end.
              -        * @type {Array.<number|string>}
              -        */
              -      var decorations = [basePos, PR_PLAIN];
              -      var pos = 0;  // index into sourceCode
              -      var tokens = sourceCode.match(tokenizer) || [];
              -      var styleCache = {};
              -
              -      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
              -        var token = tokens[ti];
              -        var style = styleCache[token];
              -        var match = void 0;
              -
              -        var isEmbedded;
              -        if (typeof style === 'string') {
              -          isEmbedded = false;
              -        } else {
              -          var patternParts = shortcuts[token.charAt(0)];
              -          if (patternParts) {
              -            match = token.match(patternParts[1]);
              -            style = patternParts[0];
              -          } else {
              -            for (var i = 0; i < nPatterns; ++i) {
              -              patternParts = fallthroughStylePatterns[i];
              -              match = token.match(patternParts[1]);
              -              if (match) {
              -                style = patternParts[0];
              -                break;
              -              }
              -            }
              -
              -            if (!match) {  // make sure that we make progress
              -              style = PR_PLAIN;
              -            }
              -          }
              -
              -          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
              -          if (isEmbedded && !(match && typeof match[1] === 'string')) {
              -            isEmbedded = false;
              -            style = PR_SOURCE;
              -          }
              -
              -          if (!isEmbedded) { styleCache[token] = style; }
              -        }
              -
              -        var tokenStart = pos;
              -        pos += token.length;
              -
              -        if (!isEmbedded) {
              -          decorations.push(basePos + tokenStart, style);
              -        } else {  // Treat group 1 as an embedded block of source code.
              -          var embeddedSource = match[1];
              -          var embeddedSourceStart = token.indexOf(embeddedSource);
              -          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
              -          if (match[2]) {
              -            // If embeddedSource can be blank, then it would match at the
              -            // beginning which would cause us to infinitely recurse on the
              -            // entire token, so we catch the right context in match[2].
              -            embeddedSourceEnd = token.length - match[2].length;
              -            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
              -          }
              -          var lang = style.substring(5);
              -          // Decorate the left of the embedded source
              -          appendDecorations(
              -              basePos + tokenStart,
              -              token.substring(0, embeddedSourceStart),
              -              decorate, decorations);
              -          // Decorate the embedded source
              -          appendDecorations(
              -              basePos + tokenStart + embeddedSourceStart,
              -              embeddedSource,
              -              langHandlerForExtension(lang, embeddedSource),
              -              decorations);
              -          // Decorate the right of the embedded section
              -          appendDecorations(
              -              basePos + tokenStart + embeddedSourceEnd,
              -              token.substring(embeddedSourceEnd),
              -              decorate, decorations);
              -        }
              -      }
              -      job.decorations = decorations;
              -    };
              -    return decorate;
              -  }
              -
              -  /** returns a function that produces a list of decorations from source text.
              -    *
              -    * This code treats ", ', and ` as string delimiters, and \ as a string
              -    * escape.  It does not recognize perl's qq() style strings.
              -    * It has no special handling for double delimiter escapes as in basic, or
              -    * the tripled delimiters used in python, but should work on those regardless
              -    * although in those cases a single string literal may be broken up into
              -    * multiple adjacent string literals.
              -    *
              -    * It recognizes C, C++, and shell style comments.
              -    *
              -    * @param {Object} options a set of optional parameters.
              -    * @return {function (Object)} a function that examines the source code
              -    *     in the input job and builds the decoration list.
              -    */
              -  function sourceDecorator(options) {
              -    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
              -    if (options['tripleQuotedStrings']) {
              -      // '''multi-line-string''', 'single-line-string', and double-quoted
              -      shortcutStylePatterns.push(
              -          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
              -           null, '\'"']);
              -    } else if (options['multiLineStrings']) {
              -      // 'multi-line-string', "multi-line-string"
              -      shortcutStylePatterns.push(
              -          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
              -           null, '\'"`']);
              -    } else {
              -      // 'single-line-string', "single-line-string"
              -      shortcutStylePatterns.push(
              -          [PR_STRING,
              -           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
              -           null, '"\'']);
              -    }
              -    if (options['verbatimStrings']) {
              -      // verbatim-string-literal production from the C# grammar.  See issue 93.
              -      fallthroughStylePatterns.push(
              -          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
              -    }
              -    var hc = options['hashComments'];
              -    if (hc) {
              -      if (options['cStyleComments']) {
              -        if (hc > 1) {  // multiline hash comments
              -          shortcutStylePatterns.push(
              -              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
              -        } else {
              -          // Stop C preprocessor declarations at an unclosed open comment
              -          shortcutStylePatterns.push(
              -              [PR_COMMENT, /^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,
              -               null, '#']);
              -        }
              -        // #include <stdio.h>
              -        fallthroughStylePatterns.push(
              -            [PR_STRING,
              -             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,
              -             null]);
              -      } else {
              -        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
              -      }
              -    }
              -    if (options['cStyleComments']) {
              -      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
              -      fallthroughStylePatterns.push(
              -          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
              -    }
              -    var regexLiterals = options['regexLiterals'];
              -    if (regexLiterals) {
              -      /**
              -       * @const
              -       */
              -      var regexExcls = regexLiterals > 1
              -        ? ''  // Multiline regex literals
              -        : '\n\r';
              -      /**
              -       * @const
              -       */
              -      var regexAny = regexExcls ? '.' : '[\\S\\s]';
              -      /**
              -       * @const
              -       */
              -      var REGEX_LITERAL = (
              -          // A regular expression literal starts with a slash that is
              -          // not followed by * or / so that it is not confused with
              -          // comments.
              -          '/(?=[^/*' + regexExcls + '])'
              -          // and then contains any number of raw characters,
              -          + '(?:[^/\\x5B\\x5C' + regexExcls + ']'
              -          // escape sequences (\x5C),
              -          +    '|\\x5C' + regexAny
              -          // or non-nesting character sets (\x5B\x5D);
              -          +    '|\\x5B(?:[^\\x5C\\x5D' + regexExcls + ']'
              -          +             '|\\x5C' + regexAny + ')*(?:\\x5D|$))+'
              -          // finally closed by a /.
              -          + '/');
              -      fallthroughStylePatterns.push(
              -          ['lang-regex',
              -           RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
              -           ]);
              -    }
              -
              -    var types = options['types'];
              -    if (types) {
              -      fallthroughStylePatterns.push([PR_TYPE, types]);
              -    }
              -
              -    var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
              -    if (keywords.length) {
              -      fallthroughStylePatterns.push(
              -          [PR_KEYWORD,
              -           new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
              -           null]);
              -    }
              -
              -    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
              -
              -    var punctuation =
              -      // The Bash man page says
              -
              -      // A word is a sequence of characters considered as a single
              -      // unit by GRUB. Words are separated by metacharacters,
              -      // which are the following plus space, tab, and newline: { }
              -      // | & $ ; < >
              -      // ...
              -      
              -      // A word beginning with # causes that word and all remaining
              -      // characters on that line to be ignored.
              -
              -      // which means that only a '#' after /(?:^|[{}|&$;<>\s])/ starts a
              -      // comment but empirically
              -      // $ echo {#}
              -      // {#}
              -      // $ echo \$#
              -      // $#
              -      // $ echo }#
              -      // }#
              -
              -      // so /(?:^|[|&;<>\s])/ is more appropriate.
              -
              -      // http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC3
              -      // suggests that this definition is compatible with a
              -      // default mode that tries to use a single token definition
              -      // to recognize both bash/python style comments and C
              -      // preprocessor directives.
              -
              -      // This definition of punctuation does not include # in the list of
              -      // follow-on exclusions, so # will not be broken before if preceeded
              -      // by a punctuation character.  We could try to exclude # after
              -      // [|&;<>] but that doesn't seem to cause many major problems.
              -      // If that does turn out to be a problem, we should change the below
              -      // when hc is truthy to include # in the run of punctuation characters
              -      // only when not followint [|&;<>].
              -      '^.[^\\s\\w.$@\'"`/\\\\]*';
              -    if (options['regexLiterals']) {
              -      punctuation += '(?!\s*\/)';
              -    }
              -
              -    fallthroughStylePatterns.push(
              -        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
              -        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
              -        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null],
              -        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
              -        [PR_LITERAL,
              -         new RegExp(
              -             '^(?:'
              -             // A hex number
              -             + '0x[a-f0-9]+'
              -             // or an octal or decimal number,
              -             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
              -             // possibly in scientific notation
              -             + '(?:e[+\\-]?\\d+)?'
              -             + ')'
              -             // with an optional modifier like UL for unsigned long
              -             + '[a-z]*', 'i'),
              -         null, '0123456789'],
              -        // Don't treat escaped quotes in bash as starting strings.
              -        // See issue 144.
              -        [PR_PLAIN,       /^\\[\s\S]?/, null],
              -        [PR_PUNCTUATION, new RegExp(punctuation), null]);
              -
              -    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
              -  }
              -
              -  var decorateSource = sourceDecorator({
              -        'keywords': ALL_KEYWORDS,
              -        'hashComments': true,
              -        'cStyleComments': true,
              -        'multiLineStrings': true,
              -        'regexLiterals': true
              -      });
              -
              -  /**
              -   * Given a DOM subtree, wraps it in a list, and puts each line into its own
              -   * list item.
              -   *
              -   * @param {Node} node modified in place.  Its content is pulled into an
              -   *     HTMLOListElement, and each line is moved into a separate list item.
              -   *     This requires cloning elements, so the input might not have unique
              -   *     IDs after numbering.
              -   * @param {boolean} isPreformatted true iff white-space in text nodes should
              -   *     be treated as significant.
              -   */
              -  function numberLines(node, opt_startLineNum, isPreformatted) {
              -    var nocode = /(?:^|\s)nocode(?:\s|$)/;
              -    var lineBreak = /\r\n?|\n/;
              -  
              -    var document = node.ownerDocument;
              -  
              -    var li = document.createElement('li');
              -    while (node.firstChild) {
              -      li.appendChild(node.firstChild);
              -    }
              -    // An array of lines.  We split below, so this is initialized to one
              -    // un-split line.
              -    var listItems = [li];
              -  
              -    function walk(node) {
              -      var type = node.nodeType;
              -      if (type == 1 && !nocode.test(node.className)) {  // Element
              -        if ('br' === node.nodeName) {
              -          breakAfter(node);
              -          // Discard the <BR> since it is now flush against a </LI>.
              -          if (node.parentNode) {
              -            node.parentNode.removeChild(node);
              -          }
              -        } else {
              -          for (var child = node.firstChild; child; child = child.nextSibling) {
              -            walk(child);
              -          }
              -        }
              -      } else if ((type == 3 || type == 4) && isPreformatted) {  // Text
              -        var text = node.nodeValue;
              -        var match = text.match(lineBreak);
              -        if (match) {
              -          var firstLine = text.substring(0, match.index);
              -          node.nodeValue = firstLine;
              -          var tail = text.substring(match.index + match[0].length);
              -          if (tail) {
              -            var parent = node.parentNode;
              -            parent.insertBefore(
              -              document.createTextNode(tail), node.nextSibling);
              -          }
              -          breakAfter(node);
              -          if (!firstLine) {
              -            // Don't leave blank text nodes in the DOM.
              -            node.parentNode.removeChild(node);
              -          }
              -        }
              -      }
              -    }
              -  
              -    // Split a line after the given node.
              -    function breakAfter(lineEndNode) {
              -      // If there's nothing to the right, then we can skip ending the line
              -      // here, and move root-wards since splitting just before an end-tag
              -      // would require us to create a bunch of empty copies.
              -      while (!lineEndNode.nextSibling) {
              -        lineEndNode = lineEndNode.parentNode;
              -        if (!lineEndNode) { return; }
              -      }
              -  
              -      function breakLeftOf(limit, copy) {
              -        // Clone shallowly if this node needs to be on both sides of the break.
              -        var rightSide = copy ? limit.cloneNode(false) : limit;
              -        var parent = limit.parentNode;
              -        if (parent) {
              -          // We clone the parent chain.
              -          // This helps us resurrect important styling elements that cross lines.
              -          // E.g. in <i>Foo<br>Bar</i>
              -          // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
              -          var parentClone = breakLeftOf(parent, 1);
              -          // Move the clone and everything to the right of the original
              -          // onto the cloned parent.
              -          var next = limit.nextSibling;
              -          parentClone.appendChild(rightSide);
              -          for (var sibling = next; sibling; sibling = next) {
              -            next = sibling.nextSibling;
              -            parentClone.appendChild(sibling);
              -          }
              -        }
              -        return rightSide;
              -      }
              -  
              -      var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
              -  
              -      // Walk the parent chain until we reach an unattached LI.
              -      for (var parent;
              -           // Check nodeType since IE invents document fragments.
              -           (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
              -        copiedListItem = parent;
              -      }
              -      // Put it on the list of lines for later processing.
              -      listItems.push(copiedListItem);
              -    }
              -  
              -    // Split lines while there are lines left to split.
              -    for (var i = 0;  // Number of lines that have been split so far.
              -         i < listItems.length;  // length updated by breakAfter calls.
              -         ++i) {
              -      walk(listItems[i]);
              -    }
              -  
              -    // Make sure numeric indices show correctly.
              -    if (opt_startLineNum === (opt_startLineNum|0)) {
              -      listItems[0].setAttribute('value', opt_startLineNum);
              -    }
              -  
              -    var ol = document.createElement('ol');
              -    ol.className = 'linenums';
              -    var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;
              -    for (var i = 0, n = listItems.length; i < n; ++i) {
              -      li = listItems[i];
              -      // Stick a class on the LIs so that stylesheets can
              -      // color odd/even rows, or any other row pattern that
              -      // is co-prime with 10.
              -      li.className = 'L' + ((i + offset) % 10);
              -      if (!li.firstChild) {
              -        li.appendChild(document.createTextNode('\xA0'));
              -      }
              -      ol.appendChild(li);
              -    }
              -  
              -    node.appendChild(ol);
              -  }
              -  /**
              -   * Breaks {@code job.sourceCode} around style boundaries in
              -   * {@code job.decorations} and modifies {@code job.sourceNode} in place.
              -   * @param {Object} job like <pre>{
              -   *    sourceCode: {string} source as plain text,
              -   *    sourceNode: {HTMLElement} the element containing the source,
              -   *    spans: {Array.<number|Node>} alternating span start indices into source
              -   *       and the text node or element (e.g. {@code <BR>}) corresponding to that
              -   *       span.
              -   *    decorations: {Array.<number|string} an array of style classes preceded
              -   *       by the position at which they start in job.sourceCode in order
              -   * }</pre>
              -   * @private
              -   */
              -  function recombineTagsAndDecorations(job) {
              -    var isIE8OrEarlier = /\bMSIE\s(\d+)/.exec(navigator.userAgent);
              -    isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;
              -    var newlineRe = /\n/g;
              -  
              -    var source = job.sourceCode;
              -    var sourceLength = source.length;
              -    // Index into source after the last code-unit recombined.
              -    var sourceIndex = 0;
              -  
              -    var spans = job.spans;
              -    var nSpans = spans.length;
              -    // Index into spans after the last span which ends at or before sourceIndex.
              -    var spanIndex = 0;
              -  
              -    var decorations = job.decorations;
              -    var nDecorations = decorations.length;
              -    // Index into decorations after the last decoration which ends at or before
              -    // sourceIndex.
              -    var decorationIndex = 0;
              -  
              -    // Remove all zero-length decorations.
              -    decorations[nDecorations] = sourceLength;
              -    var decPos, i;
              -    for (i = decPos = 0; i < nDecorations;) {
              -      if (decorations[i] !== decorations[i + 2]) {
              -        decorations[decPos++] = decorations[i++];
              -        decorations[decPos++] = decorations[i++];
              -      } else {
              -        i += 2;
              -      }
              -    }
              -    nDecorations = decPos;
              -  
              -    // Simplify decorations.
              -    for (i = decPos = 0; i < nDecorations;) {
              -      var startPos = decorations[i];
              -      // Conflate all adjacent decorations that use the same style.
              -      var startDec = decorations[i + 1];
              -      var end = i + 2;
              -      while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
              -        end += 2;
              -      }
              -      decorations[decPos++] = startPos;
              -      decorations[decPos++] = startDec;
              -      i = end;
              -    }
              -  
              -    nDecorations = decorations.length = decPos;
              -  
              -    var sourceNode = job.sourceNode;
              -    var oldDisplay;
              -    if (sourceNode) {
              -      oldDisplay = sourceNode.style.display;
              -      sourceNode.style.display = 'none';
              -    }
              -    try {
              -      var decoration = null;
              -      while (spanIndex < nSpans) {
              -        var spanStart = spans[spanIndex];
              -        var spanEnd = spans[spanIndex + 2] || sourceLength;
              -  
              -        var decEnd = decorations[decorationIndex + 2] || sourceLength;
              -  
              -        var end = Math.min(spanEnd, decEnd);
              -  
              -        var textNode = spans[spanIndex + 1];
              -        var styledText;
              -        if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s
              -            // Don't introduce spans around empty text nodes.
              -            && (styledText = source.substring(sourceIndex, end))) {
              -          // This may seem bizarre, and it is.  Emitting LF on IE causes the
              -          // code to display with spaces instead of line breaks.
              -          // Emitting Windows standard issue linebreaks (CRLF) causes a blank
              -          // space to appear at the beginning of every line but the first.
              -          // Emitting an old Mac OS 9 line separator makes everything spiffy.
              -          if (isIE8OrEarlier) {
              -            styledText = styledText.replace(newlineRe, '\r');
              -          }
              -          textNode.nodeValue = styledText;
              -          var document = textNode.ownerDocument;
              -          var span = document.createElement('span');
              -          span.className = decorations[decorationIndex + 1];
              -          var parentNode = textNode.parentNode;
              -          parentNode.replaceChild(span, textNode);
              -          span.appendChild(textNode);
              -          if (sourceIndex < spanEnd) {  // Split off a text node.
              -            spans[spanIndex + 1] = textNode
              -                // TODO: Possibly optimize by using '' if there's no flicker.
              -                = document.createTextNode(source.substring(end, spanEnd));
              -            parentNode.insertBefore(textNode, span.nextSibling);
              -          }
              -        }
              -  
              -        sourceIndex = end;
              -  
              -        if (sourceIndex >= spanEnd) {
              -          spanIndex += 2;
              -        }
              -        if (sourceIndex >= decEnd) {
              -          decorationIndex += 2;
              -        }
              -      }
              -    } finally {
              -      if (sourceNode) {
              -        sourceNode.style.display = oldDisplay;
              -      }
              -    }
              -  }
              -
              -  /** Maps language-specific file extensions to handlers. */
              -  var langHandlerRegistry = {};
              -  /** Register a language handler for the given file extensions.
              -    * @param {function (Object)} handler a function from source code to a list
              -    *      of decorations.  Takes a single argument job which describes the
              -    *      state of the computation.   The single parameter has the form
              -    *      {@code {
              -    *        sourceCode: {string} as plain text.
              -    *        decorations: {Array.<number|string>} an array of style classes
              -    *                     preceded by the position at which they start in
              -    *                     job.sourceCode in order.
              -    *                     The language handler should assigned this field.
              -    *        basePos: {int} the position of source in the larger source chunk.
              -    *                 All positions in the output decorations array are relative
              -    *                 to the larger source chunk.
              -    *      } }
              -    * @param {Array.<string>} fileExtensions
              -    */
              -  function registerLangHandler(handler, fileExtensions) {
              -    for (var i = fileExtensions.length; --i >= 0;) {
              -      var ext = fileExtensions[i];
              -      if (!langHandlerRegistry.hasOwnProperty(ext)) {
              -        langHandlerRegistry[ext] = handler;
              -      } else if (win['console']) {
              -        console['warn']('cannot override language handler %s', ext);
              -      }
              -    }
              -  }
              -  function langHandlerForExtension(extension, source) {
              -    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
              -      // Treat it as markup if the first non whitespace character is a < and
              -      // the last non-whitespace character is a >.
              -      extension = /^\s*</.test(source)
              -          ? 'default-markup'
              -          : 'default-code';
              -    }
              -    return langHandlerRegistry[extension];
              -  }
              -  registerLangHandler(decorateSource, ['default-code']);
              -  registerLangHandler(
              -      createSimpleLexer(
              -          [],
              -          [
              -           [PR_PLAIN,       /^[^<?]+/],
              -           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
              -           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
              -           // Unescaped content in an unknown language
              -           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
              -           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
              -           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
              -           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
              -           // Unescaped content in javascript.  (Or possibly vbscript).
              -           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
              -           // Contains unescaped stylesheet content
              -           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
              -           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
              -          ]),
              -      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
              -  registerLangHandler(
              -      createSimpleLexer(
              -          [
              -           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
              -           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
              -           ],
              -          [
              -           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
              -           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
              -           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
              -           [PR_PUNCTUATION,  /^[=<>\/]+/],
              -           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
              -           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
              -           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
              -           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
              -           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
              -           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
              -           ]),
              -      ['in.tag']);
              -  registerLangHandler(
              -      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
              -  registerLangHandler(sourceDecorator({
              -          'keywords': CPP_KEYWORDS,
              -          'hashComments': true,
              -          'cStyleComments': true,
              -          'types': C_TYPES
              -        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
              -  registerLangHandler(sourceDecorator({
              -          'keywords': 'null,true,false'
              -        }), ['json']);
              -  registerLangHandler(sourceDecorator({
              -          'keywords': CSHARP_KEYWORDS,
              -          'hashComments': true,
              -          'cStyleComments': true,
              -          'verbatimStrings': true,
              -          'types': C_TYPES
              -        }), ['cs']);
              -  registerLangHandler(sourceDecorator({
              -          'keywords': JAVA_KEYWORDS,
              -          'cStyleComments': true
              -        }), ['java']);
              -  registerLangHandler(sourceDecorator({
              -          'keywords': SH_KEYWORDS,
              -          'hashComments': true,
              -          'multiLineStrings': true
              -        }), ['bash', 'bsh', 'csh', 'sh']);
              -  registerLangHandler(sourceDecorator({
              -          'keywords': PYTHON_KEYWORDS,
              -          'hashComments': true,
              -          'multiLineStrings': true,
              -          'tripleQuotedStrings': true
              -        }), ['cv', 'py', 'python']);
              -  registerLangHandler(sourceDecorator({
              -          'keywords': PERL_KEYWORDS,
              -          'hashComments': true,
              -          'multiLineStrings': true,
              -          'regexLiterals': 2  // multiline regex literals
              -        }), ['perl', 'pl', 'pm']);
              -  registerLangHandler(sourceDecorator({
              -          'keywords': RUBY_KEYWORDS,
              -          'hashComments': true,
              -          'multiLineStrings': true,
              -          'regexLiterals': true
              -        }), ['rb', 'ruby']);
              -  registerLangHandler(sourceDecorator({
              -          'keywords': JSCRIPT_KEYWORDS,
              -          'cStyleComments': true,
              -          'regexLiterals': true
              -        }), ['javascript', 'js']);
              -  registerLangHandler(sourceDecorator({
              -          'keywords': COFFEE_KEYWORDS,
              -          'hashComments': 3,  // ### style block comments
              -          'cStyleComments': true,
              -          'multilineStrings': true,
              -          'tripleQuotedStrings': true,
              -          'regexLiterals': true
              -        }), ['coffee']);
              -  registerLangHandler(sourceDecorator({
              -          'keywords': RUST_KEYWORDS,
              -          'cStyleComments': true,
              -          'multilineStrings': true
              -        }), ['rc', 'rs', 'rust']);
              -  registerLangHandler(
              -      createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
              -
              -  function applyDecorator(job) {
              -    var opt_langExtension = job.langExtension;
              -
              -    try {
              -      // Extract tags, and convert the source code to plain text.
              -      var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);
              -      /** Plain text. @type {string} */
              -      var source = sourceAndSpans.sourceCode;
              -      job.sourceCode = source;
              -      job.spans = sourceAndSpans.spans;
              -      job.basePos = 0;
              -
              -      // Apply the appropriate language handler
              -      langHandlerForExtension(opt_langExtension, source)(job);
              -
              -      // Integrate the decorations and tags back into the source code,
              -      // modifying the sourceNode in place.
              -      recombineTagsAndDecorations(job);
              -    } catch (e) {
              -      if (win['console']) {
              -        console['log'](e && e['stack'] || e);
              -      }
              -    }
              -  }
              -
              -  /**
              -   * Pretty print a chunk of code.
              -   * @param sourceCodeHtml {string} The HTML to pretty print.
              -   * @param opt_langExtension {string} The language name to use.
              -   *     Typically, a filename extension like 'cpp' or 'java'.
              -   * @param opt_numberLines {number|boolean} True to number lines,
              -   *     or the 1-indexed number of the first line in sourceCodeHtml.
              -   */
              -  function $prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
              -    var container = document.createElement('div');
              -    // This could cause images to load and onload listeners to fire.
              -    // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
              -    // We assume that the inner HTML is from a trusted source.
              -    // The pre-tag is required for IE8 which strips newlines from innerHTML
              -    // when it is injected into a <pre> tag.
              -    // http://stackoverflow.com/questions/451486/pre-tag-loses-line-breaks-when-setting-innerhtml-in-ie
              -    // http://stackoverflow.com/questions/195363/inserting-a-newline-into-a-pre-tag-ie-javascript
              -    container.innerHTML = '<pre>' + sourceCodeHtml + '</pre>';
              -    container = container.firstChild;
              -    if (opt_numberLines) {
              -      numberLines(container, opt_numberLines, true);
              -    }
              -
              -    var job = {
              -      langExtension: opt_langExtension,
              -      numberLines: opt_numberLines,
              -      sourceNode: container,
              -      pre: 1
              -    };
              -    applyDecorator(job);
              -    return container.innerHTML;
              -  }
              -
              -   /**
              -    * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
              -    * {@code class=prettyprint} and prettify them.
              -    *
              -    * @param {Function} opt_whenDone called when prettifying is done.
              -    * @param {HTMLElement|HTMLDocument} opt_root an element or document
              -    *   containing all the elements to pretty print.
              -    *   Defaults to {@code document.body}.
              -    */
              -  function $prettyPrint(opt_whenDone, opt_root) {
              -    var root = opt_root || document.body;
              -    var doc = root.ownerDocument || document;
              -    function byTagName(tn) { return root.getElementsByTagName(tn); }
              -    // fetch a list of nodes to rewrite
              -    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
              -    var elements = [];
              -    for (var i = 0; i < codeSegments.length; ++i) {
              -      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
              -        elements.push(codeSegments[i][j]);
              -      }
              -    }
              -    codeSegments = null;
              -
              -    var clock = Date;
              -    if (!clock['now']) {
              -      clock = { 'now': function () { return +(new Date); } };
              -    }
              -
              -    // The loop is broken into a series of continuations to make sure that we
              -    // don't make the browser unresponsive when rewriting a large page.
              -    var k = 0;
              -    var prettyPrintingJob;
              -
              -    var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
              -    var prettyPrintRe = /\bprettyprint\b/;
              -    var prettyPrintedRe = /\bprettyprinted\b/;
              -    var preformattedTagNameRe = /pre|xmp/i;
              -    var codeRe = /^code$/i;
              -    var preCodeXmpRe = /^(?:pre|code|xmp)$/i;
              -    var EMPTY = {};
              -
              -    function doWork() {
              -      var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?
              -                     clock['now']() + 250 /* ms */ :
              -                     Infinity);
              -      for (; k < elements.length && clock['now']() < endTime; k++) {
              -        var cs = elements[k];
              -
              -        // Look for a preceding comment like
              -        // <?prettify lang="..." linenums="..."?>
              -        var attrs = EMPTY;
              -        {
              -          for (var preceder = cs; (preceder = preceder.previousSibling);) {
              -            var nt = preceder.nodeType;
              -            // <?foo?> is parsed by HTML 5 to a comment node (8)
              -            // like <!--?foo?-->, but in XML is a processing instruction
              -            var value = (nt === 7 || nt === 8) && preceder.nodeValue;
              -            if (value
              -                ? !/^\??prettify\b/.test(value)
              -                : (nt !== 3 || /\S/.test(preceder.nodeValue))) {
              -              // Skip over white-space text nodes but not others.
              -              break;
              -            }
              -            if (value) {
              -              attrs = {};
              -              value.replace(
              -                  /\b(\w+)=([\w:.%+-]+)/g,
              -                function (_, name, value) { attrs[name] = value; });
              -              break;
              -            }
              -          }
              -        }
              -
              -        var className = cs.className;
              -        if ((attrs !== EMPTY || prettyPrintRe.test(className))
              -            // Don't redo this if we've already done it.
              -            // This allows recalling pretty print to just prettyprint elements
              -            // that have been added to the page since last call.
              -            && !prettyPrintedRe.test(className)) {
              -
              -          // make sure this is not nested in an already prettified element
              -          var nested = false;
              -          for (var p = cs.parentNode; p; p = p.parentNode) {
              -            var tn = p.tagName;
              -            if (preCodeXmpRe.test(tn)
              -                && p.className && prettyPrintRe.test(p.className)) {
              -              nested = true;
              -              break;
              -            }
              -          }
              -          if (!nested) {
              -            // If the classes includes a language extensions, use it.
              -            // Language extensions can be specified like
              -            //     <pre class="prettyprint lang-cpp">
              -            // the language extension "cpp" is used to find a language handler
              -            // as passed to PR.registerLangHandler.
              -            // HTML5 recommends that a language be specified using "language-"
              -            // as the prefix instead.  Google Code Prettify supports both.
              -            // http://dev.w3.org/html5/spec-author-view/the-code-element.html
              -            var langExtension = attrs['lang'];
              -            if (!langExtension) {
              -              langExtension = className.match(langExtensionRe);
              -              // Support <pre class="prettyprint"><code class="language-c">
              -              var wrapper;
              -              if (!langExtension && (wrapper = childContentWrapper(cs))
              -                  && codeRe.test(wrapper.tagName)) {
              -                langExtension = wrapper.className.match(langExtensionRe);
              -              }
              -
              -              if (langExtension) { langExtension = langExtension[1]; }
              -            }
              -
              -            var preformatted;
              -            if (preformattedTagNameRe.test(cs.tagName)) {
              -              preformatted = 1;
              -            } else {
              -              var currentStyle = cs['currentStyle'];
              -              var defaultView = doc.defaultView;
              -              var whitespace = (
              -                  currentStyle
              -                  ? currentStyle['whiteSpace']
              -                  : (defaultView
              -                     && defaultView.getComputedStyle)
              -                  ? defaultView.getComputedStyle(cs, null)
              -                  .getPropertyValue('white-space')
              -                  : 0);
              -              preformatted = whitespace
              -                  && 'pre' === whitespace.substring(0, 3);
              -            }
              -
              -            // Look for a class like linenums or linenums:<n> where <n> is the
              -            // 1-indexed number of the first line.
              -            var lineNums = attrs['linenums'];
              -            if (!(lineNums = lineNums === 'true' || +lineNums)) {
              -              lineNums = className.match(/\blinenums\b(?::(\d+))?/);
              -              lineNums =
              -                lineNums
              -                ? lineNums[1] && lineNums[1].length
              -                  ? +lineNums[1] : true
              -                : false;
              -            }
              -            if (lineNums) { numberLines(cs, lineNums, preformatted); }
              -
              -            // do the pretty printing
              -            prettyPrintingJob = {
              -              langExtension: langExtension,
              -              sourceNode: cs,
              -              numberLines: lineNums,
              -              pre: preformatted
              -            };
              -            applyDecorator(prettyPrintingJob);
              -          }
              -        }
              -      }
              -      if (k < elements.length) {
              -        // finish up in a continuation
              -        setTimeout(doWork, 250);
              -      } else if ('function' === typeof opt_whenDone) {
              -        opt_whenDone();
              -      }
              -    }
              -
              -    doWork();
              -  }
              -
              -  /**
              -   * Contains functions for creating and registering new language handlers.
              -   * @type {Object}
              -   */
              -  var PR = win['PR'] = {
              -        'createSimpleLexer': createSimpleLexer,
              -        'registerLangHandler': registerLangHandler,
              -        'sourceDecorator': sourceDecorator,
              -        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
              -        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
              -        'PR_COMMENT': PR_COMMENT,
              -        'PR_DECLARATION': PR_DECLARATION,
              -        'PR_KEYWORD': PR_KEYWORD,
              -        'PR_LITERAL': PR_LITERAL,
              -        'PR_NOCODE': PR_NOCODE,
              -        'PR_PLAIN': PR_PLAIN,
              -        'PR_PUNCTUATION': PR_PUNCTUATION,
              -        'PR_SOURCE': PR_SOURCE,
              -        'PR_STRING': PR_STRING,
              -        'PR_TAG': PR_TAG,
              -        'PR_TYPE': PR_TYPE,
              -        'prettyPrintOne':
              -           IN_GLOBAL_SCOPE
              -             ? (win['prettyPrintOne'] = $prettyPrintOne)
              -             : (prettyPrintOne = $prettyPrintOne),
              -        'prettyPrint': prettyPrint =
              -           IN_GLOBAL_SCOPE
              -             ? (win['prettyPrint'] = $prettyPrint)
              -             : (prettyPrint = $prettyPrint)
              -      };
              -
              -  // Make PR available via the Asynchronous Module Definition (AMD) API.
              -  // Per https://github.com/amdjs/amdjs-api/wiki/AMD:
              -  // The Asynchronous Module Definition (AMD) API specifies a
              -  // mechanism for defining modules such that the module and its
              -  // dependencies can be asynchronously loaded.
              -  // ...
              -  // To allow a clear indicator that a global define function (as
              -  // needed for script src browser loading) conforms to the AMD API,
              -  // any global define function SHOULD have a property called "amd"
              -  // whose value is an object. This helps avoid conflict with any
              -  // other existing JavaScript code that could have defined a define()
              -  // function that does not conform to the AMD API.
              -  if (typeof define === "function" && define['amd']) {
              -    define("google-code-prettify", [], function () {
              -      return PR; 
              -    });
              -  }
              -})();
              diff --git a/scripts/lib/uuid.core.js b/scripts/lib/uuid.core.js
              deleted file mode 100644
              index 9d43cd2..0000000
              --- a/scripts/lib/uuid.core.js
              +++ /dev/null
              @@ -1,5 +0,0 @@
              -/*
              - Version: core-1.0
              - The MIT License: Copyright (c) 2012 LiosK.
              -*/
              -function UUID(){}UUID.generate=function(){var a=UUID._gri,b=UUID._ha;return b(a(32),8)+"-"+b(a(16),4)+"-"+b(16384|a(12),4)+"-"+b(32768|a(14),4)+"-"+b(a(48),12)};UUID._gri=function(a){return 0>a?NaN:30>=a?0|Math.random()*(1<<a):53>=a?(0|1073741824*Math.random())+1073741824*(0|Math.random()*(1<<a-30)):NaN};UUID._ha=function(a,b){for(var c=a.toString(16),d=b-c.length,e="0";0<d;d>>>=1,e+=e)d&1&&(c=e+c);return c};
              diff --git a/scripts/messages.js b/scripts/messages.js
              index 642df20..67b8c3b 100644
              --- a/scripts/messages.js
              +++ b/scripts/messages.js
              @@ -3,7 +3,8 @@
               * Copyright (C) Codexa Organization 2013.
               */
               
              -function MessageProxy(port) {
              +function MessageProxy() {
              +	var send, recv;
               	var messageHandlers = {};
               	var pub = this;
               
              @@ -30,11 +31,26 @@ function MessageProxy(port) {
               		messageHandlers[key] = undefined;
               	}
               
              -	this.getPort = function getPort() {
              -		return port;
              +	this.getMessageHandlers = function getMessageHandlers() {
              +		return messageHandlers;
               	}
               
              -	port.addEventListener("message", function (e) {
              +	this.setMessageHandlers = function setMessageHandlers(_messageHandlers) {
              +		messageHandlers = _messageHandlers;
              +	}
              +
              +	this.postMessage = function postMessage(data) {
              +		send.postMessage(data, "*");
              +	}
              +
              +	this.setSend = function setSend(_send) {
              +		send = _send;
              +	}
              +
              +	function handler(e) {
              +		if(e.source !== send) {
              +			return;
              +		}
               		// check for command
               		if(!messageHandlers[e.data.command]) {
               			throw new Error('No command registered: "' + e.data.command + '"');
              @@ -47,5 +63,11 @@ function MessageProxy(port) {
               		if(messageHandlers[e.data.command].useOnce) {
               			pub.unRegisterMessageHandler(e.data.command);
               		}
              -	}, false);
              +	}
              +
              +	this.setRecv = function setRecv(_recv) {
              +		if(recv) recv.removeEventListener("message", handler, false);
              +		recv = _recv;
              +		if(recv) recv.addEventListener("message", handler, false);
              +	}
               };
              \ No newline at end of file
              diff --git a/scripts/modules.js b/scripts/modules.js
              new file mode 100644
              index 0000000..9329ccb
              --- /dev/null
              +++ b/scripts/modules.js
              @@ -0,0 +1,155 @@
              +/*
              +* Modules
              +* Copyright (C) Codexa Organization.
              +*/
              +
              +if (!app) {
              +	var app = {};
              +}
              +
              +(function(window, undefined) {
              +	'use strict';
              +	
              +	function loadModule(url, callback, deep) {
              +		// Validate params
              +		if (!url) {
              +			callback('bad-params');
              +		}
              +	
              +		// Get module
              +		var request = new XMLHttpRequest();
              +		request.open("GET", url, true);
              +		request.responseType = "document";
              +		request.overrideMimeType("text/html");
              +		request.addEventListener("load", function(e) {
              +			if(this.status === 200) {
              +				var response = this.response;
              +				if (deep) {
              +					var elements = response.querySelectorAll("script, link");
              +					var loading = {};
              +					for (var i = 0; i < elements.length; i++) {
              +						(function() {
              +							var element = elements[i];
              +							var name = element.tagName;
              +							if(name === "SCRIPT" ? element.src : element.href) {
              +								var type = element.type;
              +								var url = name === "SCRIPT" ? element.src : element.href;
              +								var rel = element.getAttribute('rel');
              +								var data = element.dataset;
              +								if(!loading[url]) {
              +									loading[url] = [];
              +									var req = new XMLHttpRequest();
              +									req.open("GET", url, true);
              +									req.responseType = "text";
              +									req.addEventListener("load", function(e) {
              +										var done = true;
              +										if(this.status === 200) {
              +											var inline = response.createElement(name);
              +											var text = this.response;
              +											text = text.replace(/\[ORIGIN_OF_MAIN_DOCUMENT\]/g, window.location.origin ? window.location.origin : window.location.protocol + "//" + window.location.host);
              +											inline.type = type;
              +											if(name === "SCRIPT") {
              +												inline.src = "data:text/javascript;base64," + btoa(text + '\n//# sourceURL=' + url);
              +											} else {
              +												inline.href = "data:text/css;base64," + btoa(text + '\n/*# sourceURL=' + url + '*/');
              +											}
              +											inline.setAttribute('rel', rel);
              +											for (var key in data) {
              +												inline.dataset[key] = data[key];
              +											}
              +											loading[url][0].parentNode.replaceChild(inline, loading[url][0]);
              +											for (var i = 1; i < loading[url].length; i++) {
              +												loading[url][i].parentNode.removeChild(loading[url][i]);
              +											}
              +											delete loading[url];
              +											for(var x in loading) {
              +												done = false;
              +												break;
              +											}
              +											if (done) {
              +												callback(null, createBlob(response));
              +											}
              +										}
              +									}, false);
              +									req.send();
              +								}
              +								loading[url].push(element);
              +							}
              +						})();
              +					}
              +				} else {
              +					callback(null, createBlob(response));
              +				}
              +			} else {
              +				callback(this.status);
              +			}
              +		}, false);
              +		request.send();
              +	}
              +	
              +	function fillFrame(url, destinations, callback) {
              +		// Validate params
              +		if (!url || !destinations) {
              +			callback('bad-params');
              +		}
              +		
              +		if (!Array.isArray(destinations)) {
              +			destinations = [destinations];
              +		}
              +		
              +		// Fill frames
              +		destinations.forEach(function(t){
              +			t.src = url;
              +		});
              +		
              +		// Done!
              +		callback();
              +	}
              +	
              +	function createBlob(response) {
              +		var moduleBlob = new Blob([response.documentElement.outerHTML], {type: "text/html"});
              +		var moduleURL = URL.createObjectURL ? URL.createObjectURL(moduleBlob) : URL.webkitCreateObjectURL ? URL.webkitCreateObjectURL(moduleBlob) : null;
              +		return moduleURL;	
              +	}
              +	
              +	app.modules = {
              +		fill: function (url, destinations, callback) {
              +			fillFrame(url, destinations, function(e){
              +				if (e) {
              +					console.log(e);
              +				} else {
              +					callback();
              +				}
              +			});
              +		},
              +		load: function (url, destinations, callback, store, deep) {
              +			console.log('Loading '+url);
              +			
              +			if (store) {
              +				loadModule(url, function(e,b){
              +					if (e) {
              +						console.log(e);
              +					} else {
              +						fillFrame(b, destinations, function(e){
              +							if (e) {
              +								console.log(e);
              +							} else {
              +								console.log('Finished loading '+url);
              +								callback(b);
              +							}
              +						});
              +					}
              +				}, deep);
              +			} else {
              +				fillFrame(url, destinations, function(e){
              +					if (e) {
              +						console.log(e);
              +					} else {
              +						console.log('Finished loading '+url);
              +						callback();
              +					}
              +				});
              +			}
              +		}
              +	};
              +})(this);
              diff --git a/scripts/night.js b/scripts/night.js
              index c20539b..065b850 100644
              --- a/scripts/night.js
              +++ b/scripts/night.js
              @@ -40,19 +40,25 @@ function startNight(start) {
               		html.classList.add('night');
               		themeColor.setAttribute('content', nightTheme);
               		if (editorMessageProxy) {
              -			editorMessageProxy.getPort().postMessage({
              +			editorMessageProxy.postMessage({
               				command: "night",
               				nightMode: true
               			});
              -		}	
              +		}
              +		if (rawEditor) {
              +			rawEditor.setOption("theme", 'tomorrow-night-bright');
              +		}
               	} else {
               		html.classList.remove('night');
               		themeColor.setAttribute('content', dayTheme);
               		if (editorMessageProxy) {
              -			editorMessageProxy.getPort().postMessage({
              +			editorMessageProxy.postMessage({
               				command: "night",
               				nightMode: false
               			});
              -		}	
              +		}
              +		if (rawEditor) {
              +			rawEditor.setOption("theme", 'default');
              +		}
               	}
               }
              diff --git a/scripts/notifications.js b/scripts/notifications.js
              new file mode 100644
              index 0000000..35977d9
              --- /dev/null
              +++ b/scripts/notifications.js
              @@ -0,0 +1,41 @@
              +/*
              +* Notifications
              +* Copyright (C) Codexa Organization.
              +*/
              +
              +'use strict';
              +
              +firetext.notify = function (message, title, time) {
              +	// Fix variables
              +	if (!time) {
              +		time = 5000;
              +	}
              +	
              +	// Create notification
              +	var notification = document.createElement('section');
              +	notification.setAttribute('role','status');
              +	
              +	if (title) {
              +		var notificationTitle = document.createElement('p');
              +		notificationTitle.classList.add('notification-title');
              +		notificationTitle.textContent = title;
              +		notification.appendChild(notificationTitle);		
              +	}
              +	
              +	var notificationBody = document.createElement('p');
              +	notificationBody.textContent = message;
              +	notification.appendChild(notificationBody);
              +	
              +	document.body.appendChild(notification);
              +	setTimeout(function(){
              +		notification.classList.add('notification-shown');
              +		
              +		// Set timeout to hide notification
              +		setTimeout(function(){
              +			notification.classList.remove('notification-shown');
              +			setTimeout(function(){
              +				document.body.removeChild(notification);
              +			},300);
              +		},time);
              +	}, 100);
              +};
              diff --git a/scripts/parsers/odt.js b/scripts/parsers/odt.js
              new file mode 160000
              index 0000000..39f1c1d
              --- /dev/null
              +++ b/scripts/parsers/odt.js
              @@ -0,0 +1 @@
              +Subproject commit 39f1c1dc19925bff5aa4fee2261ca4d02a614628
              diff --git a/scripts/parsers/plain-text.js b/scripts/parsers/plain-text.js
              index 1eea6b9..a101dc8 100644
              --- a/scripts/parsers/plain-text.js
              +++ b/scripts/parsers/plain-text.js
              @@ -20,7 +20,8 @@ firetext.parsers.plain.parse = function (data, type) {
               	// Some code to convert TXT into something else
               	var output = "";
               	if (type == "HTML") {
              -		output = data.replace(/</gi, '<pre><code>&lt;')
              +		output = '<!DOCTYPE html>' + // Chrome html height
              +					data.replace(/</gi, '<pre><code>&lt;')
               					 .replace(/>/gi, '&gt;</code></pre>')
               					 .replace(/&amp;/gi, '&amp;amp;')
               					 .replace(/\n/gi, '<br>');
              diff --git a/scripts/regions.js b/scripts/regions.js
              index 88f0319..7cc5bb8 100644
              --- a/scripts/regions.js
              +++ b/scripts/regions.js
              @@ -53,15 +53,7 @@ function nav2() {
               		tempElement.classList.add('current');
               		
               		/* Remove this section when porting to other projects */	 
              -		if (tempLoc == 'edit') {
              -			if (tempAutozen !== false) {
              -				// Start Zen Mode if autozen == true
              -				if (firetext.settings.get('autozen') == 'true' ||
              -						tempAutozen === true) {
              -					editFullScreen(true);
              -				}
              -			}
              -			
              +		if (tempLoc == 'edit') {			
               			// Save edit status
               			firetext.settings.save('autoload.wasEditing', 'true');
               			firetext.settings.save('autoload.dir', document.getElementById('currentFileDirectory').textContent);
              @@ -77,9 +69,6 @@ function nav2() {
               			}			
               		} else {
               			if (tempElement.getAttribute('role') === 'region') {
              -				// No zen mode if region
              -				editFullScreen(false);
              -				
               				// Not editing if region
               				firetext.settings.save('autoload.wasEditing', 'false');
               			}
              @@ -98,6 +87,28 @@ function nav2() {
               		} else if (tempLoc == 'open') {
               			updateDocLists(['cloud']);		
               		}
              +		
              +		// Focus filename input
              +		if (tempLoc == 'create' || tempLoc == 'save-as') {
              +			var onTransitionEnd = function () {
              +				document.getElementById(tempLoc == 'create' ? 'createDialogFileName' : 'saveAsDialogFileName').focus();
              +				tempElement.removeEventListener('transitionend', onTransitionEnd);
              +				tempElement.removeEventListener('webkitTransitionEnd', onTransitionEnd);
              +			};
              +			tempElement.addEventListener('transitionend', onTransitionEnd);
              +			tempElement.addEventListener('webkitTransitionEnd', onTransitionEnd);
              +		}
              +		
              +		// Prefill filename and show filetype
              +		if (tempLoc == 'save-as') {
              +			document.getElementById('saveAsDialogFileName').value = document.getElementById('currentFileName').textContent;
              +			document.getElementById('saveAsDialogFileType').textContent = document.getElementById('currentFileType').textContent;
              +		}
              +		
              +		// Move file location selector to active region
              +		if (tempLoc == 'create' || tempLoc == 'upload' || tempLoc == 'save-as') {
              +			document.getElementById(tempLoc).getElementsByClassName('button-block')[0].appendChild(locationLegend);
              +		}
               		/* End of customized section */
               	}
               }
              @@ -129,14 +140,32 @@ regions.sidebar = function (name, state) {
               
               regions.tab = function (list, name) {
               	if (document.getElementById('tab-'+name)) {
              -		if (document.querySelector('.selected')) {
              -			document.querySelector('.selected').classList.remove('selected');
              +		// Unselect previous tab and button
              +		var previousTab = document.querySelector('.selected-tab');
              +		if (previousTab) {
              +			previousTab.classList.remove('selected-tab');
               		}
              -		document.getElementById('tab-'+name).classList.add('selected');
              -		
              +		var previousTabButton = document.querySelector('.selected-tab-button');
              +		if (previousTabButton) {
              +			previousTabButton.classList.remove('selected-tab-button');
              +		}
              +
              +		// Select tab
              +		document.getElementById('tab-'+name).classList.add('selected-tab');
              +
              +		// Select tab button
              +		var tabButton = document.querySelector('[role="tab-button"][data-tab-id="'+name+'"]');
              +		if (tabButton) {
              +			tabButton.classList.add('selected-tab-button');                
              +		}
              +
               		/* Remove this section when porting to other projects */
              -		if (name == 'raw') {
              -			prettyPrint();
              +		if (name === 'raw') {
              +			setTimeout(function(){rawEditor.focus();},300);
              +			if (tempText) {
              +				rawEditor.setValue(tempText);
              +				tempText = undefined;				
              +			}
               		}
               		/* End of customized section */
               	}
              diff --git a/scripts/settings.js b/scripts/settings.js
              index 60e3877..ca867fa 100644
              --- a/scripts/settings.js
              +++ b/scripts/settings.js
              @@ -17,7 +17,6 @@ firetext.settings.init = function () {
               	// Select elements
               	var autoloadEnabled = document.querySelector('#autoload-enabled-switch');
               	var autosaveEnabled = document.querySelector('#autosave-enabled-switch');
              -	var autozenEnabled = document.querySelector('#autozen-enabled-switch');
               	var dropboxEnabled = document.querySelector('#dropbox-enabled-switch');
               	var languageSelect = document.querySelector('#language-select');
               	var nightmodeSelect = document.querySelector('#nightmode-select');
              @@ -50,26 +49,11 @@ firetext.settings.init = function () {
               		firetext.settings.save('autosave', this.checked);
               		if (firetext.settings.get('autosave') != 'false') {
               			document.getElementById('editorSaveButton').style.display = 'none';
              -			document.getElementById('zenSaveButton').style.display = 'none';
               		} else {
               			document.getElementById('editorSaveButton').style.display = 'inline-block';
              -			document.getElementById('zenSaveButton').style.display = 'inline-block';
               		}
               	}
               
              -	// Autozen
              -	if (firetext.settings.get('autozen') == 'false') {
              -		autozenEnabled.removeAttribute('checked');
              -	} else {
              -		autozenEnabled.setAttribute('checked', '');
              -		if (!firetext.settings.get('autozen')) {
              -			firetext.settings.save('autozen', 'true');
              -		}
              -	}
              -	autozenEnabled.onchange = function () {
              -		firetext.settings.save('autozen', this.checked);
              -	}
              -
               	// Dropbox
               	if (firetext.settings.get('dropbox.enabled') == 'true') {
               		dropboxEnabled.setAttribute('checked', '');
              @@ -144,12 +128,19 @@ firetext.settings.init = function () {
               		if (firetext.settings.get('stats.enabled') != 'true') {
               			firetext.settings.save('stats.enabled', 'true');
               		}
              -	} else {	
              +	} else {
               		statsEnabled.removeAttribute('checked');
               	}
               	statsEnabled.onchange = function () {
               		firetext.settings.save('stats.enabled', this.checked);
              -		bugsenseInit();
              +		if (!this.checked) {
              +			var r = confirm(navigator.mozL10n.get('needs-restart'));
              +			if (r) {
              +				window.location.reload();
              +			}
              +		} else {
              +			bugsenseInit();
              +		}
               	}
               };
               
              diff --git a/style/bb/buttons.css b/style/bb/buttons.css
              index b009d43..543ecd4 100755
              --- a/style/bb/buttons.css
              +++ b/style/bb/buttons.css
              @@ -21,7 +21,7 @@ a[role="button"] {
                 white-space: nowrap;
                 overflow: hidden;
                 background: #fafafa url(buttons/images/ui/default.png) repeat-x left bottom;
              -  border: 0.1rem solid #a6a6a6;
              +  border: 1px solid #a6a6a6;
                 border-radius: 0.2rem;
                 font: 500 1.5rem/3.8rem 'MozTT', Sans-serif;
                 color: #333;
              @@ -203,16 +203,16 @@ ol.compact {
                 border-radius: 0 0 0.3rem 0.3rem;
               }
               
              -/* Pressed */
              +/* Pressed */
               .compact > li button:active,
               .compact > li a[role="button"]:active {
                 border-color: #eee;
                 background: #eee;
               }
               
              -/* Disabled */
              +/* Disabled */
               .compact > li button[disabled],
               .compact > li a[role="button"][aria-disabled="true"] {
                 color: #a6a6a6;
                 border-color: #a6a6a6;
              -}
              \ No newline at end of file
              +}
              diff --git a/style/bb/drawer.css b/style/bb/drawer.css
              index 81172ae..7f1dfcb 100755
              --- a/style/bb/drawer.css
              +++ b/style/bb/drawer.css
              @@ -189,7 +189,7 @@ section[data-type="sidebar"][data-position="right"]:after {
               }
               
               section[data-type="sidebar"] > nav {
              -  overflow-y: scroll;
              +  overflow-y: auto;
                 overflow-x: hidden;
                 max-height: calc(100% - 5rem);
                   max-height: -moz-calc(100% - 5rem);
              @@ -213,7 +213,7 @@ section[data-type="sidebar"] [role="toolbar"] {
                 width: 80%;
                 right: auto;
                 background-color: #1d1d1d;
              -  color: #6f6f6f
              +  color: #fff;
               }
               
               section[data-type="sidebar"][data-position="right"] [role="toolbar"] {
              @@ -221,16 +221,16 @@ section[data-type="sidebar"][data-position="right"] [role="toolbar"] {
                 right: 0;
               }
               
              -section[data-type="sidebar"] [role="toolbar"] button[class^="icon-"], 
              -section[data-type="sidebar"] [role="toolbar"] [class*=" icon-"] {
              -  color: #fff;
              -}
              -
               section[data-type="sidebar"] [role="toolbar"] button:active, 
               section[data-type="sidebar"] [role="toolbar"] button.active {
                 background-color: #111;
               }
               
              +section[data-type="sidebar"] [role="toolbar"] button[class^="icon-"],                                                                                
              +section[data-type="sidebar"] [role="toolbar"] [class*=" icon-"] {                                                                                    
              +  color: inherit;                                                                                                                                       
              +}
              +
               section[data-type="sidebar"] [role="toolbar"] + nav {
                 max-height: calc(100% - 5rem - 4rem);
                   max-height: -moz-calc(100% - 5rem - 4rem);
              diff --git a/style/bb/status.css b/style/bb/status.css
              index c253813..9775522 100755
              --- a/style/bb/status.css
              +++ b/style/bb/status.css
              @@ -2,41 +2,36 @@
                * Status
                * ---------------------------------- */
               section[role="status"] {
              -  background: #dfdfdf;
              -  overflow: hidden;
              -  position: absolute;
              -  z-index: 100;
              -  left: 0;
              -  right: 0;
              -  bottom: 0;
              -  height: 1rem;
              -  min-height: 6.2rem;
              -  white-space: nowrap;
              -  font-family: "MozTT", Sans-serif;
              -  color: #1f1f1f;
              -  text-align: center;
              +	background: #efefef;
              +	color: #1f1f1f;
              +	overflow: hidden;
              +	position: absolute;
              +	z-index: 200;
              +	left: 0;
              +	right: 0;
              +	bottom: 0;
              +	text-align: left;
              +	transition: all 0.3s;
               }
               
               section[role="status"] p {
              -  display: inline-block;
              -  vertical-align: middle;
              -  white-space: normal;
              -  font-size: 1.6rem;
              -  line-height: 1.4em;
              -  max-width: 75%;
              -  margin: 0;
              -  text-align: left;
              +	font-size: 1.8rem;
              +	font-weight: normal;
              +	line-height: 2.2rem;
              +	margin: 1rem 3rem;
              +	padding: 0;
              +	text-align: left;
               }
               
              -section[role="status"]:before {
              -  content: "";
              -  height: 100%;
              -  display: inline-block;
              -  vertical-align: middle;
              +section[role="status"] p strong {
              +	font-weight: 500;
               }
               
              -section[role="status"] p strong {
              -  text-transform: uppercase;
              -  color: #0995b0;
              -  font-weight: normal;
              +/*
              + * Right to Left View
              + */
              +
              +html[dir="rtl"] section[role="status"],
              +html[dir="rtl"] section[role="status"] p {
              +	text-align: right;
               }
              diff --git a/style/bb/tabs.css b/style/bb/tabs.css
              deleted file mode 100755
              index 2ca6eff..0000000
              --- a/style/bb/tabs.css
              +++ /dev/null
              @@ -1,293 +0,0 @@
              -/* ----------------------------------
              -* Tabs
              -* ---------------------------------- */
              -
              -[role="tablist"] {
              -  margin: 0;
              -  padding: 0;
              -  position: absolute;
              -  width: 100%;
              -  height: 100%;
              -  font-family: "Open Sans", Sans-serif;
              -  background: #efefef;
              -}
              -
              -[role="tablist"] > [role="tab"] {
              -  list-style: none;
              -  margin: 0;
              -  padding: 0;
              -  float: left;
              -  opacity: 1;
              -}
              -
              -/* Items calcs */
              -[role="tablist"][data-items="2"] > [role="tab"] {
              -    width: -moz-calc(100% / 2);
              -    width: -webkit-calc(100% / 2);
              -  width: calc(100% / 2);
              -}
              -
              -[role="tablist"][data-items="3"] > [role="tab"] {
              -    width: -moz-calc(100% / 3);
              -    width: -webkit-calc(100% / 3);
              -  width: calc(100% / 3);
              -}
              -
              -[role="tablist"][data-items="4"] > [role="tab"] {
              -    width: -moz-calc(100% / 3);
              -    width: -webkit-calc(100% / 3);
              -  width: calc(100% / 3);
              -}
              -
              -[role="tablist"][data-items="4.1"] > [role="tab"] {
              -    width: -moz-calc(100% / 4.1);
              -    width: -webkit-calc(100% / 4.1);
              -  width: calc(100% / 4.1);
              -}
              -
              -[role="tablist"][data-items="5"] > [role="tab"] {
              -    width: -moz-calc(100% / 5);
              -    width: -webkit-calc(100% / 5);
              -  width: calc(100% / 5);
              -}
              -
              -[role="tablist"] > [role="tab"] > a {
              -  font-size: 1.8rem;
              -  text-decoration: none;
              -  line-height: 4rem;
              -  text-align: center;
              -  float: left;
              -  width: 100%;
              -  position: relative;
              -  color: #737373;
              -    -moz-transition: all .5s;
              -    -webkit-transition: all .5s;
              -    -o-transition: all .5s;
              -  transition: all .5s;
              -  font-weight: bold;
              -  outline: none;
              -}
              -
              -[role="tablist"] > [role="tab"] > a:active {
              -  background-color: #bfbfbf;
              -  color: #1f1f1f;
              -}
              -
              -[role="tablist"] > [role="tab"][aria-disabled="true"] > a:active {
              -  background-color: #000;
              -}
              -
              -[role="tablist"] > [role="tab"] > a.icon {
              -  font-size: 0;
              -}
              -
              -[role="tablist"] > [role="tab"] > a.icon:after {
              -  content: '';
              -  width: 100%;
              -  height: 100%;
              -  position: absolute;
              -  background: none no-repeat center top;
              -  left: 0;
              -  z-index: 1;
              -}
              -
              -/* Hidden */
              -[role="tablist"] > [role="tab"].hidden {
              -  visibility: hidden;
              -    -moz-transition: all .5s;
              -    -webkit-transition: all .5s;
              -    -o-transition: all .5s;
              -  transition: all .5s;
              -}
              -
              -/* Selected state */
              -[role="tablist"] > [role="tab"].selected > a {
              -  color: #000;
              -  background: #fff;
              -}
              -
              -[role="tablist"] > [role="tab"].selected > a.icon:after {
              -  background-position: center -4rem;
              -}
              -
              -/* Disabled state */
              -[role="tablist"] > [role="tab"][aria-disabled="true"] > a {
              -  color: #4d4d4d;
              -}
              -
              -[role="tablist"] > [role="tab"][aria-disabled="true"] > a.icon:after {
              -  background-position: center -8rem;
              -}
              -
              -[role="tablist"] [role="tabpanel"] {
              -  position: absolute;
              -  top: 4rem;
              -  left: 0;
              -  bottom: 5.2rem;
              -  visibility: hidden;
              -  width: 100%;
              -  display: block;
              -  overflow: auto;
              -  background: #fff;
              -    -moz-transition: all .4s;
              -    -webkit-transition: all .4s;
              -    -o-transition: all .4s;
              -  transition: all .4s;    
              -}
              -
              -.fullscreen [role="tablist"] [role="tabpanel"] {
              -  bottom: 0; 
              -}
              -
              -.current [role="tablist"] [role="tabpanel"],
              -.parent [role="tablist"] [role="tabpanel"],
              -.active [role="tablist"] [role="tabpanel"] {
              -    -moz-transform: translateX(-102%);
              -    -webkit-transform: translateX(-102%);
              -    -o-transform: translateX(-102%);
              -    -ms-transform: translateX(-102%);
              -  transform: translateX(-102%);
              -}
              -
              -.current [role="tablist"] .selected [role="tabpanel"],
              -.parent [role="tablist"] .selected [role="tabpanel"],
              -.active [role="tablist"] .selected [role="tabpanel"],
              -[dir="rtl"] .current [role="tablist"] .selected [role="tabpanel"],
              -[dir="rtl"] .parent [role="tablist"] .selected [role="tabpanel"],
              -[dir="rtl"] .active [role="tablist"] .selected [role="tabpanel"] {
              -  visibility: visible;
              -    -moz-transform: none;
              -    -webkit-transform: none;
              -    -o-transform: none;
              -    -ms-transform: none;
              -  transform: none;
              -}
              -
              -[role="tablist"] .selected ~ [role="tab"] [role="tabpanel"] {
              -    -moz-transform: translateX(102%);
              -    -webkit-transform: translateX(102%);
              -    -o-transform: translateX(102%);
              -    -ms-transform: translateX(102%);
              -  transform: translateX(102%);
              -}
              -
              -/* Position bottom */
              -[role="tablist"].bottom > [role="tab"] {
              -  height: 100%;
              -}
              -
              -[role="tablist"].bottom  > [role="tab"] > a {
              -  position: relative;
              -  height: 4rem;
              -    top: -moz-calc(100% - 4rem);
              -    top: -webkit-calc(100% - 4rem);
              -  top: calc(100% - 4rem);
              -}
              -
              -[role="tablist"].bottom [role="tabpanel"] {
              -  top: 0;
              -}
              -
              -/* ----------------------------------
              - * Filters
              - * ---------------------------------- */
              -
              -[role="tablist"][data-type="filter"] {
              -  background: #c7c7c7;
              -  display: inline-block;
              -  width: 100%;
              -  list-style: none;
              -  padding: 0;
              -  margin: 0;
              -  position: relative;
              -}
              -
              -[role="tablist"][data-type="filter"]:before {
              -  content: "";
              -  position: absolute;
              -  left: 0;
              -  right: 0;
              -  top: 100%;
              -  height: 0.2rem;
              -  background: transparent;
              -}
              -
              -[role="tablist"][data-type="filter"] > [role="tab"] {
              -  float: left;
              -  text-align: center;
              -    -moz-box-sizing: border-box;
              -    -webkit-box-sizing: border-box;
              -  box-sizing: border-box;
              -  color: #737272;
              -  border-bottom: solid 1px #999;
              -}
              -
              -[role="tablist"][data-type="filter"] > [role="tab"] > a {
              -  display: block;
              -  padding: 1.3rem 0.5rem;
              -  text-decoration: none;
              -  color: #737272;
              -  overflow: hidden;
              -  text-overflow: ellipsis;
              -  white-space: nowrap;
              -  background-color: transparent;
              -  font: bold 1.4rem/1em "Open Sans", Sans-serif;
              -  width: auto;
              -  float: none;
              -}
              -
              -/* Selected state */
              -[role="tablist"][data-type="filter"] > [role="tab"].selected {
              -  background: #fff;
              -  border: solid 1px #999;
              -  border-top: none;
              -  color: #000;
              -}
              -
              -[role="tablist"][data-type="filter"] > [role="tab"].selected > a {
              -  color: #000;
              -}
              -
              -[role="tablist"][data-type="filter"] > [role="tab"] > a:active {
              -  background-color: #008aaa;
              -  color: #fff;
              -}
              -
              -/* Bottom position */
              -[role="tablist"][data-type="filter"].bottom:before {
              -  bottom: 100%;
              -  top: auto;
              -  background-image: transparent;
              -}
              -
              -[role="tablist"][data-type="filter"].bottom > [role="tab"] {
              -  border-bottom: none;
              -  border-top: solid 1px #999;
              -}
              -[role="tablist"][data-type="filter"].bottom > [role="tab"] > a {
              -  height: auto;
              -}
              -
              -
              -/* RTL */
              -[dir="rtl"] [role="tablist"] > [role="tab"] {
              -    float: right;   
              -}
              -
              -[dir="rtl"] .current [role="tablist"] [role="tabpanel"],
              -[dir="rtl"] .parent [role="tablist"] [role="tabpanel"],
              -[dir="rtl"] .active [role="tablist"] [role="tabpanel"] {
              -    -moz-transform: translateX(102%);
              -    -webkit-transform: translateX(102%);
              -    -o-transform: translateX(102%);
              -    -ms-transform: translateX(102%);
              -  transform: translateX(102%);
              -}
              -
              -[dir="rtl"] [role="tablist"] .selected ~ [role="tab"] [role="tabpanel"] {
              -    -moz-transform: translateX(-102%);
              -    -webkit-transform: translateX(-102%);
              -    -o-transform: translateX(-102%);
              -    -ms-transform: translateX(-102%);
              -  transform: translateX(-102%);
              -}
              diff --git a/style/bb/toolbars.css b/style/bb/toolbars.css
              index aed5a86..e4417d7 100755
              --- a/style/bb/toolbars.css
              +++ b/style/bb/toolbars.css
              @@ -37,6 +37,7 @@
                 padding: 0;
                 border-radius: 0;
                 text-indent: -100%;
              +  margin: 0;
               }
               
               [role="toolbar"] button:active, 
              diff --git a/style/codemirror/codemirror.css b/style/codemirror/codemirror.css
              new file mode 100644
              index 0000000..cacdd4b
              --- /dev/null
              +++ b/style/codemirror/codemirror.css
              @@ -0,0 +1,308 @@
              +/* BASICS */
              +
              +.CodeMirror {
              +  /* Set height, width, borders, and global font properties here */
              +  font-family: monospace;
              +}
              +
              +/* PADDING */
              +
              +.CodeMirror-lines {
              +  padding: 4px 0 18px; /* Vertical padding around content */
              +}
              +.CodeMirror pre {
              +  padding: 0 4px; /* Horizontal padding of content */
              +}
              +
              +.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
              +  background-color: white; /* The little square between H and V scrollbars */
              +}
              +
              +/* GUTTER */
              +
              +.CodeMirror-gutters {
              +  background-color: #fff;
              +  border-right: 1px solid #ddd;
              +  white-space: nowrap;
              +}
              +.CodeMirror-linenumbers {}
              +.CodeMirror-linenumber {
              +  padding: 0 3px 0 5px;
              +  min-width: 20px;
              +  text-align: right;
              +  color: #999;
              +  -moz-box-sizing: content-box;
              +  box-sizing: content-box;
              +}
              +
              +.CodeMirror-guttermarker { color: black; }
              +.CodeMirror-guttermarker-subtle { color: #999; }
              +
              +/* CURSOR */
              +
              +.CodeMirror div.CodeMirror-cursor {
              +  border-left: 1px solid black;
              +}
              +/* Shown when moving in bi-directional text */
              +.CodeMirror div.CodeMirror-secondarycursor {
              +  border-left: 1px solid silver;
              +}
              +.CodeMirror.cm-fat-cursor div.CodeMirror-cursor {
              +  width: auto;
              +  border: 0;
              +  background: #7e7;
              +}
              +.CodeMirror.cm-fat-cursor div.CodeMirror-cursors {
              +  z-index: 1;
              +}
              +
              +.cm-animate-fat-cursor {
              +  width: auto;
              +  border: 0;
              +  -webkit-animation: blink 1.06s steps(1) infinite;
              +  -moz-animation: blink 1.06s steps(1) infinite;
              +  animation: blink 1.06s steps(1) infinite;
              +}
              +@-moz-keyframes blink {
              +  0% { background: #7e7; }
              +  50% { background: none; }
              +  100% { background: #7e7; }
              +}
              +@-webkit-keyframes blink {
              +  0% { background: #7e7; }
              +  50% { background: none; }
              +  100% { background: #7e7; }
              +}
              +@keyframes blink {
              +  0% { background: #7e7; }
              +  50% { background: none; }
              +  100% { background: #7e7; }
              +}
              +
              +/* Can style cursor different in overwrite (non-insert) mode */
              +div.CodeMirror-overwrite div.CodeMirror-cursor {}
              +
              +.cm-tab { display: inline-block; text-decoration: inherit; }
              +
              +.CodeMirror-ruler {
              +  border-left: 1px solid #ccc;
              +  position: absolute;
              +}
              +
              +/* DEFAULT THEME */
              +
              +.cm-s-default .cm-keyword {color: #708;}
              +.cm-s-default .cm-atom {color: #219;}
              +.cm-s-default .cm-number {color: #164;}
              +.cm-s-default .cm-def {color: #00f;}
              +.cm-s-default .cm-variable,
              +.cm-s-default .cm-punctuation,
              +.cm-s-default .cm-property,
              +.cm-s-default .cm-operator {}
              +.cm-s-default .cm-variable-2 {color: #05a;}
              +.cm-s-default .cm-variable-3 {color: #085;}
              +.cm-s-default .cm-comment {color: #a50;}
              +.cm-s-default .cm-string {color: #a11;}
              +.cm-s-default .cm-string-2 {color: #f50;}
              +.cm-s-default .cm-meta {color: #555;}
              +.cm-s-default .cm-qualifier {color: #555;}
              +.cm-s-default .cm-builtin {color: #30a;}
              +.cm-s-default .cm-bracket {color: #997;}
              +.cm-s-default .cm-tag {color: #170;}
              +.cm-s-default .cm-attribute {color: #00c;}
              +.cm-s-default .cm-header {color: blue;}
              +.cm-s-default .cm-quote {color: #090;}
              +.cm-s-default .cm-hr {color: #999;}
              +.cm-s-default .cm-link {color: #00c;}
              +
              +.cm-negative {color: #d44;}
              +.cm-positive {color: #292;}
              +.cm-header, .cm-strong {font-weight: bold;}
              +.cm-em {font-style: italic;}
              +.cm-link {text-decoration: underline;}
              +.cm-strikethrough {text-decoration: line-through;}
              +
              +.cm-s-default .cm-error {color: #f00;}
              +.cm-invalidchar {color: #f00;}
              +
              +/* Default styles for common addons */
              +
              +div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
              +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
              +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
              +.CodeMirror-activeline-background {background: #e8f2ff;}
              +
              +/* STOP */
              +
              +/* The rest of this file contains styles related to the mechanics of
              +   the editor. You probably shouldn't touch them. */
              +
              +.CodeMirror {
              +  line-height: 1;
              +  position: relative;
              +  overflow: hidden;
              +  background: white;
              +  color: black;
              +}
              +
              +.CodeMirror-scroll {
              +  overflow: scroll !important; /* Things will break if this is overridden */
              +  /* 30px is the magic margin used to hide the element's real scrollbars */
              +  /* See overflow: hidden in .CodeMirror */
              +  margin-bottom: -30px; margin-right: -30px;
              +  padding-bottom: 30px;
              +  height: 100%;
              +  outline: none; /* Prevent dragging from highlighting the element */
              +  position: relative;
              +  -moz-box-sizing: content-box;
              +  box-sizing: content-box;
              +}
              +.CodeMirror-sizer {
              +  position: relative;
              +  border-right: 30px solid transparent;
              +  -moz-box-sizing: content-box;
              +  box-sizing: content-box;
              +}
              +
              +/* The fake, visible scrollbars. Used to force redraw during scrolling
              +   before actuall scrolling happens, thus preventing shaking and
              +   flickering artifacts. */
              +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
              +  position: absolute;
              +  z-index: 6;
              +  display: none;
              +}
              +.CodeMirror-vscrollbar {
              +  right: 0; top: 0;
              +  overflow-x: hidden;
              +  overflow-y: scroll;
              +}
              +.CodeMirror-hscrollbar {
              +  bottom: 0; left: 0;
              +  overflow-y: hidden;
              +  overflow-x: scroll;
              +}
              +.CodeMirror-scrollbar-filler {
              +  right: 0; bottom: 0;
              +}
              +.CodeMirror-gutter-filler {
              +  left: 0; bottom: 0;
              +}
              +
              +.CodeMirror-gutters {
              +  position: absolute; left: 0; top: 0;
              +  z-index: 3;
              +}
              +.CodeMirror-gutter {
              +  white-space: normal;
              +  height: 100%;
              +  -moz-box-sizing: content-box;
              +  box-sizing: content-box;
              +  display: inline-block;
              +  margin-bottom: -30px;
              +  /* Hack to make IE7 behave */
              +  *zoom:1;
              +  *display:inline;
              +}
              +.CodeMirror-gutter-wrapper {
              +  position: absolute;
              +  z-index: 4;
              +  height: 100%;
              +}
              +.CodeMirror-gutter-elt {
              +  position: absolute;
              +  cursor: default;
              +  z-index: 4;
              +}
              +
              +.CodeMirror-lines {
              +  cursor: text;
              +  min-height: 1px; /* prevents collapsing before first draw */
              +}
              +.CodeMirror pre {
              +  /* Reset some styles that the rest of the page might have set */
              +  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
              +  border-width: 0;
              +  background: transparent;
              +  font-family: inherit;
              +  font-size: inherit;
              +  margin: 0;
              +  white-space: pre;
              +  word-wrap: normal;
              +  line-height: inherit;
              +  color: inherit;
              +  z-index: 2;
              +  position: relative;
              +  overflow: visible;
              +}
              +.CodeMirror-wrap pre {
              +  word-wrap: break-word;
              +  white-space: pre-wrap;
              +  word-break: normal;
              +}
              +
              +.CodeMirror-linebackground {
              +  position: absolute;
              +  left: 0; right: 0; top: 0; bottom: 0;
              +  z-index: 0;
              +}
              +
              +.CodeMirror-linewidget {
              +  position: relative;
              +  z-index: 2;
              +  overflow: auto;
              +}
              +
              +.CodeMirror-widget {}
              +
              +.CodeMirror-measure {
              +  position: absolute;
              +  width: 100%;
              +  height: 0;
              +  overflow: hidden;
              +  visibility: hidden;
              +}
              +.CodeMirror-measure pre { position: static; }
              +
              +.CodeMirror div.CodeMirror-cursor {
              +  position: absolute;
              +  border-right: none;
              +  width: 0;
              +}
              +
              +div.CodeMirror-cursors {
              +  visibility: hidden;
              +  position: relative;
              +  z-index: 3;
              +}
              +.CodeMirror-focused div.CodeMirror-cursors {
              +  visibility: visible;
              +}
              +
              +.CodeMirror-selected { background: #d9d9d9; }
              +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
              +.CodeMirror-crosshair { cursor: crosshair; }
              +
              +.cm-searching {
              +  background: #ffa;
              +  background: rgba(255, 255, 0, .4);
              +}
              +
              +/* IE7 hack to prevent it from returning funny offsetTops on the spans */
              +.CodeMirror span { *vertical-align: text-bottom; }
              +
              +/* Used to force a border model for a node */
              +.cm-force-border { padding-right: .1px; }
              +
              +@media print {
              +  /* Hide the cursor when printing */
              +  .CodeMirror div.CodeMirror-cursors {
              +    visibility: hidden;
              +  }
              +}
              +
              +/* See issue #2901 */
              +.cm-tab-wrap-hack:after { content: ''; }
              +
              +/* Help users use markselection to safely style text background */
              +span.CodeMirror-selectedtext { background: none; }
              diff --git a/style/codemirror/tomorrow-night-bright.css b/style/codemirror/tomorrow-night-bright.css
              new file mode 100644
              index 0000000..decb82d
              --- /dev/null
              +++ b/style/codemirror/tomorrow-night-bright.css
              @@ -0,0 +1,35 @@
              +/*
              +
              +    Name:       Tomorrow Night - Bright
              +    Author:     Chris Kempson
              +
              +    Port done by Gerard Braad <me@gbraad.nl>
              +
              +*/
              +
              +.cm-s-tomorrow-night-bright.CodeMirror {background: #000000; color: #eaeaea;}
              +.cm-s-tomorrow-night-bright div.CodeMirror-selected {background: #424242 !important;}
              +.cm-s-tomorrow-night-bright .CodeMirror-gutters {background: #000000; border-right: 0px;}
              +.cm-s-tomorrow-night-bright .CodeMirror-guttermarker { color: #e78c45; }
              +.cm-s-tomorrow-night-bright .CodeMirror-guttermarker-subtle { color: #777; }
              +.cm-s-tomorrow-night-bright .CodeMirror-linenumber {color: #424242;}
              +.cm-s-tomorrow-night-bright .CodeMirror-cursor {border-left: 1px solid #6A6A6A !important;}
              +
              +.cm-s-tomorrow-night-bright span.cm-comment {color: #d27b53;}
              +.cm-s-tomorrow-night-bright span.cm-atom {color: #a16a94;}
              +.cm-s-tomorrow-night-bright span.cm-number {color: #a16a94;}
              +
              +.cm-s-tomorrow-night-bright span.cm-property, .cm-s-tomorrow-night-bright span.cm-attribute {color: #99cc99;}
              +.cm-s-tomorrow-night-bright span.cm-keyword {color: #d54e53;}
              +.cm-s-tomorrow-night-bright span.cm-string {color: #e7c547;}
              +
              +.cm-s-tomorrow-night-bright span.cm-variable {color: #b9ca4a;}
              +.cm-s-tomorrow-night-bright span.cm-variable-2 {color: #7aa6da;}
              +.cm-s-tomorrow-night-bright span.cm-def {color: #e78c45;}
              +.cm-s-tomorrow-night-bright span.cm-bracket {color: #eaeaea;}
              +.cm-s-tomorrow-night-bright span.cm-tag {color: #d54e53;}
              +.cm-s-tomorrow-night-bright span.cm-link {color: #a16a94;}
              +.cm-s-tomorrow-night-bright span.cm-error {background: #d54e53; color: #6A6A6A;}
              +
              +.cm-s-tomorrow-night-bright .CodeMirror-activeline-background {background: #2a2a2a !important;}
              +.cm-s-tomorrow-night-bright .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;}
              diff --git a/style/desktop.css b/style/desktop.css
              index c4c91c2..81dd216 100644
              --- a/style/desktop.css
              +++ b/style/desktop.css
              @@ -1,92 +1,349 @@
              -@media (min-width: 767px) {
              -  /* Regions */
              -  section[role="dialog"],
              -  form[role="dialog"] {
              -    width: auto;
              -    height: auto;
              -    top: 20%;
              -    left: 20%;
              -    right: 20%;
              -    bottom: 20%;    
              -    border: 1px solid #dfdfdf;
              -    box-shadow: 0 0 10px #efefef;
              -      -webkit-transform: translateY(150%);
              -      -moz-transform: translateY(150%);
              -      -o-transform: translateY(150%);
              -      -ms-transform: translateY(150%);
              -    transform: translateY(150%);
              -    z-index: 102 !important;
              -  }
              -  section[role="dialog"] + .background,
              -  form[role="dialog"] + .background {
              -    z-index: 101;
              -    top: 0;
              -    left: 0;
              -    right: 0;
              -    bottom: 0;
              -    display: block;
              -    position: fixed;
              -    background: rgba(255,255,255,.7);
              -    opacity: 0;
              -    visibility: hidden;
              -      -moz-transition: opacity .4s, visibility .4s 0s;
              -      -webkit-transition: opacity .4s, visibility .4s 0s;
              -      -o-transition: opacity .4s, visibility .4s 0s;
              -      -ms-transition: opacity .4s, visibility .4s 0s;
              -    transition: opacity .4s, visibility .4s 0s;
              -  }
              -  section[role="dialog"].current + .background,
              -  section[role="dialog"].parent + .background,
              -  form[role="dialog"].current + .background,
              -  form[role="dialog"].parent + .background {
              -    opacity: 1;
              -    visibility: visible;
              -      -moz-transition: opacity .4s, visibility 0s;
              -      -webkit-transition: opacity .4s, visibility 0s;
              -      -o-transition: opacity .4s, visibility 0s;
              -      -ms-transition: opacity .4s, visibility 0s;
              -    transition: opacity .4s, visibility 0s;
              -  }
              -  
              -  /* Tabs */
              -  [role="tablist"] > [role="tab"] {
              -    width: auto !important;
              -  }
              -  [role="tablist"] > [role="tab"] > a {
              -    padding: 0 15px;
              -    width: auto;
              -  }
              -  
              -  /* Drawer/Sidebar */
              -  section[data-type="sidebar"], section[data-type="sidebar"] [role="toolbar"] {
              -    width: 250px;
              -  }
              -  section[data-type="sidebar"] > nav {
              -    height: calc(100% - 5rem - 4rem);
              -  }
              -  [data-state="drawer"].current,
              -  [dir="rtl"] [data-state="drawer"][data-position="right"].current {
              -      -moz-transform: translateX(250px) !important;
              -      -webkit-transform: translateX(250px) !important;
              -      -o-transform: translateX(250px) !important;
              -      -ms-transform: translateX(250px) !important;    
              -    transform: translateX(250px) !important;   
              -  }
              -  [data-state="drawer"][data-position="right"].current,
              -  [dir="rtl"] [data-state="drawer"].current {
              -      -moz-transform: translateX(-250px) !important;
              -      -webkit-transform: translateX(-250px) !important;
              -      -o-transform: translateX(-250px) !important;
              -      -ms-transform: translateX(-250px) !important;    
              -    transform: translateX(-250px) !important;
              -  }  
              -  
              -  /* Misc */    
              -  .firetext {
              -    text-align: left !important;      
              -  }
              +html {
              +  font-size: 9px;
              +}
              +
              +.mobile-only {
              +  display: none !important;
              +}
              +
              +/* Regions */
              +section[role="region"] {
              +  opacity: 0;
              +    -moz-transition-duration: 0.2s;
              +    -webkit-transition-duration: 0.2s;
              +    -o-transition-duration: 0.2s;
              +  transition-duration: 0.2s;
              +}
              +
              +section[role="region"].current,
              +[role="region"].parent,
              +[role="dialog"].parent {
              +  opacity: 1;
              +}
              +
              +section[role="dialog"],
              +form[role="dialog"] {
              +  width: auto;
              +  height: auto;
              +  top: 20%;
              +  left: 20%;
              +  right: 20%;
              +  bottom: 20%;    
              +  border: 1px solid #dfdfdf;
              +  box-shadow: 0 0 10px #efefef;
              +    -webkit-transform: translateY(150%);
              +    -moz-transform: translateY(150%);
              +    -o-transform: translateY(150%);
              +    -ms-transform: translateY(150%);
              +  transform: translateY(150%);
              +  z-index: 102 !important;
              +}
              +
              +section[role="dialog"] + .background,
              +form[role="dialog"] + .background {
              +  z-index: 101;
              +  top: 0;
              +  left: 0;
              +  right: 0;
              +  bottom: 0;
              +  display: block;
              +  position: fixed;
              +  background: rgba(255,255,255,.7);
              +  opacity: 0;
              +  visibility: hidden;
              +    -moz-transition: opacity .4s, visibility .4s 0s;
              +    -webkit-transition: opacity .4s, visibility .4s 0s;
              +    -o-transition: opacity .4s, visibility .4s 0s;
              +    -ms-transition: opacity .4s, visibility .4s 0s;
              +  transition: opacity .4s, visibility .4s 0s;
              +}
              +
              +section[role="dialog"].current + .background,
              +section[role="dialog"].parent + .background,
              +form[role="dialog"].current + .background,
              +form[role="dialog"].parent + .background {
              +  opacity: 1;
              +  visibility: visible;
              +    -moz-transition: opacity .4s, visibility 0s;
              +    -webkit-transition: opacity .4s, visibility 0s;
              +    -o-transition: opacity .4s, visibility 0s;
              +    -ms-transition: opacity .4s, visibility 0s;
              +  transition: opacity .4s, visibility 0s;
              +}
              +
              +/* Tabs */
              +[role="tabs"] [role="tab"] {
              +  opacity: 0;
              +    -moz-transition-duration: 0.2s;
              +    -webkit-transition-duration: 0.2s;
              +    -o-transition-duration: 0.2s;
              +  transition-duration: 0.2s;
              +}
              +
              +[role="tabs"] [role="tab"].selected-tab {
              +  opacity: 1;
              +}
                 
              -  [dir="rtl"] .firetext {
              -    text-align: right !important;      
              -  }
              +/* Drawer/Sidebar */
              +section[data-type="sidebar"] {
              +  width: auto;
              +  position: absolute;
              +  top: 5.5rem;
              +  margin: 0 4px;
              +  z-index: 1000;
              +    height: -moz-calc(100% - 5.5rem - 3rem);
              +    height: -webkit-calc(100% - 5.5rem - 3rem);
              +  height: calc(100% - 5.5rem - 3rem);
              +  transition: none;
              +  background-color: transparent;
              +  color: #1f1f1f;
              +  border-radius: 8px;
              +  overflow: visible;
              +  pointer-events: none;
              +}
              +
              +.fullscreen section[data-type="sidebar"] {
              +  top: 4.5rem;
              +    height: -moz-calc(100% - 4.5rem - 3rem);
              +    height: -webkit-calc(100% - 4.5rem - 3rem);
              +  height: calc(100% - 4.5rem - 3rem);
              +}
              +
              +section[data-type="sidebar"] > * {
              +  pointer-events: all;
              +}
              +
              +section[data-type="sidebar"] > header:first-child {
              +  display: none;
              +}
              +
              +section[data-type="sidebar"] > nav {
              +  height: auto;
              +    max-height: -moz-calc(100% - 5rem);
              +    max-height: -webkit-calc(100% - 5rem);
              +  max-height: calc(100% - 5rem);
              +  border: 1px solid #ccc;
              +  border-bottom-width: 0;
              +  padding: 5px 0;
              +  border-radius: inherit;
              +  border-bottom-left-radius: 0;
              +  border-bottom-right-radius: 0;
              +  background-color: #ffffff;
              +}
              +
              +section[data-type="sidebar"] > nav:before,
              +section[data-type="sidebar"] > nav:after {
              +  height: 0;
              +  width: 0;
              +  position: absolute;
              +  border: solid transparent;
              +  content: " ";
              +  border-width: 11px;
              +  margin-left: -11px;
              +  right: 9px;
              +}
              +
              +section[data-type="sidebar"] > nav:before {
              +  border-bottom-color: #ccc;
              +  bottom: 100%;
              +}
              +
              +section[data-type="sidebar"] > nav:after {
              +  border-bottom-color: #fff;
              +    bottom: -moz-calc(100% - 1px);
              +    bottom: -webkit-calc(100% - 1px);
              +  bottom: calc(100% - 1px);
              +}
              +
              +section[data-type="sidebar"] > nav > h2 {
              +  background-color: transparent;
              +  text-indent: 0;
              +  font-size: 1.8rem;
              +  padding: 0.5rem 2rem;
              +}
              +
              +section[data-type="sidebar"] > nav > ul > li:active {
              +  background-color: #efefef;
              +}
              +
              +section[data-type="sidebar"] > nav > ul > li > a {
              +  font-size: 1.8rem;
              +  line-height: 4rem;
              +  padding: 0.5rem 2rem;
              +  text-indent: 0;
              +}
              +
              +section[data-type="sidebar"] [role="toolbar"] {
              +  width: 100%;
              +  position: static;
              +  background-color: #efefef;
              +  color: inherit;
              +  border-radius: inherit;
              +  border-top-left-radius: 0;
              +  border-top-right-radius: 0;
              +  overflow: hidden;
              +  border: 1px solid #ccc;
              +  border-top-width: 0;
              +}
              +
              +section[data-type="sidebar"] [role="toolbar"] button {
              +  margin: 0;
              +}
              +
              +section[data-type="sidebar"] [role="toolbar"] button:active,
              +section[data-type="sidebar"] [role="toolbar"] button.active {
              +  background-color: #ccc; 
              +}
              +
              +[data-state="drawer"].current,
              +[data-state="drawer"][data-position="right"].current,
              +[dir="rtl"] [data-state="drawer"].current,
              +[dir="rtl"] [data-state="drawer"][data-position="right"].current {
              +    -moz-transform: translateX(0) !important;
              +    -webkit-transform: translateX(0) !important;
              +    -o-transform: translateX(0) !important;
              +    -ms-transform: translateX(0) !important;    
              +  transform: translateX(0) !important;   
              +}
              +
              +[dir="rtl"] section[data-type="sidebar"] > nav:before,
              +[dir="rtl"] section[data-type="sidebar"] > nav:after {
              +  right: auto;
              +  left: 9px;
              +  margin-left: 0;
              +}
              +
              +/* Editor */
              +#fileName {
              +  display: inline-block;
              +}
              +
              +.edit-header .tabBar {
              +  display: inline-block;
              +  height: 100%;
              +}
              +
              +.edit-header .tabBar > div {
              +  font-size: 2rem;
              +  line-height: 5rem;
              +    -webkit-box-sizing: border-box;
              +  box-sizing: border-box;
              +}
              +
              +#edit-bar {
              +  top: 0;
              +  background-color: #fafafa;
              +  border-bottom: 2px solid #efefef;
              +}
              +
              +.icon-more {
              +    -moz-transform: rotate(0.5turn);
              +    -webkit-transform: rotate(0.5turn);
              +    -o-transform: rotate(0.5turn);
              +    -ms-transform: rotate(0.5turn);
              +  transform: rotate(0.5turn);
              +}
              +
              +/* Zen mode */
              +.fullscreen .edit-header {
              +  right: 1.1rem;
              +  top: 0.5rem;
              +  background-color: transparent;
              +  position: absolute;
              +  border: none;
              +}
              +
              +.fullscreen .no-zen {
              +  display: none !important;
              +}
              +
              +.fullscreen #edit-bar {
              +  background-color: transparent !important;
              +  border-color: transparent !important;
              +  width: auto;
              +  top: 6rem;
              +  left: auto;
              +  right: 0;
              +}
              +
              +.fullscreen #edit-bar li {
              +  float: none;
              +  margin: 0;
              +  padding: 0.5rem;
              +}
              +
              +.fullscreen #edit-bar button {
              +  border-right: 4px solid transparent;
              +}
              +
              +.fullscreen #edit-bar button:active,
              +.fullscreen #edit-bar button.active {
              +  background-color: transparent;
              +  border-color: #aaa !important;
              +}
              +
              +.fullscreen #edit-bar .icon-more {
              +    -moz-transform: rotate(-.25turn);
              +    -webkit-transform: rotate(-.25turn);
              +    -o-transform: rotate(-.25turn);
              +    -ms-transform: rotate(-.25turn);
              +  transform: rotate(-.25turn);
              +}
              +
              +.fullscreen .editor-container {
              +  height: 100%;
              +}
              +
              +.fullscreen #rawEditor {
              +  padding-top: 7rem;
              +}
              +
              +[dir="rtl"].fullscreen .edit-header {
              +  left: 1.1rem;
              +  right: auto;
              +}
              +
              +[dir="rtl"].fullscreen #edit-bar {
              +  right: auto;
              +  left: 0;
              +}
              +
              +[dir="rtl"] #edit-bar button {
              +  border-left: 4px solid transparent;
              +  border-right: none;
              +}
              +
              +[dir="rtl"].fullscreen #edit-bar .icon-more {
              +    -moz-transform: rotate(.25turn);
              +    -webkit-transform: rotate(.25turn);
              +    -o-transform: rotate(.25turn);
              +    -ms-transform: rotate(.25turn);
              +  transform: rotate(.25turn);
              +}
              +
              +/* Status */
              +section[role="status"] {
              +  left: 0;
              +  right: auto;
              +  max-width: 400px;
              +  border-radius: 8px;
              +  margin: 1rem;
              +  background-color: #fff;
              +  border: 1px solid #ccc;
              +  padding: 10px;
              +  box-shadow: 0 0 10px #ccc;
              +	opacity: 0;
              +}
              +
              +[dir="rtl"] section[role="status"] {
              +  left: auto;
              +  right: 0;  
              +}
              +
              +section[role="status"] p {
              +  margin: 0; 
              +}
              +
              +section[role="status"].notification-shown {
              +	opacity: 1;
               }
              diff --git a/style/editor.css b/style/editor.css
              index 535d8a4..67ff152 100755
              --- a/style/editor.css
              +++ b/style/editor.css
              @@ -1,35 +1,59 @@
               .editor-container {
              -  height: 100%;
              -  padding: 0;
              -  margin: 0;
              -  overflow: scroll;
              +	padding: 0;
              +	margin: 0;
              +	overflow: auto;
              +	position: relative;
               }
               
               .editor {
              -  border: none;
              -  font-size: 2em;
              -  font-family: "Open Sans", Sans-serif;
              -  outline: none;
              -  width: 100%;
              -  height: 100%;
              -  word-wrap: break-word;
              +	border: none;
              +	font-size: 1.8rem;
              +	font-family: "Open Sans", Sans-serif;
              +	outline: none;
              +	width: 100%;
              +	height: 100%;
              +	display: block;
              +	max-height: unset;
               }
               
              +/* HTML editor */
               #tempEditDiv {
              -  font-family: "Open Sans", Sans-serif;
              +	font-family: "Open Sans", Sans-serif;
               }
               
              -#rawEditor {
              -  border: none;
              -  padding: 5px 5px 6rem;
              -  font-size: 2em;
              -  outline: none;
              -  font-family: monospace;
              -  display: block;
              -  max-width: 100%;
              -  direction: ltr;
              +[role="toolbar"] .hidden {
              +	visibility: hidden;
               }
               
              -[role="toolbar"] .hidden {
              -  visibility: hidden;
              +#edit-bar {
              +	position: absolute;
              +	bottom: 0;
              +}
              +
              +/* Header */
              +#fileName {
              +	text-align: left;
              +}
              +
              +.edit-header .tabBar {
              +	vertical-align: top;
              +}
              +
              +.edit-header .tabBar > div {
              +	text-decoration: none
              +	color: #737373;
              +		-moz-transition: all .5s;
              +		-webkit-transition: all .5s;
              +		-o-transition: all .5s;
              +	transition: all .5s;
              +	cursor: pointer;
              +	display: inline-block;
              +	margin: 0 7px;
              +	border-bottom: 2px solid transparent;
              +	height: 100%;
              +}
              +
              +.edit-header .tabBar > div.selected-tab-button {
              +	border-color: #737373;
              +	color: #1f1f1f;
               }
              diff --git a/style/headers.css b/style/headers.css
              index 8417a43..ae21549 100755
              --- a/style/headers.css
              +++ b/style/headers.css
              @@ -11,7 +11,7 @@ section > header:first-child {
               
               section > header:first-child h1 {
                 color: inherit;
              -  margin: 0 5rem;
              +  margin: 0 1rem;
               }
               
               section > header:first-child h1.firetext {
              diff --git a/style/main.css b/style/main.css
              index 9463568..dd85bd1 100755
              --- a/style/main.css
              +++ b/style/main.css
              @@ -20,15 +20,26 @@ html, body {
                   height: -moz-calc(100% - 5.2rem);
                   height: -webkit-calc(100% - 5.2rem);
                 height: calc(100% - 5.2rem);
              -  overflow: scroll;
              +  overflow: auto;
              +  width: 100%;
              +  border: none;
              +  outline: none;
               }
               
              -.redAlert {
              -  color: red;
              +.no-storage-notice {
                 font-size: 2rem;
                 text-align: center;
                 display: block;
              -  margin: 1rem;
              +  margin: 10% 1rem 1rem;
              +}
              +
              +.no-storage-notice button {
              +  width: auto;
              +  margin-top: 1rem;
              +}
              +
              +.hidden-item {
              +  display: none !important;
               }
               
               #hide-keyboard-button {
              @@ -51,7 +62,6 @@ html, body {
                 display: inline-block; 
               }
               
              -
               /* Fonts */
               @font-face {
                 font-family: 'Open Sans';
              @@ -59,13 +69,17 @@ html, body {
                 src: local('OpenSans'), url(fonts/OpenSans.woff) format('woff');
               }
               
              -
              -
               /* Style hacks */
               [role="toolbar"] button.ftanylitics {
                 background-color: #444;
               }
               
              +section[data-type="sidebar"] > nav {
              +    height: -moz-calc(100% - 5rem - 4rem);
              +    height: -webkit-calc(100% - 5rem - 4rem);
              +  height: calc(100% - 5rem - 4rem);
              +}
              +
               section[data-type="sidebar"] [role="toolbar"] .icon-setting {
                 padding-top: .3rem;
                 font-size: 2.5rem;
              @@ -82,6 +96,29 @@ section > header:first-child .icon.icon-close {
                 padding-top: 1.4rem;
               }
               
              +.tabToolbar .icon-close {
              +  font-size: 1.5rem !important;
              +}
              +
              +.firetext {
              +  text-align: left !important;
              +}
              +
              +#tab-design [role="tabpanel"] {
              +  overflow: hidden;
              +}
              +
              +section[data-type="sidebar"] > nav > ul > li {
              +  position: relative;
              +}
              +section[data-type="sidebar"] > nav > ul > li > iframe {
              +  border: 0;
              +  position: absolute;
              +  top: 0;
              +  width: 100%;
              +  height: 100%;
              +}
              +
               
               /* action_menu.css */
               form[role=dialog] {
              @@ -126,7 +163,7 @@ label.pack-switch {
               [data-type="list"] h2,
               [data-type="edit"] h2 {
                 background: #efefef;
              -  padding: 5px 20px;
              +  padding: 0.5rem 2rem;
                 color: #2C2C2C;
                 margin: 0 0;
                 font-family: "Open Sans";
              @@ -137,8 +174,8 @@ label.pack-switch {
               [data-type="list"] li a,
               [data-type="edit"] li a,
               .noLink {
              -  padding-left: 20px;
              -  padding-right: 20px;
              +  padding-left: 2rem;
              +  padding-right: 2rem;
               }
               
               
              @@ -209,12 +246,12 @@ label.pack-switch {
               /* Buttons */
               .button-block {
                 width: 96%;
              -  margin-left: 1.5%;
              +  margin: 1.5%;
               }
               
               
               /* Value selectors */
              -#fileTypeLegend {
              +.fileTypeLegend {
                 float: right;
                 width: 9rem;
               }
              @@ -224,6 +261,11 @@ label.pack-switch {
                 padding-top: 11px;  
               }
               
              +#uploadDialogFiles {
              +  margin: 1.6rem auto 0.4rem;
              +  display: block;
              +}
              +
               #locationLegend {
                 width: 100%;
               }
              @@ -232,19 +274,23 @@ label.pack-switch {
                 text-align: center;
               }
                 
              -legend.action { 
              +fieldset legend {
              +  text-transform: initial;
              +}
              +
              +fieldset legend.action { 
                 background: none;
                 border: none;
                 border-radius: 0;
                 outline: none;
               }
               
              -legend.action:active {
              +fieldset legend.action:active {
                 background-color: #eee;
                 outline: none;
               }
               
              -legend.action select {
              +fieldset legend.action select {
                 width: 100%;
                 height: 100%;
                 background: transparent;
              @@ -268,57 +314,6 @@ aside select.dummy {
                 width: 80%;
               }
               
              -
              -/* Tab Toolbar */
              -.tabToolbar {
              -  text-align: right;
              -  opacity: 0;
              -  visibility: hidden;
              -  height: 4rem;
              -  transition: opacity .3s;
              -    -moz-transition: opacity .3s;
              -    -webkit-transition: opacity .3s;
              -    -o-transition: opacity .3s;
              -}
              -
              -.tabToolbar.visible {
              -  opacity: 1;
              -  visibility: visible;
              -}
              -
              -.tabToolbar button,
              -.tabToolbar .button,
              -.tabToolbar input[type="button"] {
              -  height: 100%;
              -  background: transparent;
              -  border: none;
              -  font-size: 0;
              -  border-radius: 0;
              -  width: 4rem;
              -  padding: 0 1rem;
              -}
              -
              -.tabToolbar button:active,
              -.tabToolbar .button:active,
              -.tabToolbar input[type="button"]:active {
              -  background-color: #dfdfdf;
              -  transition: background 0.2s ease;
              -    -moz-transition: background 0.2s ease;
              -    -webkit-transition: background 0.2s ease;
              -    -o-transition: background 0.2s ease;
              -}
              -
              -.tabToolbar button[class*=" icon-"],
              -.tabToolbar button[class^="icon-"],
              -.tabToolbar .button[class*=" icon-"],
              -.tabToolbar .button[class^="icon-"],
              -.tabToolbar input[type="button"][class*=" icon-"],
              -.tabToolbar input[type="button"][class^="icon-"] {
              -  font-size: 2.5rem;
              -  text-shadow: none;
              -}
              -
              -
               /* Spinner (Throbber) */
               .spinner {
                 border-radius: 100%;
              @@ -428,7 +423,7 @@ aside select.dummy {
                   margin-right: 1.5%;
               }
               
              -[dir="rtl"] #fileTypeLegend {
              +[dir="rtl"] .fileTypeLegend {
                   float: left;  
               }
               
              @@ -436,6 +431,10 @@ aside select.dummy {
                   text-align: left;
               }
               
              +[dir="rtl"] #tabToolbarLeft {
              +    float: right;
              +}
              +
               [dir="rtl"] .spinner > div {
                   -moz-animation-name: rtlSpin;
                   -webkit-animation-name: rtlSpin;
              @@ -450,6 +449,10 @@ aside select.dummy {
                   transform: scale(-1, 1);    
               }
               
              +[dir="rtl"] .firetext {
              +    text-align: right !important;
              +}
              +
               @keyframes rtlSpin{
                 0%{
                     -moz-transform: rotate(1turn);
              diff --git a/style/mobile.css b/style/mobile.css
              new file mode 100644
              index 0000000..b294334
              --- /dev/null
              +++ b/style/mobile.css
              @@ -0,0 +1,188 @@
              +.desktop-only {
              +  display: none !important;
              +}
              +
              +/* Regions */
              +section[role="region"] {
              +		-moz-transform: translateX(-100%);
              +		-webkit-transform: translateX(-100%);
              +		-o-transform: translateX(-100%); 
              +		-ms-transform: translateX(-100%); 
              +	transform: translateX(-100%);
              +}
              +
              +section[role="region"].current,
              +[role="region"].parent,
              +[role="dialog"].parent {
              +		-moz-transform: none;
              +		-webkit-transform: none;
              +		-o-transform: none;
              +		-ms-transform: none; 
              +	transform: none;
              +}
              +
              +section[role="region"].current ~ section[role="region"] {	 
              +		-moz-transform: translateX(100%);
              +		-webkit-transform: translateX(100%);
              +		-o-transform: translateX(100%);
              +		-ms-transform: translateX(100%);
              +	transform: translateX(100%);
              +}
              +
              +[dir="rtl"] section[role="region"] {
              +		-moz-transform: translateX(100%);
              +		-webkit-transform: translateX(100%);
              +		-o-transform: translateX(100%); 
              +		-ms-transform: translateX(100%); 
              +	transform: translateX(100%);
              +}
              +
              +[dir="rtl"] section[role="region"].current,
              +[dir="rtl"] [role="region"].parent {
              +		-moz-transform: none;
              +		-webkit-transform: none;
              +		-o-transform: none;
              +		-ms-transform: none; 
              +	transform: none;
              +}
              +
              +[dir="rtl"] section[role="region"].current ~ section[role="region"] {	 
              +		-moz-transform: translateX(-100%);
              +		-webkit-transform: translateX(-100%);
              +		-o-transform: translateX(-100%);
              +		-ms-transform: translateX(-100%);
              +	transform: translateX(-100%);
              +}
              +
              +/* Dialogs */
              +section[role="dialog"] + .background {
              +	display: none;
              +}
              +
              +/* Sidebars */
              +[data-type="sidebar"] {
              +		-moz-transition: .4s visibility 0s;
              +		-webkit-transition: .4s visibility 0s;
              +		-o-transition: 4s visibility 0s;
              +	transition: .4s visibility 0s;
              +}
              +
              +[data-type="sidebar"].active {
              +		-moz-transition: 0s visibility 0s;
              +		-webkit-transition: 0s visibility 0s;
              +		-o-transition: 0s visibility 0s;
              +	transition: 0s visibility 0s;
              +}
              +
              +[data-state="drawer"].current {
              +		-moz-transform: translateX(80%) !important;
              +		-webkit-transform: translateX(80%) !important;
              +		-o-transform: translateX(80%) !important;
              +		-ms-transform: translateX(80%) !important;
              +	transform: translateX(80%) !important;
              +}
              +
              +[dir="rtl"] [data-state="drawer"].current {
              +		-moz-transform: translateX(-80%) !important;
              +		-webkit-transform: translateX(-80%) !important;
              +		-o-transform: translateX(-80%) !important;
              +		-ms-transform: translateX(-80%) !important;
              +	transform: translateX(-80%) !important;
              +}
              +
              +[data-state="drawer"].current > *:not(.drawerEnabled) {
              +	pointer-events: none;		
              +}
              +
              +[data-state="drawer"].current .drawerEnabled {
              +	pointer-events: all;
              +}
              +
              +[data-state="drawer"][data-position="right"].current {
              +		-moz-transform: translateX(-80%) !important;
              +		-webkit-transform: translateX(-80%) !important;
              +		-o-transform: translateX(-80%) !important;
              +		-ms-transform: translateX(-80%) !important;
              +	transform: translateX(-80%) !important;
              +}
              +
              +[dir="rtl"] [data-state="drawer"][data-position="right"].current {
              +		-moz-transform: translateX(80%) !important;
              +		-webkit-transform: translateX(80%) !important;
              +		-o-transform: translateX(80%) !important;
              +		-ms-transform: translateX(80%) !important;
              +	transform: translateX(80%) !important;
              +}
              +
              +/* Tabs */
              +.current [role="tabs"] [role="tab"],
              +.parent [role="tabs"] [role="tab"],
              +.active [role="tabs"] [role="tab"] {
              +		-moz-transform: translateX(-100%);
              +		-webkit-transform: translateX(-100%);
              +		-o-transform: translateX(-100%);
              +		-ms-transform: translateX(-100%);
              +	transform: translateX(-100%);
              +}
              +
              +[dir="rtl"] .current [role="tabs"] [role="tab"],
              +[dir="rtl"] .parent [role="tabs"] [role="tab"],
              +[dir="rtl"] .active [role="tabs"] [role="tab"] {
              +		-moz-transform: translateX(102%);
              +		-webkit-transform: translateX(102%);
              +		-o-transform: translateX(102%);
              +		-ms-transform: translateX(102%);
              +	transform: translateX(102%);
              +}
              +
              +.current [role="tabs"] [role="tab"].selected-tab,
              +.parent [role="tabs"] [role="tab"].selected-tab,
              +.active [role="tabs"] [role="tab"].selected-tab {
              +		-moz-transform: none;
              +		-webkit-transform: none;
              +		-o-transform: none;
              +		-ms-transform: none;
              +	transform: none;
              +}
              +
              +[role="tabs"] .selected-tab ~ [role="tab"] {
              +		-moz-transform: translateX(100%);
              +		-webkit-transform: translateX(100%);
              +		-o-transform: translateX(100%);
              +		-ms-transform: translateX(100%);
              +	transform: translateX(100%);
              +}
              +
              +[dir="rtl"] [role="tabs"] .selected-tab ~ [role="tab"] {
              +		-moz-transform: translateX(-102%);
              +		-webkit-transform: translateX(-102%);
              +		-o-transform: translateX(-102%);
              +		-ms-transform: translateX(-102%);
              +	transform: translateX(-102%);
              +}
              +
              +/* Editor */
              +#fileName {
              +	display: none;
              +}
              +
              +.edit-header .tabBar {
              +	display: block;
              +	white-space: nowrap;
              +	overflow-x: auto;
              +	text-align: center;
              +}
              +
              +.edit-header .tabBar > div {
              +	font-size: 1.8rem;
              +	line-height: 5rem;
              +}
              +
              +/* Status */
              +section[role="status"] {
              +	transform: translateY(100%);
              +}
              +
              +section[role="status"].notification-shown {
              +	transform: none;
              +}
              diff --git a/style/night.css b/style/night.css
              index e0ade2a..3059697 100644
              --- a/style/night.css
              +++ b/style/night.css
              @@ -5,394 +5,296 @@
               
               .night,
               .night body {
              -  background: #111;
              -  color: #a0a0a0;
              +	background: #111;
              +	color: #a0a0a0;
               }
               
              -
               /* Regions */
               .night section[role="region"],
               .night section[role="dialog"],
               .night form[role="region"],
               .night form[role="dialog"] {
              -  background: #111;
              +	background: #111;
               }
               
              -.night [role="action"] {  
              -  background-color: #111;
              -  border-top: 1px solid #222;
              +.night [role="action"] {	
              +	background-color: #111;
              +	border-top: 1px solid #222;
               }
               
               .night [role="action"] + .background {
              -  background-color: rgba(0,0,0,0.7);
              +	background-color: rgba(0,0,0,0.7);
               }
               
               .night [role="action"] > menu > button {
              -  background-color: #333;
              -  color: #fff;
              +	background-color: #333;
              +	color: #fff;
               }
               
               .night [role="action"] > menu > button:active {
              -  background-color: #555;
              +	background-color: #555;
               }
               
               .night [role="action"] > menu > button.danger {
              -  background-color: #BE000A;
              +	background-color: #BE000A;
               }
               
               .night [role="action"] > menu > button.danger:active {
              -  background-color: #DE000A;  
              +	background-color: #DE000A;	
               }
               
               @media (min-width: 767px) {
              -  .night section[role="dialog"],
              -  .night form[role="dialog"] {
              -    border-color: #222;
              -    box-shadow: none;
              -  }
              -  .night section[role="dialog"] + .background,
              -  .night form[role="dialog"] + .background {
              -    background-color: rgba(0,0,0,0.7); 
              -  }
              +	.night section[role="dialog"],
              +	.night form[role="dialog"] {
              +		border-color: #222;
              +		box-shadow: none;
              +	}
              +	.night section[role="dialog"] + .background,
              +	.night form[role="dialog"] + .background {
              +		background-color: rgba(0,0,0,0.7); 
              +	}
               }
               
              -
               /* Headers */
               .night section > header:first-child {
              -  background-color: #111;
              -  color: #eee;
              -  border-color: #2C2C2C;
              -}
              -
              -.night .tabToolbar button:active {
              -  background-color: #111;
              +	background-color: #111;
              +	color: #eee;
              +	border-color: #2C2C2C;
               }
               
               .night section > header:first-child h1.firetext {
              -  color: inherit; 
              +	color: inherit; 
               }
               
               .night section > header:first-child a,
               .night section > header:first-child button {
              -  color: inherit;
              +	color: inherit;
               }
               
               .night section > header:first-child a:active,
               .night section > header:first-child button:active,
               .night section > header:first-child a:hover,
               .night section > header:first-child button:hover {
              -  background-color: #222;
              +	background-color: #222;
               }
               
               .night section > header:first-child [class^="icon-"], 
               .night section > header:first-child [class*=" icon-"] {
              -  color: #eee;
              +	color: #eee;
               }
               
              -
               /* Spinner */
               .night .spinner {
              -  background: rgba(44,44,44,0.5);
              -  border: none;
              +	background: rgba(44,44,44,0.5);
              +	border: none;
               }
               
               .night .spinner > div {
              -  background-image: url(icons/night/misc/spinner-night.png);
              +	background-image: url(icons/night/misc/spinner-night.png);
               }
               
              -
               /* Switches */
               .night label input[data-type="switch"] + span:after {
              -  background: transparent;
              +	background: transparent;
               }
               
               .night label input[data-type="switch"] + span:before {
              -  background-color: #2c2c2c;
              +	background-color: #2c2c2c;
               }
               
               .night label input[data-type="switch"]:checked + span {
              -  border-color: #2c2c2c;
              +	border-color: #2c2c2c;
               }
               
               /* Input areas */
               .night fieldset {
              -  background-color: #2c2c2c;
              -  color: #dfdfdf;
              -  border-color: transparent;
              +	background-color: #2c2c2c;
              +	color: #dfdfdf;
              +	border-color: transparent;
               }
               
               .night fieldset input,
               .night fieldset select {
              -  color: #dfdfdf;
              -  background-color: #2c2c2c;
              +	color: #dfdfdf;
              +	background-color: #2c2c2c;
              +}
              +
              +.night fieldset legend {
              +	color: #dfdfdf;
               }
               
               .night fieldset legend.action:after {
              -  border-top-color: #dfdfdf;
              +	border-top-color: #dfdfdf;
               }
               
              -.night fieldset legend:active {
              -  background: #1a1a1a;
              +.night fieldset legend.action:active {
              +	background: #1a1a1a;
               }
               
               .night aside.pack-end select {
              -  color: #dfdfdf;
              +	color: #dfdfdf;
              +	background: #111;
               }
               
               .night button {
              -  background-color: transparent;
              -  color: #dfdfdf;
              -  border-color: #dfdfdf;
              -  text-shadow: none;
              +	background-color: transparent;
              +	color: #dfdfdf;
              +	border-color: #dfdfdf;
              +	text-shadow: none;
               }
               
              -
               /* Lists */
               .night [data-type="list"] h2,
               .night [data-type="edit"] h2 {
              -  background: #2c2c2c;
              -  color: #dfdfdf;
              +	background: #2c2c2c;
              +	color: #dfdfdf;
               }
               
               .night [data-type="list"] li {
              -  border-color: #1f1f1f;
              -  color: #a0a0a0;
              +	border-color: #1f1f1f;
              +	color: #a0a0a0;
               }
               
               .night [data-type="list"] li p:first-of-type {
              -  color: #a0a0a0;
              +	color: #a0a0a0;
               }
               
               .night [data-type="list"] li > label {
              -  border-color: #1f1f1f;
              +	border-color: #1f1f1f;
               }
               
              -
               /* File lists */
               .night [data-type="list"] li.fileListItem {
              -  background: #111;
              -  color: #a0a0a0;
              +	background: #111;
              +	color: #a0a0a0;
               }
               
               .night [data-type="list"] li.fileListItem .fileItemDescription {
              -  background: #161616;
              -  color: #a0a0a0;
              +	background: #161616;
              +	color: #a0a0a0;
               }
               
               .night [data-type="list"] li.fileListItem .fileItemName {
              -  color: #dfdfdf;
              +	color: #dfdfdf;
               }
               
               .night [data-type="list"] li.fileListItem .fileItemPath {
              -  color: #a0a0a0;
              +	color: #a0a0a0;
               }
               
              -
               /* Sidebar */
               .night section[data-type="sidebar"] {
              -  background: #161616;
              -  color: #a0a0a0;
              +	background: #161616;
              +	color: #a0a0a0;
               }
               
               .night section[data-type="sidebar"] > nav > h2 {
              -  background-color: #2c2c2c;
              -  color: #dfdfdf;
              -}
              -
              -
              -/* Tabs */
              -.night [role="tablist"] {
              -  color: #0a0a0a;
              -  background-color: #222;
              -}
              -
              -.night [role="tablist"] > [role="tab"] > a {
              -  background-color: #222;
              +	background-color: #2c2c2c;
              +	color: #dfdfdf;
               }
               
              -.night [role="tablist"] > [role="tab"] > a:active {
              -  background-color: #444;
              -  color: #cacaca;
              +@media (min-width: 767px) {
              +	.night section[data-type="sidebar"] {
              +		background-color: transparent;
              +	}
              +	.night section[data-type="sidebar"] > nav {
              +		background: #161616;
              +		border-color: #555;		 
              +	}
              +	.night section[data-type="sidebar"] > nav:before {
              +		border-bottom-color: #555;
              +	}
              +	.night section[data-type="sidebar"] > nav:after {
              +		border-bottom-color: #161616;
              +	}
              +	.night section[data-type="sidebar"] > nav > h2 {
              +		background-color: transparent;
              +	}	 
              +	.night section[data-type="sidebar"] > nav > ul > li:active {
              +		background-color: #333;
              +	}
              +	.night section[data-type="sidebar"] [role="toolbar"] {
              +		background-color: #222;
              +		border-color: #555;		 
              +	}
              +	.night section[data-type="sidebar"] [role="toolbar"] button:active,
              +	.night section[data-type="sidebar"] [role="toolbar"] button.active {
              +		background-color: #555;
              +	}
               }
               
              -.night [role="tablist"] > [role="tab"].selected > a {
              -  background-color: #111;
              -  color: #dfdfdf;
              +/* Tabs */
              +.night .tabBar div.selected-tab-button {
              +	color: #fff;
              +	border-color: #fff;
               }
               
               .night [role="tablist"] [role="tabpanel"] {
              -  background-color: #111;
              -  color: #0a0a0a;
              +	background-color: #111;
              +	color: #0a0a0a;
               }
               
              -
               /* Edit Mode */
               .night [role="dialog"][data-type="edit"] > menu {
              -    background-color: #222;
              -    border-color: #333;
              +		background-color: #222;
              +		border-color: #333;
               }
               
               .night [role="dialog"][data-type="edit"] > menu button {
              -    background-color: #333;
              -    color: #fff;
              -    text-shadow: none;
              +		background-color: #333;
              +		color: #fff;
              +		text-shadow: none;
               }
               
               .night [role="dialog"][data-type="edit"] > menu button.danger {
              -    background-color: #BE000A;
              +		background-color: #BE000A;
               }
               
              -
               /* Editor */
               .night .editor {
              -  background: #111;
              -  color: #a0a0a0;
              +	background-color: #000;
               }
               
              +@media (min-width: 767px) {
              +	.night #edit-bar {
              +		background-color: #222;
              +		color: #fff;
              +		border-color: #2c2c2c;
              +	}
              +}
               
               /* Toolbar */
               .night [role="toolbar"] {
              -  background-color: rgba(17,17,17,0.95);
              +	background-color: rgba(17,17,17,0.95);
               }
               
               .night [role="toolbar"] button:active, 
               .night [role="toolbar"] button.active {
              -  background-color: #444;
              +	background-color: #444;
               }
               
               .night [role="toolbar"] button[class^="icon-"], 
               .night [role="toolbar"] [class*=" icon-"] {
              -  color: #dfdfdf;   
              -}
              -
              -
              -/* Tab Toolbar */
              -.night .tabToolbar button,
              -.night .tabToolbar .button,
              -.night .tabToolbar input[type="button"] {
              -  color: #dfdfdf;
              +	color: #dfdfdf;		
               }
               
              -
               /* Status */
               .night section[role="status"] {
              -  background: #222;
              -  color: #dfdfdf;
              -}
              -
              -
              -/* Google Code Prettify */
              -/* Tomorrow Night Bright Theme */
              -.night .pln {
              -  color: #eaeaea;
              -}
              -
              -/* string content */
              -.night .str {
              -  color: #b9ca4a;
              +	background: #222;
              +	color: #dfdfdf;
               }
               
              -/* a keyword */
              -.night .kwd {
              -  color: #c397d8;
              -}
              -
              -/* a comment */
              -.night .com {
              -  color: #969896;
              -}
              -
              -/* a type name */
              -.night .typ {
              -  color: #7aa6da;
              -}
              -
              -/* a literal value */
              -.night .lit {
              -  color: #e78c45;
              -}
              -
              -/* punctuation */
              -.night .pun {
              -  color: #eaeaea;
              -}
              -
              -/* lisp open bracket */
              -.night .opn {
              -  color: #eaeaea;
              -}
              -
              -/* lisp close bracket */
              -.night .clo {
              -  color: #eaeaea;
              -}
              -
              -/* a markup tag name */
              -.night .tag {
              -  color: #d54e53;
              -}
              -
              -/* a markup attribute name */
              -.night .atn {
              -  color: #e78c45;
              -}
              -
              -/* a markup attribute value */
              -.night .atv {
              -  color: #70c0b1;
              -}
              -
              -/* a declaration */
              -.night .dec {
              -  color: #e78c45;
              -}
              -
              -/* a variable name */
              -.night .var {
              -  color: #d54e53;
              -}
              -
              -/* a function name */
              -.night .fun {
              -  color: #7aa6da;
              -}
              -
              -/* pre style */
              -.night pre.prettyprint {
              -  font-family: Menlo, "Bitstream Vera Sans Mono", "DejaVu Sans Mono", Monaco, Consolas, monospace;
              -  font-size: 12px;
              -  line-height: 1.5;
              -  border: 1px solid #cccccc;
              -  padding: 10px;
              -}
              -
              -/* Specify class=linenums on a pre to get line numbering */
              -.night ol.linenums {
              -  margin-top: 0;
              -  margin-bottom: 0;
              -}
              -
              -/* IE indents via margin-left */
              -.night li.L0,
              -.night li.L1,
              -.night li.L2,
              -.night li.L3,
              -.night li.L4,
              -.night li.L5,
              -.night li.L6,
              -.night li.L7,
              -.night li.L8,
              -.night li.L9 {
              -  /* */
              +@media (min-width: 767px) {
              +	.night section[role="status"] {
              +		box-shadow: 0 0 10px #444;
              +		border-color: #444;
              +	}
               }
               
              -/* Alternate shading for lines */
              -.night li.L1,
              -.night li.L3,
              -.night li.L5,
              -.night li.L7,
              -.night li.L9 {
              -  /* */
              +/* Zen */
              +@media (min-width: 767px) {
              +	.night.fullscreen #edit-bar button:active,
              +	.night.fullscreen #edit-bar button.active {
              +		border-color: #eee !important;	
              +	}
               }
              -
              -/* End of Google Code Prettify CSS */
              \ No newline at end of file
              diff --git a/style/prettify.css b/style/prettify.css
              deleted file mode 100644
              index 400fd74..0000000
              --- a/style/prettify.css
              +++ /dev/null
              @@ -1,52 +0,0 @@
              -/* Pretty printing styles. Used with prettify.js. */
              -
              -/* SPAN elements with the classes below are added by prettyprint. */
              -.pln { color: #000 }  /* plain text */
              -
              -@media screen {
              -  .str { color: #080 }  /* string content */
              -  .kwd { color: #008 }  /* a keyword */
              -  .com { color: #800 }  /* a comment */
              -  .typ { color: #606 }  /* a type name */
              -  .lit { color: #066 }  /* a literal value */
              -  /* punctuation, lisp open bracket, lisp close bracket */
              -  .pun, .opn, .clo { color: #660 }
              -  .tag { color: #008 }  /* a markup tag name */
              -  .atn { color: #606 }  /* a markup attribute name */
              -  .atv { color: #080 }  /* a markup attribute value */
              -  .dec, .var { color: #606 }  /* a declaration; a variable name */
              -  .fun { color: red }  /* a function name */
              -}
              -
              -/* Use higher contrast and text-weight for printable form. */
              -@media print, projection {
              -  .str { color: #060 }
              -  .kwd { color: #006; font-weight: bold }
              -  .com { color: #600; font-style: italic }
              -  .typ { color: #404; font-weight: bold }
              -  .lit { color: #044 }
              -  .pun, .opn, .clo { color: #440 }
              -  .tag { color: #006; font-weight: bold }
              -  .atn { color: #404 }
              -  .atv { color: #060 }
              -}
              -
              -/* Put a border around prettyprinted code snippets. */
              -pre.prettyprint { padding: 2px; border: 1px solid #888 }
              -
              -/* Specify class=linenums on a pre to get line numbering */
              -ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */
              -li.L0,
              -li.L1,
              -li.L2,
              -li.L3,
              -li.L5,
              -li.L6,
              -li.L7,
              -li.L8 { list-style-type: none }
              -/* Alternate shading for lines */
              -li.L1,
              -li.L3,
              -li.L5,
              -li.L7,
              -li.L9 { background: #eee }
              diff --git a/style/regions.css b/style/regions.css
              index dd3f2a9..c52d519 100755
              --- a/style/regions.css
              +++ b/style/regions.css
              @@ -21,11 +21,6 @@ section[role="region"], section[role="dialog"] {
               
               section[role="region"] {
                 visibility: hidden;
              -    -moz-transform: translateX(-100%);
              -    -webkit-transform: translateX(-100%);
              -    -o-transform: translateX(-100%); 
              -    -ms-transform: translateX(-100%); 
              -  transform: translateX(-100%);
               }
               
               section[role="region"].current,
              @@ -33,19 +28,6 @@ section[role="region"].current,
               [role="dialog"].parent {
                 visibility: visible;
                 z-index: 100; 
              -    -moz-transform: none;
              -    -webkit-transform: none;
              -    -o-transform: none;
              -    -ms-transform: none; 
              -  transform: none;
              -}
              -
              -section[role="region"].current ~ section[role="region"] {  
              -    -moz-transform: translateX(100%);
              -    -webkit-transform: translateX(100%);
              -    -o-transform: translateX(100%);
              -    -ms-transform: translateX(100%);
              -  transform: translateX(100%);
               }
               
               section[role="dialog"] {
              @@ -57,10 +39,6 @@ section[role="dialog"] {
                 transform: translateY(100%);
               }
               
              -section[role="dialog"] + .background {
              -  display: none;
              -}
              -
               section[role="dialog"].current {
                 z-index: 101;
                 visibility: visible;
              @@ -71,86 +49,11 @@ section[role="dialog"].current {
                 transform: none;
               }
               
              -/* Handle sidebars */
              +/* Sidebars */
               [data-type="sidebar"] {
                 visibility: collapse;
              -    -moz-transition: .4s visibility 0s;
              -    -webkit-transition: .4s visibility 0s;
              -    -o-transition: 4s visibility 0s;
              -  transition: .4s visibility 0s;
               }
               
               [data-type="sidebar"].active {
                 visibility: visible;
              -    -moz-transition: 0s visibility 0s;
              -    -webkit-transition: 0s visibility 0s;
              -    -o-transition: 0s visibility 0s;
              -  transition: 0s visibility 0s;
              -}
              -
              -[data-state="drawer"].current {
              -    -moz-transform: translateX(80%) !important;
              -    -webkit-transform: translateX(80%) !important;
              -    -o-transform: translateX(80%) !important;
              -    -ms-transform: translateX(80%) !important;
              -  transform: translateX(80%) !important;
              -}
              -
              -[data-state="drawer"].current > *:not(.drawerEnabled) {
              -  pointer-events: none;   
              -}
              -
              -[data-state="drawer"].current .drawerEnabled {
              -  pointer-events: all;
              -}
              -
              -[data-state="drawer"][data-position="right"].current {
              -    -moz-transform: translateX(-80%) !important;
              -    -webkit-transform: translateX(-80%) !important;
              -    -o-transform: translateX(-80%) !important;
              -    -ms-transform: translateX(-80%) !important;
              -  transform: translateX(-80%) !important;
              -}
              -
              -
              -/* RTL */
              -[dir="rtl"] section[role="region"] {
              -    -moz-transform: translateX(100%);
              -    -webkit-transform: translateX(100%);
              -    -o-transform: translateX(100%); 
              -    -ms-transform: translateX(100%); 
              -  transform: translateX(100%);
              -}
              -
              -[dir="rtl"] section[role="region"].current,
              -[dir="rtl"] [role="region"].parent {
              -    -moz-transform: none;
              -    -webkit-transform: none;
              -    -o-transform: none;
              -    -ms-transform: none; 
              -  transform: none;
              -}
              -
              -[dir="rtl"] section[role="region"].current ~ section[role="region"] {  
              -    -moz-transform: translateX(-100%);
              -    -webkit-transform: translateX(-100%);
              -    -o-transform: translateX(-100%);
              -    -ms-transform: translateX(-100%);
              -  transform: translateX(-100%);
              -}
              -
              -[dir="rtl"] [data-state="drawer"].current {
              -    -moz-transform: translateX(-80%) !important;
              -    -webkit-transform: translateX(-80%) !important;
              -    -o-transform: translateX(-80%) !important;
              -    -ms-transform: translateX(-80%) !important;
              -  transform: translateX(-80%) !important;
              -}
              -
              -[dir="rtl"] [data-state="drawer"][data-position="right"].current {
              -    -moz-transform: translateX(80%) !important;
              -    -webkit-transform: translateX(80%) !important;
              -    -o-transform: translateX(80%) !important;
              -    -ms-transform: translateX(80%) !important;
              -  transform: translateX(80%) !important;
               }
              diff --git a/style/tabs.css b/style/tabs.css
              new file mode 100755
              index 0000000..8e2933a
              --- /dev/null
              +++ b/style/tabs.css
              @@ -0,0 +1,33 @@
              +/* ----------------------------------
              +* Tabs
              +* ---------------------------------- */
              +
              +[role="tabs"] {
              +  padding: 0;
              +  margin: 0;
              +  overflow: hidden;
              +  position: absolute;
              +  top: 0;
              +  bottom: 0;
              +  left: 0;
              +  right: 0;
              +}
              +
              +[role="tabs"] [role="tab"] {
              +  position: absolute;
              +  top: 0;
              +  left: 0;
              +  right: 0;
              +  bottom: 0;
              +  overflow: auto;
              +  visibility: hidden;
              +    -moz-transition: all .4s;
              +    -webkit-transition: all .4s;
              +    -o-transition: all .4s;
              +  transition: all .4s;
              +}
              +
              +.current [role="tabs"] [role="tab"].selected-tab,
              +.parent [role="tabs"] [role="tab"].selected-tab {  
              +  visibility: visible;
              +}