Coder Social home page Coder Social logo

ron89 / thesaurus_query.vim Goto Github PK

View Code? Open in Web Editor NEW
217.0 217.0 23.0 307 KB

Multi-language Thesaurus Query and Replacement plugin for Vim/NeoVim

Home Page: http://www.vim.org/scripts/script.php?script_id=5341

License: Apache License 2.0

Python 80.27% Vim Script 19.73%
language python synonyms thesaurus thesaurus-query vim

thesaurus_query.vim's People

Contributors

deathmaz avatar gitter-badger avatar idbrii avatar jceb avatar jrasmusbm avatar manwholikespie avatar perelo avatar ron89 avatar rwilhelm avatar unphased 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

thesaurus_query.vim's Issues

No synonyms found

Hello I installed the plugin on VIM. I have a working internet connection, I have all the backends in enabled_backends, all the post-installation defaults ... but when I search a for a word either by the cursor or specifically, I get No synonym found for "WORD". I've tried with several correct english words.

I've installed the plugin via Vundle. I'm using Bash on Ubuntu (WSL).

Error when choosing empty synonym

If the user decides not to change a synonym, you get "Invalid Input! Ending synonym replacing session without making changes." I believe this is just a simple spacing issue. If you press backspace and enter, it works as it should.

Issue when activate Synonym group truncate

Hi, everyone. There is error message when I was trying to limit the synonym group. It happens when the word has many synonym for example 'place'. Alhoutgh it limited the word correctly and showed the correct result but it also showed red background error message. The error message unable to continue or pick the words.
The syntax I put in my vimrc that make it error is this, no matter I changes the number. let g:tq_truncation_on_definition_num = 3 .

Thanks.

Screen Shot 2022-09-14 at 06 15 54

make openoffice_en backend works for other language

I tried to use the openoffice_en backend in french by using the files provided by libreoffice. It works but I need to keep the 'en' in tq_language list:

with this configuration, only online thesaurus are used

let g:tq_language=['fr']
let g:tq_openoffice_en_file="/usr/share/mythes/th_fr_FR_v2"
let g:tq_enabled_backends=["openoffice_en",  "cnrtl_fr", "synonymo_fr"]

a workaround is to add 'en' the the language list and only french backend
both libreoffice and online thesaurus are workings

let g:tq_language=['en', 'fr']
let g:tq_openoffice_en_file="/usr/share/mythes/th_fr_FR_v2"
let g:tq_enabled_backends=["openoffice_en",  "cnrtl_fr", "synonymo_fr"]

but it become complicate if I want to have english and french backend activated and switch language by modifying tq_language option.
where I have to change, the language, the openoffice_file and the backend options. I tried

let b:myLang==0
function! ToggleThesaurus()
    if b:myLang==0
        let g:tq_language=['en', 'fr']
        let g:tq_openoffice_en_file="/usr/share/mythes/th_fr_FR_v2"
        let g:tq_enabled_backends=["openoffice_en", "cnrtl_fr", "synonymo_fr"]
        b:gyLang=1
    else
        let g:tq_language=['en']
        let g:tq_openoffice_en_file="/usr/share/mythes/th_en_US_v2"
        let g:tq_enabled_backends=["openoffice_en", "mthesaur_txt", "datamuse_com"]
        b:gyLang=0
    endif
endfunction

but if the switch works for the libreoffice thesaurus, the plugin only use the first backend list.
In this example, I am able to use the three french thesaurus backend but switching to english use only openoffice_en one.
If I enable all backend before the function, in french, I'll get answer from all backend in french and in english.

highlighting word group in mthesaur.txt that can be replaced

@Ron89 outstanding plugin. here is what I was looking into doing: say I have bult an mthesaur.txt where I have the expression "very important" which I set as a synonym for "critical"

The problem is that I will forget that the expression "very important" is under mthesaur.txt and so I would be unlikely to visually select both words while searching for a synonym. Question then is: any suggestions on how I could enhance the plugin to underline expressions present in mthesaur.txt with more than one word? This would allow me to know that these expressions are potentially replaceable.

<Leader> cs + ^C ---> raise vim error

It is widely used to press ^C (Ctrl+C) for cancellation any command in VIM. When you use ^C during thesaurus_query it is raising following error.

Error detected while processing function thesaurus_query#Thesaurus_Query_Lookup:
line   22:
Traceback (most recent call last):
  File "<string>", line 7, in <module>
  File "/home/user/.vim/plugged/thesaurus_query.vim/autoload/thesaurus_query/thesaurus_que
