Giter Club home page Giter Club logo

svgpp's Introduction

SVG++ library 1.3.0

Please visit http://svgpp.org/ for description, tutorial and reference.

About

SVG++ library can be thought of as a framework, containing parsers for various SVG syntaxes, adapters that simplify handling of parsed data and a lot of other utilities and helpers for the most common tasks. Take a look at Tutorial to get the idea about what it is.

SVG++ features

  • Is a header-only library

  • Can be used with any XML parser

  • Compile time configured - no virtual functions

  • Minimal runtime overhead - you pay only for what you get

  • Has wide range of possible uses:

    • Fully functional, conforming SVG viewers
    • Simple in-app SVG rasterizers
    • Import modules of vector editing software
    • Implementing path-only input of SVG format with minimal efforts in any graphics or math software
  • Requires only Boost library itself (demo, tests and sample have their own requirements)

  • Compatible with C++11, but requires conforming implementation, due to heavy usage of templates

  • Supports any character type (char and wchar_t). Other (Unicode from C++11) were not tested, but should be ok.

SVG 1.1 features covered by SVG++

  • Path data - parsing, simplification
  • Transform list - parsing, simplification
  • Color, including ICC color - parsing
  • Lengths - highly configurable handling of SVG lengths, full support of all SVG length units
  • Basic shapes - optional conversion to path
  • Style attribute - parsing, taking in account differences in parsing presentation attributes and style properties
  • Automatic marker positions calculation
  • Viewport and viewbox handling

SVG++ is NOT

  • An SVG viewer or library that produces raster image from SVG (though C++ demo app included, which renders SVG with AGG, GDI+ or Skia graphics library)
  • Renders anything itself

What's new

  • SVG++ update 1.2.1 fixes handling text content inside <a> element that is a child of <text> element.
  • SVG++ update 1.2 focuses on reducing compiler memory usage by allowing separation of template heavy Boost.Spirit code to other compilation unit.

How to Help

  • CSS Processor. Processing CSS is outside of SVG++ scope, but it'll be nice to have some generic implementation of CSS selectors to use at preprocessing stage.
  • SVG Filter Effects. Some filters are already implemented in demo application but the complete solution requires more efforts. Generic enough parts may fit in SVG++ source base. Usage of Boost.GIL may make the code more reusable.
  • Animation. Implementation of animation in the demo application. Probably some utilities may get to SVG++.
  • Try to reduce compiler memory usage by switching to some C++11 metaprogramming library (brigand?). Evaluate upgrade to Boost.Spirit 3.0.
  • Extend demo with Cairo support?
  • More wrappers for XML parsers?
  • Evolve demo to fully functional SVG rendering component for one of the graphic engines. A major gap in demo's SVG implementation is text and font support. It'll be too complex to make it cross-engine, but for the single engine chosen and probably with third-party libraries like FreeType it's pretty feasible.

svgpp's People

Contributors

2bt avatar andrej730 avatar donba-microsoft avatar jediry avatar luzpaz avatar magjac avatar osmial avatar richardcory avatar svgpp avatar zhedahht 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

svgpp's Issues

Failed on parsing numbers in path

Failed on parsing path string
number_optional_number_test_t("9.94-8.06", 9.94, -8.06), number_optional_number_test_t("-4.228.9", -4.228, 0.9),

Check this path:

M30.262 57.02L7.195 40.723c-5.84-3.976-7.56-12.06-3.842-18.063 3.715-6 11.467-7.65 17.306-3.68l4.52 3.76 2.6-5.274c3.717-6.002 11.47-7.65 17.305-3.68 5.84 3.97 7.56 12.054 3.842 18.062L34.49 56.118c-.897 1.512-2.793 1.915-4.228.9z

Here you can find some examples of svg for test, which is have difficult path strings.

I can not use this on VS2015

Hello. thank you for making good libs. Unfortunately, i have faced a problem when i use it.

My problem is like below :

I tried to use it on VS 2015. and i just added the libs at 'Additional Including folder'

and then i add "#include <svgpp/svgpp.h>" to my cpp files.

When i tried to build it, i could see a lot of errors.

The errors lists pointed to the 123 line at 'enumerate_literal_value.inc' file.

SVGPP_ON_VALUE(small) // Error on Windows may be caused by "small" macro in RpcNdr.h

The source code has already been marked that it will go to error.

How can i do to use it?

I worked with VS2015 and MFC.

Incorrect marker viewport handling

According to the SVG 1.1 specification, section 11.6.2, the attributes refX / refY on marker elements are defined as coordinates in the coordinate system after applying viewBox and preserveAspectRatio.
Unfortunately SVG++ resolves the refX / refY value before computing the viewBox, which means that percentage values for refX / refY will be incorrect.

