Giter Site home page Giter Site logo

tranleduy2000 / pascalnide Goto Github PK

View Code? Open in Web Editor NEW
92.0 13.0 25.0 296.94 MB

Pascal Compiler for Android

Pascal 7.61% Batchfile 0.02% Java 87.21% Lex 1.68% HTML 3.08% CSS 0.02% Makefile 0.09% Yacc 0.08% AngelScript 0.01% Emacs Lisp 0.06% Vim Script 0.13% Shell 0.01%
pascal pascal-compiler android interpreter pascal-nide

pascalnide's Introduction

Pascal NIDE - Pascal Compiler for Android

Wall

See app on Google Play Store

Overview

The application is a Pascal interpreter on Android. This application is confusing for everyone to learn Pascal on the mobile without a computer, so that we can practice anytime, anywhere.

If you want to translate this app, please visit this link http://osewnui.oneskyapp.com/collaboration/project/272800

The main features of the IDE:

  1. Compile Pascal programs and run them without Internet.
  2. Report error when compiling
  3. Powerful editor with many smart features:
    • File menu: create a new program file, open, save,automatically save file
    • Menu edit: Undo, redo, copy, paste.
    • Auto suggest: Display a small popup window that suggests words that coincide with the word being typed
    • Auto format: automatically reformat the code for easier viewing.
    • Find / Find and replace: Regular Expression support.
    • Goto line: Move the cursor to a line.
    • Highlight code: highlight the keywords.
    • Code style: many interface for the editor.
    • Font size, font, word wrap.
  4. Support library Android (Sensor, battery, record audio, camera...)
  5. Support Java in Pascal
  6. Auto fix parsing error
    • declare type
    • declare procedure
    • declare constant
    • declare function
    • declare variable
    • Fix wrong type
    • Fix missing token
    • Fix group exception
    • Change constant to variable
    • Fix missing begin end
    • Change type of constant
    • Change type of variable
    • Fix missing dot token

Features that the interpreter is missing

  • Exceptions
  • Variant types
  • goto, label

Libraries supported for Android

  • The aTTSpeech library converts text to speech (requires TextToSpeech). See example text_to_speech.pas
  • The aRecognition library converts speech to text (requires Google Voice). See example speech_to_text.pas.
  • The aVibrate library supports vibration control. You see example vibrate.pas
  • The aSensor library supports processing of Android sensors (light, acceleration, ...). See accelerometer_sensor.pas for accelerometer sensor example
  • The aNotify library helps display notifications in the status bar. See the example notify.pas
  • The aClipboard library works with the clipboard in Android. See the clipboard.pas example
  • The aBattery library retrieves the battery information of the device. See battery.pas example
  • The aMedia library Provides classes that manage various media interfaces in audio and video. See Wiki
  • The aTone library provides API to play DTMF tones (ITU-T Recommendation Q.23). See Wiki
  • The aDilaog library provides API to show some dialog. See Wiki

Java under Pascal - JPascal

Pascal N-IDE allows write program with objects class of Java, which seems crazy :), but it is possible. I reprogrammed a whole platform. Therefore, you can completely use the class of Java (such as java.util.ArrayList or java.net.Socket to program Socket). That's great, isn't it?.

For more information, please read the java_under_pascal.md wiki for details. Link instruction

Here is an example of using Socket

var
    sk: java_net_Socket;
    ipAddress: string;
    Port: integer;

begin
    ipaddress := '192.168.1.1';
    port := 80;

    {Socket sk = new Socket(ipAddress, port)}
    New(sk, ipAddress, port);

    writeln(sk);
    writeln(sk.isConnected());
end.

or ArrayList in Java

var
    list: java_util_ArrayList;
    i: integer;
begin
    new(list);

    for i := 1 to 10 do
        list.add(i);

    for i := 1 to 10 do
        writeln(list.get(i));

end.

How to contribute

All contributions are welcome, include code, documentation, suggestions, bug reports, ... . Use github pull request feature or email me. Many thanks for your help To help translate this app, please visit http://osewnui.oneskyapp.com/collaboration/project?id=272800

Tutorials

  1. Google Voice
  2. Scan Barcode/QR code
  3. Text To Speech
  4. Generate Tone DFMT
  5. RGB Color

See in https://pascalnide.wordpress.com/

  1. How to create communication application by voice with Pascal N-IDE>

If you want to help me write a tutorial, please email to me.

License

The code in this repository is licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

NOTE: This software depends on other packages that may be licensed under different open source licenses.

Developer

Trần Lê Duy

pascalnide's People

Contributors

tranleduy2000 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

Watchers

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

