Giter Club home page Giter Club logo

qwiktape's Introduction

QwikTape logo by Viral Ghelani

Do calculations, annotate it like you would on a paper "qwikly".

Features

  • Write text, calculations, and annotations with the same ease as you would on paper or in a book.
  • Annotate your calculations to avoid forgetting what they were about.
  • Perform calculations such as addition +, subtraction -, division ÷, multiplication ×, percentage %, and power ^.
  • Create unlimited tapes using + button in tabs bar, switch between tapes using browser like tabs.
  • View/Rename/Delete your saved tapes in the Bookmark menu, use the top left menu to view all tapes.
  • Tapes will auto save, allowing you to pick up right where you left off.
  • The numbers will auto format and auto indented as you type.
  • Numbers are formatted according to your locale.
  • You can define variables and use it in calculations.
  • Hover cursor over variables to check it's value.
  • Customize colors using the settings menu , number of decimals to display and indent length can be changed too.
  • Tape calculation doesn't use operator precedence, the results will be as you would type it on a calculator.
       100.00
+      200.00
×        3.00
═════════════
       900.00
  • Expressions use operator precedence. myvar = 100 + 200 × 3 myvar is 700.
  • All calculations are performed with infinite precision, resulting in highly accurate and reliable results, so 0.1 + 0.2 = 0.3
  • Export your tape as PDF .



EITHER

Download QwikTape from releases,

OR

git clone --recurse-submodules https://github.com/4silvertooth/QwikTape.git

and run

run-win.bat for windows sh run-linux.sh for linux sh run-macosx.sh for macosx

What's in a name?

QwikTape the name is inspired by QuickJs used by Sciter, the engine which powers this application, and Tape which is what it used to be called for such documents.

The logo is inspired by the Rail-Road diagram the QwikTape grammar generates and a calculator.

Chevrotain toolkit to build the parser.

Also inspired by CalcTape, Numi, Soulver, Calca

Keyboard Shortcuts

Windows/Linux MacOs
New Tape Ctrl+T +T
New Tape Ctrl+N +N
Switch Tapes Ctrl+Tab +Tab
Close Tape Ctrl+W +W
Clear Tape ESC * ESC *

*Select Press ESC to clear tape content? from settings to clear tape on pressing ESC.

FAQ

To execute linux binary after downloading use this command.

sudo chmod +x qwiktape

To execute macosx binary use this command.

sudo chmod +x qwiktape
sudo xattr -d com.apple.quarantine qwiktape

Mentions

ilovefreesoftware made a little tutorial to use QwikTape.

Coming up.

  • i18n

Developers

QwikTape uses awesome Sciter SDK for its gui and chevrotain for the parser,

Clone the repo with submodules using,

git clone --recurse-submodules https://github.com/4silvertooth/QwikTape.git

Directory structure,

  • sdk the sciter-js-sdk as a submodule

  • src the source directory of the application

    • assets icons and logos
    • components all the reactor widgets
    • chevrotain the parser toolkit
    • parser the heart of it all
    • storage the database logic
    • main.htm the entry point
  • tests all the tests goes in here

  • run-dev.html for developers to debug and support in making changes.

Start developer mode by using,

run-win.bat -dev for windows

sh run-linux.sh -dev for linux

sh run-macosx.sh -dev for macosx

from the prompt, it will give you developer view of QwikTape with controls to help you make changes. It launches scapp from sciter-js-sdk with run-dev.html in --debug mode. Use inspector to inspect.

Use,

  • Diagram to produce rail-road diagram of the parser grammar.

  • Refresh to refresh the application frame for any changes to css or html.

  • Tests to bring up all the tests, run tests from the toolwindow.

  • Screen Shot to capture the image of the main application.

  • Build to produce final builds.

  • Inspector to open inspector for debugging

  • Help to open sciter sdk documentation



I've build all assets like icons and logos inside src/assets in figma and are licensed under CC.

qwiktape's People

Contributors

4silvertooth 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

qwiktape's Issues

Enhancement - Focus tape first

Hello!
Would be nice to have the focus on the current tape when opening the app, so one can start typing calculations immediately upon opening. As it stand now (v.0.4), I have to hit TAB key 5 times or focus the tape with a mouse click.
Thank you for the portable version and for implementing the ability to use the ESC key!

cmd line option "path to qwiktapes.db"

On Windows it saves "qwiktapes.db" in the user's documents folder, to make it portable (flash drive, cloud drive) an option to pass on the (relative) path to qwiktapes.db would be useful.

qwiktape.exe f:\path-to\qwiktapes.db