How to support Intersection clip path?

The intersection clip path is archived by the attribute "clip-path" of element "ClipPath" with the use element. But it seems like the attribute "clip-path" in element "ClipPath" isn't supported. The below is the sample file:

<defs>

<clipPath id="clip1">
<polygon id="clip1Shape" points="100,10 40,180 190,60 10,60 160,180 100,10" stroke="blue" />
</clipPath>

<clipPath id="clip2">
<circle id="clip2Shape" cx="100" cy="100" r="65" />
</clipPath>

<!-- Intersection -->
<clipPath id="clipIntersection" clip-path="url(#clip1)">
<use x="0" y="0" width="200" height="200" xlink:href="#clip2Shape" />
</clipPath>

</defs>

<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1">

<rect x="10" y="10" width="180" height="180" fill="red"
clip-path="url(#clipIntersection)" transform="translate(200)" />

</g>

在MFC中使用svgpp报错:error C3861: “min”: 找不到标识符

您好,感谢您百忙之中查看该信息。
我在一个MFC工程中使用svgpp,在project中增加 NOMINMAX 。编译之后报错:
1>c:\program files (x86)\windows kits\8.1\include\um\gdiplustypes.h(475): error C3861: “min”: 找不到标识符
不知道怎么解决,请大神帮忙看看,谢谢!

Compile error on on Mac with c++11

I'm getting an error when compiling the demo on macOS Sierra with Apple LLVM version 8.1.0 (clang-802.0.42), -std=c++11, and Boost 1.64.0:

/src/agg/include/agg_trans_affine.h:313:9: warning: 'register' storage class specifier is deprecated and incompatible with C++1z [-Wdeprecated-register]
        register double b = (*y - ty) * d;
        ^~~~~~~~~
In file included from /src/render/svgpp_render.cpp:7:
In file included from /src/svgpp/utility/gil/mask.hpp:11:
/src/boost/gil/channel_algorithm.hpp:54:85: error: non-type template argument evaluates to -1, which cannot be narrowed to type 'unsigned long' [-Wc++11-narrowing]
struct unsigned_integral_max_value : public mpl::integral_c<UnsignedIntegralChannel,-1> {};

Adjust transform syntax to reflect test suite and browser practice

While a strict reading of the SVG1.1 specification requires that transforms in a list are separated by a comma or at least one whitespace character, this test http://www.w3.org/Graphics/SVG/Test/20110816/harness/htmlSVGWeb/coords-transformattr-01-f.html suggests it is not the case, and the specification is erroneous. Indeed, SVG2 (which uses CSS3 transforms) eliminates the requirements, and all major browsers pass the test, unlike svgpp and any app using it.
I suggest amending the grammar used by svgpp to reflect implementation practice.

Viewport handling

Implement full viewport handling:

  • Getting size from root svg element.
  • Establishing new viewport.
  • Passing viewport size to Length Factory.
  • Establishing clipping rect
  • ...

There are some problem with gdiplus.

Hello. It is me again.

I have encountered a new problem with gdiplus.

I tried to draw a svgpath.

M688 564Q631 523 555 487q56 -17 121.5 -31.5T804 432q8 -1 9.5 -4.5T813 417l-9 -34q-2 -11 -16 -8q-32 5 -71.5 13t-82 18t-85 21.5T468 450Q397 422 318 400.5T156 365q-15 -3 -19 7l-12 34q-2 5 1 9.5t9 6.5q70 14 132 30.5t118.5 35t109 41T599 577q17 9 15.5 15.5T597 599H199q-13 0 -13 13v35q0 12 13 12H631q78 0 95 -27.5T688 564ZM900 277t5 -3.5t5 -9.5V230q0 -5 -5 -9t-10 -4H45q-6 0 -10.5 4T30 230v34q0 6 4.5 9.5T45 277H432V383q0 14 14 14h41q14 0 14 -14V277H895q5 0 10 -3.5ZM502 158q-1 -5 -1 -10t-1 -10q3 -14 9 -26T523 89Q561 31 639.5 -13T827 -79q6 -2 7 -7t-1 -10l-16 -33q-2 -5 -5.5 -7.5T798 -137q-116 27 -201.5 78T469 57Q431 -6 350.5 -58T149 -143q-16 -4 -20 5l-14 37q-2 5 -0.5 11t8.5 8Q275 -41 354 22.5T436 161q0 12 12 12l46 -1q9 0 8 -14ZM611 782t0 -14V736q0 -15 -15 -15H333q-15 0 -15 15v32q0 14 15 14H596q15 0 15 -14Z