pascalnide's Issues

Error?

Really need some one solve this
Screenshot_20191108-221413

switching

15 #now switch to the install directory (we might be running from a link in /usr/bin/local)
16  
17 cd "$DIR"
18  
19 echo "in dir:" $PWD
20  
21 echo Starting pipereader
 
27 # this does not seem to work.
28 pkill -P $$
29 # remove the pipe for next time
30 rm -f $pipe
31 }
32  
33 trap cleanup EXIT

Try..except, try..finally

Hello! Can I use "try..except" and "try..finally" operators? I didn't find it in the samples of code...

[Graph unit] Different font face for each text style

In Graph unit, setTextStyle() function provide at least 7 kinds of font face. But, as I play around with Graph unit, it seems that only available 2 font faces provided by Pascal N-IDE. One for sansSerifFont and one for the others. So, could you please give each of them different font face?

Here's my suggestion:

  • TriplexFont: Tahoma, Verdana
  • SmallFont: Palatino Linotype
  • SansSerifFont: Arial, Helvetica
  • GothicFont: Times New Roman, Georgia
  • ScriptFont: Comic Sans MS
  • TSCRFont: Courier New, Lucida Console
  • BoldFont: Impact, Arial Black

Or simply pick any suitable fonts provided by Google.

Reference:

Type file is not defined

Is there any file support? There are assign and close functions but I can't define a file. Example:
type file1=file of integer;
var F:file1;
begin
end.

Putpixel color

The following proggy shoud not result in horisontal stripes but be one long gradient from top to bottom.

program map;
uses crt, graph;
var
graphicsDriver, graphicsMode,
x,y,k: Integer;

begin { main }
graphicsDriver := Detect;
InitGraph(graphicsDriver, graphicsMode, '');
k:=int(getMaxX()/2/pi);
for x:=1 to getMaxX() do
for y:=1 to getMaxY() do
begin
putPixel(x,y,y);
end;
end.

[lang] Function result variabel doesn't work

Today's Pascal —as being used by FPC and Delphi since ages ago— has result variable declared implicitly within a function. This doesn't work in Pascal N-IDE.

Example:

function f(p: integer): string;
// var result: string <-- implicitly added by the compiler
begin
  if p = 0 then
    result := 'zero'
  else
    result := intToStr(p);
end;

Because result is a variable, it acts like a variable. For example, if the function output is a dynamic array, the result size can be defined by setLength() procedure from within the function.

Reference: https://www.freepascal.org/docs-html/current/ref/refse90.html#x174-19600014.3

Error with function

Hello, why does the graph function InstallUserFont return void instead of int?

Command sound / nosound don't work

Hi, this program don't work correctly:

program test;
uses crt;
begin
writeln('hello world');

sound(440);
readkey;
nosound;

sound(880);  
readkey;
nosound;

writeln('end');

end.

My phone: Android Google Pixel

Automatically Deleted My Program

To day on 26 Feb 2020 DELETED MY PROGRAM From Another Reason. The Program Was 169 Code Lines. When Open On My Program i saw of Code Lines and Not Exist Lines. WHY!!!!!!!!

[Touch unit] (multi) touch detection

There's no Touch unit available yet. So, I propose to provide Touch unit to handle touch and gesture events. For example:

  • single tap detection
  • double tap detection
  • tap-n-hold (long-tap) detection
  • multi-touch (up to 4 touches) detection
  • edge swipe detection
  • long swipe detection
  • rotate swipe detection
  • pinch detection (for zoom)
  • … and other common touch and gesture events.

[Editor] It's getting slower as the code gets larger

The editor is pretty good, but it's getting slower as the code file grows. Once you reach over a hundred lines of code, the lag becomes obvious. Sometimes it even fails to render syntax highlight correctly and the text goes all white.

False error in a recursive function

I've got an error in a recursive function in a place where it should get itself a value that it should return. The error states about wrong number of arguments. But to give a value to a function one should assign it to the name of the funct. without any arguments. On a desktop this code works as it should.

function fib(n: Integer): Integer;
var f:Integer;
begin
  if n < 1 then fib:= fib(n+2)-fib(n+1)
    else if n > 2 then fib:= fib(n-2) + fib(n-1)
      else fib:=1;
end;

Cant use label

i cant make label, always said "the following name doesnt belong here", even though i match with program in google but i cant see what my mistake

[lang] Optional parameters doesn't work

Today's Pascal —as being used by FPC and Delphi since ages ago— has default or optional parameter in function/procedure declaration. This kind of parameter can be omitted when calling the function. This doesn't work in Pascal N-IDE.

Example:

