gitextract_vy1u92c1/ ├── .gitignore ├── LICENSE.md ├── README.md ├── dirigible/ │ ├── .gitignore │ ├── dirigible/ │ │ ├── __init__.py │ │ ├── settings.py │ │ ├── test_utils.py │ │ ├── urls.py │ │ └── wsgi.py │ ├── featured_sheet/ │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── models.py │ │ ├── templates/ │ │ │ └── featured_sheets.html │ │ ├── tests/ │ │ │ ├── __init__.py │ │ │ └── test_models.py │ │ └── views.py │ ├── feedback/ │ │ ├── __init__.py │ │ ├── models.py │ │ ├── tests/ │ │ │ ├── __init__.py │ │ │ └── test_views.py │ │ ├── urls.py │ │ └── views.py │ ├── fts/ │ │ ├── __init__.py │ │ ├── screendumps/ │ │ │ └── placeholder │ │ └── tests/ │ │ ├── __init__.py │ │ ├── functionaltest.py │ │ ├── test_2521_CodeEditor.py │ │ ├── test_2525_LoginLogout.py │ │ ├── test_2528_CreateEditSheet.py │ │ ├── test_2529_HighlightErrorsInCells.py │ │ ├── test_2531_DifficultStuffInCells.py │ │ ├── test_2532_LambdasInCells.py │ │ ├── test_2533_Numpy.py │ │ ├── test_2534_JsonWorksheets.py │ │ ├── test_2535_RunWorksheetSerial.py │ │ ├── test_2536_ParallelFormulaExecution.py │ │ ├── test_2537_ErrorsInConsole.py │ │ ├── test_2538_ShowStdoutInConsole.py │ │ ├── test_2540_FrontPage.py │ │ ├── test_2544_403_404_and_500_pages.py │ │ ├── test_2545_PageResizeBehaviour.py │ │ ├── test_2546_ListSheetsOnDashboard.py │ │ ├── test_2547_EnterDataQuickly.py │ │ ├── test_2548_UserCode.py │ │ ├── test_2549_InterruptedRecalculations.py │ │ ├── test_2550_EditableSheetName.py │ │ ├── test_2554_SlicingInFormulae.py │ │ ├── test_2556_BrokenUserCode.py │ │ ├── test_2557_ClickAwaySavesUsercode.py │ │ ├── test_2558_MoreCellsByDefault.py │ │ ├── test_2559_FitEditorToCells.py │ │ ├── test_2562_ErrorInCellShouldBeClearedByConstants.py │ │ ├── test_2565_JSONAPIAuth.py │ │ ├── test_2571_DocumentationAndBlogLinks.py │ │ ├── test_2577_SaveColumnWidths.py │ │ ├── test_2581_FormulaBar.py │ │ ├── test_2582_ReferencingEmptyCell.py │ │ ├── test_2592_Cut_Copy_Paste_Within_Dirigible.py │ │ ├── test_2595_Spinner.py │ │ ├── test_2597_CapRecalcTime.py │ │ ├── test_2601_UndefinedShouldBeAvailableToUsercode.py │ │ ├── test_2602_SheetPageShouldDisplayBeforeFirstRecalcComplete.py │ │ ├── test_2603_WorksheetsMayOnlyContainCells.py │ │ ├── test_2616_RootPageIsDashboard.py │ │ ├── test_2621_CanSaveSheetsWithLotsOfFormulae.py │ │ ├── test_2622_CellRanges.py │ │ ├── test_2631_BlogRedirect.py │ │ ├── test_2633_CursorKeysMoveAroundGrid.py │ │ ├── test_2635_SheetNameSelectedOnEdit.py │ │ ├── test_2639_SciPy_and_MpMath.py │ │ ├── test_2642_RecalcTimesInConsole.py │ │ ├── test_2644_AdminOmniscience.py │ │ ├── test_2650_UsercodeSandbox.py │ │ ├── test_2651_SaveSheetNameOnBlur.py │ │ ├── test_2652_CommitCellOnBlur.py │ │ ├── test_2653_UsernameFocusedOnLoginPage.py │ │ ├── test_2654_CtrlSSavesUsercode.py │ │ ├── test_2678_GlobalStateNotShared.py │ │ ├── test_2682_CellAccessUsingA1.py │ │ ├── test_2685_ChangePassword.py │ │ ├── test_2689_DontClearCellEditorWhenRecalcsHitClient.py │ │ ├── test_2690_FocusShouldStartInGrid.py │ │ ├── test_2691_AllowSettingValuesFromUsercodeBeforeLoadConstants.py │ │ ├── test_2701_NameResolutionWorks.py │ │ ├── test_2702_HttpsInChrootJail.py │ │ ├── test_2704_OldStyleClassesInTheGrid.py │ │ ├── test_2711_ImportExcel.py │ │ ├── test_2712_ImportCSV.py │ │ ├── test_2726_FormulaBarTextSelection.py │ │ ├── test_2734_ClearCells.py │ │ ├── test_2735_CtrlKeysArePassedOnToBrowser.py │ │ ├── test_2741_Xlrd.py │ │ ├── test_2749_DisallowArbitraryKeysForWorksheet.py │ │ ├── test_2751_UsefulModules.py │ │ ├── test_2758_LoadGridDataOnDemand.py │ │ ├── test_2762_PythonConversion.py │ │ ├── test_2770_ClearDependentCellErrors.py │ │ ├── test_2774_ExportCSV.py │ │ ├── test_2781_FormulaAndFormattedValueMustBeStrings.py │ │ ├── test_2787_SignUp.py │ │ ├── test_2789_ErrorConsoleHTMLEscape.py │ │ ├── test_2795_Rewrite_Formulae_during_Cut_and_Paste.py │ │ ├── test_2799_FillDownDuringPaste.py │ │ ├── test_2812_CutCopyPasteInEditMode.py │ │ ├── test_2814_PublicWorksheets.py │ │ ├── test_2828_GridShouldNotStealFocusOnRecalc.py │ │ ├── test_2839_CutCopyPasteButtons.py │ │ ├── test_2844_CantMakeRowHeaderActive.py │ │ ├── test_2848_WorksheetBounds.py │ │ ├── test_2862_CopyAndPasteFormulaWithErrors.py │ │ ├── test_2872_CellTooltips.py │ │ ├── test_2873_IE_Warning.py │ │ ├── test_2884_FeedbackForm.py │ │ └── test_data/ │ │ ├── T2711-badly-named-png.xls │ │ ├── T2711-import-excel.xls │ │ ├── csv_file.csv │ │ ├── excel_generated_csv.csv │ │ ├── expected_csv_file.csv │ │ ├── expected_unicode_csv.csv │ │ ├── japanese.csv │ │ └── public_sheet_csv_file.csv │ ├── info_pages/ │ │ ├── __init__.py │ │ ├── migrations/ │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── templates/ │ │ │ ├── non_logged_in_front_page.html │ │ │ ├── oss.html │ │ │ └── video.html │ │ ├── tests/ │ │ │ ├── __init__.py │ │ │ └── test_views.py │ │ └── views.py │ ├── manage.py │ ├── registration/ │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── forms.py │ │ ├── locale/ │ │ │ ├── ar/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── bg/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── de/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── el/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── en/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── es/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── es_AR/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── fr/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── he/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── it/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── ja/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── nl/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── pl/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── pt_BR/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── ru/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── sr/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── sv/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ ├── zh_CN/ │ │ │ │ └── LC_MESSAGES/ │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ │ └── zh_TW/ │ │ │ └── LC_MESSAGES/ │ │ │ ├── django.mo │ │ │ └── django.po │ │ ├── management/ │ │ │ ├── __init__.py │ │ │ └── commands/ │ │ │ ├── __init__.py │ │ │ └── cleanupregistration.py │ │ ├── migrations/ │ │ │ ├── 0001_initial.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── tests.py │ │ ├── urls.py │ │ └── views.py │ ├── shared/ │ │ ├── __init__.py │ │ ├── models.py │ │ ├── static/ │ │ │ ├── ace/ │ │ │ │ ├── ace-uncompressed.js │ │ │ │ ├── ace.js │ │ │ │ ├── cockpit-uncompressed.js │ │ │ │ ├── cockpit.js │ │ │ │ ├── mode-python.js │ │ │ │ └── worker-javascript.js │ │ │ ├── dirigible/ │ │ │ │ ├── examples/ │ │ │ │ │ └── pricelist-json-api-demo.html │ │ │ │ ├── images/ │ │ │ │ │ └── toolbar/ │ │ │ │ │ └── api_button_disabled.pdn │ │ │ │ ├── scripts/ │ │ │ │ │ ├── cell_editor.js │ │ │ │ │ ├── console_view.js │ │ │ │ │ ├── dialogs.js │ │ │ │ │ ├── editor_commands.js │ │ │ │ │ ├── feedback_dialog.js │ │ │ │ │ ├── grid_commands.js │ │ │ │ │ ├── grid_content_converter.js │ │ │ │ │ ├── grid_interaction_handler.js │ │ │ │ │ ├── grid_remote_model.js │ │ │ │ │ ├── grid_view.js │ │ │ │ │ ├── htmlescape.js │ │ │ │ │ ├── keyboard_cellrange_selector.js │ │ │ │ │ ├── page_commands.js │ │ │ │ │ ├── page_interaction_handler.js │ │ │ │ │ ├── page_view.js │ │ │ │ │ ├── security_settings.js │ │ │ │ │ ├── selection_model.js │ │ │ │ │ ├── sheet_page_utils.js │ │ │ │ │ ├── toolbar_interaction_handler.js │ │ │ │ │ └── usercode_view.js │ │ │ │ ├── styles/ │ │ │ │ │ ├── base.css │ │ │ │ │ ├── coming_soon_page.css │ │ │ │ │ ├── contact.css │ │ │ │ │ ├── error.css │ │ │ │ │ ├── index.css │ │ │ │ │ ├── info_page.css │ │ │ │ │ ├── login.css │ │ │ │ │ ├── non_sheet_page.css │ │ │ │ │ ├── pricing.css │ │ │ │ │ ├── registration.css │ │ │ │ │ ├── sheet_page.css │ │ │ │ │ ├── user_page.css │ │ │ │ │ └── video.css │ │ │ │ └── tests/ │ │ │ │ ├── cell_editor_test.html │ │ │ │ ├── console_view_test.html │ │ │ │ ├── dialogs_test.html │ │ │ │ ├── editor_commands_test.html │ │ │ │ ├── feedback_dialog_test.html │ │ │ │ ├── grid_commands_test.html │ │ │ │ ├── grid_content_converter_test.html │ │ │ │ ├── grid_interaction_handler_test.html │ │ │ │ ├── grid_remote_model_test.html │ │ │ │ ├── grid_view_test.html │ │ │ │ ├── htmlescape_test.html │ │ │ │ ├── jsmock.js │ │ │ │ ├── logger.css │ │ │ │ ├── page_commands_test.html │ │ │ │ ├── page_interaction_handler_test.html │ │ │ │ ├── page_view_test.html │ │ │ │ ├── security_settings_test.html │ │ │ │ ├── selection_model_test.html │ │ │ │ ├── sheet_page_utils_test.html │ │ │ │ ├── test_utils.js │ │ │ │ ├── test_utils_test.html │ │ │ │ ├── testlogger.css │ │ │ │ ├── toolbar_interaction_handler_test.html │ │ │ │ ├── usercode_view_test.html │ │ │ │ ├── yuirunner.js │ │ │ │ └── yuitest/ │ │ │ │ └── yuitest-combo.js │ │ │ ├── jquery/ │ │ │ │ ├── jeip.js │ │ │ │ ├── jquery-ui-1.8.10.custom.css │ │ │ │ ├── jquery.ajaxq-0.0.1.js │ │ │ │ └── jquery.cookie.js │ │ │ ├── json/ │ │ │ │ └── json2.js │ │ │ ├── robots.txt │ │ │ ├── slickgrid/ │ │ │ │ ├── MIT-LICENSE.txt │ │ │ │ ├── slick.cellrangedecorator.js │ │ │ │ ├── slick.cellrangeselector.js │ │ │ │ ├── slick.cellselectionmodel.js │ │ │ │ ├── slick.core.js │ │ │ │ ├── slick.editors.js │ │ │ │ ├── slick.grid.css │ │ │ │ └── slick.grid.js │ │ │ └── splitter/ │ │ │ └── splitter.js │ │ ├── templates/ │ │ │ ├── 403.html │ │ │ ├── 404.html │ │ │ ├── 500.html │ │ │ ├── base.html │ │ │ ├── error_page.html │ │ │ ├── footer_links_include.html │ │ │ ├── header_links_include.html │ │ │ ├── info_page.html │ │ │ └── non_sheet_page_small_logo.html │ │ ├── tests/ │ │ │ ├── __init__.py │ │ │ └── test_views.py │ │ └── views.py │ ├── sheet/ │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── calculate.py │ │ ├── cell.py │ │ ├── cell_range.py │ │ ├── clipboard.py │ │ ├── dependency_graph.py │ │ ├── dirigible_datetime.py │ │ ├── errors.py │ │ ├── eval_constant.py │ │ ├── forms.py │ │ ├── formula_interpreter.py │ │ ├── importer.py │ │ ├── migrations/ │ │ │ ├── 0001_initial.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── parser/ │ │ │ ├── __init__.py │ │ │ ├── fl_cell_range_parse_node.py │ │ │ ├── fl_cell_reference_parse_node.py │ │ │ ├── fl_column_reference_parse_node.py │ │ │ ├── fl_named_column_reference_parse_node.py │ │ │ ├── fl_named_row_reference_parse_node.py │ │ │ ├── fl_reference_parse_node.py │ │ │ ├── fl_row_reference_parse_node.py │ │ │ ├── grammar.py │ │ │ ├── parse_node.py │ │ │ ├── parse_node_constructors.py │ │ │ ├── parser.py │ │ │ ├── parsetab.py │ │ │ └── tokens.py │ │ ├── rewrite_formula_offset_cell_references.py │ │ ├── sheet.py │ │ ├── templates/ │ │ │ ├── export_csv_error.html │ │ │ ├── import_csv_error.html │ │ │ ├── import_xls_error.html │ │ │ └── sheet_page.html │ │ ├── tests/ │ │ │ ├── __init__.py │ │ │ ├── parser/ │ │ │ │ ├── __init__.py │ │ │ │ ├── test_fl_cell_range_parse_node.py │ │ │ │ ├── test_fl_cell_reference_parse_node.py │ │ │ │ ├── test_fl_coloumn_reference_parse_node.py │ │ │ │ ├── test_fl_named_column_reference_parse_node.py │ │ │ │ ├── test_fl_named_row_reference_parse_node.py │ │ │ │ ├── test_fl_reference_parse_node.py │ │ │ │ ├── test_fl_row_reference_parse_node.py │ │ │ │ ├── test_parse_node.py │ │ │ │ ├── test_parse_node_constructors.py │ │ │ │ └── test_parser.py │ │ │ ├── test_calculate.py │ │ │ ├── test_cell.py │ │ │ ├── test_cell_range.py │ │ │ ├── test_clipboard.py │ │ │ ├── test_dependency_graph.py │ │ │ ├── test_dirigible_datetime.py │ │ │ ├── test_errors.py │ │ │ ├── test_eval_constant.py │ │ │ ├── test_forms.py │ │ │ ├── test_formula_interpreter.py │ │ │ ├── test_importer.py │ │ │ ├── test_rewrite_formula_offset_cell_references.py │ │ │ ├── test_sheet.py │ │ │ ├── test_ui_jsonifier.py │ │ │ ├── test_views.py │ │ │ ├── test_views_api_0_1.py │ │ │ ├── test_worksheet.py │ │ │ └── utils/ │ │ │ ├── __init__.py │ │ │ ├── test_cell_name_utils.py │ │ │ ├── test_interruptable_thread.py │ │ │ └── test_string_utils.py │ │ ├── ui_jsonifier.py │ │ ├── urls.py │ │ ├── urls_api_0_1.py │ │ ├── utils/ │ │ │ ├── __init__.py │ │ │ ├── cell_name_utils.py │ │ │ ├── interruptable_thread.py │ │ │ └── string_utils.py │ │ ├── views.py │ │ ├── views_api_0_1.py │ │ └── worksheet.py │ └── user/ │ ├── __init__.py │ ├── admin.py │ ├── forms.py │ ├── migrations/ │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── signup_urls.py │ ├── templates/ │ │ ├── login.html │ │ ├── registration/ │ │ │ ├── activate.html │ │ │ ├── activation_email.txt │ │ │ ├── activation_email_subject.txt │ │ │ ├── registration_complete.html │ │ │ └── registration_form.html │ │ ├── user_page.html │ │ └── welcome_email.txt │ ├── tests/ │ │ ├── __init__.py │ │ ├── test_forms.py │ │ ├── test_models.py │ │ └── test_views.py │ ├── urls.py │ └── views.py ├── documentation/ │ ├── .gitignore │ ├── BeautifulSoup.py │ ├── Makefile │ ├── _static/ │ │ └── file-to-force-git-to-keep-empty-dir │ ├── _templates/ │ │ └── layout.html │ ├── builtins.rst │ ├── conf.py │ ├── dirigible-theme/ │ │ ├── layout.html │ │ ├── static/ │ │ │ └── dirigible-style.css │ │ └── theme.conf │ ├── fl-python-differences.rst │ ├── import_export.rst │ ├── index.rst │ ├── json_api.rst │ ├── overview.rst │ ├── public_sheets.rst │ ├── python-modules.rst │ ├── spreadsheet-functions.rsl │ ├── spreadsheet-functions.rst │ ├── talk.md │ ├── talk_example_sheets.json │ ├── tutorial01.rst │ ├── tutorial02.rst │ ├── tutorial03.rst │ └── tutorial04.rst └── requirements.txt