ry.py", line 192, in tq_replace_cursor_word_from_candidates
    thesaurus_user_choice = vim.eval("input('Type number and <Enter> (empty cancels): ')")
KeyboardInterrupt

Design tests for Python modules

Design test for the backend handler and the backends would speed up the future development for both. It is a good to have feature given time to develop it. The difficult part is to write a Vim emulator to run the tests upon.

Is the lookup in mthesaur all words in the line or only first?

When the plugin searches for synonyms it returns the first line which contains the word that is queried (see snippet).

The way I understood the format of mthesaur is that the "root" word is the first word of the line, so shouldn't this line then be changed to:

if word == synonym_list[0]:

The reason I'm posing the question is that I seem to get a lot of "bad" synonyms when I query a word, normally because the word appears in a synonym list of another word where the link is debatable.

Error During & After Updating [Cause by Repo Trimming on github]

Users installed before March 8th, when performing update with your plugin manager might encounter problem with this plugin. And the error could even prevent user from using it after performing the update. This is due to the trimming I was doing to the plugin. It messed up with the commit-id, thus rendering some of the plugin managers confused.

To resolve this,

cd ~/.vim/[Your_Plugin_Manager_Folder]/
rm -rf thesaurus_query.vim

Then open vim, use your plugin manager to install it again.

I am terribly sorry for the toubles caused. I was trying to reduce the repo's
size by removing the screenshots. I didn't expect it to behave like this. I
shall refrain from such actions in the future.

Interactively cycle through backends for a definition

When I tested the OpenOffice backend I noticed that it is much better at finding close synonyms but that it doesn't have the richness and variety of 'mthesaur_txt'. Using both backends is useful:

  • OpenOffice for common words
  • Mthesaur for larger range of words

Is there a way to cycle through the backends to see how they deal with a word?

If there's not, I would like to be able to do something like this:

a. Hit cs to look up a word e.g "melee"
b. Hit to change from the OpenOffice backend to mthesaur and then to thesaurus_com, or whatever is defined in my backend list

[question] Python support for neovim lua windows

Hello there, I am using neovim with lua in windows. When I want to query the synonym cs, an error message showed up. The error said thesaurus.. framework requires vim with python support. My response are installed python from its website and also from scoop. This resulted nothing, could you explain what is the fault here.

Another response of mine: reinstall neovim before installed python using scoop. I have searched how to install neovim with pyhton support but I could not follow it along. Much appreciated.

Thank you!

Yeah, it's not a bug report or a feature request. There's no "like" button on github so i have to do this the old fashioned way.

Thank you for an awesome plugin, that is incredibly useful and has become a daily driver for me! I'm recommending it here and there.

I suppose "keep developing this, and keep being awesome" would be the feature request.

Add auto-install mechanism for local backends

No one like a Long read before using a simple thesaurus query. So instead of posting where to find those blasted source files, it's better just download the thesaurus source on-demand when it is not available at indicated location.

AttributeError: module 'vim' has no attribute 'find_module' (python 3.7)

Probably after upgrading my Arch Linux system to python 3.7, thesaurus_query stopped working. I get the following errors:

Error detected while processing /home/stammler/.vim/bundle/thesaurus_query.vim/autoload/thesaurus_query.vim:
line  214:
Traceback (most recent call last):
  File "<string>", line 9, in <module>
  File "/home/stammler/.vim/bundle/thesaurus_query.vim/autoload/thesaurus_query/thesaurus_query.py", line 17, in <module>
    from . import backends as tq_backends
  File "/home/stammler/.vim/bundle/thesaurus_query.vim/autoload/thesaurus_query/backends/__init__.py", line 10, in <module>
    from . import *
  File "/home/stammler/.vim/bundle/thesaurus_query.vim/autoload/thesaurus_query/backends/thesaurus_com_lookup.py", line 27, i
n <module>
    import pkg_resources
  File "/usr/lib/python3.7/site-packages/pkg_resources/__init__.py", line 3112, in <module>
    @_call_aside
  File "/usr/lib/python3.7/site-packages/pkg_resources/__init__.py", line 3096, in _call_aside
    f(*args, **kwargs)
  File "/usr/lib/python3.7/site-packages/pkg_resources/__init__.py", line 3140, in _initialize_master_working_set
    for dist in working_set
  File "/usr/lib/python3.7/site-packages/pkg_resources/__init__.py", line 3140, in <genexpr>
    for dist in working_set
  File "/usr/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2647, in activate
    declare_namespace(pkg)
  File "/usr/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2184, in declare_namespace
    _handle_ns(packageName, path_item)
  File "/usr/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2101, in _handle_ns
    loader = importer.find_module(packageName)