Explicit Comment / Escape calculation symbol

This is so brilliant!! Thank you! I've been using CalcTape for years but could not get the changes I'd like to have implemented.

Could we get an explicit comment character for the remainder of a line.

Example

  • Giving a slash or dash will cause a divide or minus
         120.00 IE: 12-31-1900 or 12/31/1900
+       400.00 
══════════════
        520.00

Proposal

  • The hash key or some other key would denote that the rest of the line is a comment.
     120.00 # Interest as of 12/31/2023
+    400.00 # Income from 1-15-2024 to 2/01/2024 
══════════════
     520.00

Thank you for your work on this project!

Dark background

I prefer darkmode and it looks like the background is implemented, outside of:

<Color (editor-paper)>Paper</Color>

being included in settings.js around line 54. I wasn't sure if this was unintentional, but it appears to work well on Windows. Great tool by the way!

Unfortunately does not rund under KDE Neon Wayland

Hi,

I can start it - seeing the Icon in the Taskbar but it does not render any UI.
If I run it from cli I also do not get any error:

./qwiktape
/home/user/Apps/qwiktapes.db /home/user/Documents
tape [object Object]
tape [object Object]

System:

OS: TUXEDO OS 2 x86_64 (KDE Neon base)
Kernel: 6.5.0-10008-tuxedo
Resolution: 2880x1800, 3440x1440
DE: Plasma 5.27.9 (Wayland)
WM: kwin_wayland_wr
KWin version: 5.27.9
Qt Version: 5.15.11
Qt compile version: 5.15.11
XCB compile version: 1.14
Operation Mode: Xwayland

X-Server

Vendor: The X.Org Foundation
Vendor Release: 12201001
Protocol Version/Revision: 11/0
SHAPE: yes; Version: 0x11
RANDR: yes; Version: 0x14
DAMAGE: yes; Version: 0x11
Composite: yes; Version: 0x4
RENDER: yes; Version: 0xb
XFIXES: yes; Version: 0x50
SYNC: yes; Version: 0x31
GLX: yes; Version: 0x0

Options
=======
focusPolicy: 0
xwaylandCrashPolicy: 
xwaylandMaxCrashCount: 3
nextFocusPrefersMouse: false
clickRaise: true
autoRaise: false
autoRaiseInterval: 0
delayFocusInterval: 0
shadeHover: false
shadeHoverInterval: 250
separateScreenFocus: false
activeMouseScreen: false
placement: 
activationDesktopPolicy: 0
focusPolicyIsReasonable: true
borderSnapZone: 10
windowSnapZone: 10
centerSnapZone: 0
snapOnlyWhenOverlapping: false
rollOverDesktops: false
focusStealingPreventionLevel: 2
operationTitlebarDblClick: 5000
operationMaxButtonLeftClick: 5000
operationMaxButtonMiddleClick: 5015
operationMaxButtonRightClick: 5014
commandActiveTitlebar1: 0
commandActiveTitlebar2: 28
commandActiveTitlebar3: 2
commandInactiveTitlebar1: 4
commandInactiveTitlebar2: 28
commandInactiveTitlebar3: 2
commandWindow1: 7
commandWindow2: 8
commandWindow3: 8
commandWindowWheel: 28
commandAll1: 10
commandAll2: 3
commandAll3: 14
keyCmdAllModKey: 16777250
condensedTitle: false
electricBorderMaximize: true
electricBorderTiling: true
electricBorderCornerRatio: 0.25
borderlessMaximizedWindows: false
killPingTimeout: 5000
hideUtilityWindowsForInactive: true
compositingMode: 1
useCompositing: true
hiddenPreviews: 1
glSmoothScale: 2
glStrictBinding: false
glStrictBindingFollowsDriver: true
glPreferBufferSwap: 101
glPlatformInterface: 2
windowsBlockCompositing: true
latencyPolicy: 
renderTimeEstimator: 
allowTearing: true
Screen 0:
---------
Name: eDP-1
Enabled: 1
Geometry: 3440,120,1920x1200
Scale: 1.5
Refresh Rate: 90000
Adaptive Sync: incapable
Screen 1:
---------
Name: DP-4
Enabled: 1
Geometry: 0,0,3440x1440
Scale: 1
Refresh Rate: 100000
Adaptive Sync: incapable

If there is anything I can provide please let me know.

Cool idea. Dies a horrible death under Wayland

Cloned the repository and chmod +x run-linux.sh, then ran it....

(scapp:3787030): Gdk-CRITICAL **: 14:47:43.381: gdk_wayland_window_set_dbus_properties_libgtk_only: assertion 'GDK_IS_WAYLAND_WINDOW (window)' failed
root [object Object]
tape [object Object]
tape [object Object]

