twitter-together / action Goto Github PK
View Code? Open in Web Editor NEW:bird: A GitHub action to tweet from a repository
Home Page: https://github.com/marketplace/actions/twitter-together
License: MIT License
:bird: A GitHub action to tweet from a repository
Home Page: https://github.com/marketplace/actions/twitter-together
License: MIT License
Avoid loading huuuge diffs for pull requests that don’t create a new tweet file
What’s missing?
Split from #166/#177, add support for using ^ filename
within the body of a tweet to attach media, as an alternative to frontmatter.
Why?
We already have support for () option
syntax in the body for polls, it'd be nice to make media attachments similarly simple to use via the ^
syntax.
Alternatives you tried
Media can currently be attached to a tweet via frontmatter.
What’s missing?
Manage tweeting of multiple (more than one) twitter account.
Why?
This GitHub Actions seems can manage tweets only one specific twitter account.
In my use case, I want to update two twitter accounts because it is separated as English and Japanese.
Manage multiple twitter account is already possible to create multiple GitHub repositories, but that's a pain...
So I want to manage multiple twitter account in one GitHub repository!
My idea is below:
It is complex and waste to support multiple accounts settings in one twitter-together.yml
file, I think.
If we can add optional settings fields that specify any directory,
We can manage multiple twitter accounts by just put multiple twitter-together.yml
file, like:
twitter-together-ja.yml
twitter-together-en.yml
...
steps:
- name: checkout master
uses: actions/checkout@v2
- name: Tweet
uses: gr2m/[email protected]
with:
tweets-dir: tweets-ja
env:
...
Alternatives you tried
I haven't tried anything yet.
What happened?
The default tweets/README.md
file throws a 404 page not found error when the Create New Tweet button in it is pressed.
Repro:
tweets/README.md
in your repoWhat did you expect to happen?
I would expect the page to show the GitHub file composer ready for me to write a new tweet.
What the problem might be
The problem lies in fetching the file for the setup PR from this repo:
https://github.com/gr2m/twitter-together/blob/4fabe65750bfc7eda4b15b5fe9d9e5f52652b572/lib/push/setup.js#L35-L47
This repo's tweets/README.md
file defaults to referring to the master branch instead of the main branch.
Resolution
This issue could be resolved by developers manually changing the files as is necessary during setup to refer to the correct branch.
In the long term, renaming this repo's default branch from master
to main
alongside documentation/readme changes would help resolve this issue.
If someone wants me to file a PR to make those documentation/readme changes, I would be more than happy to make them, although it would probably break the workflow on this repo if this repo's default branch is not renamed (because this repo's copy of tweets/README.md
would have to be modified).
13.1.9
to 13.1.10
.This version is covered by your current version range and after updating it in your project the build failed.
tap is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.
The new version differs by 5 commits.
6dc593a
13.1.10
a9bd8f3
Apply test-regex against unix-ified paths
8e0a712
Add fastify-vhost to the 100 club
50aa89c
use git push --follow-tags instead of 2 git commands
de3882a
document t.expectUncaughtException
See the full diff
There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.
Your Greenkeeper Bot 🌴
Ideally on the pull request if there is one so that that all collaborators get notified, otherwise on the last commit of the push
Hi!
As usual, thanks for this action. I expect a lot of use from it.
I was looking to see how to reply to tweets. Is the semantics include the URL, or ...? Perhaps this is obvious to someone who uses twitter a lot, but that's not me... and if it is supported, I can't find the documentation of it in this repo.
Thanks!
What’s missing?
I have had to set up several repos using this, I made some template and copied it. Would be useful to allow people to jump into this almost immediately.
Why?
Doing the same thing over and over again is boring.
Alternatives you tried
nothing
Instead, I made a template repository here: https://github.com/rkdarst/twitter-together-template/
I'll develop it over time, but would you like to take it into your namespace as the upstream? the "template repository" github feature could be useful as a way to deploy this. It has some opinions included in it but could be useful anyway... Also it's still under development as I see what works best for us.
follow up to #203
Make sure that dist/index.js
is always updated in main
before semantic-release
is run. And then use https://github.com/gr2m/semantic-release-plugin-github-breaking-version-tag to create/update a release tag, then push back the changes with https://github.com/semantic-release/git. Remove the release branches, and replace them with tags
This is a follow up to #92 /cc @matchai
What’s missing?
The goal of twitter-together
is to encourage and enable editorial contributions to projects build around GitHub repositories. The first step was to use github.com's UI to make that possible, by creating *.tweet
files in a dedicated repository.
What's missing is a custom UI tailored to the workflow of submitting a tweet to a project's shared twitter account.
Why?
The challenge of depending on GitHub's UI is that editorial contributors might not be familiar with GitHub and it's pull request workflows. The high learning curve only to submit a tweet might prevent people from contributing which goes against the point why I created twitter-together
in the first place.
Alternatives you tried
Educate interested contributors in how to use github.com and provide a lot of documentation.
As the usage of this action grows, I think it would be better to rename the name of the action.
Twitter's terms and conditions for developers state in 4. Use of Twitter Marks.
:
The Twitter Marks may not be included in or as part of your registered corporate name, any of your logos, or any of your service or product names. Moreover, you may not create any derivative works of the Twitter Marks or use the Twitter Marks in a manner that creates or reasonably implies an inaccurate sense of endorsement, sponsorship, or association with Twitter.
I guess better to change both the name and the logo sooner than later.
Hello.
I am applying the twitter-together you made to my repertoire.
But I think the application went well, but there is one problem.
The action does not seem to recognize the tweets directory. Did I do anything wrong?
Thank you.
What’s missing?
This is a follow up to processing/p5.js#3893 (comment)
Why?
@stalgiag suggested to automate the process of creating twitter polls to generate discussions. Adding that feature to twitter-together will also allow everyone to contribute a twitter poll
Alternatives you tried
Manually creating a pull using twitter.com or one of the apps.
I think the current state is good enough. Write integration tests, then refactor code and add some more comments for clarifications on how things work
I really like this idea of this bot. This sounds like a really nice approach. I can't believe something like this isn't available directly from Twitter, but I could certainly see this as useful for the user group that I co-lead.
What’s missing?
The first thing that comes to mind (mostly because I haven't found the time to solve it in another way yet) is scheduled tweets. Is that even possible with an action like this?
Why?
the process of reviewing a PR as a team lends itself nicely to planning ahead about what will be tweeted. when planning that far ahead, merging immediately may be earlier than you actually want the tweet to go out. remembering to merge later could mean missing the window that you want to target.
Alternatives you tried
i've considered buffer, but the free tier is limited to a single user, so we're left with the same limitation of a shared account
What’s missing?
Split from #166 -- When attaching media to a tweet currently, it is expected that the filename will be located within the media
directory in the repository. Support for absolute URLs would be a great addition to media attachments, allowing for folks to do url: https://media2.giphy.com/media/vFKqnCdLPNOKc/giphy.gif
instead of file: cat.gif
Why?
Improving the usability of attaching media for folks that don't want to start version controlling every item of media that is sent out in a tweet, or want to avoid having to make copies of existing online media in their repository to tweet it.
Alternatives you tried
Frontmatter media already supports local files using file: cat.gif
with cat.gif
being in the media
directory.
What’s missing?
Signing up for a Twitter Developer Account (TDA) requires that an email address is associated with a Twitter account. This is not mentioned in the docs nor it's mentioned in the TDA application. You find out that you need it only when you get to the end, at which point you need to go and add an email address to your account, and then restart the application.
Why?
Mentioning upfront in the docs that you need an email address associated with the account would save you from doing the application twice.
Alternatives you tried
n/a
Suggestion
In Apply for a Developer Account section, the first paragraph says:
You might be asked to add a phone number to your twitter account before proceeding. If the phone number is used in another account, it won’t let you use it again. But you can remove the phone number from the other account. You can change it back once your developer account was approved.
it would be helpful to add a sentence like this or similar, to the end of the paragraph:
Your Twitter account will also need to be associated with an email address. If it isn't yet, do that first.
Would you like a PR?
What happened?
Twitter updated the process of creating a Twitter App. We need to update our docs and the screenshots in them
I'd very much appreciate help with that
What’s missing?
I'd like to add the ability to do threads. Threads will follow the format of: https://getchirrapp.com, where the format of a .tweet
file is:
Contents of tweet 1, which must have 280 characters.
[...]
Each tweet is delimited by:
- the start/end of a file
- `[...]`
[...]
The start and end of the tweet is also stripped of whitespace.
Why?
I want to tweet threads and I can't do it right now.
Alternatives you tried
None. I can attempt to write the code for this later, but I want to have agreement first.
When handling the push
event, check if the tweets
folder exists. If it does not, create a pull request adding the tweets/README.md
file based on the tweets/README.md
in this repository
What’s missing?
atm I need to lookup the github action logs to find out about errors of the action.
thats a unnecessary hurdle for use.
Why?
it would be awesome this action would just use github annotations - see a live example at https://github.com/staabm/gh-annotation-example/pull/1/files - so the actual errors get shown in the Pull Requests
its a pretty simple format you need to use, so github actions will automatically turn errors/infos/warnings into annotations.
example:
Alternatives you tried
none.
What happened?
We tried setting this up over at coderefinery/coderefinery-twitter. When the PR is merged, we get this error message from the action:
(node:2866) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'message' of undefined
Running twitter-together version 0.0.0-development
at /home/runner/work/_actions/gr2m/twitter-together/v1.x/dist/index.js:25821:56
Tweeting: If you are getting this message, CodeRefinery has set up tweet-by git using Github Actions!
at Array.map (<anonymous>)
at handlePush (/home/runner/work/_actions/gr2m/twitter-together/v1.x/dist/index.js:25821:37)
https://github.com/gr2m/twitter-together
at processTicksAndRejections (internal/process/task_queues.js:93:5)
(node:2866) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:2866) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
error
Error: HTTP Error: 401 Authorization Required
at Request._callback (/home/runner/work/_actions/gr2m/twitter-together/v1.x/dist/index.js:41822:9)
at Request.self.callback (/home/runner/work/_actions/gr2m/twitter-together/v1.x/dist/index.js:19751:22)
at Request.emit (events.js:210:5)
at Request.<anonymous> (/home/runner/work/_actions/gr2m/twitter-together/v1.x/dist/index.js:20727:10)
at Request.emit (events.js:210:5)
at IncomingMessage.<anonymous> (/home/runner/work/_actions/gr2m/twitter-together/v1.x/dist/index.js:20649:12)
at Object.onceWrapper (events.js:299:28)
at IncomingMessage.emit (events.js:215:7)
at endReadableNT (_stream_readable.js:1184:12)
at processTicksAndRejections (internal/process/task_queues.js:80:21)
The actual problem was fixed (we needed to give the app write permissions). But, the gh-action runner reports that the action succeeded.
What did you expect to happen?
Ideally the error would be propagated to the return code and noticed by the action runner - and the action would report failure to the users.
What the problem might be
I haven't dug into the code any, I'm not that good at javascript.
Other notes
Thanks for this action - it's exactly what we needed to start actually using twitter well, and I can only imagine it will be come indispensable for many projects.
I created a Twitter app but i only see TWITTER_API_KEY and TWITTER_API_SECRET_KEY. where do i get the other two please?
What’s missing?
Correct me if I'm wrong, but we don't currently validate new tweets for their length. It'd be great to do that and exit 1
if the length of a tweet is too long. Here's a handy package I found for doing that: mscoutermarsh/tweet-characters-left.
It uses the twitter-text library to get an accurate length and returns a comparison.
1.2.1
to 1.2.2
.This version is covered by your current version range and after updating it in your project the build failed.
@actions/core is a direct dependency of this project, and it is very likely causing it to break. If other packages depend on yours, this update is probably also breaking those in turn.
There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.
Your Greenkeeper Bot 🌴
What’s missing?
Twitter released a new version of it's ads.twitter.com API (v7):
https://twittercommunity.com/t/ads-api-version-7/135093
Why?
v6 will stop working on Sep 1st, 2020
What’s missing?
As part of landing #177 it was decided to lower the coverage requirement from 100% to 50%. It would be great to get this coverage back up to 100% across the codebase and reinstante the 100% requirement.
This likely includes some completely new tests for the --file
flag, as well as new "pull-request" tests to ensure that validation is applied properly for all frontmatter options (and potentially some new "push-main" tests for frontmatter combinations).
Why?
Improving the code coverage through testing helps ensure that future changes don't break existing functionality, and also acts as wonderful demos to users looking at what this project can do.
Alternatives you tried
N/A
https://github.com/gr2m/twitter-together/blob/108ea845ec190a6b69a40ca2e82a84f614a3e3c2/index.js#L72
should use .every
instead of .find
. Via @JasonEtco
Add a GIF that walks through the process of creating a new tweet via a pull request
How do you use twitter-together?
I'm planning on using Twitter-together with my @aprendegatsbyjs account, so all the coaches CAN tweet on it without giving them the credentials
What do you love about it?
That IT JUST WORKED!! https://twitter.com/aprendegatsbyjs/status/1242248525494222849
How did you learn about it?
someone shared the repo link from twitter :)
What’s missing?
I'd like to add the ability to retweet tweets. Twitter API has a statuses/retweet/:id
API that could be used in conjunction with a .retweet
file.
N.B. I would be willing to take a stab at working on this!
Why?
We've decided to try out Twitter Together for the @electron Twitter account so that the working group responsible for social media can have a formal process for Tweets.
A non-negligible part of our Tweets are straight retweets from other accounts, and we'd like to use the same flow for RTs as well.
Alternatives you tried
Quote-tweeting everything is an alternative, but not always the best solution.
12.6.3
to 12.6.4
.This version is covered by your current version range and after updating it in your project the build failed.
tap is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.
There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.
Your Greenkeeper Bot 🌴
Here is a list of previous feature requests that I'd like to cover
A Front Matter for *.tweet
files, similar to Jekyll's Front Matter
Front Matter would be optional, so the simplest *.tweet
file would only contain text:
Hi, this is my tweet
Multiple tweets can be seperated by ---
surrounded by empty lines
Hi, this is my first tweet --- And this is my second twee
The delimiter can be configured, similar to a multipart email boundary
--- thread-delimiter: ~~~ --- Hi, this is my first tweet ~~~ And this is my second twee
--- reply: https://twitter.com/coderefine/status/1311044915602903043 --- Reply text here
With text
--- retweet: https://twitter.com/coderefine/status/1311044915602903043 --- quote text heer
Without text
--- retweet: https://twitter.com/coderefine/status/1311044915602903043 ---
Gif
--- media: - url: https://media2.giphy.com/media/vFKqnCdLPNOKc/giphy.gif alt: Alternative text here --- My tweet here
My understanding is that max 1 video or one gif can be attached, or up to 4 images.
Timezones are hard. I'd go with the simplest and only accept UTC.
--- schedule: 2021-11-13T00:10:12Z --- My tweet here
I'm open to suggestions. We could alternatively accept an object with time and datetime properteties, e.g.
--- schedule: time-zone: America/Los_Angeles date: 2021-11-13 time: 16:10 --- My tweet here
But this can quickly become a rabbit whole of complexity.
The current twitter-together supports polls with a special syntax in the text body, but when we introduce front matter I'd rather use that to be coherent.
--- poll: - option 1 - option 2 - option 3 - option 4 --- Tweet text shown above the poll here
Please let me know what you think! If you asked for or would like to use any of the twitter features that twitter-together
is not supporting today please let me know if the syntax would cover it
What happened?
I'm trying to test the tweet poll feature. The pipeline is in success but the tweet is not published. When checking the logs, there is an error "Error: TWITTER_ACCOUNT_ID environment variable must be set" even though it is set.
There is also another error which might come from the "missing" TWITTER_ACCOUNT_ID":
(node:2656) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'message' of undefined
at /home/runner/work/_actions/gr2m/twitter-together/v1.x/dist/index.js:25821:56
at Array.map (<anonymous>)
at handlePush (/home/runner/work/_actions/gr2m/twitter-together/v1.x/dist/index.js:25821:37)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
What did you expect to happen?
I expected the tweet to be posted.
What the problem might be
If the problem lies on my side, perhaps I've used the wrong TWITTER_ACCOUNT_ID. Once my Twitter Ads account was validated I went to https://ads.twitter.com/ and got my account id from the URL https://ads.twitter.com/campaign/[ACCOUNT_ID]
.
What happened?
An error occured after the setup branch was created:
ENOENT: no such file or directory, open 'tweets/README.md'
Here is the excerpt with the relevant logs, full logs are at https://github.com/nock/twitter/runs/73862372
ℹ info tweets/ folder does not yet exist. Starting setup
ℹ info Checking if "twitter-together-setup" branch exists already
ℹ info "twitter-together-setup" branch does not yet exist
(node:1) ExperimentalWarning: The fs.promises API is experimental
(node:1) UnhandledPromiseRejectionWarning: Error: ENOENT: no such file or directory, open 'tweets/README.md'
(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:1) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
ℹ info "twitter-together-setup" branch created
What did you expect to happen?
I expected the initial pull request to be created as advertised :)
What the problem might be
I assume the action does not have access to the tweets/README.md
file, we might need to copy it into the Dockerfile?
What’s missing?
The project should be running on the latest LTS release of Node.js.
Why?
The project currently runs on Node.js 12 which was EOL'ed as of April this year.
Alternatives you tried
N/A
What’s missing?
The ability to delete existing tweets.
Why?
Currently the only way to delete a published tweet is for the owner of the account to remove it.
If a twitter account is maintained primarily by a twitter-together repo, there should be a way to delete tweets from this repo, in case there's a mistake or a retraction needed.
How?
To maintain a record of deletions, perhaps a field to flag .tweet
files with deleted: true
, or deleted: [tweet url]
.
What happened?
twitter-together failed on a tweet that should have worked, specifically due to line length.
What did you expect to happen?
twitter-together should have succeeded.
What the problem might be
I am fairly confident that this has to do with Twitter's link parsing. Testing out https://github.com/nodejs/build
as an example, the .length of that as a string is 31 but Twitter only counts it as 23 chars (note that the space before the link is taking up one char):
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww https://github.com/nodejs/build
Given that all characters (w
s and the sapce) here count as 280 characters, the actual count is 314 but the Twitter count is 303.
This occurs because under the hood, Twitter creates a t.co short link for every link that is - in total - 23 characters. It doesn't count additional characters in a URL toward the total character count, since they're only storing 23 in total. This will happen for each link, including photos.
What’s missing?
Mastodon support!
Why?
Mastodon is a nice place for open source projects. It shares many of the properties of twitter, but is open source and decentralised itself.
Alternatives you tried
I did not try any alternatives, mostly because I know your software is awesome and other's is not always awesome.
What happened?
Perhaps because of twitter deprecating it's v1 API for new twitter account applications, after creating a new tweet, the following error occurs.
Run gr2m/[email protected]
Running twitter-together version 0.0.0-development
Tweeting: Hello, world!
error
[
{
message: 'You currently have Essential access which includes access to Twitter API v2 endpoints only. If you need access to this endpoint, you’ll need to apply for Elevated access via the Developer Portal. You can learn more here: https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api#v2-access-leve',
code: 453
}
]
What did you expect to happen?
For simple tweets, it should not need Elevated access.
What the problem might be
Support for twitter-api-v2
node library or some fork of twitter
that supports v2, rather than twitter
(updated 5 years ago) which supports v1 only.
What’s missing?
Support for media (image, GIF, and video)
Why?
In order to make more eye-catching and engaging tweets ✨
Alternatives you tried
Tweeting a link to a statically hosted asset will sometimes embed a preview.
How it would work
Such a feature would have some added complexity:
Unfortunately, adding media files to a repo in the same PR can't be done via /new/master/?filename=tweets/%3Cyour-path%3E.tweet
. The interface doesn't allow adding media files to that same PR.
Some possible options:
hello-world.tweet
contains hello-world.gif
![https://media2.giphy.com/media/vFKqnCdLPNOKc/giphy.gif]
will be automatically downloaded and embeddedWhat’s missing?
A trigger to tweet on release.
I would like to have an action which automatically sends a tweet announcing my newest release whenever one make one for example: Release 1.0.0 of awesome tool is out!
Why?
Tweeting about new releases would be a nice way to keep our user community up to date -- new features, fixed bugs, deprecated functionality, newly introduced bugs...
Alternatives you tried
I've tried tweeting myself, but I always forget to do it.
What happened?
See Mattlk13/p5.js#92. The linked pull request is unusual: Mattlk13/p5.js#92. The pull request head is the original repository, while base is the fork. It's a PR to keep a fork up-to-date.
What did you expect to happen?
There should not be an error.
What the problem might be
twitter-together currently only checks if head is a fork, but not base.
I assume that if we check for both, the problem should go away
🤔 maybe something with ... a tree ... and branches ... and birds ... tweeting ... 🤔
What’s missing?
The ability to manage multiple twitter accounts from the same repository.
Why?
It's common for the same team to manage multiple different twitter handles, for example:
Alternatives you tried
Instead of having to manage multiple repositories with duplicated code and permissions, it would be easier to be able to specify an optional account
field in the YAML file, where the tweet will be published to. An alternative would be to use some specific folder structure for each account.
A new config object schema would be required that supports defining multiple accounts.
What happened?
After squash-merging nock/twitter#2, the "Tweet" workflow ran twice.
What did you expect to happen?
There should only be one run.
What the problem might be
I assume that the merge triggers another "push" event where the head
is set incorrectly to 0000000000000000000000000000000000000000
.
Hey 👋,
I followed the setup steps but ended with read-only permissions (not asked to provide Website URL).
There is an option to set up new Oauth 1.x
and additionally 2.0
. This method allows to choose permissions (read + write) as in documentation but requires additional information like Callback URI
,
Before digging into this, would be great to know the setup of API correctly described.
Workflow run: https://github.com/z-shell/community/runs/5104251869?check_suite_focus=true
Thanks,
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.