program test;

uses SysUtils;

// function f with p as optional parameter (has default value)
function f(p: integer = 0): string;
begin
  if p = 0 then
    f := 'zero'
  else
    f := intToStr(p);
end;

begin
  f;    // print 'zero'
  f(2); // print '2'
end.

Reference: https://www.freepascal.org/docs-html/current/ref/refsu64.html#x176-19800014.4.1

There's an error in complier.

I can't run my program to do my IT homework. I think there's can be some problem with command "length" in app.
P.S. Great thanks to you for creating "Pascal N-IDE" it is very helpful and cool :)

There is program:

Program kek;
var
f: text;
k, max, i: integer;
a: string;
begin
Assign(f, '/storage/sdcard0/24_demo.txt');
reset(f);
read(f, a);
close(f);
max := 0;
for i := 1 to length(a) - 1 do
if (a[i] = a[i + 1]) and (a[i] = 'Z') then
begin
k := k + 1;
if k > max then
max := k ;
end
else
k := 1;
writeln(max);
end.

Mảng và case of

Em ko khai báo mảng có chiều dài là các kí tự từ 'a' - 'z' dc và cũng ko dùng case of mà các trường hợp là xâu dc. Mong anh sửa các lỗi này nhanh nhất có thể.

[IDE console] How to change output console font?

I'm looking for a way to change output console's font face and size, because sometimes I want my program to be able to use larger font. It seems that it's not customizable yet, am I right? I suggest you to use monospace fonts for output console like Courier New or Lucida Console or Menlo or something like that.

pointer comparison does not work

program test;
var p: ^integer;
begin
new(p);
if p=p then exit();
end.

The error message says that operator = cannot be applied to args of type ^integer.

[Editor] Set default indent to 2 spaces

Due to smartphone screen size limit, I suggest the app to set editor's default indentation to 2 spaces. Apply it to the code formatter/beautifier as well. Pascal is a verbose language, 2 spaces indentation is clear enough. And please don't use tabs for indentation because it's not portable for copy-and-paste operation across apps/editors.

[BUG]KeyPressed Command Error

The KeyPressed Command Does Not Work, When My Program Is Running Then stop at the Same Time. Fix Please

My Program Has 250 Lines

Error

Program p;
var a, b:integer;
Begin
readln(a);
if (a=0) or (a=1) then else writeln('error');
writeln(a);
end.

error - If a=0 then "the program should not do anything" else "the program should write error"

Wrong error.

program p;
type Litere = (a, b);
var x : Litere; y:char; i:integer;
begin
x:=a; i:=ord(x); writeln(i);
end.

Compile wrong error:
"The type of one or more arguments, is wrong, when calling the "ord" function.
Accept functions:
Ord(Char):integer"
This error is incorrect because the program is correct and should not be error at compiler.
screenshot_2017-10-09-21-34-46

Languages

Czech language(Čeština) is in slovakian language (slovenština).

[Graph unit] Color transparency isn't supported

Graph unit is an old unit, legacy of Turbo Pascal. But as N-IDE is created in today modern world, it should work with modern technology as well, including in color values. Current Graph unit doesn't provide support to define color transparency (alpha) value in any ways. Hopefully it will be supported in the future version.

Insert TAB in string

Description

I work on a program that writes the fibonacci sequence and I want to arrange my numbers.
From what I learned, you can print TAB by using #9 (the ascii value of TAB).

Problem