AttributeError: module 'vim' has no attribute 'find_module'
Error detected while processing function thesaurus_query#Thesaurus_Query_Init:
line    1:
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'tq_interface' is not defined
Error detected while processing function thesaurus_query#Thesaurus_Query_Lookup:
line   40:
Traceback (most recent call last):
  File "<string>", line 2, in <module>
NameError: name 'tq_framework' is not defined
line   44:
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'tq_synonym_result' is not defined 

Up-to-date Arch Linux, python 3.7.0, vim 8.1
It seems that other projects have similar problems, e.g., python-mode/python-mode#937

apply the word replacement as a Vim action so that it can be repeated with .

Common workflow might be to replace a word with another word, for all or many instances of the original word. This would be made expedient by searching the original word and using the . to perform the replacement, so having thesaurus_query apply the change be an actual vim action would facilitate that!

bs4 dependency install request for disabled backend

Using the plugin in neovim works great, however all my configuration efforts do not seem to avoid the following error to spawn on every new session (which is quite annoying):

Required package bs4 can not be imported. Please use '/usr/bin/python3 -m pip install bs4 --user --upgrade' to install the latest bs4.
 Do you want to try to import it again?
[Y]es, (D)isable 'cnrtl_fr' backend for this Vim session:

I do not plan on using this backend ever and I do not want to install the dependency. My config does not enable the cnrtl_fr package, yet it asks for its dependency:

let g:tq_enabled_backends=[ "openoffice_en",
            \"openoffice_de",
            \"datamuse_com",
            \"openthesaurus_de",
            \"mthesaur_txt",] 
let g:tq_language=['en', 'de']

When I echo the variables in vim they are correctly set. Their content seems to but are ignored? How can I avoid this behaviour? Is this a configuration issue?

Nevertheless: Great plugin, really useful to me. Thanks!

Further information on my setup:

$ nvim --version
NVIM v0.4.2
Build type: Release
LuaJIT 2.0.5
Compilation: /usr/bin/cc -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -O2 -DNDEBUG -DMIN_LOG_LEVEL=3 -Wall -Wextra -pedantic -Wno-unused-parameter -Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion -Wmissing-prototypes -Wimplicit-fallthrough -Wvla -fstack-protector-strong -fdiagnostics-color=always -DINCLUDE_GENERATED_DECLARATIONS -D_GNU_SOURCE -DNVIM_MSGPACK_HAS_FLOAT32 -DNVIM_UNIBI_HAS_VAR_FROM -I/build/neovim/src/build/config -I/build/neovim/src/neovim-0.4.2/src -I/usr/include -I/build/neovim/src/build/src/nvim/auto -I/build/neovim/src/build/include
Compiled by builduser

Features: +acl +iconv +tui
See ":help feature-compile"

   system vimrc file: "$VIM/sysinit.vim"
  fall-back for $VIM: "/usr/share/nvim"
$ uname -a
Linux 5.3.8-arch1-1 #1 SMP PREEMPT @1572357769 x86_64 GNU/Linux

cilin_txt backend cannot work

I downloaded "cilin.txt" from shijiebei2009/Algorithms , and make sure that cilin.txt is utf-8 encoded. But the plugin still do not function correctly with the file.

GIF Demo

cilin error

My .vimrc setting:

let g:tq_openoffice_en_file=$HOME . "/.vim/thesaurus/MyThes-1.0/th_en_US_new"
let g:tq_mthesaur_file=$HOME . "/.vim/thesaurus/mthesaur.txt"
let g:tq_cilin_txt_file=$HOME . "/.vim/thesaurus/cilin.txt"
let g:tq_enabled_backends=["thesaurus_com","openoffice_en","mthesaur_txt","datamuse_com","cilin_txt"]
let g:tq_language=['en', 'cn']

Other backends is working well.

Natural language processing for replacement candidate

When query thesaurus.com for word under cursor, the synonym candidates in query result would all be in their original form. This is not ideal since more often than not the words under cursor are not in such form. And users may have to manually change the form of the synonyms they just chose from the list. It sort of defeats the purpose of having a choosing function in the first place.

I am thinking of using Python's NLTK library to change the candidates' form automatically, but that could add more dependencies which could be intrusive or confusing to some users.

Thoughts?

Bad var name g:tq_yarn-synsets_file

Having this line in neovim config
let g:tq_yarn-synsets_file = "~/.config/nvim/thesaurus/yarn-synsets.csv"
causing following errors:

E121: Undefined variable: g:tq_yarn
E488: Trailing characters
Press ENTER or type command to continue