(scapp:3787030): Gdk-WARNING **: 14:47:44.781: ../../../../../gdk/x11/gdkwindow-x11.c:5653 drawable is not a native X11 window
Segmentation fault (core dumped)

Running on Ubuntu 22.04 Gnome on Wayland

pdf export not work, and no error

no pdf is generated, and no error reported.

if in debug mode, it says that PDF is null

function toPdf(val, fileName){    
    console.log('PDF type = object ? ', typeof PDF === 'object');
    console.log('PDF == null ? ',  PDF === null);
    ...
    PDF.newDoc();
    ...}

PDF type = object ? true
PDF == null ? true
TypeError: cannot read property 'newDoc' of null
at toPdf pdf.js

using qwiktape-v0.6-windows-portable.zip on win10 19044

"Word Wrap" option

Good Day!
Could you please add "Word Wrap" option in QwikTape?
Can't tell for other users, but in the version I have tested (version 0.6 portable, Windows 10) a chunk of copied text just can't fit into the window. Usually the problem like this is tackled via "Word Wrap" implementation. Please see the screenshot with the issue.
wordw20231104

Editor freezes when using long variable names

Hey, I've been using CalcTape on my phone for a while and was looking for something similar to use on my desktop, and stumbled upon QwikTape. Seeing that CalcTape was one of the inspirations, it's exactly what I was looking for! The variable assigning in results is quite handy. So here's a brief story of my first experience:

Today I went grocery shopping with my mom and sister and I was paying, but we're splitting the bill, so I used a couple variables to see the total of stuff for each of us and also check it against my bank balance to see if I'll still make ends meet. In this process, I was using descriptive variable names like sister_total, mom_total, house_total, and also doing compound calculations (e.g. foo / bar = baz / qux = foobar), until suddently QwikTape froze on me.

Here is a small snippet that triggers it (but doesn't freeze completely):

fee_fo_fum_fam_foo_bar_baz_qux_leeroy_jenkins = 100

Do any operation with the variable below to trigger a freeze:

fee_fo_fum_fam_foo_bar_baz_qux_leeroy_jenkins

This is an exaggeration of course, the variables I was using weren't that long, but using them together had the same effect as using a single long one, and the more calculations you have the longer it freezes. It seems that long variables break the document evaluation to such a degree that changing the variable value doesn't even update the calculation anymore. This happens in the latest release and also in the latest commit. A workround is just to use small/single character variables, but that makes things less readable.

Here's the stack trace (from the latest commit):

InternalError: stack overflow
    at tg (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at cg (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at pT (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at Mb (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at dM (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at s (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at apply (native)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at ALT (file:///home/manokara/Downloads/QwikTape/src/parser/tape-embedded.js)
    at call (native)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/parser/tape-embedded.js:742)
    at apply (native)
    at s (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at apply (native)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at ALT (file:///home/manokara/Downloads/QwikTape/src/parser/tape-embedded.js)
    at call (native)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/parser/tape-embedded.js:655)
    at apply (native)
    at s (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at apply (native)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/parser/tape-embedded.js:639)
    at apply (native)
    at s (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at apply (native)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/parser/tape-embedded.js:614)
    at apply (native)
    at s (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at apply (native)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/parser/tape-embedded.js:601)
    at apply (native)
    at s (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at apply (native)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/parser/tape-embedded.js:594)
    at apply (native)
    at s (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at apply (native)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/parser/tape-embedded.js:576)
    at apply (native)
    at s (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at apply (native)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at ALT (file:///home/manokara/Downloads/QwikTape/src/parser/tape-embedded.js)
    at call (native)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/parser/tape-embedded.js:247)
    at apply (native)
    at s (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at apply (native)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/parser/tape-embedded.js:232)
    at call (native)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at <anonymous> (file:///home/manokara/Downloads/QwikTape/src/parser/tape-embedded.js:234)
    at apply (native)
    at s (file:///home/manokara/Downloads/QwikTape/src/chevrotain/chevrotain.min.js)
    at parseTape (file:///home/manokara/Downloads/QwikTape/src/components/editor.js:153)
    at evalTokens (file:///home/manokara/Downloads/QwikTape/src/components/editor.js:186)
// The line above repeats around 380 times!
    at on ^change at :root (file:///home/manokara/Downloads/QwikTape/src/components/editor.js:454)

Looking at the stack trace and with my limited understarding of the source code, it's almost as if it's considering each character in the editor as a token, causing a stack overflow.

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.