i could draw it correctly with FillPath method of gdiplus.

2

But, in case of DrawPath method. There was some artifacts like below.

default

I painted red rectangles on the artifacts.

Please help me.

Call to 'ref' is ambiguous - xcode C++ collision

Fresh download, trying to compile https://github.com/svgpp/svgpp/blob/master/src/samples/sample01b.cpp

In file "number.hpp" I get an ambiguous call to the second 'ref' on line 108
>> number [ref(value2) = _1, ref(two_values) = true]
and
In file "misc.hpp" I get the ambiguous call to the second 'ref' on line 188
if (qi::parse(it, end, number[ref(value) = _1] >> -(qi::lit('%')[ref(percentage) = true])) && it == end)

In both cases, the collision type is bool and there are two candidate functions, one in "__functional_base.cpp" and one in "reference.hpp". It seems pretty clear that the intended usage is the definition in "reference.hpp".

The problem seems to be Xcode Specific because "__functional_base.cpp" is part of the default xcode C++ toolchain.

Svgpp does not compile with Boost 1.63.0

Good evening,

With the latest version of Boost (1.63.0), compilation of svgpp fails with the following error when calling document_traversal :

svgpp/parser/grammar/transform.hpp:79:41: erreur : no matching function for call to « bind(<unresolved overloaded function type>, const _r1_type&, const _a_type&, const _b_type&) »
                   >> lit(')') [phx::bind(&transform_grammar::call_translate, _r1, _a, _b)]
                                ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

My compiler is GCC 6.3.1. I confirmed that the problem does not appear when using Boost 1.62.0.

I found such an error occurs when transform is included in the processed attributes or when shapes_attributes_by_element is used.

Offer interface for CSS rule engine

Now it can be done in XML policy by appending style attribute, but there should be possibility to bypass styles concatenation and subsequent parsing.

I have a problem to draw shape.

I tried to draw svg path data to gdi+ bitmap. I referred to source code in demo for completing it.

In result :

  1. It is a svg path of dashcharacter and works well. (It consists of lines)

<path d="M616 440H66V621H616V440Z"/>

  1. It is a svg path of alphabet Ocharacter and does not work. (It consists of curves)

<path d="M569 1085q215 0 356.5 -140T1067 547Q1067 234 914 104.5T569 -25Q368 -25 220 108T72 530q0 280 143 417.5T569 1085ZM569 123q154 0 234 114t80 300q0 199 -90.5 300T569 938Q432 938 344 835.5T256 530q0 -202 89.5 -304.5T569 123Z"/>

Case number 2, nothing rendered. The paths which contain Bezier curve seem not to work.

I made Context the same as PathStoragein demo source code.

I have almost spent 5 days to fix it.

Please help me, give me some piece of advice.

Not building on Ubuntu 14.04

Using

cmake -G "Unix Makefiles" -D BOOST_ROOT=/usr/share ../src/samples/
make

I get a lot of these errors:

/home/dave/Desktop/svgpp_testing/svgpp/src/samples/../../include/svgpp/policy/error.hpp:58:88: error: declaration of ‘operator=’ as parameter
   BOOST_DELETED_FUNCTION(unknown_element_error& operator= (unknown_element_error const&))
                                                                                        ^
/home/dave/Desktop/svgpp_testing/svgpp/src/samples/../../include/svgpp/policy/error.hpp:58:89: error: ISO C++ forbids declaration of ‘BOOST_DELETED_FUNCTION’ with no type [-fpermissive]
   BOOST_DELETED_FUNCTION(unknown_element_error& operator= (unknown_element_error const&))

I have libboost1.54-dev

Thanks for an otherwise good looking SVG library!

Incorrect marker style handling in Demo app

The demo application uses load_expected_element() to resolve a marker, and does so in the context of the element making use of it, which means that inherited properties will be resolved using the value available for the element referencing the marker.
This is incorrect, according to section 11.6.2 of the SVG 1.1 specification.

Unfortunately, I found out that parsing a marker element in the normal flow will result in an incorrect viewport handling, as the length factory used to resolve percentages will report bogus results.

Segfault when parsing > 1024 chars of data

I get a segfault when trying to parse files that are more than 1024 chars. 1024 works, 1025 does not.

I've tried using both RapidXML and libxml2 as the XML parser, and the problem occurs in both cases. So, it seems not to be a limit in the parser.

Support 'defer' value of the ‘preserveAspectRatio’ attribute

