GithubHelp home page GithubHelp logo

davidkinder / windows-inform7 Goto Github PK

View Code? Open in Web Editor NEW
69.0 69.0 10.0 11.75 MB

Front-end for the Windows version of Inform 7.

Home Page: http://inform7.com/

License: Artistic License 2.0

C++ 96.99% C 2.46% NSIS 0.13% Makefile 0.03% Batchfile 0.06% Inform 7 0.33%

windows-inform7's People

Contributors

davidkinder avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

windows-inform7's Issues

Gluxle interpreter being flagged as infected by antivirus

(not sure if this is the right place to flag this - but just to let you know that when I try to extract the gluxle interpretor my antivirus (bitdefender) flags it as infected with a virus. I assume it's probably a false flag, but it's preventing the interpretor in the IDE from running because of the missing file

Printing support

Add a "File / Print" menu item to print the contents of some of the tabs.

Menu bar colours should come from theme

The colour of the current menu in the menu bar currently comes from GetSysColor(), but looking at Notepad, the default colour looks to come from the theme, which Inform 7 should do too.

menu

Skein: Zoom please? Pan is very slow as well. Clear FULL skein in one click?

Just a couple requests here, as per the thread title.
When the skein gets big, it would be REALLY useful to be able to zoom in and out to navigate quickly.
Regarding that, the middle-click panning function is VERY slow and not smooth.
Finally, being able to clear the ENTIRE skein with one click would be very very nice, as the skein gets QUITE full rather quickly as one is building a game. Having to delete every thread individually is very tiresome.
Similarly, it would be very nice if one could select multiple threads to delete in one go, rather than the entire skein (tho both, of course, would be very useful)
Also wondering when an official build will be available for download next. I'm not really "up to" compiling from source.
Thanks for your work! :D

Skein should support Edit/Undo and Edit/Redo menu items

Will need to think about how this works when playing a game, possibly disable undo/redo then, and clear undo history on starting a game. This will also affect the Trim option, or at least the warning shown before applying it.

Implement Per Monitor v2 high DPI support

See https://blogs.windows.com/buildingapps/2016/10/24/high-dpi-scaling-improvements-for-desktop-applications-and-mixed-mode-dpi-scaling-in-the-windows-10-anniversary-update/

The manifest needs to be updated with the "windowsSettings" section becoming

<asmv3:application>
  <asmv3:windowsSettings>
   <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware>
   <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,System</dpiAwareness>
  </asmv3:windowsSettings>
</asmv3:application>

Implement testing tab to match the MacOS front-end

Following the OSX front-end, merge the skein and transcript into a new "Testing" tab. There are several related changes associated with this:

  • Remove the "Replay" menu.
  • Allow different selections in the two skein panels.
  • Selected knots in the skein don't need to be ones playing.
  • The skein is no longer horizontally centred in the tab if less wide than the tab.
  • Reduce spacing between skein knots.
  • "Test Me" knots have italic knots below them for the output they produce.
  • Drag and drop of skein nodes with animation.
  • Undo and redo of skein, change trim warning.

Resolve accessibility regressions

This might be related to the following issue: #27

I detected the following accessibility issues when attempting to use Windows Inform 7 Beta 5:

JAWS (Version: 2021.2111.13)

Many panels, such as the report page (on release and compilation outcome) and the panel the game gets played in appear to be completely empty when using a braille display with JAWS' standard cursor. As opposed to the last non-beta release of Windows Inform 7, the used cursor in the report page is the "PC cursor", not the "virtual PC cursor", indicating that JAWS does not perceive the panel as a HTML document anymore and instead tries treating it like a native Windows application, which apparently fails - at any rate, I cannot detect any text, tab to any controls.
Using the JAWS cursor (tethered to the mouse pointer) I can only perceive the menu and tab panels, but not the content of the panel. Using the touch cursor I can perceive the content of the panel, but navigation is tedious and in the game panel, the game's content is represented as a single line, forcing me to scroll far with the braille panning buttons if the game session is lengthy; also, all information on formatting, such as paragraphs, is lost.

NVDA (Version: 2021.2)

The game panel is accessible, but the report panel is not - neither for reports on compilation, nor for reports on release. There appears to be no workaround to perceive the content of the panels. I also occasionally experienced issues with the welcome screen where the content of that screen was invisible, though that problem did not occur consistently.

Narrator (on Windows 10)

Narrator performs best in many ways, all panels but one appear to get represented correctly. Unfortuantely, that one panel is the source panel - the source text is entirely invisible, and nothing I tried could change that fact (albeit I admit that I'm not too familiar with Narrator, so this might be a problem caused by my usage and not Windows Inform 7).

If you have any further questions or would like me to test further, let me know.€€

Some keyboard shortcuts use VK_OEM_ keys

Some of the keyboard shortcuts use VK_OEM_? keycodes, such as Alt-/ (for commenting out code). This may or may not work, depending on the keyboard layout. Rather than using an accelerator table in the resources for these, they should probably be implemented directly in the code, so that the ASCII character that the keycode translates to can be checked directly.

Skein improvements

Skein should support Undo and Redo from the Edit menu

Will need to think about how this works when playing a game, possibly disable undo/redo then, and clear undo history on starting a game. This will also affect the Trim option, or at least the warning shown before applying it.

Scrolling the skein

Support dragging the skein by clicking on blank areas.

Keep track of vertical scroll position in HTML tabs for tab history

In the front-end, there are "back" and "forward" arrow buttons at the top-left of the two panes that go back and forwards through the history of the UI items that the user has selected. It would be helpful if this also tracked the scroll position in HTML tabs so that going from one documentation page and then back left the scrollbar in the same position. This might be possible if the "document.body.scrollTop" property from the DOM was accessible.

Add way to not capture arrow keys in the story tab

Currently, when waiting for line input in the story tab, arrow keys are captured to provide the edit history, and to stop the cursor moving out of the input area. A key (e.g. the tab key) should be used to toggle this behaviour, for times when users do want to move around the main story tab text area with the arrow keys.

Better exit handling when background thread is still running

Currently, if the process exits while the background thread that decodes HTML for "Find in Files" is still running, that thread is suspended. This is not a good approach: the thread could be suspended while allocating memory and holding a lock in the memory allocator, for example.

Vertical rather than horizontal tabs

The Windows front-end has always had horizontal tabs for the main tabs (Story, Index, etc.) but the OSX and Linux front-ends have vertical tabs, with the actual tabs on the right.

Investigate making the Windows front-end have vertical tabs too, possibly optionally.

Crash shutting down libcef

This crash has been seen occasionally. For some reason it's more common on the "launcher" branch. The Chrome Browser I/O thread is in the process of stopping, when it dies here, especially if the front-end is closed shortly after it was started:

libcef.dll!base::SequencedTaskRunnerHandle::Get() Line 26          C++
[Inline Frame] libcef.dll!storage::`anonymous namespace'::MakeDeferredDeleter(std::__1::unique_ptr<storage::LocalStorageImpl,std::__1::default_delete<storage::LocalStorageImpl>> object) Line 30   C++
[Inline Frame] libcef.dll!storage::`anonymous namespace'::ShutDown(std::__1::unique_ptr<storage::LocalStorageImpl,std::__1::default_delete<storage::LocalStorageImpl>> object) Line 45   C++
libcef.dll!storage::PartitionImpl::~PartitionImpl() Line 58 C++
libcef.dll!storage::PartitionImpl::~PartitionImpl() Line 57 C++
[Inline Frame] libcef.dll!std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>::operator()(content::PeriodicBackgroundSyncServiceImpl * __ptr) Line 54 C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>::reset(content::PeriodicBackgroundSyncServiceImpl * __p) Line 315  C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>::~unique_ptr() Line 269               C++
[Inline Frame] libcef.dll!std::__1::allocator_traits<std::__1::allocator<std::__1::__tree_node<std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>,void *>>>::destroy(std::__1::allocator<std::__1::__tree_node<std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>,void *>> &, std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>> * __p) Line 318  C++
libcef.dll!std::__1::__tree<std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>,base::UniquePtrComparator,std::__1::allocator<std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>>>::destroy(std::__1::__tree_node<std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>,void *> * __nd) Line 1802       C++
[Inline Frame] libcef.dll!std::__1::__tree<std::__1::unique_ptr<storage::PartitionImpl,std::__1::default_delete<storage::PartitionImpl>>,base::UniquePtrComparator,std::__1::allocator<std::__1::unique_ptr<storage::PartitionImpl,std::__1::default_delete<storage::PartitionImpl>>>>::~__tree() Line 1789            C++
[Inline Frame] libcef.dll!std::__1::set<std::__1::unique_ptr<storage::PartitionImpl,std::__1::default_delete<storage::PartitionImpl>>,base::UniquePtrComparator,std::__1::allocator<std::__1::unique_ptr<storage::PartitionImpl,std::__1::default_delete<storage::PartitionImpl>>>>::~set() Line 617               C++
libcef.dll!storage::StorageServiceImpl::~StorageServiceImpl() Line 58        C++
libcef.dll!storage::StorageServiceImpl::~StorageServiceImpl() Line 58        C++
[Inline Frame] libcef.dll!std::__1::default_delete<device::DeviceService>::operator()(device::DeviceService * __ptr) Line 54 C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>::reset(device::DeviceService * __p) Line 315  C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>::~unique_ptr() Line 269               C++
libcef.dll!std::__1::default_delete<std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>>::operator()(std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>> * __ptr) Line 54 C++
[Inline Frame] libcef.dll!base::SequenceLocalStorageSlot<std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>,std::__1::default_delete<std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>>>::Adopt::<lambda_1>::operator()(void * ptr) Line 110   C++
libcef.dll!base::SequenceLocalStorageSlot<std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>,std::__1::default_delete<std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>>>::Adopt::<lambda_1>::__invoke(void * ptr) Line 110   C++
[Inline Frame] libcef.dll!base::internal::SequenceLocalStorageMap::ValueDestructorPair::~ValueDestructorPair() Line 85  C++
[Inline Frame] libcef.dll!std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>::~pair() Line 394               C++
[Inline Frame] libcef.dll!std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>::destroy(std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair> * __p) Line 133  C++
[Inline Frame] libcef.dll!std::__1::allocator_traits<std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>>::destroy(std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>> & __a, std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair> * __p) Line 308     C++
[Inline Frame] libcef.dll!std::__1::__vector_base<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>,std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>>::__destruct_at_end(std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair> * __new_last) Line 429  C++
[Inline Frame] libcef.dll!std::__1::__vector_base<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>,std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>>::clear() Line 372               C++
[Inline Frame] libcef.dll!std::__1::__vector_base<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>,std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>>::~__vector_base() Line 466               C++
[Inline Frame] libcef.dll!std::__1::vector<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>,std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>>::~vector() Line 558               C++
[Inline Frame] libcef.dll!base::internal::flat_tree<int,base::internal::GetFirst,std::__1::less<void>,std::__1::vector<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>,std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>>>::~flat_tree() Line 222               C++
libcef.dll!base::internal::SequenceLocalStorageMap::~SequenceLocalStorageMap() Line 23  C++
libcef.dll!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::~ThreadControllerWithMessagePumpImpl() Line 68  C++
libcef.dll!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::~ThreadControllerWithMessagePumpImpl() Line 56  C++
[Inline Frame] libcef.dll!std::__1::default_delete<base::sequence_manager::internal::ThreadController>::operator()(base::sequence_manager::internal::ThreadController * __ptr) Line 54 C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<base::sequence_manager::internal::ThreadController,std::__1::default_delete<base::sequence_manager::internal::ThreadController>>::reset(base::sequence_manager::internal::ThreadController * __p) Line 315  C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<base::sequence_manager::internal::ThreadController,std::__1::default_delete<base::sequence_manager::internal::ThreadController>>::~unique_ptr() Line 269               C++
libcef.dll!base::sequence_manager::internal::SequenceManagerImpl::~SequenceManagerImpl() Line 262               C++
libcef.dll!base::sequence_manager::internal::SequenceManagerImpl::~SequenceManagerImpl() Line 216               C++
libcef.dll!content::BrowserIOThreadDelegate::~BrowserIOThreadDelegate() Line 92               C++
[Inline Frame] libcef.dll!std::__1::default_delete<base::Thread::Delegate>::operator()(base::Thread::Delegate * __ptr) Line 54 C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<base::Thread::Delegate,std::__1::default_delete<base::Thread::Delegate>>::reset(base::Thread::Delegate * __p) Line 315  C++
libcef.dll!base::Thread::ThreadMain() Line 431    C++
libcef.dll!base::`anonymous namespace'::ThreadFunc(void * params) Line 113     C++
[External Code]

Replace splash screen with launcher

The OSX front-end has replaced the previous initial splash screen with a launcher:

launcher

Implement this on Windows. Note that the launcher can also be brought up from a hotkey, or from the "Window / Show Launcher" menu item.

Button which pastes code examples from extension documentation does not work

The button which pastes code examples from extension documentation into the Source panel does not seem to work (using the latest release, beta 4, on Windows 8.1 -- but the issue happened already with a previous version; I didn't get around to reporting it earlier).

The same goes for the button at the top beside the extension title, which should paste the line 'Include <ext. title> by <ext. author>.' into the Source panel.

In contrast to that, the button to copy examples from the normal included documentation (WWI/RB) does work.

Steps to reproduce:

  1. Open an extension in the Extensions panel.
  2. Click on the small "copy/paste" button next to the extension's title, or on the button next to a code example's title.

Selecting and copy-pasting the code examples by hand is a workaround, but unfortunately, not a very good one, because the formatting is not preserved completely -- for example, paragraph breaks are missing, which causes the compiler to misunderstand the code.

I know that the Gnome-Inform7 IDE is a separate project, but for what it's worth, the same issue seems to have cropped up there and was fixed in the gtk3 branch by this commit:

ptomato/inform7-ide@9858f76
("panel: Allow loading internal JS in Extensions pages")

Thanks for your work on the IDE!

Regards,
Michael

Tab order

On the current version of the OSX front end, the tab order is:

  • Source
  • Results
  • Story (only on right-hand side)
  • Testing
  • Index
  • Documentation
  • Extensions
  • Settings

The Windows front-end should match this revised order, as much as is practical.

Crash on closing extension project

If you open an extension project and then close it really quickly, the front-end can crash. The problem occurs if the process that updates the examples list has not completed before the project window is closed.

Inform 6 syntax colouring

The MacOS front-end can syntax colour Inform 6 inclusions. This logic should be adapted and included in the Windows front-end.

Check accessibility of custom controls

The Windows front-end uses a lot of custom controls (e.g. the skein window). These should all be checked to make sure they expose Active Accessibility objects so that they are visible to screen readers, etc.

Dark mode

The latest MacOS front-end supports a dark mode, which involves both changes to the front-end app itself, and the HTML generated by Inform 7. Given that the later work is done, it should be possible to have a dark mode on Windows, too.

However, Microsoft have made this extra difficult by not supporting dark mode with the standard Win32 common controls. There is logic in uxtheme.dll to draw controls in dark mode, but it's undocumented. It has been reverse engineered, see https://github.com/ysc3839/win32-darkmode, but using undocumented entry points is certainly less than ideal. Alternatively, it shouldn't be too hard to provide custom drawing logic for the few controls used by the Windows front-end so that they look okay in dark mode.

CEF sub-processes occasionally remain if main process fails

It has been observed for one or more CEF processes to remain after the main Inform7 process has failed. This should not happen since a Windows job is used to ensure that all sub-processes die when the Inform7 process exits. However, the job is created after CefExecuteProcess() is called, so there is a chance of the sub-processes being created before the job is created.

Really the job needs to be created before CefExecuteProcess(), but only in the main process. We should pass a command line parameter to the sub-processes so that the Inform7 code can distinguish whether it is running as a sub-process or not before CefExecuteProcess() is called.

Better support for image alignment for graphics in Glk text buffer windows in the Story tab

When glk_image_draw() is called for a text buffer window, the alignment can be one of

  • imagealign_InlineUp
  • imagealign_InlineDown
  • imagealign_InlineCenter
  • imagealign_MarginLeft
  • imagealign_MarginRight

Currently this is ignored, but the flags member of the REOBJECT structure passed to IRichEditOle::InsertObject() has the following flags, which may allow implementation of some of these alignments:

  • REO_ALIGNTORIGHT
  • REO_BELOWBASELINE
  • REO_WRAPTEXTAROUND

If interpreter is missing, Story tab is just blank

If the required interpreter is missing, or fails to start, the Story tab is just blank. At the least there should be a warning on the Results tab, possibly noting that we have had false positives from anti-virus tools in the past on interpreters.

Links on the Welcome to Inform launcher dialog

On the Welcome to Inform launcher dialog, provide information on which buttons are links in two ways:

  1. A tool-tip showing the URL opened, and
  2. A hand icon when the cursor is over a button that opens a URL.

Document build procedure

  1. Download and install Visual Studio 2019 Community edition from https://visualstudio.microsoft.com/. In the installer, under "Workloads", make sure that "Desktop development with C++" is selected, and under "Individual components" that "C++ MFC for latest build tools (x86 & x64)" is selected.
  2. Install git. I use the version of git that is part of Cygwin, a Linux-like environment for Windows, but Git for Windows can be used from a Windows command prompt.
  3. Clone Windows-Inform7 repository.
  4. Clone Windows-Glk repository.
  5. Clone Libraries repository.
  6. Download third-party libraries (libpng, etc.).
  7. Copy current install to Build directory.
  8. Build in Visual Studio.

Focus on HTML pages

The switch to libcef seems to have broken the logic that does (or does not) set the focus when navigating to a HTML page in the front-end.

Need to investigate replacing ReportHtml::SetFocusOnContent() with an implementation of CefFocusHandler.

Rewrite text buffer windows in story tab to use DirectWrite

Currently, text buffer windows in the story tab are implemented as rich edit controls. This mostly works, but some corners of the Glk specification cannot be implemented using them. Investigate if it is practical to re-write the text buffer logic using DirectWrite, which would allow much more control over the display of the text buffer window.

New toolbar icons

The MacOS front-end now has separate toolbars icons for light and dark mode, which are also scalable. The Windows front-end should use a form of these icons, too.

Middle-mouse button scrolling in the Source pane

In the HTML panes, you can hold down the middle mouse button (or scroll wheel) and move the mouse to scroll. It would be nice to have this in the Source pane, too.

This is (somewhat) implemented in MFC, and there is a modified version of this already in use for the Skein window. That could be improved by having a better icon image for when this mode activates - currently it's just a crudely drawn circle with arrows, with no anti-aliasing.

The build does not produce a working application

Attempting to compile produces error 512.

Untitled

Should the command line be invoking ni.exe rather than inform7.exe which doesn't exist in the compilers directory?

Update - Copying ni.exe to inform7.exe doesn't help since the error "VM not set" is revealed.

The IDE lacks options for creating and opening project-specific/local extensions

When globally importing an Inform 7 extension in the IDE, it becomes available for use in the Extensions panel.
(the extension gets copied into the Inform/Extensions/ folder)
This allows a user to open the extension inside the IDE itself.

However, there are no options for creating and opening a project specific extension.
The documentation states that these end up in the project's materials folder like so:

MyProject/
- MyProject.inform/
- MyProject.materials/
   - Release/ 
   - Extensions/
     -  Author/
        -  MyExtension.i7x

Such extensions can be successfully imported into the project.
The IDE just lacks menu options for creating them and opening them.
They are also not listed under Extensions.

It would be nice if we could:

  1. Create an extension for the current project only.
    Instead of creating the Author folder in the global Inform directory, just create it under the projects materials directory, as shown above.
  2. Open an extension that is located inside the project's materials directory.
  3. See the locally installed extension under the Extensions panel. (perhaps marked with local extension)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.