This line of code compile but doesn't do anything
Write(#9);

This line of code produce a compilation error
Write('1 '#9);
'1 '#9

This line of code doesn't add a TAB
Write(`1 `,#9);
1 ,#9

I ran the same code in FreePascal and OnlineGDB, this works

[System unit] copy() doesn't work on dynamic array

As issue #10 that I just reported, another issue I found is Pascal N-IDE's copy() function doesn't work on dynamic array. It only works on string, as shown by auto-completion hint/info. I think it's a miss on your part, I suppose.

Actually, in modern Pascal, copy() works both on string and dynamic array. As it does on Free Pascal, Delphi, or other modern Pascal compilers. I think you should upgrade your interpreter abilities so it's compatible with other Pascal compilers being widely used today.

Reference:

[CRT unit] ScreenWidth and ScreenHeight functions are missing

In CRT unit, ScreenWidth() and ScreenHeight() functions are missing. Both functions return console's screen width and height respectively, in character. The compiler already has had this information shown after compilation. So, it's just a matter of exposing them into these appropriate functions.

In the old CRT unit, both are constants taken from the OS configuration. But as we are on mobile, they should be function because we need them from the OS dynamically i.e. screen orientation change on runtime. They're similar to getMaxX() and getMaxY() functions in the Graph unit.

wrong version number in 4.0.4 APK

Just a note: looks like you forgot to increase versionName and versionCode with the latest release:

package: name='com.duy.pascal.compiler' versionCode='103' versionName='4.0.3' platformBuildVersionName='7.1.1'

apk Builder

Is possible with the ide create a standalone apk of the app created ?
Thanks

*Major* Program overwrite issue

There is a problem where a program file gets overwritten when the app is closed (or forcibly closed) and reopened again. The entire program is overwritten by a blank file and there is no way to undo the loss. This might be caused by the autosave feature, which cannot be turned off on my device. Please fix the problem as soon as possible. Thank you very much.

Label

Fungsi Label pada apk anda tidak dapat digunakan seperti pada Turbo pascal yang ada di laptop saya, padahal saya ingin menjalnkan label dan menggunakan fungsi GoTo tersebut. terimakasih
Screenshot_2020-04-09-17-16-32-89_08834579ed939f87c5cf1d6de3b819d0

[CRT unit] Failed to render text animation

I got this from my old Pascal codes collection. It's a text animation on console, kinda simple particle on text. It works fine on console using Free Pascal. I just tested it on Linux and Mac terminal. But when I ported it to Pascal N-IDE, the console failed to render the animation correctly. The rendering is so slow that the animation lags and sluggish.

Here's the code:

program animateText;

{ ----------
  Text animation on console
  by: Mr Bee -- @pak_lebah
}

uses CRT;

const
  // global value setup
  THE_TEXT = 'THIS IS PASCAL';
  V_MOTION = 1;   // motion speed
  D_MOTION = 16;  // motion delay

type
  // letter structure
  TLetter = record
    l  : string;  // character
    x,y: integer; // position
    c  : integer; // color
  end;
  TLetters = array of TLetter;
  
var
  goSpread: boolean; // motion direction
  goStraight: boolean; // animation mode
  doneX,doneY,done: boolean; // anim state

// spread letters all over the screen
procedure spread(var l: TLetters);
var
  i: integer;
begin
  for i := 0 to high(l) do
  begin
    // random all over the screen
    l[i].x := random(ScreenWidth)+1;
    l[i].y := random(ScreenHeight)+1;
    l[i].c := random(7)+9; // bright colors
  end;
end;

// gather all letters into a text
procedure gather(var l: TLetters);
var
  tx,ty: integer;
  i: integer;
  s: string;
begin
  // compute text position
  s := '';
  for i := 0 to high(l) do s += l[i].l;
  tx := random(ScreenWidth-length(s))+1;
  ty := random(ScreenHeight-1)+1;
  // align text onto new position
  for i := 0 to high(l) do
  begin
    l[i].x := tx + i;
    l[i].y := ty;  // horz aligned
    l[i].c := random(7)+9;
  end;
end;

// animate on x position
procedure animX(var f,t: TLetters);
var
  i,v: integer;
begin
  v := V_MOTION;
  doneX := true;
  for i := 0 to high(f) do
  begin
    // move left
    if f[i].x > t[i].x then
    begin
      f[i].x := f[i].x - v;
      if f[i].x < t[i].x then 
        f[i].x := t[i].x;
    end
    // move right
    else if f[i].x < t[i].x then
    begin
      f[i].x := f[i].x + v;
      if f[i].x > t[i].x then
        f[i].x := t[i].x
    end
    else
      f[i].x := t[i].x;
    // save state
    doneX := doneX and (f[i].x = t[i].x);
  end;
end;

// animate on y position
procedure animY(var f,t: TLetters);
var
  i,v: integer;
begin
  v := V_MOTION;
  doneY := true;
  for i := 0 to high(f) do
  begin
    // move up
    if f[i].y > t[i].y then
    begin
      f[i].y := f[i].y - v;
      if f[i].y < t[i].y then 
        f[i].y := t[i].y;
    end
    // move down
    else if f[i].y < t[i].y then
    begin
      f[i].y := f[i].y + v;
      if f[i].y > t[i].y then
        f[i].y := t[i].y
    end
    else
      f[i].y := t[i].y;
    // save state
    doneY := doneY and (f[i].y = t[i].y);
  end;
end;

// animate text
procedure animate(var f,t: TLetters);
begin
  if goStraight then
  begin
    if not doneX then animX(f,t);
    if not doneY then animY(f,t);
  end else
  begin
    if goSpread then
    begin
      // go vertical first
      if not doneY then 
        animY(f,t)
      else begin
        if not doneX then
          animX(f,t);
      end;
    end else
    begin
      // go horizontal first
      if not doneX then 
        animX(f,t)
      else begin
        if not doneY then
          animY(f,t);
      end;
    end;
  end;
  // state
  done := doneX and doneY;
end;

// print letters on the screen
procedure print(l: TLetters);
var
  i: integer;
begin
  for i := 0 to high(l) do
  begin
    textColor(l[i].c);
    gotoXY(l[i].x,l[i].y);
    write(l[i].l);
  end;
end;

// convert regular text to animated letters
function toLetters(s: string): TLetters;
var
  i: integer;
  l: TLetters;
begin
  setLength(l,length(s));
  for i := 0 to length(s)-1 do
  begin
    l[i].l := s[i+1];
    l[i].x := i+1; 
    l[i].y := 1;
    l[i].c := random(7)+9;
  end;
  toLetters := l;
end;

// remove text footprint
procedure untrace(f,t: TLetters);
var
  i: integer;
begin
  for i := 0 to high(f) do
  begin
    // cover last trace
    textColor(0);
    gotoXY(f[i].x,f[i].y);
    write(f[i].l);
    // show destination
    textColor(8);
    gotoXY(t[i].x,t[i].y);
    write(t[i].l); 
  end;
end;

// copy letter colors
procedure copyCol(var f,t: TLetters);
var
  i: integer;
begin
  for i := 0 to high(f) do
    t[i].c := f[i].c;
end;

// screen setup 
procedure openScreen;
begin
  randomize;
  clrscr;
end;

// screen closing
procedure closeScreen;
begin
  textColor(15);
  clrscr;
end;

{+++ MAIN PROGRAM +++}

var
  f,t: TLetters;
  c: char = #0;
begin
  // setup
  openScreen;
  goSpread := true;
  goStraight := true;
  f := toLetters(THE_TEXT);
  t := toLetters(THE_TEXT);  
  gather(f); // from (origin)
  spread(t); // to (target)

  // animate
  repeat
    print(f);
    delay(D_MOTION);
    untrace(f,t);
    animate(f,t);

    // check done
    if done then
    begin
      print(f);
      
      // switch destination 
      //f := copy(t,0,length(t)); // NOT WORKING!
      copyCol(t,f);  // this is a workaround
      goSpread := not goSpread;
      if goSpread then spread(t)
        else gather(t);

      // freeze for 1 second
      delay(1000);
      
      // reset state
      doneX := false;
      doneY := false;
      done  := false;
    end;

    // switch mode
    if keyPressed then
    begin
      c := readKey;
      if c = #32 then // on 'space'
        goStraight := not goStraight;
    end;

  // until 'enter' or 'esc'
  until (c = #13) or (c = #27);

  // close down
  closeScreen;
end.

Here's how it supposes to work…
licecap record at 1329
as recorded on my Mac terminal just now.

Error

Why this is not working?
picsart_07-16-01 46 21
screenshot_20180716-014337 2

Error on building the project: `google-services.json` not found

I have downloaded the repo and am getting the following error on building the project:

Error:Execution failed for task ':app:processDevDebugGoogleServices'.
> File google-services.json is missing. The Google Services Plugin cannot function without it. 
   Searched Location: 
  /home/noncom/work/src/pascalnide/app/src/dev/debug/google-services.json
  /home/noncom/work/src/pascalnide/app/src/debug/dev/google-services.json
  /home/noncom/work/src/pascalnide/app/src/dev/google-services.json
  /home/noncom/work/src/pascalnide/app/src/debug/google-services.json
  /home/noncom/work/src/pascalnide/app/google-services.json

What is the recommended way to fix it?

nil pointers

Compiling or running this program results in internal error (null pointer ref in the interpreter). The program is valid though.

program list;
type
nodeptr = ^node;
node =
record
i: integer; p: nodeptr;
end;
var
head, tail, p: nodeptr;
i: integer;
begin
new(head);
head^.i := 0;
head^.p := nil;
tail := head;
for i := 1 to 10 do
begin
new(p);
p^.i := i;
p^.p := nil;
tail^.p := p;
tail := p;
end;
p := head;
repeat
writeln(p^.i);
p := p^.p;
until p = nil;
end.

Support other languages?

The IDE looks very neat and promising. What do you think about supporting other languages? There are an existing variety of opensource Java interpreters for other languages like Scheme, JavaScript, Lua... what about providing a way to integrate them with the IDE?

Is it possible with other interpreters? I have looked at the source of Pascal NIDE and I see that the IDE itself is seemingly decoupled from the Pascal interpreter. However, I did not get into how much they rely on each other yet.

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.