If the value of ‘preserveAspectRatio’ on an ‘image’ element starts with 'defer' then the value of the ‘preserveAspectRatio’ attribute on the referenced content if present should be used. If the referenced content lacks a value for ‘preserveAspectRatio’ then the ‘preserveAspectRatio’ attribute should be processed as normal (ignoring 'defer'). For ‘preserveAspectRatio’ on all other elements the 'defer' portion of the attribute is ignored.

Very slow compilation (MSCV 12 up4 64bits)

Hello,

I am trying to use your library to load some SVG files under QT and post process them.

The compilation is terribly slow.
I mean I only include your main "svgpp/svgpp.hpp" in a single cpp file, where I bind everything into a Qobject, and that file takes something like 3 minutes to compile (Debug mode).
Removing your dependencies, it only takes 2-3 seconds.

Do you have any idea why it would be so slow?
After compilation everything looks fine, and I can execute my code.

Check passed policies

Check passed policies wherever possible. Mostly for types of items in type sequences

Wrong signature in msxml policy

element_iterator::get_child_elements_and_texts() for the msxml policy expects two arguments, but the caller only passes one (and indeed, the function should only receive one, because it declares a variable with the same name)

Out of memory while building with GCC

Hello. I get my PC completely frozen when trying to build svgpp.

Saved by REISUB.

Linux Gentoo x86_64

I'm building with -j5 and it's failing, but with -j1 it compiles normaly, but uses about 5GB of RAM per file.
I presume it's templates fault. But it still too much.

PS: also compilation time is just huge. Take me about 30min on 4.2GHz Intel core.

Log:

% cmake .
-- The C compiler identification is GNU 4.9.3
-- The CXX compiler identification is GNU 4.9.3
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Boost version: 1.56.0
-- Found LibXml2: /usr/lib64/libxml2.so (found version "2.9.2") 
-- Configuring done
-- Generating done
-- Build files have been written to: /media/data/Programming/Source/svgpp/src
% make -j5
Scanning dependencies of target Sample01a
Scanning dependencies of target svgpp_agg_render
Scanning dependencies of target Sample01c
Scanning dependencies of target svgpp_agg_render_libxml
Scanning dependencies of target Sample01b
[  0%] Building CXX object samples/CMakeFiles/Sample01a.dir/sample01a.cpp.o
[  0%] [  1%] Building CXX object samples/CMakeFiles/Sample01c.dir/sample01c.cpp.o
Building CXX object samples/CMakeFiles/Sample01b.dir/sample01b.cpp.o
[  2%] Building CXX object demo/render/CMakeFiles/svgpp_agg_render.dir/media/data/Programming/Source/svgpp/third_party/agg/src/agg_curves.cpp.o
[  2%] Building CXX object demo/render/CMakeFiles/svgpp_agg_render_libxml.dir/media/data/Programming/Source/svgpp/third_party/agg/src/agg_curves.cpp.o
[  2%] [  3%] Building CXX object demo/render/CMakeFiles/svgpp_agg_render.dir/media/data/Programming/Source/svgpp/third_party/agg/src/agg_trans_affine.cpp.o
Building CXX object demo/render/CMakeFiles/svgpp_agg_render_libxml.dir/media/data/Programming/Source/svgpp/third_party/agg/src/agg_trans_affine.cpp.o
[  4%] Building CXX object demo/render/CMakeFiles/svgpp_agg_render_libxml.dir/media/data/Programming/Source/svgpp/third_party/agg/src/agg_vcgen_dash.cpp.o
[  5%] Building CXX object demo/render/CMakeFiles/svgpp_agg_render.dir/media/data/Programming/Source/svgpp/third_party/agg/src/agg_vcgen_dash.cpp.o
[  5%] Building CXX object demo/render/CMakeFiles/svgpp_agg_render_libxml.dir/media/data/Programming/Source/svgpp/third_party/agg/src/agg_vcgen_stroke.cpp.o
[  5%] Building CXX object demo/render/CMakeFiles/svgpp_agg_render.dir/media/data/Programming/Source/svgpp/third_party/agg/src/agg_vcgen_stroke.cpp.o
[  6%] Building CXX object demo/render/CMakeFiles/svgpp_agg_render_libxml.dir/svgpp_render.cpp.o
[  7%] Building CXX object demo/render/CMakeFiles/svgpp_agg_render.dir/svgpp_render.cpp.o
c++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://bugs.gentoo.org/> for instructions.
demo/render/CMakeFiles/svgpp_agg_render_libxml.dir/build.make:146: recipe for target 'demo/render/CMakeFiles/svgpp_agg_render_libxml.dir/svgpp_render.cpp.o' failed
make[2]: *** [demo/render/CMakeFiles/svgpp_agg_render_libxml.dir/svgpp_render.cpp.o] Error 4
CMakeFiles/Makefile2:112: recipe for target 'demo/render/CMakeFiles/svgpp_agg_render_libxml.dir/all' failed
make[1]: *** [demo/render/CMakeFiles/svgpp_agg_render_libxml.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
^Cdemo/render/CMakeFiles/svgpp_agg_render.dir/build.make:146: recipe for target 'demo/render/CMakeFiles/svgpp_agg_render.dir/svgpp_render.cpp.o' failed
make[2]: *** [demo/render/CMakeFiles/svgpp_agg_render.dir/svgpp_render.cpp.o] Interrupt
demo/render/CMakeFiles/svgpp_agg_render.dir/build.make:169: recipe for target 'demo/render/CMakeFiles/svgpp_agg_render.dir/gradient.cpp.o' failed
make[2]: *** [demo/render/CMakeFiles/svgpp_agg_render.dir/gradient.cpp.o] Interrupt
CMakeFiles/Makefile2:77: recipe for target 'demo/render/CMakeFiles/svgpp_agg_render.dir/all' failed
make[1]: *** [demo/render/CMakeFiles/svgpp_agg_render.dir/all] Interrupt
samples/CMakeFiles/Sample01b.dir/build.make:54: recipe for target 'samples/CMakeFiles/Sample01b.dir/sample01b.cpp.o' failed
make[2]: *** [samples/CMakeFiles/Sample01b.dir/sample01b.cpp.o] Interrupt
CMakeFiles/Makefile2:229: recipe for target 'samples/CMakeFiles/Sample01b.dir/all' failed
make[1]: *** [samples/CMakeFiles/Sample01b.dir/all] Interrupt
samples/CMakeFiles/Sample01c.dir/build.make:54: recipe for target 'samples/CMakeFiles/Sample01c.dir/sample01c.cpp.o' failed
make[2]: *** [samples/CMakeFiles/Sample01c.dir/sample01c.cpp.o] Interrupt
CMakeFiles/Makefile2:264: recipe for target 'samples/CMakeFiles/Sample01c.dir/all' failed
make[1]: *** [samples/CMakeFiles/Sample01c.dir/all] Interrupt
make[2]: *** wait: No child processes.  Stop.
make[2]: *** Waiting for unfinished jobs....
make[2]: *** wait: No child processes.  Stop.
CMakeFiles/Makefile2:194: recipe for target 'samples/CMakeFiles/Sample01a.dir/all' failed
make[1]: *** [samples/CMakeFiles/Sample01a.dir/all] Error 2
Makefile:75: recipe for target 'all' failed
make: *** [all] Interrupt

ParserGTest FAILED TEST on Mac 10.10.1

Failed test on Mac 10.10.1
Xcode 6.1.1
Clang 6.0

[ RUN      ] AttributeTraversal.Prioritized_Without_Style
[       OK ] AttributeTraversal.Prioritized_Without_Style (0 ms)
[ RUN      ] AttributeTraversal.Sequential
/Users/sakrist/Desktop/svgpp/src/test/attribute_traversal_test.cpp:157: Failure
Value of: context.str()
  Actual: "ATTR 247 [11]\nATTR 262 [12]\nATTR 215 [baseline-shift:style value;fill: fill value ;]\nATTR 1 [attr value]\nATTR 28 [fw value]\n"
Expected: sample_context.str()
Which is: "ATTR 247 [11]\nATTR 262 [12]\nSTYLE 1 [style value]\nSTYLE 15 [fill value]\nATTR 1 [attr value]\nATTR 28 [fw value]\n"
[  FAILED  ] AttributeTraversal.Sequential (0 ms)
[----------] 3 tests from AttributeTraversal (0 ms total)

Configured Xcode project by cmake:

user$ cmake -G Xcode -D BOOST_ROOT=/usr/local/Cellar/boost/1.56.0/include/boost/ /User/svgpp/src 
-- The C compiler identification is AppleClang 6.0.0.6000056
-- The CXX compiler identification is AppleClang 6.0.0.6000056
-- Check for working C compiler using: Xcode
-- Check for working C compiler using: Xcode -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler using: Xcode
-- Check for working CXX compiler using: Xcode -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Boost version: 1.56.0
-- Found LibXml2: /usr/lib/libxml2.dylib (found version "2.9.0") 
-- Configuring done
-- Generating done

Deal with XML namespaces

While most of namespaces should be just filtered out by XML policy, some, like xlink (anything else?) are used by SVG++ and must be handled.
How it should be done with namespaces-unaware parsers like RapidXML?

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.