Maybe it worth rename g:tq_yarn-synsets_file to g:tq_yarn_synsets_file?
There is no problems with g:tq_mthesaur_file for example.

Multiple thesaurus files

Hello, I arrived here via the Stackoverflow conversation. As I said there, I'm interested in using other sources for the thesaurus file. If anyone who reads this knows of a good one that is available with a CC or copyleft license, please let me know. I can certainly work on formatting it and getting it ready for use with this (or another) vim plugin.

woxikon.de changed Design

Because woxikon.de changed their design, the backend isn't working anymore. This needs fixing, or maybe we should switch to an api supported backend for german language, see #15.

NameError with neovim and lua plugin managers

Hello Ron and thanks for your plugin.

I use it a lot when I'm writing prose and it worked very well with neovim up to v0.6.1

I was using both packer and paq-nvim as my plugin managers and from now on, even if the plugin is loaded I have an error buffer saying it can not find tq_interface. (NameError: can't find xxx module)

What is funny is that when I tried to replace those plugin managers with 'vim-plug' (my init.lua was untouched beside this change) thesaurus_query works as expected.

Tested and reproduced on Termux, Alpine and OpenBSD.

I'm around if you need more informations.

Justin

Support for native vim auto-complete and mappings (eg ^X - ^T)

There is native vim support for thesaurus:

'thesaurus' 'tsr' string (default "")
global or local to buffer global-local
List of file names, separated by commas, that are used to lookup words
for thesaurus completion commands i_CTRL-X_CTRL-T. Each line in
the file should contain words with similar meaning, separated by
non-keyword characters (white space is preferred). Maximum line
length is 510 bytes.

It would be great for that plugin to replace that functionality. Because sometimes it much better for speed and convenience to have autocomplete list.

ThesaurusQueryReplaceCurrentWord not able to finish it's work

After firing ThesaurusQueryReplaceCurrentWord nothing happens. nvim gets unresponsive and the cpu fan spins up. There is no other way than to kill nvim. Can I provide any logs?

This is my configuration:

Plug 'ron89/thesaurus_query.vim'
let g:tq_language = ['de', 'en']
let g:tq_online_backends_timeout = 0.4
let g:tq_enabled_backends=["woxikon_de","openthesaurus_de","thesaurus_com"]
let g:tq_map_keys=0
nnoremap <Leader>S :ThesaurusQueryReplaceCurrentWord<CR>
vnoremap <Leader>S y:ThesaurusQueryReplace <C-r>"<CR>

thesaurus python package is installed.

Provide completion function for emerging 'thesaurusfunc'

I have filed vim/vim#8950 and awesome @yegappan suggested POC implementation in yegappan/vim@949c4f2 Now, in order to test this, I would need a function following API of https://vimhelp.org/insert.txt.html#complete-functions generating a list of synonyms. Would it be possible for your plugin to add such function, which could be used as a value of 'thesaurusfunc' (same API as for 'completefunc' and 'omnifunc').

I hope it would be also help with your issue #7.

Cc: @reedes and @alem0lars from https://github.com/preservim/vim-lexical

Cross-posted with preservim/vim-lexical#19

mapping already exists for <leader>cs

I've set:

nnoremap <leader>ct :ThesaurusQueryReplaceCurrentWord<CR>
vnoremap <leader>ct y:ThesaurusQueryReplace <C-r>"<CR>

in my .vimrc file. But I get the above error when running vim.

I even tried this:

nnoremap <leader>ct :ThesaurusQueryReplaceCurrentWord<CR>
vnoremap <leader>ct "ky:ThesaurusQueryReplace <C-r>k<CR>
nnoremap <leader>ct :ThesaurusQueryReplaceCurrentWord<CR>
vnoremap <leader>ct "ky:ThesaurusQueryReplace <C-r>k<CR>

or other scenarios. I only be able to fix this problem with changing the same definitions in the ~/.vim/plugged/thesaurus_query.vim/plugin/thesaurus_query.vim file which is not a robust fix.

if g:tq_map_keys
    nnoremap <unique><silent> <Leader>ct :ThesaurusQueryReplaceCurrentWord<CR>
    vnoremap <unique><silent> <Leader>ct "ky:ThesaurusQueryReplace <C-r>k<CR>
    nnoremap <silent> <LocalLeader>ct :ThesaurusQueryReplaceCurrentWord<CR>
    vnoremap <silent> <LocalLeader>ct "ky:ThesaurusQueryReplace <C-r>k<CR>
endif

I'm using vim-8.0.1176-1

Add a backend for thesaurus.plus

Hello, quite an awesome plugin you have here. I observed that thesaurus.com provides a list of antonyms, so let's add support for them also. Maybe even create a new binding to quickly access antonyms for the specified word.

Sincerely

mapping already exists

Full error description:

Error detected while processing $HOME/.config/nvim/plugged/thesaurus_query.vim/plugin/thesaurus_query.vim:
line 47:
E227: mapping already exists for ,cs

Solution:
just comment the problematic lines in :

thesaurus_query.vim/plugin/thesaurus_query.vim

lines 47,48

Add wiktionary as backend

There is Wiktionary:

It is a multilingual, web-based project to create a free content dictionary of all words in all languages. It is available in 172 languages and in Simple English. Because Wiktionary is not limited by print space considerations, most of Wiktionary's language editions provide definitions and translations of words from many languages, and some editions offer additional information typically found in thesauri and lexicons.

In that case it will be support for 172 languages. I'm not sure about quality, but it can be better for Russian because jerk.ru isn't perfect (especially for verbs...).

For my setup this plugin replaces the wrong word.

Depending on the length of the file the plugin replaces a word further above on the file, and certainly not the exact word that is under the cursor.

Since I'm not looking to sacrifice any of my other configuration or plugins at all, I would like to ask for debugging steps and general guidance on how this plugin implements the finding and replacing.

Thanks

Add support for neovim's `vim.ui.select()`

Neovim provides a lua function vim.ui.select() that can be used by plugins to ask the user to select one of several entries. Other plugins can than overwrite this function and provide the user with nice and fancy picker/select interfaces. The idea is that plugins like thesaurus_query need not bother implementing their own user interaction just to select an entry and advanced plugins like telescope can take care of the interface.

I know thesaurus_query also supports Vim so this would not rid you of the need to write your own select interface but you could leavage the advantage of this neovim interface.

Is this a feasible feature request?

Any plans for a plugin to look up online dictionaries?

Thanks for a superb plugin! I just recently discovered this plugin when I was browsing the web looking for something I can use while thinking and writing on PC. Looking up dictionaries and searching for the right word sometimes gives us not only fun but insights. The list of synonyms collected from Thesaurus.com seems quite usable and best suited for most purposes.

I am kind of a newbie to vim (using Emacs most of the time) but I got interested in this plugin when I had just a look at it. So just out of curiosity, let me ask you if you happen to have any plans for a plugin to look up online dictionaries like Dictionary.com? Thanks.

Buffer with this name already exists

after closing a Thesaurus query window with 'q' trying to run the query again for the same word results in

Error detected while processing function thesaurus_query#Thesaurus_Query_Lookup:
line 49:
Traceback (most recent call last):
File "", line 1, in
File "/home/eligon/.vim/bundle/thesaurus_query.vim/autoload/thesaurus_query/thesaurus_query.py", line 380, in tq_generate_thesaurus_buffer
vim_command('exec ":silent file thesaurus:\\ " . l:word_fname . "\\ (press\\ q\\ to\\ close\\ this\\ split.)"')
File "/home/eligon/.vim/bundle/thesaurus_query.vim/autoload/thesaurus_query/tq_common_lib.py", line 120, in vim_command
vim.command(command)
vim.error: Vim(file):E95: Buffer with this name already exists

New Thesaurus source: YARN -- WordNet-like machine-readable thesaurus for the Russian language

There is a crowdsourcing project: https://russianword.net/en/

Quotation:

The Yet Another RussNet (YARN) project was initiated in 2013 and aims at creating a large open WordNet-like machine-readable thesaurus for the Russian language through crowdsourcing. The project objectives include creating the thesaurus, developing free and libré open source software to operate with it, designing the necessary data schemes and models, writing technical and user documentation. The thesaurus is available under the CC BY-SA license.

There is a public HTTP API (unfortunately documentation I've found only in Russian): https://nlpub.ru/YARN/API

Google translate of that documentation (which is quite readable): https://translate.google.com/translate?hl=ru&sl=ru&tl=en&u=https%3A%2F%2Fnlpub.ru%2FYARN%2FAPI

It should be very good and stable solution for Russian language.

About Default Truncation Condition

Hey guys,

Thanks for take interests in this plugin.

As described in README.md, currently I have designed 2 ways to truncate
candidate list for synonym replacing interface, in case the result list of the
query gets too overwhelmingly long. But I don't know what default value to set
is proper. So if you happen to find this truncation feature useful, after some
trial and error, could you send me the variable set you find most satisfying
with?

In later versions, I'll use your feedback to set a proper default for
truncations, or consider creating new truncation routines.

Thanks again for your interests.
Chong

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.