diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 80a61fa1..00000000 --- a/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/README.md b/README.md deleted file mode 100644 index 830b2c10..00000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -超微浏览器设置及使用技巧 diff --git a/archives/index.html b/archives/index.html deleted file mode 100644 index 9f749b71..00000000 --- a/archives/index.html +++ /dev/null @@ -1,516 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
- -
- - - - -
-
-
- - - search -
-
- -
-
-
-
- -
-
- -
- - - - - - -
- -
- - 2020 - - -
- - - -
-
-
- - -
-
    - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - diff --git a/categories/index.xml b/categories/index.xml deleted file mode 100644 index 5f88af25..00000000 --- a/categories/index.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - Categories on - https://jamesfengcao.gitee.io/uwebzh/categories/ - Recent content in Categories on - Hugo -- gohugo.io - en-us - - diff --git a/css/aircloud.css b/css/aircloud.css deleted file mode 100644 index 2e177cff..00000000 --- a/css/aircloud.css +++ /dev/null @@ -1,1146 +0,0 @@ -/*varibles*/ -* { - font-family: "italic", Helvetica, Arial, "Heiti SC", "Microsoft YaHei"; -} -body, -html { - margin: 0; - padding: 0; -} -body { - margin-left: calc(100vw - 100%) !important; -} -.red { - color: red; -} -.hide { - display: none !important; -} -.show-block { - display: block !important; -} -.show-block { - animation: showBlock 0.4s forwards; - display: block !important; -} -@keyframes showBlock { - from { - opacity: 0; - transform: translateY(-100%); - } - to { - opacity: 1; - transform: translateY(0); - } -} -.hide-block { - display: block !important; - animation: hideBlock 0.4s forwards; - opacity: 1; - transform: translateY(0); -} -@keyframes hideBlock { - from { - opacity: 1; - transform: translateY(0); - } - to { - opacity: 0; - transform: translateY(-100%); - display: none; - } -} -.show-flex-fade { - animation: showFade 0.4s forwards; - display: flex !important; -} -.hide-flex-fade { - animation: hideFade 0.4s forwards; -} -@keyframes showFade { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -@keyframes hideFade { - from { - opacity: 1; - } - to { - opacity: 0; - display: none !important; - } -} -.no-indent { - text-indent: 0 !important; -} -.no-indent p, -.no-indent h1, -.no-indent h2, -.no-indent h3, -.no-indent h4, -.no-indent h5, -.no-indent h6, -.no-indent ul, -.no-indent ol { - text-indent: 0 !important; -} -.nav { - position: relative; - padding-top: 50px; - color: #333333; - width: 100%; - display: flex; - flex-direction: column; - align-items: center; -} -.nav .avatar-name { - display: flex; - flex-direction: column; - align-items: center; - border-bottom: 1px solid #979797; -} -.nav .avatar-name .avatar { - width: 120px; - height: 120px; - padding: 10px; - box-sizing: border-box; -} -.nav .avatar-name .avatar img { - width: 100px; - height: 100px; -} -.nav .avatar-name .name { - margin-top: 10px; - margin-bottom: 20px; -} -.nav .avatar-name .name i { - font-size: 16px; - font-family: "italic" !important; - font-weight: 300; - color: #666666; -} -.nav .contents ul { - width: 100%; - padding-left: 0; - margin-top: 25px; - margin-bottom: 25px; -} -.nav .contents ul li, -.nav .contents ul li a { - text-decoration: none; - font-size: 15px; - margin: 20px auto; - padding-left: 0; - list-style: none; -} -.nav .contents ul li i, -.nav .contents ul li a i { - cursor: pointer; - color: #999999; - margin-right: 5px; -} -.nav .contents ul li span, -.nav .contents ul li a span { - cursor: pointer; - color: #999999; -} -.nav .contents ul li.active span, -.nav .contents ul li.active i { - color: #4a4a4a; -} -.nav .contents ul li:hover span, -.nav .contents ul li:hover i { - color: #4a4a4a; -} -.site-nav-toggle { - display: none; -} -.site-nav-toggle button { - outline: none; - margin-top: 2px; - padding: 9px 10px; - background: transparent; - border: none; - user-select: none; -} -.site-nav-toggle button .btn-bar { - display: block; - width: 22px; - height: 2px; - background: #666666; - border-radius: 1px; -} -.site-nav-toggle button .btn-bar + .btn-bar { - margin-top: 4px; -} -.search-field { - overflow: hidden; - display: none; - position: fixed; - top: 0; - bottom: 0; - z-index: 3; - left: 0; - right: 0; - width: 100vw; - height: 100vh; - background-color: rgba(0, 0, 0, 0.3); - align-items: center; - flex-direction: column; -} -.search-field .search-container { - width: 40vw; - min-width: 500px; - height: 70vh; - margin-top: 15vh; -} -.search-field .search-container .search-input { - width: 100%; - display: flex; - align-items: center; - padding-top: 10px; -} -.search-field .search-container .search-input span { - width: 60px; - color: #999999; - line-height: 30px; - text-align: center; -} -.search-field .search-container .search-input span:nth-child(1) { - width: 40px; -} -.search-field .search-container .search-input #begin-search { - cursor: pointer; -} -.search-field .search-container .search-input #begin-search:hover { - color: #4a4a4a; -} -.search-field .search-container .search-input input { - flex: 1; - background-color: #f3f4f7; - border: 1px solid #cccccc; - height: 30px; - font-size: 18px; - color: #4a4a4a; - box-sizing: border-box; - font-weight: 300; - padding-left: 5px; - padding-right: 5px; -} -.search-field .search-result-container { - height: calc(70vh - 50px); - overflow-y: scroll; - overflow-x: hidden; -} -.search-field .search-result-container::-webkit-scrollbar { - width: 4px; -} -.search-field .search-result-container .no-search-result { - width: 100%; - height: 200px; - text-align: center; - padding-top: 100px; - color: #999999; - font-size: 16px; -} -.search-field .search-result-container::-webkit-scrollbar-thumb { - background-color: #c3c4c7; - -webkit-border-radius: 2px; - border-radius: 2px; -} -.search-field .search-result-container ul { - margin-top: 10px; - width: calc(100% - 25px); - padding-left: 10px; -} -.search-field .search-result-container ul li { - margin-bottom: 15px; - list-style: none; -} -.search-field .search-result-container ul li a { - text-decoration: none; - cursor: pointer; - font-size: 16px; - color: #4a4a4a; - font-weight: 300; - padding-bottom: 5px; -} -.search-field .search-result-container ul li ul { - padding-left: 10px; -} -.search-field .search-result-container ul li ul li { - list-style: none; - color: #666666; - font-weight: 300; - font-size: 13px; -} -@media screen and (max-width: 680px) { - .search-field .search-container { - min-width: 0; - width: 100%; - height: 100%; - margin: 0; - } - .search-field .search-result-container { - height: calc(100vh - 50px); - } - .nav { - margin-top: 50px; - position: relative; - top: 0; - width: 100%; - } - .nav .avatar-name { - border-bottom: none; - } - .nav .contents { - display: none; - position: fixed; - left: 0; - top: 40px; - width: 100%; - border-bottom: 1px solid #CCCCCC; - border-top: 1px solid #CCCCCC; - } - .nav .contents ul { - padding-left: 30px; - } - .site-nav-toggle { - height: 40px; - box-sizing: border-box; - display: block; - position: fixed; - width: 100%; - padding-top: 2px; - padding-left: 20px; - z-index: 2; - } -} -.post-preview { - width: 100%; - height: max-content; - margin-bottom: 10px; - box-sizing: border-box; - display: flex; - flex-direction: row; -} -.post-preview .post-time { - font-size: 17px; - color: #999999; - width: 125px; - font-weight: 300; - line-height: 24px; -} -.post-preview .post-info { - flex: 1; -} -.post-preview .post-info a { - cursor: pointer; - text-decoration: none; -} -.post-preview .post-info a h3 { - line-height: 24px; - cursor: pointer; - margin-top: 0; - margin-bottom: 5px; - color: #101010; - font-size: 18px; - font-weight: 300; - transition: color 0.4s; -} -.post-preview .post-info a h3:hover { - color: #4990E2; -} -.post-preview .post-info p { - margin-top: 0; -} -.post-preview .post-info p span, -.post-preview .post-info p a { - font-weight: 300; - color: #999999; - font-size: 14px; - text-decoration: none; -} -.post-preview-container { - min-height: 420px; -} -.pager { - width: 100%; - height: 40px; - padding-left: 0; - display: flex; -} -.pager .previous { - flex: 1; - display: flex; - flex-direction: row; - cursor: pointer; -} -.pager .next { - flex: 1; - display: flex; - flex-direction: row-reverse; - cursor: pointer; -} -.pager .previous a, -.pager .next a { - box-sizing: border-box; - cursor: pointer; - transition: color 0.4s, background-color 0.4s; - border: 1px solid #999999; - line-height: 40px; - width: 150px; - height: 40px; - font-size: 18px; - color: #999999; - text-align: center; - text-decoration: none; -} -.pager .previous a:hover, -.pager .next a:hover { - color: white; - cursor: pointer; - background-color: #666666; -} -@media screen and (max-width: 680px) { - .post-preview-container { - min-height: 0 !important; - } - .post-preview { - width: 100%; - height: max-content; - margin-bottom: 10px; - box-sizing: border-box; - display: flex; - flex-direction: column; - padding-left: 10px; - padding-right: 10px; - border-bottom: 1px solid #EEEEEE; - } - .post-preview .post-time { - font-size: 11px; - color: #999999; - width: 125px; - font-weight: 300; - line-height: 20px; - font-style: oblique; - } - .post-preview .post-info { - flex: 1; - } - .post-preview .post-info a { - cursor: pointer; - text-decoration: none; - } - .post-preview .post-info a h3 { - line-height: 20px; - cursor: pointer; - margin-top: 0; - margin-bottom: 5px; - color: #101010; - font-size: 15px; - font-weight: 300; - } - .post-preview .post-info p { - margin-top: 0; - } - .post-preview .post-info p span, - .post-preview .post-info p a { - font-weight: 300; - color: #999999; - font-size: 12px; - text-decoration: none; - } - .pager { - width: 100%; - height: 40px; - padding-left: 10px; - padding-right: 10px; - display: flex; - } - .pager .previous { - flex: 1; - display: flex; - flex-direction: row; - cursor: pointer; - } - .pager .next { - flex: 1; - display: flex; - flex-direction: row-reverse; - cursor: pointer; - } - .pager .previous a, - .pager .next a { - box-sizing: border-box; - cursor: pointer; - transition: color 0.4s, background-color 0.4s; - border: 1px solid #999999; - line-height: 30px; - width: 120px; - height: 30px; - font-size: 14px; - color: #999999; - text-align: center; - text-decoration: none; - } - .pager .previous a:hover, - .pager .next a:hover { - color: white; - cursor: pointer; - background-color: #666666; - } -} -.tags { - line-height: 30px; - margin-bottom: 25px; -} -.tags a { - text-decoration: none; - color: #999999; - margin-right: 15px; -} -.tags a:hover { - color: #4a4a4a; -} -.tags a::before { - content: "#"; -} -.one-tag-list { - margin-bottom: 25px; -} -.one-tag-list .fa-tag { - margin-bottom: 15px; - display: block; - color: #999999; -} -.one-tag-list .post-preview { - padding-left: 2em; -} -.one-tag-list .post-preview a { - cursor: pointer; - text-decoration: none; -} -.one-tag-list .post-preview a .post-title { - margin-bottom: 5px; - line-height: 20px; - cursor: pointer; - margin-top: 0; - color: #101010; - font-size: 18px; - font-weight: 300; - transition: color 0.4s; -} -.one-tag-list .post-preview a .post-title:hover { - color: #4990E2; -} -@media screen and (max-width: 680px) { - .one-tag-list { - margin-bottom: 25px; - } - .one-tag-list .fa-tag { - margin-bottom: 15px; - display: block; - color: #999999; - } - .one-tag-list .post-preview { - padding-left: 2em; - } - .one-tag-list .post-preview a { - cursor: pointer; - text-decoration: none; - } - .one-tag-list .post-preview a .post-title { - font-size: 14px; - font-weight: 300; - text-decoration: none; - line-height: 20px; - color: #4a4a4a; - margin-bottom: 5px; - cursor: pointer; - margin-top: 0; - transition: color 0.4s; - } - .one-tag-list .post-preview a .post-title:hover { - color: #4990E2; - } -} -.post-container { - width: 100%; - height: max-content; - display: flex; - flex-direction: column; -} -.post-container .post-title { - width: 100%; - text-align: center; - line-height: 24px; - margin-top: 0; - margin-bottom: 5px; - color: #101010; - font-size: 20px; - font-weight: 300; -} -.post-container .post-meta { - text-align: center; - margin-top: 0; - margin-bottom: 20px; -} -.post-container .post-meta span, -.post-container .post-meta a { - font-weight: 300; - color: #999999; - font-size: 13px; - text-decoration: none; -} -.post-container .post-meta .attr { - margin-right: 5px; - margin-left: 5px; -} -.post-content { - line-height: 20px; - font-size: 15px; - text-indent: 0; - color: #333333; - font-weight: 300; -} -.post-content blockquote { - border-top: 1px solid #cccccc; - border-bottom: 1px solid #cccccc; - margin-left: 2em; - margin-right: 2em; - padding-left: 0; - padding-right: 0; -} -.post-content blockquote p { - margin-top: 10px; - margin-bottom: 10px; - color: #666666; -} -.post-content a { - text-decoration: none; - color: #4990E2; -} -.post-content p { - color: #404040; - font-size: 14px; - line-height: 30px; - text-indent: 0; - letter-spacing: 1px; -} -.post-content p img { - width: 80%; -} -.post-content ul, -.post-content ol { - padding-left: 2em; -} -.post-content ul li, -.post-content ol li { - list-style: none; - color: #404040; - font-size: 14px; - line-height: 30px; - text-indent: 0; - letter-spacing: 1px; - margin-bottom: 5px; - margin-top: 5px; -} -.post-content ul li:before, -.post-content ol li:before { - content: '• '; -} -.post-content pre { - text-indent: 0; - padding: 10px; -} -.post-content pre code { - line-height: 175%; -} -.post-content h1 { - color: #333333; - margin-top: 20px; - margin-bottom: 20px; -} -.post-content h2 { - color: #333333; - margin-top: 20px; - margin-bottom: 20px; -} -.post-content h3 { - color: #333333; - margin-top: 20px; - margin-bottom: 20px; -} -.post-content h4 { - color: #333333; - margin-top: 20px; - margin-bottom: 20px; -} -.post-content h5 { - color: #333333; - margin-top: 20px; - margin-bottom: 20px; -} -.post-content h6 { - color: #333333; - margin-top: 20px; - margin-bottom: 20px; -} -#comment-container { - text-indent: 0; -} -#lv-container { - text-indent: 0; -} -.post-content li p { - display: inline; -} -.index-about { - text-align: center; - width: 100%; - margin-top: 45px; - margin-bottom: 40px; - opacity: 0; - animation: showBlock 1.6s forwards; -} -.index-about i { - font-size: 15px; - font-family: "italic" !important; - font-weight: 300; - color: #444444; -} -.index-about-mobile { - display: none; -} -.index-container { - justify-content: center; - height: max-content; - position: relative; - width: 1024px; - margin: auto; - display: flex; - flex-direction: row; -} -.index-container .index-left { - width: 240px; -} -.index-container .index-middle { - max-width: 784px; - flex: 1; -} -@media screen and (max-width: 1180px) { - .index-container { - left: 0; - width: 100%; - box-sizing: border-box; - margin: auto; - padding: 0 40px 0 10px; - display: flex; - flex-direction: row; - } - .index-container .index-left { - width: 180px; - } - .index-container .index-middle { - flex: 1; - max-width: calc(100% - 180px); - } -} -@media screen and (max-width: 680px) { - .index-container { - width: 100%; - box-sizing: border-box; - margin: auto; - display: flex; - flex-direction: column; - padding: 0 25px 0 25px; - min-height: 0; - } - .index-container .index-left { - width: 100%; - } - .index-container .index-middle { - max-width: 100%; - flex: 1; - } - .index-about { - display: none; - } - .index-about-mobile { - display: block; - text-align: center; - width: 100%; - margin-top: 0; - margin-bottom: 40px; - } - .index-about-mobile i { - font-size: 15px; - font-family: "italic" !important; - font-weight: 300; - color: #444444; - } -} -.archives-container .one-tag-list .listing-seperator { - font-size: 18px; - color: #999999; -} -.archives-container .one-tag-list ul { - list-style: none; -} -.archives-container .one-tag-list ul li { - display: flex; - align-items: center; - flex-direction: row; - margin-bottom: 10px; -} -.archives-container .one-tag-list ul li span { - color: #999999; - margin-right: 15px; - min-width: 45px; -} -.archives-container .one-tag-list ul li a { - text-decoration: none; - line-height: 20px; - color: #4a4a4a; -} -.archives-container .one-tag-list ul li a span { - color: #4a4a4a; - transition: color 0.4s; -} -.archives-container .one-tag-list ul li a span:hover { - color: #4990E2; -} -@media screen and (max-width: 680px) { - .archives-container .one-tag-list .listing-seperator { - font-size: 18px; - color: #999999; - } - .archives-container .one-tag-list ul { - list-style: none; - padding-left: 1em; - } - .archives-container .one-tag-list ul li { - display: flex; - align-items: center; - flex-direction: row; - margin-bottom: 10px; - } - .archives-container .one-tag-list ul li span { - color: #999999; - margin-right: 15px; - min-width: 45px; - font-size: 14px; - } - .archives-container .one-tag-list ul li i { - font-size: 12px; - } - .archives-container .one-tag-list ul li a { - font-size: 14px; - font-weight: 300; - text-decoration: none; - line-height: 20px; - color: #4a4a4a; - } - .archives-container .one-tag-list ul li a span { - color: #4a4a4a; - } -} -pre, -.highlight { - overflow: auto; - margin: 20px 0; - padding: 0; - font-size: 13px; - color: #4d4d4c; - background: #f7f7f7; - line-height: 1.6; -} -pre, -code { - font-family: consolas, Menlo, "PingFang SC", "Microsoft YaHei", monospace; -} -code { - padding: 2px 4px; - word-wrap: break-word; - color: #555; - background: #eee; - border-radius: 3px; - font-size: 13px; -} -pre { - padding: 10px; -} -pre code { - padding: 0; - color: #4d4d4c; - background: none; - text-shadow: none; -} -.highlight { - border-radius: 1px; -} -.highlight pre { - border: none; - margin: 0; - padding: 10px 0; -} -.highlight table { - margin: 0; - width: auto; - border: none; -} -.highlight td { - border: none; - padding: 0; -} -.highlight figcaption { - font-size: 1em; - color: #4d4d4c; - line-height: 1em; - margin-bottom: 1em; -} -.highlight figcaption a { - float: right; - color: #4d4d4c; -} -.highlight figcaption a:hover { - border-bottom-color: #4d4d4c; -} -.highlight .gutter pre { - padding-left: 10px; - padding-right: 10px; - color: #869194; - text-align: right; - background-color: #eff2f3; -} -.highlight .code pre { - width: 100%; - padding-left: 10px; - padding-right: 10px; - background-color: #f7f7f7; -} -.highlight .line { - height: 20px; -} -.gutter { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.gist table { - width: auto; -} -.gist table td { - border: none; -} -pre .deletion { - background: #fdd; -} -pre .addition { - background: #dfd; -} -pre .meta { - color: #8959a8; -} -pre .comment { - color: #8e908c; -} -pre .variable, -pre .attribute, -pre .tag, -pre .regexp, -pre .ruby .constant, -pre .xml .tag .title, -pre .xml .pi, -pre .xml .doctype, -pre .html .doctype, -pre .css .id, -pre .css .class, -pre .css .pseudo { - color: #c82829; -} -pre .number, -pre .preprocessor, -pre .built_in, -pre .literal, -pre .params, -pre .constant, -pre .command { - color: #f5871f; -} -pre .ruby .class .title, -pre .css .rules .attribute, -pre .string, -pre .value, -pre .inheritance, -pre .header, -pre .ruby .symbol, -pre .xml .cdata, -pre .special, -pre .number, -pre .formula { - color: #718c00; -} -pre .title, -pre .css .hexcolor { - color: #3e999f; -} -pre .function, -pre .python .decorator, -pre .python .title, -pre .ruby .function .title, -pre .ruby .title .keyword, -pre .perl .sub, -pre .javascript .title, -pre .coffeescript .title { - color: #4271ae; -} -pre .keyword, -pre .javascript .function { - color: #8959a8; -} -.footer { - width: 100%; - align-items: center; - display: flex; - flex-direction: column; - color: #979797; - margin-bottom: 10px; -} -.footer p { - font-family: "Montserrat", "Helvetica Neue", "Hiragino Sans GB", "LiHei Pro", Arial, sans-serif; - font-size: 14px; - margin-top: 5px; - margin-bottom: 0; - font-weight: 300; -} -.footer p a { - font-weight: 300; - font-family: "Montserrat", "Helvetica Neue", "Hiragino Sans GB", "LiHei Pro", Arial, sans-serif; - cursor: pointer; - color: #333333; -} -.footer p span a { - font-weight: 300; - font-family: "Montserrat", "Helvetica Neue", "Hiragino Sans GB", "LiHei Pro", Arial, sans-serif; - cursor: pointer; - color: #979797; - text-decoration: none; -} -.footer p span a:hover { - color: #333333; -} -.list-inline.text-center { - color: #444444; - font-size: 20px; - padding-left: 0; - margin-bottom: 0; -} -.list-inline.text-center li { - display: inline-block; - margin: 0 2px; - background-color: #979797; - height: 24px; - width: 24px; - border-radius: 12px; - text-align: center; -} -.list-inline.text-center li a { - text-decoration: none; -} -.list-inline.text-center li a span i { - line-height: 20px; - color: white; -} -.list-inline.text-center li:hover { - background-color: #333333; -} -@media screen and (max-width: 680px) { - .footer { - box-sizing: border-box; - padding-left: 20px; - padding-right: 20px; - } - .footer p { - font-family: "Montserrat", "Helvetica Neue", "Hiragino Sans GB", "LiHei Pro", Arial, sans-serif; - font-size: 11px; - margin-top: 5px; - margin-bottom: 0; - font-weight: 300; - } - .footer p span a { - font-size: 11px; - font-weight: 300; - font-family: "Montserrat", "Helvetica Neue", "Hiragino Sans GB", "LiHei Pro", Arial, sans-serif; - cursor: pointer; - color: #979797; - text-decoration: none; - } - .footer p span a:hover { - color: #333333; - } -} -.toc-article { - width: 240px; -} -.toc-article ol { - padding-left: 10px; - cursor: pointer; - font-size: 0; -} -.toc-article li { - font-size: 0; - box-sizing: border-box; - border-left: 2px solid #cccccc; - list-style: none; - padding-left: 10px; -} -.toc-article li a { - display: block; - line-height: 20px; - margin-bottom: 10px; - text-decoration: none; - color: #999999; - font-size: 14px; -} -.toc-article li a span { - word-break: break-all; -} -.toc-article li.active { - border-left: 2px solid #4990E2; -} -.toc-article li.active > a { - color: #4990E2; -} -.toc-article li:hover { - border-left: 2px solid #4990E2; -} -.toc-article li:hover > a { - color: #4990E2; -} -.toc-article > ol > li { - border-left: none !important; -} -.toc-fixed { - position: fixed; - top: 10px; - width: 240px; -} -.toc-fixed::-webkit-scrollbar { - width: 0; -} -.toc-fixed::-webkit-scrollbar-thumb { - -webkit-border-radius: 4px; - border-radius: 2px; -} -@media screen and (max-width: 1180px) { - .toc-article { - display: none; - } -} diff --git a/css/aircloud.less b/css/aircloud.less deleted file mode 100644 index 58208cd4..00000000 --- a/css/aircloud.less +++ /dev/null @@ -1,19 +0,0 @@ -@import "../_less/variables"; -@import "../_less/common"; -@import "../_less/nav"; -@import "../_less/about"; -@import "../_less/index"; -@import "../_less/tag"; -@import "../_less/post"; -@import "../_less/page"; -@import "../_less/layout"; - - -@import "../_less/archive"; - -@import "../_less/hightlight"; -// _partial: -@import "../_less/_partial/footer"; - -@import "../_less/toc"; - diff --git a/css/gitment.css b/css/gitment.css deleted file mode 100644 index 5414f78c..00000000 --- a/css/gitment.css +++ /dev/null @@ -1,1146 +0,0 @@ -.gitment-container { - font-family: sans-serif; - font-size: 14px; - line-height: 1.5; - color: #333; - word-wrap: break-word; -} - -.gitment-container * { - box-sizing: border-box; -} - -.gitment-container *:disabled { - cursor: not-allowed; -} - -.gitment-container a, -.gitment-container a:visited { - cursor: pointer; - text-decoration: none; -} - -.gitment-container a:hover { - text-decoration: underline; -} - -.gitment-container .gitment-hidden { - display: none; -} - -.gitment-container .gitment-spinner-icon { - fill: #333; - - -webkit-animation: gitment-spin 1s steps(12) infinite; - animation: gitment-spin 1s steps(12) infinite; -} - -@-webkit-keyframes gitment-spin { - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg) - } -} - -@keyframes gitment-spin { - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg) - } -} - -.gitment-root-container { - margin: 19px 0; -} - -.gitment-header-container { - margin: 19px 0; -} - -.gitment-header-like-btn, -.gitment-comment-like-btn { - cursor: pointer; -} - -.gitment-comment-like-btn { - float: right; -} - -.gitment-comment-like-btn.liked { - color: #F44336; -} - -.gitment-header-like-btn svg { - vertical-align: middle; - height: 30px; -} - -.gitment-comment-like-btn svg { - vertical-align: middle; - height: 20px; -} - -.gitment-header-like-btn.liked svg, -.gitment-comment-like-btn.liked svg { - fill: #F44336; -} - -a.gitment-header-issue-link, -a.gitment-header-issue-link:visited { - float: right; - line-height: 30px; - color: #666; -} - -a.gitment-header-issue-link:hover { - color: #666; -} - -.gitment-comments-loading, -.gitment-comments-error, -.gitment-comments-empty { - text-align: center; - margin: 50px 0; -} - -.gitment-comments-list { - list-style: none; - padding-left: 0; - margin: 0 0 38px; -} - -.gitment-comment, -.gitment-editor-container { - position: relative; - min-height: 60px; - padding-left: 60px; - margin: 19px 0; -} - -.gitment-comment-avatar, -.gitment-editor-avatar { - float: left; - margin-left: -60px; -} - -.gitment-comment-avatar, -.gitment-comment-avatar-img, -.gitment-comment-avatar, -.gitment-editor-avatar-img, -.gitment-editor-avatar svg { - width: 44px; - height: 44px; - border-radius: 3px; -} - -.gitment-editor-avatar .gitment-github-icon { - fill: #fff; - background-color: #333; -} - -.gitment-comment-main, -.gitment-editor-main { - position: relative; - border: 1px solid #CFD8DC; - border-radius: 0; -} - -.gitment-editor-main::before, -.gitment-editor-main::after, -.gitment-comment-main::before, -.gitment-comment-main::after { - position: absolute; - top: 11px; - left: -16px; - display: block; - width: 0; - height: 0; - pointer-events: none; - content: ""; - border-color: transparent; - border-style: solid solid outset; -} - -.gitment-editor-main::before, -.gitment-comment-main::before { - border-width: 8px; - border-right-color: #CFD8DC; -} - -.gitment-editor-main::after, -.gitment-comment-main::after { - margin-top: 1px; - margin-left: 2px; - border-width: 7px; - border-right-color: #fff; -} - -.gitment-comment-header { - margin: 12px 15px; - color: #666; - background-color: #fff; - border-radius: 3px; -} - -.gitment-editor-header { - padding: 0; - margin: 0; - border-bottom: 1px solid #CFD8DC; -} - -a.gitment-comment-name, -a.gitment-comment-name:visited { - font-weight: 600; - color: #666; -} - -.gitment-editor-tabs { - margin-bottom: -1px; - margin-left: -1px; -} - -.gitment-editor-tab { - display: inline-block; - padding: 11px 12px; - font-size: 14px; - line-height: 20px; - color: #666; - text-decoration: none; - background-color: transparent; - border-width: 0 1px; - border-style: solid; - border-color: transparent; - border-radius: 0; - - white-space: nowrap; - cursor: pointer; - user-select: none; - - outline: none; -} - -.gitment-editor-tab.gitment-selected { - color: #333; - background-color: #fff; - border-color: #CFD8DC; -} - -.gitment-editor-login { - float: right; - margin-top: -30px; - margin-right: 15px; -} - -a.gitment-footer-project-link, -a.gitment-footer-project-link:visited, -a.gitment-editor-login-link, -a.gitment-editor-login-link:visited { - color: #2196F3; -} - -a.gitment-editor-logout-link, -a.gitment-editor-logout-link:visited { - color: #666; -} - -a.gitment-editor-logout-link:hover { - color: #2196F3; - text-decoration: none; -} - -.gitment-comment-body { - position: relative; - margin: 12px 15px; - overflow: hidden; - border-radius: 3px; -} - -.gitment-comment-body-folded { - cursor: pointer; -} - -.gitment-comment-body-folded::before { - display: block !important; - content: ""; - position: absolute; - width: 100%; - left: 0; - top: 0; - bottom: 50px; - pointer-events: none; - background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0), rgba(255, 255, 255, .9)); - background: linear-gradient(180deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, .9)); -} - -.gitment-comment-body-folded::after { - display: block !important; - content: "Click to Expand" !important; - text-align: center; - color: #666; - position: absolute; - width: 100%; - height: 50px; - line-height: 50px; - left: 0; - bottom: 0; - pointer-events: none; - background: rgba(255, 255, 255, .9); -} - -.gitment-editor-body { - margin: 0; -} - -.gitment-comment-body > *:first-child, -.gitment-editor-preview > *:first-child { - margin-top: 0 !important; -} - -.gitment-comment-body > *:last-child, -.gitment-editor-preview > *:last-child { - margin-bottom: 0 !important; -} - -.gitment-editor-body textarea { - display: block; - width: 100%; - min-height: 150px; - max-height: 500px; - padding: 16px; - resize: vertical; - - max-width: 100%; - margin: 0; - font-size: 14px; - line-height: 1.6; - - background-color: #fff; - - color: #333; - vertical-align: middle; - border: none; - border-radius: 0; - outline: none; - box-shadow: none; - - overflow: visible; -} - -.gitment-editor-body textarea:focus { - background-color: #fff; -} - -.gitment-editor-preview { - min-height: 150px; - - padding: 16px; - background-color: transparent; - - width: 100%; - font-size: 14px; - - line-height: 1.5; - word-wrap: break-word; -} - -.gitment-editor-footer { - padding: 0; - margin-top: 10px; -} - -.gitment-editor-footer::after { - display: table; - clear: both; - content: ""; -} - -a.gitment-editor-footer-tip { - display: inline-block; - padding-top: 10px; - font-size: 12px; - color: #666; -} - -a.gitment-editor-footer-tip:hover { - color: #2196F3; - text-decoration: none; -} - -.gitment-comments-pagination { - list-style: none; - text-align: right; - border-radius: 0; - margin: -19px 0 19px 0; -} - -.gitment-comments-page-item { - display: inline-block; - cursor: pointer; - border: 1px solid #CFD8DC; - margin-left: -1px; - padding: .25rem .5rem; -} - -.gitment-comments-page-item:hover { - background-color: #f5f5f5; -} - -.gitment-comments-page-item.gitment-selected { - background-color: #f5f5f5; -} - -.gitment-editor-submit, -.gitment-comments-init-btn { - color: #fff; - background-color: #00BCD4; - - position: relative; - display: inline-block; - padding: 7px 13px; - font-size: 14px; - font-weight: 600; - line-height: 20px; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-size: 110% 110%; - border: none; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} - -.gitment-editor-submit:hover, -.gitment-comments-init-btn:hover { - background-color: #00ACC1; -} - -.gitment-comments-init-btn:disabled, -.gitment-editor-submit:disabled { - color: rgba(255,255,255,0.75); - background-color: #4DD0E1; - box-shadow: none; -} - -.gitment-editor-submit { - float: right; -} - -.gitment-footer-container { - margin-top: 30px; - margin-bottom: 20px; - text-align: right; - font-size: 12px; -} - -/* - * Markdown CSS - * Copied from https://github.com/sindresorhus/github-markdown-css - */ -.gitment-markdown { - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; - line-height: 1.5; - color: #333; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - font-size: 16px; - line-height: 1.5; - word-wrap: break-word; -} - -.gitment-markdown .pl-c { - color: #969896; -} - -.gitment-markdown .pl-c1, -.gitment-markdown .pl-s .pl-v { - color: #0086b3; -} - -.gitment-markdown .pl-e, -.gitment-markdown .pl-en { - color: #795da3; -} - -.gitment-markdown .pl-smi, -.gitment-markdown .pl-s .pl-s1 { - color: #333; -} - -.gitment-markdown .pl-ent { - color: #63a35c; -} - -.gitment-markdown .pl-k { - color: #a71d5d; -} - -.gitment-markdown .pl-s, -.gitment-markdown .pl-pds, -.gitment-markdown .pl-s .pl-pse .pl-s1, -.gitment-markdown .pl-sr, -.gitment-markdown .pl-sr .pl-cce, -.gitment-markdown .pl-sr .pl-sre, -.gitment-markdown .pl-sr .pl-sra { - color: #183691; -} - -.gitment-markdown .pl-v, -.gitment-markdown .pl-smw { - color: #ed6a43; -} - -.gitment-markdown .pl-bu { - color: #b52a1d; -} - -.gitment-markdown .pl-ii { - color: #f8f8f8; - background-color: #b52a1d; -} - -.gitment-markdown .pl-c2 { - color: #f8f8f8; - background-color: #b52a1d; -} - -.gitment-markdown .pl-c2::before { - content: "^M"; -} - -.gitment-markdown .pl-sr .pl-cce { - font-weight: bold; - color: #63a35c; -} - -.gitment-markdown .pl-ml { - color: #693a17; -} - -.gitment-markdown .pl-mh, -.gitment-markdown .pl-mh .pl-en, -.gitment-markdown .pl-ms { - font-weight: bold; - color: #1d3e81; -} - -.gitment-markdown .pl-mq { - color: #008080; -} - -.gitment-markdown .pl-mi { - font-style: italic; - color: #333; -} - -.gitment-markdown .pl-mb { - font-weight: bold; - color: #333; -} - -.gitment-markdown .pl-md { - color: #bd2c00; - background-color: #ffecec; -} - -.gitment-markdown .pl-mi1 { - color: #55a532; - background-color: #eaffea; -} - -.gitment-markdown .pl-mc { - color: #ef9700; - background-color: #ffe3b4; -} - -.gitment-markdown .pl-mi2 { - color: #d8d8d8; - background-color: #808080; -} - -.gitment-markdown .pl-mdr { - font-weight: bold; - color: #795da3; -} - -.gitment-markdown .pl-mo { - color: #1d3e81; -} - -.gitment-markdown .pl-ba { - color: #595e62; -} - -.gitment-markdown .pl-sg { - color: #c0c0c0; -} - -.gitment-markdown .pl-corl { - text-decoration: underline; - color: #183691; -} - -.gitment-markdown .octicon { - display: inline-block; - vertical-align: text-top; - fill: currentColor; -} - -.gitment-markdown a { - background-color: transparent; - -webkit-text-decoration-skip: objects; -} - -.gitment-markdown a:active, -.gitment-markdown a:hover { - outline-width: 0; -} - -.gitment-markdown strong { - font-weight: inherit; -} - -.gitment-markdown strong { - font-weight: bolder; -} - -.gitment-markdown h1 { - font-size: 2em; - margin: 0.67em 0; -} - -.gitment-markdown img { - border-style: none; -} - -.gitment-markdown svg:not(:root) { - overflow: hidden; -} - -.gitment-markdown code, -.gitment-markdown kbd, -.gitment-markdown pre { - font-family: monospace, monospace; - font-size: 1em; -} - -.gitment-markdown hr { - box-sizing: content-box; - height: 0; - overflow: visible; -} - -.gitment-markdown input { - font: inherit; - margin: 0; -} - -.gitment-markdown input { - overflow: visible; -} - -.gitment-markdown [type="checkbox"] { - box-sizing: border-box; - padding: 0; -} - -.gitment-markdown * { - box-sizing: border-box; -} - -.gitment-markdown input { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -.gitment-markdown a { - color: #0366d6; - text-decoration: none; -} - -.gitment-markdown a:hover { - text-decoration: underline; -} - -.gitment-markdown strong { - font-weight: 600; -} - -.gitment-markdown hr { - height: 0; - margin: 15px 0; - overflow: hidden; - background: transparent; - border: 0; - border-bottom: 1px solid #dfe2e5; -} - -.gitment-markdown hr::before { - display: table; - content: ""; -} - -.gitment-markdown hr::after { - display: table; - clear: both; - content: ""; -} - -.gitment-markdown table { - border-spacing: 0; - border-collapse: collapse; -} - -.gitment-markdown td, -.gitment-markdown th { - padding: 0; -} - -.gitment-markdown h1, -.gitment-markdown h2, -.gitment-markdown h3, -.gitment-markdown h4, -.gitment-markdown h5, -.gitment-markdown h6 { - margin-top: 0; - margin-bottom: 0; -} - -.gitment-markdown h1 { - font-size: 32px; - font-weight: 600; -} - -.gitment-markdown h2 { - font-size: 24px; - font-weight: 600; -} - -.gitment-markdown h3 { - font-size: 20px; - font-weight: 600; -} - -.gitment-markdown h4 { - font-size: 16px; - font-weight: 600; -} - -.gitment-markdown h5 { - font-size: 14px; - font-weight: 600; -} - -.gitment-markdown h6 { - font-size: 12px; - font-weight: 600; -} - -.gitment-markdown p { - margin-top: 0; - margin-bottom: 10px; -} - -.gitment-markdown blockquote { - margin: 0; -} - -.gitment-markdown ul, -.gitment-markdown ol { - padding-left: 0; - margin-top: 0; - margin-bottom: 0; -} - -.gitment-markdown ol ol, -.gitment-markdown ul ol { - list-style-type: lower-roman; -} - -.gitment-markdown ul ul ol, -.gitment-markdown ul ol ol, -.gitment-markdown ol ul ol, -.gitment-markdown ol ol ol { - list-style-type: lower-alpha; -} - -.gitment-markdown dd { - margin-left: 0; -} - -.gitment-markdown code { - font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; - font-size: 12px; -} - -.gitment-markdown pre { - margin-top: 0; - margin-bottom: 0; - font: 12px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; -} - -.gitment-markdown .octicon { - vertical-align: text-bottom; -} - -.gitment-markdown .pl-0 { - padding-left: 0 !important; -} - -.gitment-markdown .pl-1 { - padding-left: 4px !important; -} - -.gitment-markdown .pl-2 { - padding-left: 8px !important; -} - -.gitment-markdown .pl-3 { - padding-left: 16px !important; -} - -.gitment-markdown .pl-4 { - padding-left: 24px !important; -} - -.gitment-markdown .pl-5 { - padding-left: 32px !important; -} - -.gitment-markdown .pl-6 { - padding-left: 40px !important; -} - -.gitment-markdown::before { - display: table; - content: ""; -} - -.gitment-markdown::after { - display: table; - clear: both; - content: ""; -} - -.gitment-markdown>*:first-child { - margin-top: 0 !important; -} - -.gitment-markdown>*:last-child { - margin-bottom: 0 !important; -} - -.gitment-markdown a:not([href]) { - color: inherit; - text-decoration: none; -} - -.gitment-markdown .anchor { - float: left; - padding-right: 4px; - margin-left: -20px; - line-height: 1; -} - -.gitment-markdown .anchor:focus { - outline: none; -} - -.gitment-markdown p, -.gitment-markdown blockquote, -.gitment-markdown ul, -.gitment-markdown ol, -.gitment-markdown dl, -.gitment-markdown table, -.gitment-markdown pre { - margin-top: 0; - margin-bottom: 16px; -} - -.gitment-markdown hr { - height: 0.25em; - padding: 0; - margin: 24px 0; - background-color: #e1e4e8; - border: 0; -} - -.gitment-markdown blockquote { - padding: 0 1em; - color: #6a737d; - border-left: 0.25em solid #dfe2e5; -} - -.gitment-markdown blockquote>:first-child { - margin-top: 0; -} - -.gitment-markdown blockquote>:last-child { - margin-bottom: 0; -} - -.gitment-markdown kbd { - display: inline-block; - padding: 3px 5px; - font-size: 11px; - line-height: 10px; - color: #444d56; - vertical-align: middle; - background-color: #fafbfc; - border: solid 1px #c6cbd1; - border-bottom-color: #959da5; - border-radius: 0; - box-shadow: inset 0 -1px 0 #959da5; -} - -.gitment-markdown h1, -.gitment-markdown h2, -.gitment-markdown h3, -.gitment-markdown h4, -.gitment-markdown h5, -.gitment-markdown h6 { - margin-top: 24px; - margin-bottom: 16px; - font-weight: 600; - line-height: 1.25; -} - -.gitment-markdown h1 .octicon-link, -.gitment-markdown h2 .octicon-link, -.gitment-markdown h3 .octicon-link, -.gitment-markdown h4 .octicon-link, -.gitment-markdown h5 .octicon-link, -.gitment-markdown h6 .octicon-link { - color: #1b1f23; - vertical-align: middle; - visibility: hidden; -} - -.gitment-markdown h1:hover .anchor, -.gitment-markdown h2:hover .anchor, -.gitment-markdown h3:hover .anchor, -.gitment-markdown h4:hover .anchor, -.gitment-markdown h5:hover .anchor, -.gitment-markdown h6:hover .anchor { - text-decoration: none; -} - -.gitment-markdown h1:hover .anchor .octicon-link, -.gitment-markdown h2:hover .anchor .octicon-link, -.gitment-markdown h3:hover .anchor .octicon-link, -.gitment-markdown h4:hover .anchor .octicon-link, -.gitment-markdown h5:hover .anchor .octicon-link, -.gitment-markdown h6:hover .anchor .octicon-link { - visibility: visible; -} - -.gitment-markdown h1 { - padding-bottom: 0.3em; - font-size: 2em; - border-bottom: 1px solid #eaecef; -} - -.gitment-markdown h2 { - padding-bottom: 0.3em; - font-size: 1.5em; - border-bottom: 1px solid #eaecef; -} - -.gitment-markdown h3 { - font-size: 1.25em; -} - -.gitment-markdown h4 { - font-size: 1em; -} - -.gitment-markdown h5 { - font-size: 0.875em; -} - -.gitment-markdown h6 { - font-size: 0.85em; - color: #6a737d; -} - -.gitment-markdown ul, -.gitment-markdown ol { - padding-left: 2em; -} - -.gitment-markdown ul ul, -.gitment-markdown ul ol, -.gitment-markdown ol ol, -.gitment-markdown ol ul { - margin-top: 0; - margin-bottom: 0; -} - -.gitment-markdown li>p { - margin-top: 16px; -} - -.gitment-markdown li+li { - margin-top: 0.25em; -} - -.gitment-markdown dl { - padding: 0; -} - -.gitment-markdown dl dt { - padding: 0; - margin-top: 16px; - font-size: 1em; - font-style: italic; - font-weight: 600; -} - -.gitment-markdown dl dd { - padding: 0 16px; - margin-bottom: 16px; -} - -.gitment-markdown table { - display: block; - width: 100%; - overflow: auto; -} - -.gitment-markdown table th { - font-weight: 600; -} - -.gitment-markdown table th, -.gitment-markdown table td { - padding: 6px 13px; - border: 1px solid #dfe2e5; -} - -.gitment-markdown table tr { - background-color: #fff; - border-top: 1px solid #c6cbd1; -} - -.gitment-markdown table tr:nth-child(2n) { - background-color: #f5f5f5; -} - -.gitment-markdown img { - max-width: 100%; - box-sizing: content-box; - background-color: #fff; -} - -.gitment-markdown code { - padding: 0; - padding-top: 0.2em; - padding-bottom: 0.2em; - margin: 0; - font-size: 85%; - background-color: rgba(27,31,35,0.05); - border-radius: 0; -} - -.gitment-markdown code::before, -.gitment-markdown code::after { - letter-spacing: -0.2em; - content: "\00a0"; -} - -.gitment-markdown pre { - word-wrap: normal; -} - -.gitment-markdown pre>code { - padding: 0; - margin: 0; - font-size: 100%; - word-break: normal; - white-space: pre; - background: transparent; - border: 0; -} - -.gitment-markdown .highlight { - margin-bottom: 16px; -} - -.gitment-markdown .highlight pre { - margin-bottom: 0; - word-break: normal; -} - -.gitment-markdown .highlight pre, -.gitment-markdown pre { - padding: 16px; - overflow: auto; - font-size: 85%; - line-height: 1.45; - background-color: #f5f5f5; - border-radius: 0; -} - -.gitment-markdown pre code { - display: inline; - max-width: auto; - padding: 0; - margin: 0; - overflow: visible; - line-height: inherit; - word-wrap: normal; - background-color: transparent; - border: 0; -} - -.gitment-markdown pre code::before, -.gitment-markdown pre code::after { - content: normal; -} - -.gitment-markdown .full-commit .btn-outline:not(:disabled):hover { - color: #005cc5; - border-color: #005cc5; -} - -.gitment-markdown kbd { - display: inline-block; - padding: 3px 5px; - font: 11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; - line-height: 10px; - color: #444d56; - vertical-align: middle; - background-color: #fcfcfc; - border: solid 1px #c6cbd1; - border-bottom-color: #959da5; - border-radius: 0; - box-shadow: inset 0 -1px 0 #959da5; -} - -.gitment-markdown :checked+.radio-label { - position: relative; - z-index: 1; - border-color: #0366d6; -} - -.gitment-markdown .task-list-item { - list-style-type: none; -} - -.gitment-markdown .task-list-item+.task-list-item { - margin-top: 3px; -} - -.gitment-markdown .task-list-item input { - margin: 0 0.2em 0.25em -1.6em; - vertical-align: middle; -} - -.gitment-markdown hr { - border-bottom-color: #eee; -} \ No newline at end of file diff --git a/_posts/index.html b/en/categories/index.html similarity index 100% rename from _posts/index.html rename to en/categories/index.html diff --git a/en/categories/index.xml b/en/categories/index.xml new file mode 100644 index 00000000..77d82b49 --- /dev/null +++ b/en/categories/index.xml @@ -0,0 +1,9 @@ + + + + Categories on + /en/categories/ + Recent content in Categories on + Hugo -- gohugo.io + + diff --git a/en/index.html b/en/index.html new file mode 100644 index 00000000..d89979cf --- /dev/null +++ b/en/index.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + +
+ + +
+
+ + +
    + + + + + +
+ + + diff --git a/en/index.xml b/en/index.xml new file mode 100644 index 00000000..6222ec4e --- /dev/null +++ b/en/index.xml @@ -0,0 +1,9 @@ + + + + + /en/ + Recent content on + Hugo -- gohugo.io + + diff --git a/en/sitemap.xml b/en/sitemap.xml new file mode 100644 index 00000000..ff3b96b8 --- /dev/null +++ b/en/sitemap.xml @@ -0,0 +1,41 @@ + + + + /en/ + + + + /en/categories/ + + + + /en/tags/ + + + + diff --git a/categories/index.html b/en/tags/index.html similarity index 100% rename from categories/index.html rename to en/tags/index.html diff --git a/en/tags/index.xml b/en/tags/index.xml new file mode 100644 index 00000000..f82d5d66 --- /dev/null +++ b/en/tags/index.xml @@ -0,0 +1,9 @@ + + + + Tags on + /en/tags/ + Recent content in Tags on + Hugo -- gohugo.io + + diff --git a/index.html b/index.html index 345a13b1..d7ba57d6 100644 --- a/index.html +++ b/index.html @@ -1,287 +1,10 @@ - - + + - + zh/ + + - - - - + - -
- - -
-
- - - - - diff --git a/js/gitment.js b/js/gitment.js deleted file mode 100644 index ef8778ba..00000000 --- a/js/gitment.js +++ /dev/null @@ -1,3757 +0,0 @@ -/** - * Created by Xiaotao.Nie on 11/04/2018. - * All right reserved - * IF you have any question please email onlythen@yeah.net - */ - -var Gitment = - /******/ (function(modules) { // webpackBootstrap - /******/ // The module cache - /******/ var installedModules = {}; - /******/ - /******/ // The require function - /******/ function __webpack_require__(moduleId) { - /******/ - /******/ // Check if module is in cache - /******/ if(installedModules[moduleId]) - /******/ return installedModules[moduleId].exports; - /******/ - /******/ // Create a new module (and put it into the cache) - /******/ var module = installedModules[moduleId] = { - /******/ i: moduleId, - /******/ l: false, - /******/ exports: {} - /******/ }; - /******/ - /******/ // Execute the module function - /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - /******/ - /******/ // Flag the module as loaded - /******/ module.l = true; - /******/ - /******/ // Return the exports of the module - /******/ return module.exports; - /******/ } - /******/ - /******/ - /******/ // expose the modules object (__webpack_modules__) - /******/ __webpack_require__.m = modules; - /******/ - /******/ // expose the module cache - /******/ __webpack_require__.c = installedModules; - /******/ - /******/ // identity function for calling harmony imports with the correct context - /******/ __webpack_require__.i = function(value) { return value; }; - /******/ - /******/ // define getter function for harmony exports - /******/ __webpack_require__.d = function(exports, name, getter) { - /******/ if(!__webpack_require__.o(exports, name)) { - /******/ Object.defineProperty(exports, name, { - /******/ configurable: false, - /******/ enumerable: true, - /******/ get: getter - /******/ }); - /******/ } - /******/ }; - /******/ - /******/ // getDefaultExport function for compatibility with non-harmony modules - /******/ __webpack_require__.n = function(module) { - /******/ var getter = module && module.__esModule ? - /******/ function getDefault() { return module['default']; } : - /******/ function getModuleExports() { return module; }; - /******/ __webpack_require__.d(getter, 'a', getter); - /******/ return getter; - /******/ }; - /******/ - /******/ // Object.prototype.hasOwnProperty.call - /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; - /******/ - /******/ // __webpack_public_path__ - /******/ __webpack_require__.p = ""; - /******/ - /******/ // Load entry module and return exports - /******/ return __webpack_require__(__webpack_require__.s = 5); - /******/ }) -/************************************************************************/ -/******/ ([ - /* 0 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var LS_ACCESS_TOKEN_KEY = exports.LS_ACCESS_TOKEN_KEY = 'gitment-comments-token'; - var LS_USER_KEY = exports.LS_USER_KEY = 'gitment-user-info'; - - var NOT_INITIALIZED_ERROR = exports.NOT_INITIALIZED_ERROR = new Error('Comments Not Initialized'); - - /***/ }), - /* 1 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - /* WEBPACK VAR INJECTION */(function(global) { - - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - - var __extends = undefined && undefined.__extends || function () { - var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (d, b) { - d.__proto__ = b; - } || function (d, b) { - for (var p in b) { - if (b.hasOwnProperty(p)) d[p] = b[p]; - } - }; - return function (d, b) { - extendStatics(d, b); - function __() { - this.constructor = d; - } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - }(); - Object.defineProperty(exports, "__esModule", { value: true }); - registerGlobals(); - exports.extras = { - allowStateChanges: allowStateChanges, - deepEqual: deepEqual, - getAtom: getAtom, - getDebugName: getDebugName, - getDependencyTree: getDependencyTree, - getAdministration: getAdministration, - getGlobalState: getGlobalState, - getObserverTree: getObserverTree, - isComputingDerivation: isComputingDerivation, - isSpyEnabled: isSpyEnabled, - onReactionError: onReactionError, - resetGlobalState: resetGlobalState, - shareGlobalState: shareGlobalState, - spyReport: spyReport, - spyReportEnd: spyReportEnd, - spyReportStart: spyReportStart, - setReactionScheduler: setReactionScheduler - }; - if ((typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__ === "undefined" ? "undefined" : _typeof(__MOBX_DEVTOOLS_GLOBAL_HOOK__)) === "object") { - __MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobx(module.exports); - } - module.exports.default = module.exports; - var actionFieldDecorator = createClassPropertyDecorator(function (target, key, value, args, originalDescriptor) { - var actionName = args && args.length === 1 ? args[0] : value.name || key || ""; - var wrappedAction = action(actionName, value); - addHiddenProp(target, key, wrappedAction); - }, function (key) { - return this[key]; - }, function () { - invariant(false, getMessage("m001")); - }, false, true); - var boundActionDecorator = createClassPropertyDecorator(function (target, key, value) { - defineBoundAction(target, key, value); - }, function (key) { - return this[key]; - }, function () { - invariant(false, getMessage("m001")); - }, false, false); - var action = function action(arg1, arg2, arg3, arg4) { - if (arguments.length === 1 && typeof arg1 === "function") return createAction(arg1.name || "", arg1); - if (arguments.length === 2 && typeof arg2 === "function") return createAction(arg1, arg2); - if (arguments.length === 1 && typeof arg1 === "string") return namedActionDecorator(arg1); - return namedActionDecorator(arg2).apply(null, arguments); - }; - exports.action = action; - action.bound = function boundAction(arg1, arg2, arg3) { - if (typeof arg1 === "function") { - var action_1 = createAction("", arg1); - action_1.autoBind = true; - return action_1; - } - return boundActionDecorator.apply(null, arguments); - }; - function namedActionDecorator(name) { - return function (target, prop, descriptor) { - if (descriptor && typeof descriptor.value === "function") { - descriptor.value = createAction(name, descriptor.value); - descriptor.enumerable = false; - descriptor.configurable = true; - return descriptor; - } - return actionFieldDecorator(name).apply(this, arguments); - }; - } - function runInAction(arg1, arg2, arg3) { - var actionName = typeof arg1 === "string" ? arg1 : arg1.name || ""; - var fn = typeof arg1 === "function" ? arg1 : arg2; - var scope = typeof arg1 === "function" ? arg2 : arg3; - invariant(typeof fn === "function", getMessage("m002")); - invariant(fn.length === 0, getMessage("m003")); - invariant(typeof actionName === "string" && actionName.length > 0, "actions should have valid names, got: '" + actionName + "'"); - return executeAction(actionName, fn, scope, undefined); - } - exports.runInAction = runInAction; - function isAction(thing) { - return typeof thing === "function" && thing.isMobxAction === true; - } - exports.isAction = isAction; - function defineBoundAction(target, propertyName, fn) { - var res = function res() { - return executeAction(propertyName, fn, target, arguments); - }; - res.isMobxAction = true; - addHiddenProp(target, propertyName, res); - } - function autorun(arg1, arg2, arg3) { - var name, view, scope; - if (typeof arg1 === "string") { - name = arg1; - view = arg2; - scope = arg3; - } else { - name = arg1.name || "Autorun@" + getNextId(); - view = arg1; - scope = arg2; - } - invariant(typeof view === "function", getMessage("m004")); - invariant(isAction(view) === false, getMessage("m005")); - if (scope) view = view.bind(scope); - var reaction = new Reaction(name, function () { - this.track(reactionRunner); - }); - function reactionRunner() { - view(reaction); - } - reaction.schedule(); - return reaction.getDisposer(); - } - exports.autorun = autorun; - function when(arg1, arg2, arg3, arg4) { - var name, predicate, effect, scope; - if (typeof arg1 === "string") { - name = arg1; - predicate = arg2; - effect = arg3; - scope = arg4; - } else { - name = "When@" + getNextId(); - predicate = arg1; - effect = arg2; - scope = arg3; - } - var disposer = autorun(name, function (r) { - if (predicate.call(scope)) { - r.dispose(); - var prevUntracked = untrackedStart(); - effect.call(scope); - untrackedEnd(prevUntracked); - } - }); - return disposer; - } - exports.when = when; - function autorunAsync(arg1, arg2, arg3, arg4) { - var name, func, delay, scope; - if (typeof arg1 === "string") { - name = arg1; - func = arg2; - delay = arg3; - scope = arg4; - } else { - name = arg1.name || "AutorunAsync@" + getNextId(); - func = arg1; - delay = arg2; - scope = arg3; - } - invariant(isAction(func) === false, getMessage("m006")); - if (delay === void 0) delay = 1; - if (scope) func = func.bind(scope); - var isScheduled = false; - var r = new Reaction(name, function () { - if (!isScheduled) { - isScheduled = true; - setTimeout(function () { - isScheduled = false; - if (!r.isDisposed) r.track(reactionRunner); - }, delay); - } - }); - function reactionRunner() { - func(r); - } - r.schedule(); - return r.getDisposer(); - } - exports.autorunAsync = autorunAsync; - function reaction(expression, effect, arg3) { - if (arguments.length > 3) { - fail(getMessage("m007")); - } - if (isModifierDescriptor(expression)) { - fail(getMessage("m008")); - } - var opts; - if ((typeof arg3 === "undefined" ? "undefined" : _typeof(arg3)) === "object") { - opts = arg3; - } else { - opts = {}; - } - opts.name = opts.name || expression.name || effect.name || "Reaction@" + getNextId(); - opts.fireImmediately = arg3 === true || opts.fireImmediately === true; - opts.delay = opts.delay || 0; - opts.compareStructural = opts.compareStructural || opts.struct || false; - effect = action(opts.name, opts.context ? effect.bind(opts.context) : effect); - if (opts.context) { - expression = expression.bind(opts.context); - } - var firstTime = true; - var isScheduled = false; - var nextValue; - var r = new Reaction(opts.name, function () { - if (firstTime || opts.delay < 1) { - reactionRunner(); - } else if (!isScheduled) { - isScheduled = true; - setTimeout(function () { - isScheduled = false; - reactionRunner(); - }, opts.delay); - } - }); - function reactionRunner() { - if (r.isDisposed) return; - var changed = false; - r.track(function () { - var v = expression(r); - changed = valueDidChange(opts.compareStructural, nextValue, v); - nextValue = v; - }); - if (firstTime && opts.fireImmediately) effect(nextValue, r); - if (!firstTime && changed === true) effect(nextValue, r); - if (firstTime) firstTime = false; - } - r.schedule(); - return r.getDisposer(); - } - exports.reaction = reaction; - function createComputedDecorator(compareStructural) { - return createClassPropertyDecorator(function (target, name, _, __, originalDescriptor) { - invariant(typeof originalDescriptor !== "undefined", getMessage("m009")); - invariant(typeof originalDescriptor.get === "function", getMessage("m010")); - var adm = asObservableObject(target, ""); - defineComputedProperty(adm, name, originalDescriptor.get, originalDescriptor.set, compareStructural, false); - }, function (name) { - var observable = this.$mobx.values[name]; - if (observable === undefined) return undefined; - return observable.get(); - }, function (name, value) { - this.$mobx.values[name].set(value); - }, false, false); - } - var computedDecorator = createComputedDecorator(false); - var computedStructDecorator = createComputedDecorator(true); - var computed = function computed(arg1, arg2, arg3) { - if (typeof arg2 === "string") { - return computedDecorator.apply(null, arguments); - } - invariant(typeof arg1 === "function", getMessage("m011")); - invariant(arguments.length < 3, getMessage("m012")); - var opts = (typeof arg2 === "undefined" ? "undefined" : _typeof(arg2)) === "object" ? arg2 : {}; - opts.setter = typeof arg2 === "function" ? arg2 : opts.setter; - return new ComputedValue(arg1, opts.context, opts.compareStructural || opts.struct || false, opts.name || arg1.name || "", opts.setter); - }; - exports.computed = computed; - computed.struct = computedStructDecorator; - function createTransformer(transformer, onCleanup) { - invariant(typeof transformer === "function" && transformer.length < 2, "createTransformer expects a function that accepts one argument"); - var objectCache = {}; - var resetId = globalState.resetId; - var Transformer = function (_super) { - __extends(Transformer, _super); - function Transformer(sourceIdentifier, sourceObject) { - var _this = _super.call(this, function () { - return transformer(sourceObject); - }, undefined, false, "Transformer-" + transformer.name + "-" + sourceIdentifier, undefined) || this; - _this.sourceIdentifier = sourceIdentifier; - _this.sourceObject = sourceObject; - return _this; - } - Transformer.prototype.onBecomeUnobserved = function () { - var lastValue = this.value; - _super.prototype.onBecomeUnobserved.call(this); - delete objectCache[this.sourceIdentifier]; - if (onCleanup) onCleanup(lastValue, this.sourceObject); - }; - return Transformer; - }(ComputedValue); - return function (object) { - if (resetId !== globalState.resetId) { - objectCache = {}; - resetId = globalState.resetId; - } - var identifier = getMemoizationId(object); - var reactiveTransformer = objectCache[identifier]; - if (reactiveTransformer) return reactiveTransformer.get(); - reactiveTransformer = objectCache[identifier] = new Transformer(identifier, object); - return reactiveTransformer.get(); - }; - } - exports.createTransformer = createTransformer; - function getMemoizationId(object) { - if (object === null || (typeof object === "undefined" ? "undefined" : _typeof(object)) !== "object") throw new Error("[mobx] transform expected some kind of object, got: " + object); - var tid = object.$transformId; - if (tid === undefined) { - tid = getNextId(); - addHiddenProp(object, "$transformId", tid); - } - return tid; - } - function expr(expr, scope) { - if (!isComputingDerivation()) console.warn(getMessage("m013")); - return computed(expr, { context: scope }).get(); - } - exports.expr = expr; - function extendObservable(target) { - var properties = []; - for (var _i = 1; _i < arguments.length; _i++) { - properties[_i - 1] = arguments[_i]; - } - return extendObservableHelper(target, deepEnhancer, properties); - } - exports.extendObservable = extendObservable; - function extendShallowObservable(target) { - var properties = []; - for (var _i = 1; _i < arguments.length; _i++) { - properties[_i - 1] = arguments[_i]; - } - return extendObservableHelper(target, referenceEnhancer, properties); - } - exports.extendShallowObservable = extendShallowObservable; - function extendObservableHelper(target, defaultEnhancer, properties) { - invariant(arguments.length >= 2, getMessage("m014")); - invariant((typeof target === "undefined" ? "undefined" : _typeof(target)) === "object", getMessage("m015")); - invariant(!isObservableMap(target), getMessage("m016")); - properties.forEach(function (propSet) { - invariant((typeof propSet === "undefined" ? "undefined" : _typeof(propSet)) === "object", getMessage("m017")); - invariant(!isObservable(propSet), getMessage("m018")); - }); - var adm = asObservableObject(target); - var definedProps = {}; - for (var i = properties.length - 1; i >= 0; i--) { - var propSet = properties[i]; - for (var key in propSet) { - if (definedProps[key] !== true && hasOwnProperty(propSet, key)) { - definedProps[key] = true; - if (target === propSet && !isPropertyConfigurable(target, key)) continue; - var descriptor = Object.getOwnPropertyDescriptor(propSet, key); - defineObservablePropertyFromDescriptor(adm, key, descriptor, defaultEnhancer); - } - } - } - return target; - } - function getDependencyTree(thing, property) { - return nodeToDependencyTree(getAtom(thing, property)); - } - function nodeToDependencyTree(node) { - var result = { - name: node.name - }; - if (node.observing && node.observing.length > 0) result.dependencies = unique(node.observing).map(nodeToDependencyTree); - return result; - } - function getObserverTree(thing, property) { - return nodeToObserverTree(getAtom(thing, property)); - } - function nodeToObserverTree(node) { - var result = { - name: node.name - }; - if (hasObservers(node)) result.observers = getObservers(node).map(nodeToObserverTree); - return result; - } - function intercept(thing, propOrHandler, handler) { - if (typeof handler === "function") return interceptProperty(thing, propOrHandler, handler);else return interceptInterceptable(thing, propOrHandler); - } - exports.intercept = intercept; - function interceptInterceptable(thing, handler) { - return getAdministration(thing).intercept(handler); - } - function interceptProperty(thing, property, handler) { - return getAdministration(thing, property).intercept(handler); - } - function isComputed(value, property) { - if (value === null || value === undefined) return false; - if (property !== undefined) { - if (isObservableObject(value) === false) return false; - var atom = getAtom(value, property); - return isComputedValue(atom); - } - return isComputedValue(value); - } - exports.isComputed = isComputed; - function isObservable(value, property) { - if (value === null || value === undefined) return false; - if (property !== undefined) { - if (isObservableArray(value) || isObservableMap(value)) throw new Error(getMessage("m019"));else if (isObservableObject(value)) { - var o = value.$mobx; - return o.values && !!o.values[property]; - } - return false; - } - return isObservableObject(value) || !!value.$mobx || isAtom(value) || isReaction(value) || isComputedValue(value); - } - exports.isObservable = isObservable; - var deepDecorator = createDecoratorForEnhancer(deepEnhancer); - var shallowDecorator = createDecoratorForEnhancer(shallowEnhancer); - var refDecorator = createDecoratorForEnhancer(referenceEnhancer); - var deepStructDecorator = createDecoratorForEnhancer(deepStructEnhancer); - var refStructDecorator = createDecoratorForEnhancer(refStructEnhancer); - function createObservable(v) { - if (v === void 0) { - v = undefined; - } - if (typeof arguments[1] === "string") return deepDecorator.apply(null, arguments); - invariant(arguments.length <= 1, getMessage("m021")); - invariant(!isModifierDescriptor(v), getMessage("m020")); - if (isObservable(v)) return v; - var res = deepEnhancer(v, undefined, undefined); - if (res !== v) return res; - return observable.box(v); - } - var IObservableFactories = function () { - function IObservableFactories() {} - IObservableFactories.prototype.box = function (value, name) { - if (arguments.length > 2) incorrectlyUsedAsDecorator("box"); - return new ObservableValue(value, deepEnhancer, name); - }; - IObservableFactories.prototype.shallowBox = function (value, name) { - if (arguments.length > 2) incorrectlyUsedAsDecorator("shallowBox"); - return new ObservableValue(value, referenceEnhancer, name); - }; - IObservableFactories.prototype.array = function (initialValues, name) { - if (arguments.length > 2) incorrectlyUsedAsDecorator("array"); - return new ObservableArray(initialValues, deepEnhancer, name); - }; - IObservableFactories.prototype.shallowArray = function (initialValues, name) { - if (arguments.length > 2) incorrectlyUsedAsDecorator("shallowArray"); - return new ObservableArray(initialValues, referenceEnhancer, name); - }; - IObservableFactories.prototype.map = function (initialValues, name) { - if (arguments.length > 2) incorrectlyUsedAsDecorator("map"); - return new ObservableMap(initialValues, deepEnhancer, name); - }; - IObservableFactories.prototype.shallowMap = function (initialValues, name) { - if (arguments.length > 2) incorrectlyUsedAsDecorator("shallowMap"); - return new ObservableMap(initialValues, referenceEnhancer, name); - }; - IObservableFactories.prototype.object = function (props, name) { - if (arguments.length > 2) incorrectlyUsedAsDecorator("object"); - var res = {}; - asObservableObject(res, name); - extendObservable(res, props); - return res; - }; - IObservableFactories.prototype.shallowObject = function (props, name) { - if (arguments.length > 2) incorrectlyUsedAsDecorator("shallowObject"); - var res = {}; - asObservableObject(res, name); - extendShallowObservable(res, props); - return res; - }; - IObservableFactories.prototype.ref = function () { - if (arguments.length < 2) { - return createModifierDescriptor(referenceEnhancer, arguments[0]); - } else { - return refDecorator.apply(null, arguments); - } - }; - IObservableFactories.prototype.shallow = function () { - if (arguments.length < 2) { - return createModifierDescriptor(shallowEnhancer, arguments[0]); - } else { - return shallowDecorator.apply(null, arguments); - } - }; - IObservableFactories.prototype.deep = function () { - if (arguments.length < 2) { - return createModifierDescriptor(deepEnhancer, arguments[0]); - } else { - return deepDecorator.apply(null, arguments); - } - }; - IObservableFactories.prototype.struct = function () { - if (arguments.length < 2) { - return createModifierDescriptor(deepStructEnhancer, arguments[0]); - } else { - return deepStructDecorator.apply(null, arguments); - } - }; - return IObservableFactories; - }(); - exports.IObservableFactories = IObservableFactories; - var observable = createObservable; - exports.observable = observable; - Object.keys(IObservableFactories.prototype).forEach(function (key) { - return observable[key] = IObservableFactories.prototype[key]; - }); - observable.deep.struct = observable.struct; - observable.ref.struct = function () { - if (arguments.length < 2) { - return createModifierDescriptor(refStructEnhancer, arguments[0]); - } else { - return refStructDecorator.apply(null, arguments); - } - }; - function incorrectlyUsedAsDecorator(methodName) { - fail("Expected one or two arguments to observable." + methodName + ". Did you accidentally try to use observable." + methodName + " as decorator?"); - } - function createDecoratorForEnhancer(enhancer) { - invariant(!!enhancer, ":("); - return createClassPropertyDecorator(function (target, name, baseValue, _, baseDescriptor) { - assertPropertyConfigurable(target, name); - invariant(!baseDescriptor || !baseDescriptor.get, getMessage("m022")); - var adm = asObservableObject(target, undefined); - defineObservableProperty(adm, name, baseValue, enhancer); - }, function (name) { - var observable = this.$mobx.values[name]; - if (observable === undefined) return undefined; - return observable.get(); - }, function (name, value) { - setPropertyValue(this, name, value); - }, true, false); - } - function observe(thing, propOrCb, cbOrFire, fireImmediately) { - if (typeof cbOrFire === "function") return observeObservableProperty(thing, propOrCb, cbOrFire, fireImmediately);else return observeObservable(thing, propOrCb, cbOrFire); - } - exports.observe = observe; - function observeObservable(thing, listener, fireImmediately) { - return getAdministration(thing).observe(listener, fireImmediately); - } - function observeObservableProperty(thing, property, listener, fireImmediately) { - return getAdministration(thing, property).observe(listener, fireImmediately); - } - function toJS(source, detectCycles, __alreadySeen) { - if (detectCycles === void 0) { - detectCycles = true; - } - if (__alreadySeen === void 0) { - __alreadySeen = []; - } - function cache(value) { - if (detectCycles) __alreadySeen.push([source, value]); - return value; - } - if (isObservable(source)) { - if (detectCycles && __alreadySeen === null) __alreadySeen = []; - if (detectCycles && source !== null && (typeof source === "undefined" ? "undefined" : _typeof(source)) === "object") { - for (var i = 0, l = __alreadySeen.length; i < l; i++) { - if (__alreadySeen[i][0] === source) return __alreadySeen[i][1]; - } - } - if (isObservableArray(source)) { - var res = cache([]); - var toAdd = source.map(function (value) { - return toJS(value, detectCycles, __alreadySeen); - }); - res.length = toAdd.length; - for (var i = 0, l = toAdd.length; i < l; i++) { - res[i] = toAdd[i]; - }return res; - } - if (isObservableObject(source)) { - var res = cache({}); - for (var key in source) { - res[key] = toJS(source[key], detectCycles, __alreadySeen); - }return res; - } - if (isObservableMap(source)) { - var res_1 = cache({}); - source.forEach(function (value, key) { - return res_1[key] = toJS(value, detectCycles, __alreadySeen); - }); - return res_1; - } - if (isObservableValue(source)) return toJS(source.get(), detectCycles, __alreadySeen); - } - return source; - } - exports.toJS = toJS; - function transaction(action, thisArg) { - if (thisArg === void 0) { - thisArg = undefined; - } - deprecated(getMessage("m023")); - return runInTransaction.apply(undefined, arguments); - } - exports.transaction = transaction; - function runInTransaction(action, thisArg) { - if (thisArg === void 0) { - thisArg = undefined; - } - return executeAction("", action); - } - function log(msg) { - console.log(msg); - return msg; - } - function whyRun(thing, prop) { - switch (arguments.length) { - case 0: - thing = globalState.trackingDerivation; - if (!thing) return log(getMessage("m024")); - break; - case 2: - thing = getAtom(thing, prop); - break; - } - thing = getAtom(thing); - if (isComputedValue(thing)) return log(thing.whyRun());else if (isReaction(thing)) return log(thing.whyRun()); - return fail(getMessage("m025")); - } - exports.whyRun = whyRun; - function createAction(actionName, fn) { - invariant(typeof fn === "function", getMessage("m026")); - invariant(typeof actionName === "string" && actionName.length > 0, "actions should have valid names, got: '" + actionName + "'"); - var res = function res() { - return executeAction(actionName, fn, this, arguments); - }; - res.originalFn = fn; - res.isMobxAction = true; - return res; - } - function executeAction(actionName, fn, scope, args) { - var runInfo = startAction(actionName, fn, scope, args); - try { - return fn.apply(scope, args); - } finally { - endAction(runInfo); - } - } - function startAction(actionName, fn, scope, args) { - var notifySpy = isSpyEnabled() && !!actionName; - var startTime = 0; - if (notifySpy) { - startTime = Date.now(); - var l = args && args.length || 0; - var flattendArgs = new Array(l); - if (l > 0) for (var i = 0; i < l; i++) { - flattendArgs[i] = args[i]; - }spyReportStart({ - type: "action", - name: actionName, - fn: fn, - object: scope, - arguments: flattendArgs - }); - } - var prevDerivation = untrackedStart(); - startBatch(); - var prevAllowStateChanges = allowStateChangesStart(true); - return { - prevDerivation: prevDerivation, - prevAllowStateChanges: prevAllowStateChanges, - notifySpy: notifySpy, - startTime: startTime - }; - } - function endAction(runInfo) { - allowStateChangesEnd(runInfo.prevAllowStateChanges); - endBatch(); - untrackedEnd(runInfo.prevDerivation); - if (runInfo.notifySpy) spyReportEnd({ time: Date.now() - runInfo.startTime }); - } - function useStrict(strict) { - invariant(globalState.trackingDerivation === null, getMessage("m028")); - globalState.strictMode = strict; - globalState.allowStateChanges = !strict; - } - exports.useStrict = useStrict; - function isStrictModeEnabled() { - return globalState.strictMode; - } - exports.isStrictModeEnabled = isStrictModeEnabled; - function allowStateChanges(allowStateChanges, func) { - var prev = allowStateChangesStart(allowStateChanges); - var res; - try { - res = func(); - } finally { - allowStateChangesEnd(prev); - } - return res; - } - function allowStateChangesStart(allowStateChanges) { - var prev = globalState.allowStateChanges; - globalState.allowStateChanges = allowStateChanges; - return prev; - } - function allowStateChangesEnd(prev) { - globalState.allowStateChanges = prev; - } - var BaseAtom = function () { - function BaseAtom(name) { - if (name === void 0) { - name = "Atom@" + getNextId(); - } - this.name = name; - this.isPendingUnobservation = true; - this.observers = []; - this.observersIndexes = {}; - this.diffValue = 0; - this.lastAccessedBy = 0; - this.lowestObserverState = IDerivationState.NOT_TRACKING; - } - BaseAtom.prototype.onBecomeUnobserved = function () {}; - BaseAtom.prototype.reportObserved = function () { - reportObserved(this); - }; - BaseAtom.prototype.reportChanged = function () { - startBatch(); - propagateChanged(this); - endBatch(); - }; - BaseAtom.prototype.toString = function () { - return this.name; - }; - return BaseAtom; - }(); - exports.BaseAtom = BaseAtom; - var Atom = function (_super) { - __extends(Atom, _super); - function Atom(name, onBecomeObservedHandler, onBecomeUnobservedHandler) { - if (name === void 0) { - name = "Atom@" + getNextId(); - } - if (onBecomeObservedHandler === void 0) { - onBecomeObservedHandler = noop; - } - if (onBecomeUnobservedHandler === void 0) { - onBecomeUnobservedHandler = noop; - } - var _this = _super.call(this, name) || this; - _this.name = name; - _this.onBecomeObservedHandler = onBecomeObservedHandler; - _this.onBecomeUnobservedHandler = onBecomeUnobservedHandler; - _this.isPendingUnobservation = false; - _this.isBeingTracked = false; - return _this; - } - Atom.prototype.reportObserved = function () { - startBatch(); - _super.prototype.reportObserved.call(this); - if (!this.isBeingTracked) { - this.isBeingTracked = true; - this.onBecomeObservedHandler(); - } - endBatch(); - return !!globalState.trackingDerivation; - }; - Atom.prototype.onBecomeUnobserved = function () { - this.isBeingTracked = false; - this.onBecomeUnobservedHandler(); - }; - return Atom; - }(BaseAtom); - exports.Atom = Atom; - var isAtom = createInstanceofPredicate("Atom", BaseAtom); - var ComputedValue = function () { - function ComputedValue(derivation, scope, compareStructural, name, setter) { - this.derivation = derivation; - this.scope = scope; - this.compareStructural = compareStructural; - this.dependenciesState = IDerivationState.NOT_TRACKING; - this.observing = []; - this.newObserving = null; - this.isPendingUnobservation = false; - this.observers = []; - this.observersIndexes = {}; - this.diffValue = 0; - this.runId = 0; - this.lastAccessedBy = 0; - this.lowestObserverState = IDerivationState.UP_TO_DATE; - this.unboundDepsCount = 0; - this.__mapid = "#" + getNextId(); - this.value = undefined; - this.isComputing = false; - this.isRunningSetter = false; - this.name = name || "ComputedValue@" + getNextId(); - if (setter) this.setter = createAction(name + "-setter", setter); - } - ComputedValue.prototype.onBecomeStale = function () { - propagateMaybeChanged(this); - }; - ComputedValue.prototype.onBecomeUnobserved = function () { - invariant(this.dependenciesState !== IDerivationState.NOT_TRACKING, getMessage("m029")); - clearObserving(this); - this.value = undefined; - }; - ComputedValue.prototype.get = function () { - invariant(!this.isComputing, "Cycle detected in computation " + this.name, this.derivation); - if (globalState.inBatch === 0) { - startBatch(); - if (shouldCompute(this)) this.value = this.computeValue(false); - endBatch(); - } else { - reportObserved(this); - if (shouldCompute(this)) if (this.trackAndCompute()) propagateChangeConfirmed(this); - } - var result = this.value; - if (isCaughtException(result)) throw result.cause; - return result; - }; - ComputedValue.prototype.peek = function () { - var res = this.computeValue(false); - if (isCaughtException(res)) throw res.cause; - return res; - }; - ComputedValue.prototype.set = function (value) { - if (this.setter) { - invariant(!this.isRunningSetter, "The setter of computed value '" + this.name + "' is trying to update itself. Did you intend to update an _observable_ value, instead of the computed property?"); - this.isRunningSetter = true; - try { - this.setter.call(this.scope, value); - } finally { - this.isRunningSetter = false; - } - } else invariant(false, "[ComputedValue '" + this.name + "'] It is not possible to assign a new value to a computed value."); - }; - ComputedValue.prototype.trackAndCompute = function () { - if (isSpyEnabled()) { - spyReport({ - object: this.scope, - type: "compute", - fn: this.derivation - }); - } - var oldValue = this.value; - var newValue = this.value = this.computeValue(true); - return isCaughtException(newValue) || valueDidChange(this.compareStructural, newValue, oldValue); - }; - ComputedValue.prototype.computeValue = function (track) { - this.isComputing = true; - globalState.computationDepth++; - var res; - if (track) { - res = trackDerivedFunction(this, this.derivation, this.scope); - } else { - try { - res = this.derivation.call(this.scope); - } catch (e) { - res = new CaughtException(e); - } - } - globalState.computationDepth--; - this.isComputing = false; - return res; - }; - ; - ComputedValue.prototype.observe = function (listener, fireImmediately) { - var _this = this; - var firstTime = true; - var prevValue = undefined; - return autorun(function () { - var newValue = _this.get(); - if (!firstTime || fireImmediately) { - var prevU = untrackedStart(); - listener({ - type: "update", - object: _this, - newValue: newValue, - oldValue: prevValue - }); - untrackedEnd(prevU); - } - firstTime = false; - prevValue = newValue; - }); - }; - ComputedValue.prototype.toJSON = function () { - return this.get(); - }; - ComputedValue.prototype.toString = function () { - return this.name + "[" + this.derivation.toString() + "]"; - }; - ComputedValue.prototype.valueOf = function () { - return toPrimitive(this.get()); - }; - ; - ComputedValue.prototype.whyRun = function () { - var isTracking = Boolean(globalState.trackingDerivation); - var observing = unique(this.isComputing ? this.newObserving : this.observing).map(function (dep) { - return dep.name; - }); - var observers = unique(getObservers(this).map(function (dep) { - return dep.name; - })); - return "\nWhyRun? computation '" + this.name + "':\n * Running because: " + (isTracking ? "[active] the value of this computation is needed by a reaction" : this.isComputing ? "[get] The value of this computed was requested outside a reaction" : "[idle] not running at the moment") + "\n" + (this.dependenciesState === IDerivationState.NOT_TRACKING ? getMessage("m032") : " * This computation will re-run if any of the following observables changes:\n " + joinStrings(observing) + "\n " + (this.isComputing && isTracking ? " (... or any observable accessed during the remainder of the current run)" : "") + "\n\t" + getMessage("m038") + "\n\n * If the outcome of this computation changes, the following observers will be re-run:\n " + joinStrings(observers) + "\n"); - }; - return ComputedValue; - }(); - ComputedValue.prototype[primitiveSymbol()] = ComputedValue.prototype.valueOf; - var isComputedValue = createInstanceofPredicate("ComputedValue", ComputedValue); - var IDerivationState; - (function (IDerivationState) { - IDerivationState[IDerivationState["NOT_TRACKING"] = -1] = "NOT_TRACKING"; - IDerivationState[IDerivationState["UP_TO_DATE"] = 0] = "UP_TO_DATE"; - IDerivationState[IDerivationState["POSSIBLY_STALE"] = 1] = "POSSIBLY_STALE"; - IDerivationState[IDerivationState["STALE"] = 2] = "STALE"; - })(IDerivationState || (IDerivationState = {})); - exports.IDerivationState = IDerivationState; - var CaughtException = function () { - function CaughtException(cause) { - this.cause = cause; - } - return CaughtException; - }(); - function isCaughtException(e) { - return e instanceof CaughtException; - } - function shouldCompute(derivation) { - switch (derivation.dependenciesState) { - case IDerivationState.UP_TO_DATE: - return false; - case IDerivationState.NOT_TRACKING: - case IDerivationState.STALE: - return true; - case IDerivationState.POSSIBLY_STALE: - { - var prevUntracked = untrackedStart(); - var obs = derivation.observing, - l = obs.length; - for (var i = 0; i < l; i++) { - var obj = obs[i]; - if (isComputedValue(obj)) { - try { - obj.get(); - } catch (e) { - untrackedEnd(prevUntracked); - return true; - } - if (derivation.dependenciesState === IDerivationState.STALE) { - untrackedEnd(prevUntracked); - return true; - } - } - } - changeDependenciesStateTo0(derivation); - untrackedEnd(prevUntracked); - return false; - } - } - } - function isComputingDerivation() { - return globalState.trackingDerivation !== null; - } - function checkIfStateModificationsAreAllowed(atom) { - var hasObservers = atom.observers.length > 0; - if (globalState.computationDepth > 0 && hasObservers) fail(getMessage("m031") + atom.name); - if (!globalState.allowStateChanges && hasObservers) fail(getMessage(globalState.strictMode ? "m030a" : "m030b") + atom.name); - } - function trackDerivedFunction(derivation, f, context) { - changeDependenciesStateTo0(derivation); - derivation.newObserving = new Array(derivation.observing.length + 100); - derivation.unboundDepsCount = 0; - derivation.runId = ++globalState.runId; - var prevTracking = globalState.trackingDerivation; - globalState.trackingDerivation = derivation; - var result; - try { - result = f.call(context); - } catch (e) { - result = new CaughtException(e); - } - globalState.trackingDerivation = prevTracking; - bindDependencies(derivation); - return result; - } - function bindDependencies(derivation) { - var prevObserving = derivation.observing; - var observing = derivation.observing = derivation.newObserving; - derivation.newObserving = null; - var i0 = 0, - l = derivation.unboundDepsCount; - for (var i = 0; i < l; i++) { - var dep = observing[i]; - if (dep.diffValue === 0) { - dep.diffValue = 1; - if (i0 !== i) observing[i0] = dep; - i0++; - } - } - observing.length = i0; - l = prevObserving.length; - while (l--) { - var dep = prevObserving[l]; - if (dep.diffValue === 0) { - removeObserver(dep, derivation); - } - dep.diffValue = 0; - } - while (i0--) { - var dep = observing[i0]; - if (dep.diffValue === 1) { - dep.diffValue = 0; - addObserver(dep, derivation); - } - } - } - function clearObserving(derivation) { - var obs = derivation.observing; - var i = obs.length; - while (i--) { - removeObserver(obs[i], derivation); - }derivation.dependenciesState = IDerivationState.NOT_TRACKING; - obs.length = 0; - } - function untracked(action) { - var prev = untrackedStart(); - var res = action(); - untrackedEnd(prev); - return res; - } - exports.untracked = untracked; - function untrackedStart() { - var prev = globalState.trackingDerivation; - globalState.trackingDerivation = null; - return prev; - } - function untrackedEnd(prev) { - globalState.trackingDerivation = prev; - } - function changeDependenciesStateTo0(derivation) { - if (derivation.dependenciesState === IDerivationState.UP_TO_DATE) return; - derivation.dependenciesState = IDerivationState.UP_TO_DATE; - var obs = derivation.observing; - var i = obs.length; - while (i--) { - obs[i].lowestObserverState = IDerivationState.UP_TO_DATE; - } - } - var persistentKeys = ["mobxGuid", "resetId", "spyListeners", "strictMode", "runId"]; - var MobXGlobals = function () { - function MobXGlobals() { - this.version = 5; - this.trackingDerivation = null; - this.computationDepth = 0; - this.runId = 0; - this.mobxGuid = 0; - this.inBatch = 0; - this.pendingUnobservations = []; - this.pendingReactions = []; - this.isRunningReactions = false; - this.allowStateChanges = true; - this.strictMode = false; - this.resetId = 0; - this.spyListeners = []; - this.globalReactionErrorHandlers = []; - } - return MobXGlobals; - }(); - var globalState = new MobXGlobals(); - function shareGlobalState() { - var global = getGlobal(); - var ownState = globalState; - if (global.__mobservableTrackingStack || global.__mobservableViewStack) throw new Error("[mobx] An incompatible version of mobservable is already loaded."); - if (global.__mobxGlobal && global.__mobxGlobal.version !== ownState.version) throw new Error("[mobx] An incompatible version of mobx is already loaded."); - if (global.__mobxGlobal) globalState = global.__mobxGlobal;else global.__mobxGlobal = ownState; - } - function getGlobalState() { - return globalState; - } - function registerGlobals() {} - function resetGlobalState() { - globalState.resetId++; - var defaultGlobals = new MobXGlobals(); - for (var key in defaultGlobals) { - if (persistentKeys.indexOf(key) === -1) globalState[key] = defaultGlobals[key]; - }globalState.allowStateChanges = !globalState.strictMode; - } - function hasObservers(observable) { - return observable.observers && observable.observers.length > 0; - } - function getObservers(observable) { - return observable.observers; - } - function invariantObservers(observable) { - var list = observable.observers; - var map = observable.observersIndexes; - var l = list.length; - for (var i = 0; i < l; i++) { - var id = list[i].__mapid; - if (i) { - invariant(map[id] === i, "INTERNAL ERROR maps derivation.__mapid to index in list"); - } else { - invariant(!(id in map), "INTERNAL ERROR observer on index 0 shouldnt be held in map."); - } - } - invariant(list.length === 0 || Object.keys(map).length === list.length - 1, "INTERNAL ERROR there is no junk in map"); - } - function addObserver(observable, node) { - var l = observable.observers.length; - if (l) { - observable.observersIndexes[node.__mapid] = l; - } - observable.observers[l] = node; - if (observable.lowestObserverState > node.dependenciesState) observable.lowestObserverState = node.dependenciesState; - } - function removeObserver(observable, node) { - if (observable.observers.length === 1) { - observable.observers.length = 0; - queueForUnobservation(observable); - } else { - var list = observable.observers; - var map_1 = observable.observersIndexes; - var filler = list.pop(); - if (filler !== node) { - var index = map_1[node.__mapid] || 0; - if (index) { - map_1[filler.__mapid] = index; - } else { - delete map_1[filler.__mapid]; - } - list[index] = filler; - } - delete map_1[node.__mapid]; - } - } - function queueForUnobservation(observable) { - if (!observable.isPendingUnobservation) { - observable.isPendingUnobservation = true; - globalState.pendingUnobservations.push(observable); - } - } - function startBatch() { - globalState.inBatch++; - } - function endBatch() { - if (--globalState.inBatch === 0) { - runReactions(); - var list = globalState.pendingUnobservations; - for (var i = 0; i < list.length; i++) { - var observable_1 = list[i]; - observable_1.isPendingUnobservation = false; - if (observable_1.observers.length === 0) { - observable_1.onBecomeUnobserved(); - } - } - globalState.pendingUnobservations = []; - } - } - function reportObserved(observable) { - var derivation = globalState.trackingDerivation; - if (derivation !== null) { - if (derivation.runId !== observable.lastAccessedBy) { - observable.lastAccessedBy = derivation.runId; - derivation.newObserving[derivation.unboundDepsCount++] = observable; - } - } else if (observable.observers.length === 0) { - queueForUnobservation(observable); - } - } - function invariantLOS(observable, msg) { - var min = getObservers(observable).reduce(function (a, b) { - return Math.min(a, b.dependenciesState); - }, 2); - if (min >= observable.lowestObserverState) return; - throw new Error("lowestObserverState is wrong for " + msg + " because " + min + " < " + observable.lowestObserverState); - } - function propagateChanged(observable) { - if (observable.lowestObserverState === IDerivationState.STALE) return; - observable.lowestObserverState = IDerivationState.STALE; - var observers = observable.observers; - var i = observers.length; - while (i--) { - var d = observers[i]; - if (d.dependenciesState === IDerivationState.UP_TO_DATE) d.onBecomeStale(); - d.dependenciesState = IDerivationState.STALE; - } - } - function propagateChangeConfirmed(observable) { - if (observable.lowestObserverState === IDerivationState.STALE) return; - observable.lowestObserverState = IDerivationState.STALE; - var observers = observable.observers; - var i = observers.length; - while (i--) { - var d = observers[i]; - if (d.dependenciesState === IDerivationState.POSSIBLY_STALE) d.dependenciesState = IDerivationState.STALE;else if (d.dependenciesState === IDerivationState.UP_TO_DATE) observable.lowestObserverState = IDerivationState.UP_TO_DATE; - } - } - function propagateMaybeChanged(observable) { - if (observable.lowestObserverState !== IDerivationState.UP_TO_DATE) return; - observable.lowestObserverState = IDerivationState.POSSIBLY_STALE; - var observers = observable.observers; - var i = observers.length; - while (i--) { - var d = observers[i]; - if (d.dependenciesState === IDerivationState.UP_TO_DATE) { - d.dependenciesState = IDerivationState.POSSIBLY_STALE; - d.onBecomeStale(); - } - } - } - var Reaction = function () { - function Reaction(name, onInvalidate) { - if (name === void 0) { - name = "Reaction@" + getNextId(); - } - this.name = name; - this.onInvalidate = onInvalidate; - this.observing = []; - this.newObserving = []; - this.dependenciesState = IDerivationState.NOT_TRACKING; - this.diffValue = 0; - this.runId = 0; - this.unboundDepsCount = 0; - this.__mapid = "#" + getNextId(); - this.isDisposed = false; - this._isScheduled = false; - this._isTrackPending = false; - this._isRunning = false; - } - Reaction.prototype.onBecomeStale = function () { - this.schedule(); - }; - Reaction.prototype.schedule = function () { - if (!this._isScheduled) { - this._isScheduled = true; - globalState.pendingReactions.push(this); - runReactions(); - } - }; - Reaction.prototype.isScheduled = function () { - return this._isScheduled; - }; - Reaction.prototype.runReaction = function () { - if (!this.isDisposed) { - startBatch(); - this._isScheduled = false; - if (shouldCompute(this)) { - this._isTrackPending = true; - this.onInvalidate(); - if (this._isTrackPending && isSpyEnabled()) { - spyReport({ - object: this, - type: "scheduled-reaction" - }); - } - } - endBatch(); - } - }; - Reaction.prototype.track = function (fn) { - startBatch(); - var notify = isSpyEnabled(); - var startTime; - if (notify) { - startTime = Date.now(); - spyReportStart({ - object: this, - type: "reaction", - fn: fn - }); - } - this._isRunning = true; - var result = trackDerivedFunction(this, fn, undefined); - this._isRunning = false; - this._isTrackPending = false; - if (this.isDisposed) { - clearObserving(this); - } - if (isCaughtException(result)) this.reportExceptionInDerivation(result.cause); - if (notify) { - spyReportEnd({ - time: Date.now() - startTime - }); - } - endBatch(); - }; - Reaction.prototype.reportExceptionInDerivation = function (error) { - var _this = this; - if (this.errorHandler) { - this.errorHandler(error, this); - return; - } - var message = "[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: '" + this; - var messageToUser = getMessage("m037"); - console.error(message || messageToUser, error); - if (isSpyEnabled()) { - spyReport({ - type: "error", - message: message, - error: error, - object: this - }); - } - globalState.globalReactionErrorHandlers.forEach(function (f) { - return f(error, _this); - }); - }; - Reaction.prototype.dispose = function () { - if (!this.isDisposed) { - this.isDisposed = true; - if (!this._isRunning) { - startBatch(); - clearObserving(this); - endBatch(); - } - } - }; - Reaction.prototype.getDisposer = function () { - var r = this.dispose.bind(this); - r.$mobx = this; - r.onError = registerErrorHandler; - return r; - }; - Reaction.prototype.toString = function () { - return "Reaction[" + this.name + "]"; - }; - Reaction.prototype.whyRun = function () { - var observing = unique(this._isRunning ? this.newObserving : this.observing).map(function (dep) { - return dep.name; - }); - return "\nWhyRun? reaction '" + this.name + "':\n * Status: [" + (this.isDisposed ? "stopped" : this._isRunning ? "running" : this.isScheduled() ? "scheduled" : "idle") + "]\n * This reaction will re-run if any of the following observables changes:\n " + joinStrings(observing) + "\n " + (this._isRunning ? " (... or any observable accessed during the remainder of the current run)" : "") + "\n\t" + getMessage("m038") + "\n"; - }; - return Reaction; - }(); - exports.Reaction = Reaction; - function registerErrorHandler(handler) { - invariant(this && this.$mobx && isReaction(this.$mobx), "Invalid `this`"); - invariant(!this.$mobx.errorHandler, "Only one onErrorHandler can be registered"); - this.$mobx.errorHandler = handler; - } - function onReactionError(handler) { - globalState.globalReactionErrorHandlers.push(handler); - return function () { - var idx = globalState.globalReactionErrorHandlers.indexOf(handler); - if (idx >= 0) globalState.globalReactionErrorHandlers.splice(idx, 1); - }; - } - var MAX_REACTION_ITERATIONS = 100; - var reactionScheduler = function reactionScheduler(f) { - return f(); - }; - function runReactions() { - if (globalState.inBatch > 0 || globalState.isRunningReactions) return; - reactionScheduler(runReactionsHelper); - } - function runReactionsHelper() { - globalState.isRunningReactions = true; - var allReactions = globalState.pendingReactions; - var iterations = 0; - while (allReactions.length > 0) { - if (++iterations === MAX_REACTION_ITERATIONS) { - console.error("Reaction doesn't converge to a stable state after " + MAX_REACTION_ITERATIONS + " iterations." + (" Probably there is a cycle in the reactive function: " + allReactions[0])); - allReactions.splice(0); - } - var remainingReactions = allReactions.splice(0); - for (var i = 0, l = remainingReactions.length; i < l; i++) { - remainingReactions[i].runReaction(); - } - } - globalState.isRunningReactions = false; - } - var isReaction = createInstanceofPredicate("Reaction", Reaction); - function setReactionScheduler(fn) { - var baseScheduler = reactionScheduler; - reactionScheduler = function reactionScheduler(f) { - return fn(function () { - return baseScheduler(f); - }); - }; - } - function isSpyEnabled() { - return !!globalState.spyListeners.length; - } - function spyReport(event) { - if (!globalState.spyListeners.length) return; - var listeners = globalState.spyListeners; - for (var i = 0, l = listeners.length; i < l; i++) { - listeners[i](event); - } - } - function spyReportStart(event) { - var change = objectAssign({}, event, { spyReportStart: true }); - spyReport(change); - } - var END_EVENT = { spyReportEnd: true }; - function spyReportEnd(change) { - if (change) spyReport(objectAssign({}, change, END_EVENT));else spyReport(END_EVENT); - } - function spy(listener) { - globalState.spyListeners.push(listener); - return once(function () { - var idx = globalState.spyListeners.indexOf(listener); - if (idx !== -1) globalState.spyListeners.splice(idx, 1); - }); - } - exports.spy = spy; - function hasInterceptors(interceptable) { - return interceptable.interceptors && interceptable.interceptors.length > 0; - } - function registerInterceptor(interceptable, handler) { - var interceptors = interceptable.interceptors || (interceptable.interceptors = []); - interceptors.push(handler); - return once(function () { - var idx = interceptors.indexOf(handler); - if (idx !== -1) interceptors.splice(idx, 1); - }); - } - function interceptChange(interceptable, change) { - var prevU = untrackedStart(); - try { - var interceptors = interceptable.interceptors; - if (interceptors) for (var i = 0, l = interceptors.length; i < l; i++) { - change = interceptors[i](change); - invariant(!change || change.type, "Intercept handlers should return nothing or a change object"); - if (!change) break; - } - return change; - } finally { - untrackedEnd(prevU); - } - } - function hasListeners(listenable) { - return listenable.changeListeners && listenable.changeListeners.length > 0; - } - function registerListener(listenable, handler) { - var listeners = listenable.changeListeners || (listenable.changeListeners = []); - listeners.push(handler); - return once(function () { - var idx = listeners.indexOf(handler); - if (idx !== -1) listeners.splice(idx, 1); - }); - } - function notifyListeners(listenable, change) { - var prevU = untrackedStart(); - var listeners = listenable.changeListeners; - if (!listeners) return; - listeners = listeners.slice(); - for (var i = 0, l = listeners.length; i < l; i++) { - listeners[i](change); - } - untrackedEnd(prevU); - } - function asReference(value) { - deprecated("asReference is deprecated, use observable.ref instead"); - return observable.ref(value); - } - exports.asReference = asReference; - function asStructure(value) { - deprecated("asStructure is deprecated. Use observable.struct, computed.struct or reaction options instead."); - return observable.struct(value); - } - exports.asStructure = asStructure; - function asFlat(value) { - deprecated("asFlat is deprecated, use observable.shallow instead"); - return observable.shallow(value); - } - exports.asFlat = asFlat; - function asMap(data) { - deprecated("asMap is deprecated, use observable.map or observable.shallowMap instead"); - return observable.map(data || {}); - } - exports.asMap = asMap; - function isModifierDescriptor(thing) { - return (typeof thing === "undefined" ? "undefined" : _typeof(thing)) === "object" && thing !== null && thing.isMobxModifierDescriptor === true; - } - exports.isModifierDescriptor = isModifierDescriptor; - function createModifierDescriptor(enhancer, initialValue) { - invariant(!isModifierDescriptor(initialValue), "Modifiers cannot be nested"); - return { - isMobxModifierDescriptor: true, - initialValue: initialValue, - enhancer: enhancer - }; - } - function deepEnhancer(v, _, name) { - if (isModifierDescriptor(v)) fail("You tried to assign a modifier wrapped value to a collection, please define modifiers when creating the collection, not when modifying it"); - if (isObservable(v)) return v; - if (Array.isArray(v)) return observable.array(v, name); - if (isPlainObject(v)) return observable.object(v, name); - if (isES6Map(v)) return observable.map(v, name); - return v; - } - function shallowEnhancer(v, _, name) { - if (isModifierDescriptor(v)) fail("You tried to assign a modifier wrapped value to a collection, please define modifiers when creating the collection, not when modifying it"); - if (v === undefined || v === null) return v; - if (isObservableObject(v) || isObservableArray(v) || isObservableMap(v)) return v; - if (Array.isArray(v)) return observable.shallowArray(v, name); - if (isPlainObject(v)) return observable.shallowObject(v, name); - if (isES6Map(v)) return observable.shallowMap(v, name); - return fail("The shallow modifier / decorator can only used in combination with arrays, objects and maps"); - } - function referenceEnhancer(newValue) { - return newValue; - } - function deepStructEnhancer(v, oldValue, name) { - if (deepEqual(v, oldValue)) return oldValue; - if (isObservable(v)) return v; - if (Array.isArray(v)) return new ObservableArray(v, deepStructEnhancer, name); - if (isES6Map(v)) return new ObservableMap(v, deepStructEnhancer, name); - if (isPlainObject(v)) { - var res = {}; - asObservableObject(res, name); - extendObservableHelper(res, deepStructEnhancer, [v]); - return res; - } - return v; - } - function refStructEnhancer(v, oldValue, name) { - if (deepEqual(v, oldValue)) return oldValue; - return v; - } - var MAX_SPLICE_SIZE = 10000; - var safariPrototypeSetterInheritanceBug = function () { - var v = false; - var p = {}; - Object.defineProperty(p, "0", { set: function set() { - v = true; - } }); - Object.create(p)["0"] = 1; - return v === false; - }(); - var OBSERVABLE_ARRAY_BUFFER_SIZE = 0; - var StubArray = function () { - function StubArray() {} - return StubArray; - }(); - StubArray.prototype = []; - var ObservableArrayAdministration = function () { - function ObservableArrayAdministration(name, enhancer, array, owned) { - this.array = array; - this.owned = owned; - this.lastKnownLength = 0; - this.interceptors = null; - this.changeListeners = null; - this.atom = new BaseAtom(name || "ObservableArray@" + getNextId()); - this.enhancer = function (newV, oldV) { - return enhancer(newV, oldV, name + "[..]"); - }; - } - ObservableArrayAdministration.prototype.intercept = function (handler) { - return registerInterceptor(this, handler); - }; - ObservableArrayAdministration.prototype.observe = function (listener, fireImmediately) { - if (fireImmediately === void 0) { - fireImmediately = false; - } - if (fireImmediately) { - listener({ - object: this.array, - type: "splice", - index: 0, - added: this.values.slice(), - addedCount: this.values.length, - removed: [], - removedCount: 0 - }); - } - return registerListener(this, listener); - }; - ObservableArrayAdministration.prototype.getArrayLength = function () { - this.atom.reportObserved(); - return this.values.length; - }; - ObservableArrayAdministration.prototype.setArrayLength = function (newLength) { - if (typeof newLength !== "number" || newLength < 0) throw new Error("[mobx.array] Out of range: " + newLength); - var currentLength = this.values.length; - if (newLength === currentLength) return;else if (newLength > currentLength) { - var newItems = new Array(newLength - currentLength); - for (var i = 0; i < newLength - currentLength; i++) { - newItems[i] = undefined; - }this.spliceWithArray(currentLength, 0, newItems); - } else this.spliceWithArray(newLength, currentLength - newLength); - }; - ObservableArrayAdministration.prototype.updateArrayLength = function (oldLength, delta) { - if (oldLength !== this.lastKnownLength) throw new Error("[mobx] Modification exception: the internal structure of an observable array was changed. Did you use peek() to change it?"); - this.lastKnownLength += delta; - if (delta > 0 && oldLength + delta + 1 > OBSERVABLE_ARRAY_BUFFER_SIZE) reserveArrayBuffer(oldLength + delta + 1); - }; - ObservableArrayAdministration.prototype.spliceWithArray = function (index, deleteCount, newItems) { - var _this = this; - checkIfStateModificationsAreAllowed(this.atom); - var length = this.values.length; - if (index === undefined) index = 0;else if (index > length) index = length;else if (index < 0) index = Math.max(0, length + index); - if (arguments.length === 1) deleteCount = length - index;else if (deleteCount === undefined || deleteCount === null) deleteCount = 0;else deleteCount = Math.max(0, Math.min(deleteCount, length - index)); - if (newItems === undefined) newItems = []; - if (hasInterceptors(this)) { - var change = interceptChange(this, { - object: this.array, - type: "splice", - index: index, - removedCount: deleteCount, - added: newItems - }); - if (!change) return EMPTY_ARRAY; - deleteCount = change.removedCount; - newItems = change.added; - } - newItems = newItems.map(function (v) { - return _this.enhancer(v, undefined); - }); - var lengthDelta = newItems.length - deleteCount; - this.updateArrayLength(length, lengthDelta); - var res = this.spliceItemsIntoValues(index, deleteCount, newItems); - if (deleteCount !== 0 || newItems.length !== 0) this.notifyArraySplice(index, newItems, res); - return res; - }; - ObservableArrayAdministration.prototype.spliceItemsIntoValues = function (index, deleteCount, newItems) { - if (newItems.length < MAX_SPLICE_SIZE) { - return (_a = this.values).splice.apply(_a, [index, deleteCount].concat(newItems)); - } else { - var res = this.values.slice(index, index + deleteCount); - this.values = this.values.slice(0, index).concat(newItems, this.values.slice(index + deleteCount)); - return res; - } - var _a; - }; - ObservableArrayAdministration.prototype.notifyArrayChildUpdate = function (index, newValue, oldValue) { - var notifySpy = !this.owned && isSpyEnabled(); - var notify = hasListeners(this); - var change = notify || notifySpy ? { - object: this.array, - type: "update", - index: index, newValue: newValue, oldValue: oldValue - } : null; - if (notifySpy) spyReportStart(change); - this.atom.reportChanged(); - if (notify) notifyListeners(this, change); - if (notifySpy) spyReportEnd(); - }; - ObservableArrayAdministration.prototype.notifyArraySplice = function (index, added, removed) { - var notifySpy = !this.owned && isSpyEnabled(); - var notify = hasListeners(this); - var change = notify || notifySpy ? { - object: this.array, - type: "splice", - index: index, removed: removed, added: added, - removedCount: removed.length, - addedCount: added.length - } : null; - if (notifySpy) spyReportStart(change); - this.atom.reportChanged(); - if (notify) notifyListeners(this, change); - if (notifySpy) spyReportEnd(); - }; - return ObservableArrayAdministration; - }(); - var ObservableArray = function (_super) { - __extends(ObservableArray, _super); - function ObservableArray(initialValues, enhancer, name, owned) { - if (name === void 0) { - name = "ObservableArray@" + getNextId(); - } - if (owned === void 0) { - owned = false; - } - var _this = _super.call(this) || this; - var adm = new ObservableArrayAdministration(name, enhancer, _this, owned); - addHiddenFinalProp(_this, "$mobx", adm); - if (initialValues && initialValues.length) { - adm.updateArrayLength(0, initialValues.length); - adm.values = initialValues.map(function (v) { - return enhancer(v, undefined, name + "[..]"); - }); - adm.notifyArraySplice(0, adm.values.slice(), EMPTY_ARRAY); - } else { - adm.values = []; - } - if (safariPrototypeSetterInheritanceBug) { - Object.defineProperty(adm.array, "0", ENTRY_0); - } - return _this; - } - ObservableArray.prototype.intercept = function (handler) { - return this.$mobx.intercept(handler); - }; - ObservableArray.prototype.observe = function (listener, fireImmediately) { - if (fireImmediately === void 0) { - fireImmediately = false; - } - return this.$mobx.observe(listener, fireImmediately); - }; - ObservableArray.prototype.clear = function () { - return this.splice(0); - }; - ObservableArray.prototype.concat = function () { - var arrays = []; - for (var _i = 0; _i < arguments.length; _i++) { - arrays[_i] = arguments[_i]; - } - this.$mobx.atom.reportObserved(); - return Array.prototype.concat.apply(this.peek(), arrays.map(function (a) { - return isObservableArray(a) ? a.peek() : a; - })); - }; - ObservableArray.prototype.replace = function (newItems) { - return this.$mobx.spliceWithArray(0, this.$mobx.values.length, newItems); - }; - ObservableArray.prototype.toJS = function () { - return this.slice(); - }; - ObservableArray.prototype.toJSON = function () { - return this.toJS(); - }; - ObservableArray.prototype.peek = function () { - return this.$mobx.values; - }; - ObservableArray.prototype.find = function (predicate, thisArg, fromIndex) { - if (fromIndex === void 0) { - fromIndex = 0; - } - this.$mobx.atom.reportObserved(); - var items = this.$mobx.values, - l = items.length; - for (var i = fromIndex; i < l; i++) { - if (predicate.call(thisArg, items[i], i, this)) return items[i]; - }return undefined; - }; - ObservableArray.prototype.splice = function (index, deleteCount) { - var newItems = []; - for (var _i = 2; _i < arguments.length; _i++) { - newItems[_i - 2] = arguments[_i]; - } - switch (arguments.length) { - case 0: - return []; - case 1: - return this.$mobx.spliceWithArray(index); - case 2: - return this.$mobx.spliceWithArray(index, deleteCount); - } - return this.$mobx.spliceWithArray(index, deleteCount, newItems); - }; - ObservableArray.prototype.spliceWithArray = function (index, deleteCount, newItems) { - return this.$mobx.spliceWithArray(index, deleteCount, newItems); - }; - ObservableArray.prototype.push = function () { - var items = []; - for (var _i = 0; _i < arguments.length; _i++) { - items[_i] = arguments[_i]; - } - var adm = this.$mobx; - adm.spliceWithArray(adm.values.length, 0, items); - return adm.values.length; - }; - ObservableArray.prototype.pop = function () { - return this.splice(Math.max(this.$mobx.values.length - 1, 0), 1)[0]; - }; - ObservableArray.prototype.shift = function () { - return this.splice(0, 1)[0]; - }; - ObservableArray.prototype.unshift = function () { - var items = []; - for (var _i = 0; _i < arguments.length; _i++) { - items[_i] = arguments[_i]; - } - var adm = this.$mobx; - adm.spliceWithArray(0, 0, items); - return adm.values.length; - }; - ObservableArray.prototype.reverse = function () { - this.$mobx.atom.reportObserved(); - var clone = this.slice(); - return clone.reverse.apply(clone, arguments); - }; - ObservableArray.prototype.sort = function (compareFn) { - this.$mobx.atom.reportObserved(); - var clone = this.slice(); - return clone.sort.apply(clone, arguments); - }; - ObservableArray.prototype.remove = function (value) { - var idx = this.$mobx.values.indexOf(value); - if (idx > -1) { - this.splice(idx, 1); - return true; - } - return false; - }; - ObservableArray.prototype.move = function (fromIndex, toIndex) { - function checkIndex(index) { - if (index < 0) { - throw new Error("[mobx.array] Index out of bounds: " + index + " is negative"); - } - var length = this.$mobx.values.length; - if (index >= length) { - throw new Error("[mobx.array] Index out of bounds: " + index + " is not smaller than " + length); - } - } - checkIndex.call(this, fromIndex); - checkIndex.call(this, toIndex); - if (fromIndex === toIndex) { - return; - } - var oldItems = this.$mobx.values; - var newItems; - if (fromIndex < toIndex) { - newItems = oldItems.slice(0, fromIndex).concat(oldItems.slice(fromIndex + 1, toIndex + 1), [oldItems[fromIndex]], oldItems.slice(toIndex + 1)); - } else { - newItems = oldItems.slice(0, toIndex).concat([oldItems[fromIndex]], oldItems.slice(toIndex, fromIndex), oldItems.slice(fromIndex + 1)); - } - this.replace(newItems); - }; - ObservableArray.prototype.toString = function () { - this.$mobx.atom.reportObserved(); - return Array.prototype.toString.apply(this.$mobx.values, arguments); - }; - ObservableArray.prototype.toLocaleString = function () { - this.$mobx.atom.reportObserved(); - return Array.prototype.toLocaleString.apply(this.$mobx.values, arguments); - }; - return ObservableArray; - }(StubArray); - declareIterator(ObservableArray.prototype, function () { - return arrayAsIterator(this.slice()); - }); - makeNonEnumerable(ObservableArray.prototype, ["constructor", "intercept", "observe", "clear", "concat", "replace", "toJS", "toJSON", "peek", "find", "splice", "spliceWithArray", "push", "pop", "shift", "unshift", "reverse", "sort", "remove", "move", "toString", "toLocaleString"]); - Object.defineProperty(ObservableArray.prototype, "length", { - enumerable: false, - configurable: true, - get: function get() { - return this.$mobx.getArrayLength(); - }, - set: function set(newLength) { - this.$mobx.setArrayLength(newLength); - } - }); - ["every", "filter", "forEach", "indexOf", "join", "lastIndexOf", "map", "reduce", "reduceRight", "slice", "some"].forEach(function (funcName) { - var baseFunc = Array.prototype[funcName]; - invariant(typeof baseFunc === "function", "Base function not defined on Array prototype: '" + funcName + "'"); - addHiddenProp(ObservableArray.prototype, funcName, function () { - this.$mobx.atom.reportObserved(); - return baseFunc.apply(this.$mobx.values, arguments); - }); - }); - var ENTRY_0 = { - configurable: true, - enumerable: false, - set: createArraySetter(0), - get: createArrayGetter(0) - }; - function createArrayBufferItem(index) { - var set = createArraySetter(index); - var get = createArrayGetter(index); - Object.defineProperty(ObservableArray.prototype, "" + index, { - enumerable: false, - configurable: true, - set: set, get: get - }); - } - function createArraySetter(index) { - return function (newValue) { - var adm = this.$mobx; - var values = adm.values; - if (index < values.length) { - checkIfStateModificationsAreAllowed(adm.atom); - var oldValue = values[index]; - if (hasInterceptors(adm)) { - var change = interceptChange(adm, { - type: "update", - object: adm.array, - index: index, newValue: newValue - }); - if (!change) return; - newValue = change.newValue; - } - newValue = adm.enhancer(newValue, oldValue); - var changed = newValue !== oldValue; - if (changed) { - values[index] = newValue; - adm.notifyArrayChildUpdate(index, newValue, oldValue); - } - } else if (index === values.length) { - adm.spliceWithArray(index, 0, [newValue]); - } else throw new Error("[mobx.array] Index out of bounds, " + index + " is larger than " + values.length); - }; - } - function createArrayGetter(index) { - return function () { - var impl = this.$mobx; - if (impl) { - if (index < impl.values.length) { - impl.atom.reportObserved(); - return impl.values[index]; - } - console.warn("[mobx.array] Attempt to read an array index (" + index + ") that is out of bounds (" + impl.values.length + "). Please check length first. Out of bound indices will not be tracked by MobX"); - } - return undefined; - }; - } - function reserveArrayBuffer(max) { - for (var index = OBSERVABLE_ARRAY_BUFFER_SIZE; index < max; index++) { - createArrayBufferItem(index); - }OBSERVABLE_ARRAY_BUFFER_SIZE = max; - } - reserveArrayBuffer(1000); - var isObservableArrayAdministration = createInstanceofPredicate("ObservableArrayAdministration", ObservableArrayAdministration); - function isObservableArray(thing) { - return isObject(thing) && isObservableArrayAdministration(thing.$mobx); - } - exports.isObservableArray = isObservableArray; - var ObservableMapMarker = {}; - var ObservableMap = function () { - function ObservableMap(initialData, enhancer, name) { - if (enhancer === void 0) { - enhancer = deepEnhancer; - } - if (name === void 0) { - name = "ObservableMap@" + getNextId(); - } - this.enhancer = enhancer; - this.name = name; - this.$mobx = ObservableMapMarker; - this._data = {}; - this._hasMap = {}; - this._keys = new ObservableArray(undefined, referenceEnhancer, this.name + ".keys()", true); - this.interceptors = null; - this.changeListeners = null; - this.merge(initialData); - } - ObservableMap.prototype._has = function (key) { - return typeof this._data[key] !== "undefined"; - }; - ObservableMap.prototype.has = function (key) { - if (!this.isValidKey(key)) return false; - key = "" + key; - if (this._hasMap[key]) return this._hasMap[key].get(); - return this._updateHasMapEntry(key, false).get(); - }; - ObservableMap.prototype.set = function (key, value) { - this.assertValidKey(key); - key = "" + key; - var hasKey = this._has(key); - if (hasInterceptors(this)) { - var change = interceptChange(this, { - type: hasKey ? "update" : "add", - object: this, - newValue: value, - name: key - }); - if (!change) return this; - value = change.newValue; - } - if (hasKey) { - this._updateValue(key, value); - } else { - this._addValue(key, value); - } - return this; - }; - ObservableMap.prototype.delete = function (key) { - var _this = this; - this.assertValidKey(key); - key = "" + key; - if (hasInterceptors(this)) { - var change = interceptChange(this, { - type: "delete", - object: this, - name: key - }); - if (!change) return false; - } - if (this._has(key)) { - var notifySpy = isSpyEnabled(); - var notify = hasListeners(this); - var change = notify || notifySpy ? { - type: "delete", - object: this, - oldValue: this._data[key].value, - name: key - } : null; - if (notifySpy) spyReportStart(change); - runInTransaction(function () { - _this._keys.remove(key); - _this._updateHasMapEntry(key, false); - var observable = _this._data[key]; - observable.setNewValue(undefined); - _this._data[key] = undefined; - }); - if (notify) notifyListeners(this, change); - if (notifySpy) spyReportEnd(); - return true; - } - return false; - }; - ObservableMap.prototype._updateHasMapEntry = function (key, value) { - var entry = this._hasMap[key]; - if (entry) { - entry.setNewValue(value); - } else { - entry = this._hasMap[key] = new ObservableValue(value, referenceEnhancer, this.name + "." + key + "?", false); - } - return entry; - }; - ObservableMap.prototype._updateValue = function (name, newValue) { - var observable = this._data[name]; - newValue = observable.prepareNewValue(newValue); - if (newValue !== UNCHANGED) { - var notifySpy = isSpyEnabled(); - var notify = hasListeners(this); - var change = notify || notifySpy ? { - type: "update", - object: this, - oldValue: observable.value, - name: name, newValue: newValue - } : null; - if (notifySpy) spyReportStart(change); - observable.setNewValue(newValue); - if (notify) notifyListeners(this, change); - if (notifySpy) spyReportEnd(); - } - }; - ObservableMap.prototype._addValue = function (name, newValue) { - var _this = this; - runInTransaction(function () { - var observable = _this._data[name] = new ObservableValue(newValue, _this.enhancer, _this.name + "." + name, false); - newValue = observable.value; - _this._updateHasMapEntry(name, true); - _this._keys.push(name); - }); - var notifySpy = isSpyEnabled(); - var notify = hasListeners(this); - var change = notify || notifySpy ? { - type: "add", - object: this, - name: name, newValue: newValue - } : null; - if (notifySpy) spyReportStart(change); - if (notify) notifyListeners(this, change); - if (notifySpy) spyReportEnd(); - }; - ObservableMap.prototype.get = function (key) { - key = "" + key; - if (this.has(key)) return this._data[key].get(); - return undefined; - }; - ObservableMap.prototype.keys = function () { - return arrayAsIterator(this._keys.slice()); - }; - ObservableMap.prototype.values = function () { - return arrayAsIterator(this._keys.map(this.get, this)); - }; - ObservableMap.prototype.entries = function () { - var _this = this; - return arrayAsIterator(this._keys.map(function (key) { - return [key, _this.get(key)]; - })); - }; - ObservableMap.prototype.forEach = function (callback, thisArg) { - var _this = this; - this.keys().forEach(function (key) { - return callback.call(thisArg, _this.get(key), key, _this); - }); - }; - ObservableMap.prototype.merge = function (other) { - var _this = this; - if (isObservableMap(other)) { - other = other.toJS(); - } - runInTransaction(function () { - if (isPlainObject(other)) Object.keys(other).forEach(function (key) { - return _this.set(key, other[key]); - });else if (Array.isArray(other)) other.forEach(function (_a) { - var key = _a[0], - value = _a[1]; - return _this.set(key, value); - });else if (isES6Map(other)) other.forEach(function (value, key) { - return _this.set(key, value); - });else if (other !== null && other !== undefined) fail("Cannot initialize map from " + other); - }); - return this; - }; - ObservableMap.prototype.clear = function () { - var _this = this; - runInTransaction(function () { - untracked(function () { - _this.keys().forEach(_this.delete, _this); - }); - }); - }; - ObservableMap.prototype.replace = function (values) { - var _this = this; - runInTransaction(function () { - _this.clear(); - _this.merge(values); - }); - return this; - }; - Object.defineProperty(ObservableMap.prototype, "size", { - get: function get() { - return this._keys.length; - }, - enumerable: true, - configurable: true - }); - ObservableMap.prototype.toJS = function () { - var _this = this; - var res = {}; - this.keys().forEach(function (key) { - return res[key] = _this.get(key); - }); - return res; - }; - ObservableMap.prototype.toJSON = function () { - return this.toJS(); - }; - ObservableMap.prototype.isValidKey = function (key) { - if (key === null || key === undefined) return false; - if (typeof key === "string" || typeof key === "number" || typeof key === "boolean") return true; - return false; - }; - ObservableMap.prototype.assertValidKey = function (key) { - if (!this.isValidKey(key)) throw new Error("[mobx.map] Invalid key: '" + key + "', only strings, numbers and booleans are accepted as key in observable maps."); - }; - ObservableMap.prototype.toString = function () { - var _this = this; - return this.name + "[{ " + this.keys().map(function (key) { - return key + ": " + ("" + _this.get(key)); - }).join(", ") + " }]"; - }; - ObservableMap.prototype.observe = function (listener, fireImmediately) { - invariant(fireImmediately !== true, getMessage("m033")); - return registerListener(this, listener); - }; - ObservableMap.prototype.intercept = function (handler) { - return registerInterceptor(this, handler); - }; - return ObservableMap; - }(); - exports.ObservableMap = ObservableMap; - declareIterator(ObservableMap.prototype, function () { - return this.entries(); - }); - function map(initialValues) { - deprecated("`mobx.map` is deprecated, use `new ObservableMap` or `mobx.observable.map` instead"); - return observable.map(initialValues); - } - exports.map = map; - var isObservableMap = createInstanceofPredicate("ObservableMap", ObservableMap); - exports.isObservableMap = isObservableMap; - var ObservableObjectAdministration = function () { - function ObservableObjectAdministration(target, name) { - this.target = target; - this.name = name; - this.values = {}; - this.changeListeners = null; - this.interceptors = null; - } - ObservableObjectAdministration.prototype.observe = function (callback, fireImmediately) { - invariant(fireImmediately !== true, "`observe` doesn't support the fire immediately property for observable objects."); - return registerListener(this, callback); - }; - ObservableObjectAdministration.prototype.intercept = function (handler) { - return registerInterceptor(this, handler); - }; - return ObservableObjectAdministration; - }(); - function asObservableObject(target, name) { - if (isObservableObject(target)) return target.$mobx; - invariant(Object.isExtensible(target), getMessage("m035")); - if (!isPlainObject(target)) name = (target.constructor.name || "ObservableObject") + "@" + getNextId(); - if (!name) name = "ObservableObject@" + getNextId(); - var adm = new ObservableObjectAdministration(target, name); - addHiddenFinalProp(target, "$mobx", adm); - return adm; - } - function defineObservablePropertyFromDescriptor(adm, propName, descriptor, defaultEnhancer) { - if (adm.values[propName]) { - invariant("value" in descriptor, "The property " + propName + " in " + adm.name + " is already observable, cannot redefine it as computed property"); - adm.target[propName] = descriptor.value; - return; - } - if ("value" in descriptor) { - if (isModifierDescriptor(descriptor.value)) { - var modifierDescriptor = descriptor.value; - defineObservableProperty(adm, propName, modifierDescriptor.initialValue, modifierDescriptor.enhancer); - } else if (isAction(descriptor.value) && descriptor.value.autoBind === true) { - defineBoundAction(adm.target, propName, descriptor.value.originalFn); - } else if (isComputedValue(descriptor.value)) { - defineComputedPropertyFromComputedValue(adm, propName, descriptor.value); - } else { - defineObservableProperty(adm, propName, descriptor.value, defaultEnhancer); - } - } else { - defineComputedProperty(adm, propName, descriptor.get, descriptor.set, false, true); - } - } - function defineObservableProperty(adm, propName, newValue, enhancer) { - assertPropertyConfigurable(adm.target, propName); - if (hasInterceptors(adm)) { - var change = interceptChange(adm, { - object: adm.target, - name: propName, - type: "add", - newValue: newValue - }); - if (!change) return; - newValue = change.newValue; - } - var observable = adm.values[propName] = new ObservableValue(newValue, enhancer, adm.name + "." + propName, false); - newValue = observable.value; - Object.defineProperty(adm.target, propName, generateObservablePropConfig(propName)); - notifyPropertyAddition(adm, adm.target, propName, newValue); - } - function defineComputedProperty(adm, propName, getter, setter, compareStructural, asInstanceProperty) { - if (asInstanceProperty) assertPropertyConfigurable(adm.target, propName); - adm.values[propName] = new ComputedValue(getter, adm.target, compareStructural, adm.name + "." + propName, setter); - if (asInstanceProperty) { - Object.defineProperty(adm.target, propName, generateComputedPropConfig(propName)); - } - } - function defineComputedPropertyFromComputedValue(adm, propName, computedValue) { - var name = adm.name + "." + propName; - computedValue.name = name; - if (!computedValue.scope) computedValue.scope = adm.target; - adm.values[propName] = computedValue; - Object.defineProperty(adm.target, propName, generateComputedPropConfig(propName)); - } - var observablePropertyConfigs = {}; - var computedPropertyConfigs = {}; - function generateObservablePropConfig(propName) { - return observablePropertyConfigs[propName] || (observablePropertyConfigs[propName] = { - configurable: true, - enumerable: true, - get: function get() { - return this.$mobx.values[propName].get(); - }, - set: function set(v) { - setPropertyValue(this, propName, v); - } - }); - } - function generateComputedPropConfig(propName) { - return computedPropertyConfigs[propName] || (computedPropertyConfigs[propName] = { - configurable: true, - enumerable: false, - get: function get() { - return this.$mobx.values[propName].get(); - }, - set: function set(v) { - return this.$mobx.values[propName].set(v); - } - }); - } - function setPropertyValue(instance, name, newValue) { - var adm = instance.$mobx; - var observable = adm.values[name]; - if (hasInterceptors(adm)) { - var change = interceptChange(adm, { - type: "update", - object: instance, - name: name, newValue: newValue - }); - if (!change) return; - newValue = change.newValue; - } - newValue = observable.prepareNewValue(newValue); - if (newValue !== UNCHANGED) { - var notify = hasListeners(adm); - var notifySpy = isSpyEnabled(); - var change = notify || notifySpy ? { - type: "update", - object: instance, - oldValue: observable.value, - name: name, newValue: newValue - } : null; - if (notifySpy) spyReportStart(change); - observable.setNewValue(newValue); - if (notify) notifyListeners(adm, change); - if (notifySpy) spyReportEnd(); - } - } - function notifyPropertyAddition(adm, object, name, newValue) { - var notify = hasListeners(adm); - var notifySpy = isSpyEnabled(); - var change = notify || notifySpy ? { - type: "add", - object: object, name: name, newValue: newValue - } : null; - if (notifySpy) spyReportStart(change); - if (notify) notifyListeners(adm, change); - if (notifySpy) spyReportEnd(); - } - var isObservableObjectAdministration = createInstanceofPredicate("ObservableObjectAdministration", ObservableObjectAdministration); - function isObservableObject(thing) { - if (isObject(thing)) { - runLazyInitializers(thing); - return isObservableObjectAdministration(thing.$mobx); - } - return false; - } - exports.isObservableObject = isObservableObject; - var UNCHANGED = {}; - var ObservableValue = function (_super) { - __extends(ObservableValue, _super); - function ObservableValue(value, enhancer, name, notifySpy) { - if (name === void 0) { - name = "ObservableValue@" + getNextId(); - } - if (notifySpy === void 0) { - notifySpy = true; - } - var _this = _super.call(this, name) || this; - _this.enhancer = enhancer; - _this.hasUnreportedChange = false; - _this.value = enhancer(value, undefined, name); - if (notifySpy && isSpyEnabled()) { - spyReport({ type: "create", object: _this, newValue: _this.value }); - } - return _this; - } - ObservableValue.prototype.set = function (newValue) { - var oldValue = this.value; - newValue = this.prepareNewValue(newValue); - if (newValue !== UNCHANGED) { - var notifySpy = isSpyEnabled(); - if (notifySpy) { - spyReportStart({ - type: "update", - object: this, - newValue: newValue, oldValue: oldValue - }); - } - this.setNewValue(newValue); - if (notifySpy) spyReportEnd(); - } - }; - ObservableValue.prototype.prepareNewValue = function (newValue) { - checkIfStateModificationsAreAllowed(this); - if (hasInterceptors(this)) { - var change = interceptChange(this, { object: this, type: "update", newValue: newValue }); - if (!change) return UNCHANGED; - newValue = change.newValue; - } - newValue = this.enhancer(newValue, this.value, this.name); - return this.value !== newValue ? newValue : UNCHANGED; - }; - ObservableValue.prototype.setNewValue = function (newValue) { - var oldValue = this.value; - this.value = newValue; - this.reportChanged(); - if (hasListeners(this)) { - notifyListeners(this, { - type: "update", - object: this, - newValue: newValue, - oldValue: oldValue - }); - } - }; - ObservableValue.prototype.get = function () { - this.reportObserved(); - return this.value; - }; - ObservableValue.prototype.intercept = function (handler) { - return registerInterceptor(this, handler); - }; - ObservableValue.prototype.observe = function (listener, fireImmediately) { - if (fireImmediately) listener({ - object: this, - type: "update", - newValue: this.value, - oldValue: undefined - }); - return registerListener(this, listener); - }; - ObservableValue.prototype.toJSON = function () { - return this.get(); - }; - ObservableValue.prototype.toString = function () { - return this.name + "[" + this.value + "]"; - }; - ObservableValue.prototype.valueOf = function () { - return toPrimitive(this.get()); - }; - return ObservableValue; - }(BaseAtom); - ObservableValue.prototype[primitiveSymbol()] = ObservableValue.prototype.valueOf; - var isObservableValue = createInstanceofPredicate("ObservableValue", ObservableValue); - exports.isBoxedObservable = isObservableValue; - function getAtom(thing, property) { - if ((typeof thing === "undefined" ? "undefined" : _typeof(thing)) === "object" && thing !== null) { - if (isObservableArray(thing)) { - invariant(property === undefined, getMessage("m036")); - return thing.$mobx.atom; - } - if (isObservableMap(thing)) { - var anyThing = thing; - if (property === undefined) return getAtom(anyThing._keys); - var observable_2 = anyThing._data[property] || anyThing._hasMap[property]; - invariant(!!observable_2, "the entry '" + property + "' does not exist in the observable map '" + getDebugName(thing) + "'"); - return observable_2; - } - runLazyInitializers(thing); - if (isObservableObject(thing)) { - if (!property) return fail("please specify a property"); - var observable_3 = thing.$mobx.values[property]; - invariant(!!observable_3, "no observable property '" + property + "' found on the observable object '" + getDebugName(thing) + "'"); - return observable_3; - } - if (isAtom(thing) || isComputedValue(thing) || isReaction(thing)) { - return thing; - } - } else if (typeof thing === "function") { - if (isReaction(thing.$mobx)) { - return thing.$mobx; - } - } - return fail("Cannot obtain atom from " + thing); - } - function getAdministration(thing, property) { - invariant(thing, "Expecting some object"); - if (property !== undefined) return getAdministration(getAtom(thing, property)); - if (isAtom(thing) || isComputedValue(thing) || isReaction(thing)) return thing; - if (isObservableMap(thing)) return thing; - runLazyInitializers(thing); - if (thing.$mobx) return thing.$mobx; - invariant(false, "Cannot obtain administration from " + thing); - } - function getDebugName(thing, property) { - var named; - if (property !== undefined) named = getAtom(thing, property);else if (isObservableObject(thing) || isObservableMap(thing)) named = getAdministration(thing);else named = getAtom(thing); - return named.name; - } - function createClassPropertyDecorator(onInitialize, _get, _set, enumerable, allowCustomArguments) { - function classPropertyDecorator(target, key, descriptor, customArgs, argLen) { - if (argLen === void 0) { - argLen = 0; - } - invariant(allowCustomArguments || quacksLikeADecorator(arguments), "This function is a decorator, but it wasn't invoked like a decorator"); - if (!descriptor) { - var newDescriptor = { - enumerable: enumerable, - configurable: true, - get: function get() { - if (!this.__mobxInitializedProps || this.__mobxInitializedProps[key] !== true) typescriptInitializeProperty(this, key, undefined, onInitialize, customArgs, descriptor); - return _get.call(this, key); - }, - set: function set(v) { - if (!this.__mobxInitializedProps || this.__mobxInitializedProps[key] !== true) { - typescriptInitializeProperty(this, key, v, onInitialize, customArgs, descriptor); - } else { - _set.call(this, key, v); - } - } - }; - if (arguments.length < 3 || arguments.length === 5 && argLen < 3) { - Object.defineProperty(target, key, newDescriptor); - } - return newDescriptor; - } else { - if (!hasOwnProperty(target, "__mobxLazyInitializers")) { - addHiddenProp(target, "__mobxLazyInitializers", target.__mobxLazyInitializers && target.__mobxLazyInitializers.slice() || []); - } - var value_1 = descriptor.value, - initializer_1 = descriptor.initializer; - target.__mobxLazyInitializers.push(function (instance) { - onInitialize(instance, key, initializer_1 ? initializer_1.call(instance) : value_1, customArgs, descriptor); - }); - return { - enumerable: enumerable, configurable: true, - get: function get() { - if (this.__mobxDidRunLazyInitializers !== true) runLazyInitializers(this); - return _get.call(this, key); - }, - set: function set(v) { - if (this.__mobxDidRunLazyInitializers !== true) runLazyInitializers(this); - _set.call(this, key, v); - } - }; - } - } - if (allowCustomArguments) { - return function () { - if (quacksLikeADecorator(arguments)) return classPropertyDecorator.apply(null, arguments); - var outerArgs = arguments; - var argLen = arguments.length; - return function (target, key, descriptor) { - return classPropertyDecorator(target, key, descriptor, outerArgs, argLen); - }; - }; - } - return classPropertyDecorator; - } - function typescriptInitializeProperty(instance, key, v, onInitialize, customArgs, baseDescriptor) { - if (!hasOwnProperty(instance, "__mobxInitializedProps")) addHiddenProp(instance, "__mobxInitializedProps", {}); - instance.__mobxInitializedProps[key] = true; - onInitialize(instance, key, v, customArgs, baseDescriptor); - } - function runLazyInitializers(instance) { - if (instance.__mobxDidRunLazyInitializers === true) return; - if (instance.__mobxLazyInitializers) { - addHiddenProp(instance, "__mobxDidRunLazyInitializers", true); - instance.__mobxDidRunLazyInitializers && instance.__mobxLazyInitializers.forEach(function (initializer) { - return initializer(instance); - }); - } - } - function quacksLikeADecorator(args) { - return (args.length === 2 || args.length === 3) && typeof args[1] === "string"; - } - function iteratorSymbol() { - return typeof Symbol === "function" && Symbol.iterator || "@@iterator"; - } - var IS_ITERATING_MARKER = "__$$iterating"; - function arrayAsIterator(array) { - invariant(array[IS_ITERATING_MARKER] !== true, "Illegal state: cannot recycle array as iterator"); - addHiddenFinalProp(array, IS_ITERATING_MARKER, true); - var idx = -1; - addHiddenFinalProp(array, "next", function next() { - idx++; - return { - done: idx >= this.length, - value: idx < this.length ? this[idx] : undefined - }; - }); - return array; - } - function declareIterator(prototType, iteratorFactory) { - addHiddenFinalProp(prototType, iteratorSymbol(), iteratorFactory); - } - var messages = { - "m001": "It is not allowed to assign new values to @action fields", - "m002": "`runInAction` expects a function", - "m003": "`runInAction` expects a function without arguments", - "m004": "autorun expects a function", - "m005": "Warning: attempted to pass an action to autorun. Actions are untracked and will not trigger on state changes. Use `reaction` or wrap only your state modification code in an action.", - "m006": "Warning: attempted to pass an action to autorunAsync. Actions are untracked and will not trigger on state changes. Use `reaction` or wrap only your state modification code in an action.", - "m007": "reaction only accepts 2 or 3 arguments. If migrating from MobX 2, please provide an options object", - "m008": "wrapping reaction expression in `asReference` is no longer supported, use options object instead", - "m009": "@computed can only be used on getter functions, like: '@computed get myProps() { return ...; }'. It looks like it was used on a property.", - "m010": "@computed can only be used on getter functions, like: '@computed get myProps() { return ...; }'", - "m011": "First argument to `computed` should be an expression. If using computed as decorator, don't pass it arguments", - "m012": "computed takes one or two arguments if used as function", - "m013": "[mobx.expr] 'expr' should only be used inside other reactive functions.", - "m014": "extendObservable expected 2 or more arguments", - "m015": "extendObservable expects an object as first argument", - "m016": "extendObservable should not be used on maps, use map.merge instead", - "m017": "all arguments of extendObservable should be objects", - "m018": "extending an object with another observable (object) is not supported. Please construct an explicit propertymap, using `toJS` if need. See issue #540", - "m019": "[mobx.isObservable] isObservable(object, propertyName) is not supported for arrays and maps. Use map.has or array.length instead.", - "m020": "modifiers can only be used for individual object properties", - "m021": "observable expects zero or one arguments", - "m022": "@observable can not be used on getters, use @computed instead", - "m023": "Using `transaction` is deprecated, use `runInAction` or `(@)action` instead.", - "m024": "whyRun() can only be used if a derivation is active, or by passing an computed value / reaction explicitly. If you invoked whyRun from inside a computation; the computation is currently suspended but re-evaluating because somebody requested its value.", - "m025": "whyRun can only be used on reactions and computed values", - "m026": "`action` can only be invoked on functions", - "m028": "It is not allowed to set `useStrict` when a derivation is running", - "m029": "INTERNAL ERROR only onBecomeUnobserved shouldn't be called twice in a row", - "m030a": "Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `action` if this change is intended. Tried to modify: ", - "m030b": "Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, the render function of a React component? Tried to modify: ", - "m031": "Computed values are not allowed to not cause side effects by changing observables that are already being observed. Tried to modify: ", - "m032": "* This computation is suspended (not in use by any reaction) and won't run automatically.\n Didn't expect this computation to be suspended at this point?\n 1. Make sure this computation is used by a reaction (reaction, autorun, observer).\n 2. Check whether you are using this computation synchronously (in the same stack as they reaction that needs it).", - "m033": "`observe` doesn't support the fire immediately property for observable maps.", - "m034": "`mobx.map` is deprecated, use `new ObservableMap` or `mobx.observable.map` instead", - "m035": "Cannot make the designated object observable; it is not extensible", - "m036": "It is not possible to get index atoms from arrays", - "m037": "Hi there! I'm sorry you have just run into an exception.\nIf your debugger ends up here, know that some reaction (like the render() of an observer component, autorun or reaction)\nthrew an exception and that mobx caught it, to avoid that it brings the rest of your application down.\nThe original cause of the exception (the code that caused this reaction to run (again)), is still in the stack.\n\nHowever, more interesting is the actual stack trace of the error itself.\nHopefully the error is an instanceof Error, because in that case you can inspect the original stack of the error from where it was thrown.\nSee `error.stack` property, or press the very subtle \"(...)\" link you see near the console.error message that probably brought you here.\nThat stack is more interesting than the stack of this console.error itself.\n\nIf the exception you see is an exception you created yourself, make sure to use `throw new Error(\"Oops\")` instead of `throw \"Oops\"`,\nbecause the javascript environment will only preserve the original stack trace in the first form.\n\nYou can also make sure the debugger pauses the next time this very same exception is thrown by enabling \"Pause on caught exception\".\n(Note that it might pause on many other, unrelated exception as well).\n\nIf that all doesn't help you out, feel free to open an issue https://github.com/mobxjs/mobx/issues!\n", - "m038": "Missing items in this list?\n 1. Check whether all used values are properly marked as observable (use isObservable to verify)\n 2. Make sure you didn't dereference values too early. MobX observes props, not primitives. E.g: use 'person.name' instead of 'name' in your computation.\n" - }; - function getMessage(id) { - return messages[id]; - } - var EMPTY_ARRAY = []; - Object.freeze(EMPTY_ARRAY); - function getGlobal() { - return global; - } - function getNextId() { - return ++globalState.mobxGuid; - } - function fail(message, thing) { - invariant(false, message, thing); - throw "X"; - } - function invariant(check, message, thing) { - if (!check) throw new Error("[mobx] Invariant failed: " + message + (thing ? " in '" + thing + "'" : "")); - } - var deprecatedMessages = []; - function deprecated(msg) { - if (deprecatedMessages.indexOf(msg) !== -1) return false; - deprecatedMessages.push(msg); - console.error("[mobx] Deprecated: " + msg); - return true; - } - function once(func) { - var invoked = false; - return function () { - if (invoked) return; - invoked = true; - return func.apply(this, arguments); - }; - } - var noop = function noop() {}; - function unique(list) { - var res = []; - list.forEach(function (item) { - if (res.indexOf(item) === -1) res.push(item); - }); - return res; - } - function joinStrings(things, limit, separator) { - if (limit === void 0) { - limit = 100; - } - if (separator === void 0) { - separator = " - "; - } - if (!things) return ""; - var sliced = things.slice(0, limit); - return "" + sliced.join(separator) + (things.length > limit ? " (... and " + (things.length - limit) + "more)" : ""); - } - function isObject(value) { - return value !== null && (typeof value === "undefined" ? "undefined" : _typeof(value)) === "object"; - } - function isPlainObject(value) { - if (value === null || (typeof value === "undefined" ? "undefined" : _typeof(value)) !== "object") return false; - var proto = Object.getPrototypeOf(value); - return proto === Object.prototype || proto === null; - } - function objectAssign() { - var res = arguments[0]; - for (var i = 1, l = arguments.length; i < l; i++) { - var source = arguments[i]; - for (var key in source) { - if (hasOwnProperty(source, key)) { - res[key] = source[key]; - } - } - } - return res; - } - function valueDidChange(compareStructural, oldValue, newValue) { - if (typeof oldValue === 'number' && isNaN(oldValue)) { - return typeof newValue !== 'number' || !isNaN(newValue); - } - return compareStructural ? !deepEqual(oldValue, newValue) : oldValue !== newValue; - } - var prototypeHasOwnProperty = Object.prototype.hasOwnProperty; - function hasOwnProperty(object, propName) { - return prototypeHasOwnProperty.call(object, propName); - } - function makeNonEnumerable(object, propNames) { - for (var i = 0; i < propNames.length; i++) { - addHiddenProp(object, propNames[i], object[propNames[i]]); - } - } - function addHiddenProp(object, propName, value) { - Object.defineProperty(object, propName, { - enumerable: false, - writable: true, - configurable: true, - value: value - }); - } - function addHiddenFinalProp(object, propName, value) { - Object.defineProperty(object, propName, { - enumerable: false, - writable: false, - configurable: true, - value: value - }); - } - function isPropertyConfigurable(object, prop) { - var descriptor = Object.getOwnPropertyDescriptor(object, prop); - return !descriptor || descriptor.configurable !== false && descriptor.writable !== false; - } - function assertPropertyConfigurable(object, prop) { - invariant(isPropertyConfigurable(object, prop), "Cannot make property '" + prop + "' observable, it is not configurable and writable in the target object"); - } - function getEnumerableKeys(obj) { - var res = []; - for (var key in obj) { - res.push(key); - }return res; - } - function deepEqual(a, b) { - if (a === null && b === null) return true; - if (a === undefined && b === undefined) return true; - if ((typeof a === "undefined" ? "undefined" : _typeof(a)) !== "object") return a === b; - var aIsArray = isArrayLike(a); - var aIsMap = isMapLike(a); - if (aIsArray !== isArrayLike(b)) { - return false; - } else if (aIsMap !== isMapLike(b)) { - return false; - } else if (aIsArray) { - if (a.length !== b.length) return false; - for (var i = a.length - 1; i >= 0; i--) { - if (!deepEqual(a[i], b[i])) return false; - }return true; - } else if (aIsMap) { - if (a.size !== b.size) return false; - var equals_1 = true; - a.forEach(function (value, key) { - equals_1 = equals_1 && deepEqual(b.get(key), value); - }); - return equals_1; - } else if ((typeof a === "undefined" ? "undefined" : _typeof(a)) === "object" && (typeof b === "undefined" ? "undefined" : _typeof(b)) === "object") { - if (a === null || b === null) return false; - if (isMapLike(a) && isMapLike(b)) { - if (a.size !== b.size) return false; - return deepEqual(observable.shallowMap(a).entries(), observable.shallowMap(b).entries()); - } - if (getEnumerableKeys(a).length !== getEnumerableKeys(b).length) return false; - for (var prop in a) { - if (!(prop in b)) return false; - if (!deepEqual(a[prop], b[prop])) return false; - } - return true; - } - return false; - } - function createInstanceofPredicate(name, clazz) { - var propName = "isMobX" + name; - clazz.prototype[propName] = true; - return function (x) { - return isObject(x) && x[propName] === true; - }; - } - function isArrayLike(x) { - return Array.isArray(x) || isObservableArray(x); - } - exports.isArrayLike = isArrayLike; - function isMapLike(x) { - return isES6Map(x) || isObservableMap(x); - } - function isES6Map(thing) { - if (getGlobal().Map !== undefined && thing instanceof getGlobal().Map) return true; - return false; - } - function primitiveSymbol() { - return typeof Symbol === "function" && Symbol.toPrimitive || "@@toPrimitive"; - } - function toPrimitive(value) { - return value === null ? null : (typeof value === "undefined" ? "undefined" : _typeof(value)) === "object" ? "" + value : value; - } - /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4))) - - /***/ }), - /* 2 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _icons = __webpack_require__(6); - - var _constants = __webpack_require__(0); - - function renderHeader(_ref, instance) { - var meta = _ref.meta, - user = _ref.user, - reactions = _ref.reactions; - - var container = document.createElement('div'); - container.lang = "en-US"; - container.className = 'gitment-container gitment-header-container'; - - var likeButton = document.createElement('span'); - var likedReaction = reactions.find(function (reaction) { - return reaction.content === 'heart' && reaction.user.login === user.login; - }); - likeButton.className = 'gitment-header-like-btn'; - likeButton.innerHTML = '\n ' + _icons.heart + '\n ' + (likedReaction ? 'Unlike' : 'Like') + '\n ' + (meta.reactions && meta.reactions.heart ? ' \u2022 ' + meta.reactions.heart + ' Liked' : '') + '\n '; - - if (likedReaction) { - likeButton.classList.add('liked'); - likeButton.onclick = function () { - return instance.unlike(); - }; - } else { - likeButton.classList.remove('liked'); - likeButton.onclick = function () { - return instance.like(); - }; - } - container.appendChild(likeButton); - - var commentsCount = document.createElement('span'); - commentsCount.innerHTML = '\n ' + (meta.comments ? ' \u2022 ' + meta.comments + ' Comments' : '') + '\n '; - container.appendChild(commentsCount); - - var issueLink = document.createElement('a'); - issueLink.className = 'gitment-header-issue-link'; - issueLink.href = meta.html_url; - issueLink.target = '_blank'; - issueLink.innerText = 'Issue Page'; - container.appendChild(issueLink); - - return container; - } - - function renderComments(_ref2, instance) { - var meta = _ref2.meta, - comments = _ref2.comments, - commentReactions = _ref2.commentReactions, - currentPage = _ref2.currentPage, - user = _ref2.user, - error = _ref2.error; - - var container = document.createElement('div'); - container.lang = "en-US"; - container.className = 'gitment-container gitment-comments-container'; - - if (error) { - var errorBlock = document.createElement('div'); - errorBlock.className = 'gitment-comments-error'; - - if (error === _constants.NOT_INITIALIZED_ERROR && user.login && user.login.toLowerCase() === instance.owner.toLowerCase()) { - var initHint = document.createElement('div'); - var initButton = document.createElement('button'); - initButton.className = 'gitment-comments-init-btn'; - initButton.onclick = function () { - initButton.setAttribute('disabled', true); - instance.init().catch(function (e) { - initButton.removeAttribute('disabled'); - alert(e); - }); - }; - initButton.innerText = 'Initialize Comments'; - initHint.appendChild(initButton); - errorBlock.appendChild(initHint); - } else { - errorBlock.innerText = error; - } - container.appendChild(errorBlock); - return container; - } else if (comments === undefined) { - var loading = document.createElement('div'); - loading.innerText = 'Loading comments...'; - loading.className = 'gitment-comments-loading'; - container.appendChild(loading); - return container; - } else if (!comments.length) { - var emptyBlock = document.createElement('div'); - emptyBlock.className = 'gitment-comments-empty'; - emptyBlock.innerText = 'No Comment Yet'; - container.appendChild(emptyBlock); - return container; - } - - var commentsList = document.createElement('ul'); - commentsList.className = 'gitment-comments-list'; - - comments.forEach(function (comment) { - var createDate = new Date(comment.created_at); - var updateDate = new Date(comment.updated_at); - var commentItem = document.createElement('li'); - commentItem.className = 'gitment-comment'; - commentItem.innerHTML = '\n \n \n \n
\n
\n \n ' + comment.user.login + '\n \n commented on\n ' + createDate.toDateString() + '\n ' + (createDate.toString() !== updateDate.toString() ? ' \u2022 edited' : '') + '\n
' + _icons.heart + ' ' + (comment.reactions.heart || '') + '
\n
\n
' + comment.body_html + '
\n
\n '; - var likeButton = commentItem.querySelector('.gitment-comment-like-btn'); - var likedReaction = commentReactions[comment.id] && commentReactions[comment.id].find(function (reaction) { - return reaction.content === 'heart' && reaction.user.login === user.login; - }); - if (likedReaction) { - likeButton.classList.add('liked'); - likeButton.onclick = function () { - return instance.unlikeAComment(comment.id); - }; - } else { - likeButton.classList.remove('liked'); - likeButton.onclick = function () { - return instance.likeAComment(comment.id); - }; - } - - // dirty - // use a blank image to trigger height calculating when element rendered - var imgTrigger = document.createElement('img'); - var markdownBody = commentItem.querySelector('.gitment-comment-body'); - imgTrigger.className = 'gitment-hidden'; - imgTrigger.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; - imgTrigger.onload = function () { - if (markdownBody.clientHeight > instance.maxCommentHeight) { - markdownBody.classList.add('gitment-comment-body-folded'); - markdownBody.style.maxHeight = instance.maxCommentHeight + 'px'; - markdownBody.title = 'Click to Expand'; - markdownBody.onclick = function () { - markdownBody.classList.remove('gitment-comment-body-folded'); - markdownBody.style.maxHeight = ''; - markdownBody.title = ''; - markdownBody.onclick = null; - }; - } - }; - commentItem.appendChild(imgTrigger); - - commentsList.appendChild(commentItem); - }); - - container.appendChild(commentsList); - - if (meta) { - var pageCount = Math.ceil(meta.comments / instance.perPage); - if (pageCount > 1) { - var pagination = document.createElement('ul'); - pagination.className = 'gitment-comments-pagination'; - - if (currentPage > 1) { - var previousButton = document.createElement('li'); - previousButton.className = 'gitment-comments-page-item'; - previousButton.innerText = 'Previous'; - previousButton.onclick = function () { - return instance.goto(currentPage - 1); - }; - pagination.appendChild(previousButton); - } - - var _loop = function _loop(i) { - var pageItem = document.createElement('li'); - pageItem.className = 'gitment-comments-page-item'; - pageItem.innerText = i; - pageItem.onclick = function () { - return instance.goto(i); - }; - if (currentPage === i) pageItem.classList.add('gitment-selected'); - pagination.appendChild(pageItem); - }; - - for (var i = 1; i <= pageCount; i++) { - _loop(i); - } - - if (currentPage < pageCount) { - var nextButton = document.createElement('li'); - nextButton.className = 'gitment-comments-page-item'; - nextButton.innerText = 'Next'; - nextButton.onclick = function () { - return instance.goto(currentPage + 1); - }; - pagination.appendChild(nextButton); - } - - container.appendChild(pagination); - } - } - - return container; - } - - function renderEditor(_ref3, instance) { - var user = _ref3.user, - error = _ref3.error; - - var container = document.createElement('div'); - container.lang = "en-US"; - container.className = 'gitment-container gitment-editor-container'; - - var shouldDisable = user.login && !error ? '' : 'disabled'; - var disabledTip = user.login ? '' : 'Login to Comment'; - container.innerHTML = '\n ' + (user.login ? '\n \n ' : user.isLoggingIn ? '
' + _icons.spinner + '
' : '\n ' + _icons.github + '\n ') + '\n \n
\n
\n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n '; - if (user.login) { - container.querySelector('.gitment-editor-logout-link').onclick = function () { - return instance.logout(); - }; - } - - var writeField = container.querySelector('.gitment-editor-write-field'); - var previewField = container.querySelector('.gitment-editor-preview-field'); - - var textarea = writeField.querySelector('textarea'); - textarea.oninput = function () { - textarea.style.height = 'auto'; - var style = window.getComputedStyle(textarea, null); - var height = parseInt(style.height, 10); - var clientHeight = textarea.clientHeight; - var scrollHeight = textarea.scrollHeight; - if (clientHeight < scrollHeight) { - textarea.style.height = height + scrollHeight - clientHeight + 'px'; - } - }; - - var _container$querySelec = container.querySelectorAll('.gitment-editor-tab'), - _container$querySelec2 = _slicedToArray(_container$querySelec, 2), - writeTab = _container$querySelec2[0], - previewTab = _container$querySelec2[1]; - - writeTab.onclick = function () { - writeTab.classList.add('gitment-selected'); - previewTab.classList.remove('gitment-selected'); - writeField.classList.remove('gitment-hidden'); - previewField.classList.add('gitment-hidden'); - - textarea.focus(); - }; - previewTab.onclick = function () { - previewTab.classList.add('gitment-selected'); - writeTab.classList.remove('gitment-selected'); - previewField.classList.remove('gitment-hidden'); - writeField.classList.add('gitment-hidden'); - - var preview = previewField.querySelector('.gitment-editor-preview'); - var content = textarea.value.trim(); - if (!content) { - preview.innerText = 'Nothing to preview'; - return; - } - - preview.innerText = 'Loading preview...'; - instance.markdown(content).then(function (html) { - return preview.innerHTML = html; - }); - }; - - var submitButton = container.querySelector('.gitment-editor-submit'); - submitButton.onclick = function () { - submitButton.innerText = 'Submitting...'; - submitButton.setAttribute('disabled', true); - instance.post(textarea.value.trim()).then(function (data) { - textarea.value = ''; - textarea.style.height = 'auto'; - submitButton.removeAttribute('disabled'); - submitButton.innerText = 'Comment'; - }).catch(function (e) { - alert(e); - submitButton.removeAttribute('disabled'); - submitButton.innerText = 'Comment'; - }); - }; - - return container; - } - - function renderFooter() { - var container = document.createElement('div'); - container.lang = "en-US"; - container.className = 'gitment-container gitment-footer-container'; - container.innerHTML = '\n Powered by\n \n Gitment\n \n '; - return container; - } - - function render(state, instance) { - var container = document.createElement('div'); - container.lang = "en-US"; - container.className = 'gitment-container gitment-root-container'; - container.appendChild(instance.renderHeader(state, instance)); - container.appendChild(instance.renderComments(state, instance)); - container.appendChild(instance.renderEditor(state, instance)); - container.appendChild(instance.renderFooter(state, instance)); - return container; - } - - exports.default = { render: render, renderHeader: renderHeader, renderComments: renderComments, renderEditor: renderEditor, renderFooter: renderFooter }; - - /***/ }), - /* 3 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.http = exports.Query = exports.isString = undefined; - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - exports.getTargetContainer = getTargetContainer; - - var _constants = __webpack_require__(0); - - var isString = exports.isString = function isString(s) { - return toString.call(s) === '[object String]'; - }; - - function getTargetContainer(container) { - var targetContainer = void 0; - if (container instanceof Element) { - targetContainer = container; - } else if (isString(container)) { - targetContainer = document.getElementById(container); - } else { - targetContainer = document.createElement('div'); - } - - return targetContainer; - } - - var Query = exports.Query = { - parse: function parse() { - var search = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.location.search; - - if (!search) return {}; - var queryString = search[0] === '?' ? search.substring(1) : search; - var query = {}; - queryString.split('&').forEach(function (queryStr) { - var _queryStr$split = queryStr.split('='), - _queryStr$split2 = _slicedToArray(_queryStr$split, 2), - key = _queryStr$split2[0], - value = _queryStr$split2[1]; - - if (key) query[key] = value; - }); - - return query; - }, - stringify: function stringify(query) { - var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '?'; - - var queryString = Object.keys(query).map(function (key) { - return key + '=' + encodeURIComponent(query[key] || ''); - }).join('&'); - return queryString ? prefix + queryString : ''; - } - }; - - function ajaxFactory(method) { - return function (apiPath) { - var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var base = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'https://api.github.com'; - - var req = new XMLHttpRequest(); - var token = localStorage.getItem(_constants.LS_ACCESS_TOKEN_KEY); - - var url = '' + base + apiPath; - var body = null; - if (method === 'GET' || method === 'DELETE') { - url += Query.stringify(data); - } - - var p = new Promise(function (resolve, reject) { - req.addEventListener('load', function () { - var contentType = req.getResponseHeader('content-type'); - var res = req.responseText; - if (!/json/.test(contentType)) { - resolve(res); - return; - } - var data = req.responseText ? JSON.parse(res) : {}; - if (data.message) { - reject(new Error(data.message)); - } else { - resolve(data); - } - }); - req.addEventListener('error', function (error) { - return reject(error); - }); - }); - req.open(method, url, true); - - req.setRequestHeader('Accept', 'application/vnd.github.squirrel-girl-preview, application/vnd.github.html+json'); - if (token) { - req.setRequestHeader('Authorization', 'token ' + token); - } - if (method !== 'GET' && method !== 'DELETE') { - body = JSON.stringify(data); - req.setRequestHeader('Content-Type', 'application/json'); - } - - req.send(body); - return p; - }; - } - - var http = exports.http = { - get: ajaxFactory('GET'), - post: ajaxFactory('POST'), - delete: ajaxFactory('DELETE'), - put: ajaxFactory('PUT') - }; - - /***/ }), - /* 4 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - - var g; - -// This works in non-strict mode - g = function () { - return this; - }(); - - try { - // This works if eval is allowed (see CSP) - g = g || Function("return this")() || (1, eval)("this"); - } catch (e) { - // This works if the window reference is available - if ((typeof window === "undefined" ? "undefined" : _typeof(window)) === "object") g = window; - } - -// g can still be undefined, but nothing to do about it... -// We return undefined, instead of nothing here, so it's -// easier to handle this case. if(!global) { ...} - - module.exports = g; - - /***/ }), - /* 5 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _mobx = __webpack_require__(1); - - var _constants = __webpack_require__(0); - - var _utils = __webpack_require__(3); - - var _default = __webpack_require__(2); - - var _default2 = _interopRequireDefault(_default); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var scope = 'public_repo'; - - function extendRenderer(instance, renderer) { - instance[renderer] = function (container) { - var targetContainer = (0, _utils.getTargetContainer)(container); - var render = instance.theme[renderer] || instance.defaultTheme[renderer]; - - (0, _mobx.autorun)(function () { - var e = render(instance.state, instance); - if (targetContainer.firstChild) { - targetContainer.replaceChild(e, targetContainer.firstChild); - } else { - targetContainer.appendChild(e); - } - }); - - return targetContainer; - }; - } - - var Gitment = function () { - _createClass(Gitment, [{ - key: 'accessToken', - get: function get() { - return localStorage.getItem(_constants.LS_ACCESS_TOKEN_KEY); - }, - set: function set(token) { - localStorage.setItem(_constants.LS_ACCESS_TOKEN_KEY, token); - } - }, { - key: 'loginLink', - get: function get() { - var oauthUri = 'https://github.com/login/oauth/authorize'; - var redirect_uri = this.oauth.redirect_uri || window.location.href; - - var oauthParams = Object.assign({ - scope: scope, - redirect_uri: redirect_uri - }, this.oauth); - - return '' + oauthUri + _utils.Query.stringify(oauthParams); - } - }]); - - function Gitment() { - var _this = this; - - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - - _classCallCheck(this, Gitment); - - this.defaultTheme = _default2.default; - this.useTheme(_default2.default); - - Object.assign(this, { - id: window.location.href, - title: window.document.title, - link: window.location.href, - desc: '', - labels: [], - theme: _default2.default, - oauth: {}, - perPage: 20, - maxCommentHeight: 250 - }, options); - - this.useTheme(this.theme); - - var user = {}; - try { - var userInfo = localStorage.getItem(_constants.LS_USER_KEY); - if (this.accessToken && userInfo) { - Object.assign(user, JSON.parse(userInfo), { - fromCache: true - }); - } - } catch (e) { - localStorage.removeItem(_constants.LS_USER_KEY); - } - - this.state = (0, _mobx.observable)({ - user: user, - error: null, - meta: {}, - comments: undefined, - reactions: [], - commentReactions: {}, - currentPage: 1 - }); - - var query = _utils.Query.parse(); - if (query.code) { - var _oauth = this.oauth, - client_id = _oauth.client_id, - client_secret = _oauth.client_secret; - - var code = query.code; - delete query.code; - var search = _utils.Query.stringify(query); - var replacedUrl = '' + window.location.origin + window.location.pathname + search + window.location.hash; - history.replaceState({}, '', replacedUrl); - - Object.assign(this, { - id: replacedUrl, - link: replacedUrl - }, options); - - this.state.user.isLoggingIn = true; - _utils.http.post('https://gh-oauth.imsun.net', { - code: code, - client_id: client_id, - client_secret: client_secret - }, '').then(function (data) { - _this.accessToken = data.access_token; - _this.update(); - }).catch(function (e) { - _this.state.user.isLoggingIn = false; - alert(e); - }); - } else { - this.update(); - } - } - - _createClass(Gitment, [{ - key: 'init', - value: function init() { - var _this2 = this; - - return this.createIssue().then(function () { - return _this2.loadComments(); - }).then(function (comments) { - _this2.state.error = null; - return comments; - }); - } - }, { - key: 'useTheme', - value: function useTheme() { - var _this3 = this; - - var theme = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - - this.theme = theme; - - var renderers = Object.keys(this.theme); - renderers.forEach(function (renderer) { - return extendRenderer(_this3, renderer); - }); - } - }, { - key: 'update', - value: function update() { - var _this4 = this; - - return Promise.all([this.loadMeta(), this.loadUserInfo()]).then(function () { - return Promise.all([_this4.loadComments().then(function () { - return _this4.loadCommentReactions(); - }), _this4.loadReactions()]); - }).catch(function (e) { - return _this4.state.error = e; - }); - } - }, { - key: 'markdown', - value: function markdown(text) { - return _utils.http.post('/markdown', { - text: text, - mode: 'gfm' - }); - } - }, { - key: 'createIssue', - value: function createIssue() { - var _this5 = this; - - var id = this.id, - owner = this.owner, - repo = this.repo, - title = this.title, - link = this.link, - desc = this.desc, - labels = this.labels; - - - return _utils.http.post('/repos/' + owner + '/' + repo + '/issues', { - title: title, - labels: labels.concat(['gitment', id]), - body: link + '\n\n' + desc - }).then(function (meta) { - _this5.state.meta = meta; - return meta; - }); - } - }, { - key: 'getIssue', - value: function getIssue() { - if (this.state.meta.id) return Promise.resolve(this.state.meta); - - return this.loadMeta(); - } - }, { - key: 'post', - value: function post(body) { - var _this6 = this; - - return this.getIssue().then(function (issue) { - return _utils.http.post(issue.comments_url, { body: body }, ''); - }).then(function (data) { - _this6.state.meta.comments++; - var pageCount = Math.ceil(_this6.state.meta.comments / _this6.perPage); - if (_this6.state.currentPage === pageCount) { - _this6.state.comments.push(data); - } - return data; - }); - } - }, { - key: 'loadMeta', - value: function loadMeta() { - var _this7 = this; - - var id = this.id, - owner = this.owner, - repo = this.repo; - - return _utils.http.get('/repos/' + owner + '/' + repo + '/issues', { - creator: owner, - labels: id - }).then(function (issues) { - if (!issues.length) return Promise.reject(_constants.NOT_INITIALIZED_ERROR); - _this7.state.meta = issues[0]; - return issues[0]; - }); - } - }, { - key: 'loadComments', - value: function loadComments() { - var _this8 = this; - - var page = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.currentPage; - - return this.getIssue().then(function (issue) { - return _utils.http.get(issue.comments_url, { page: page, per_page: _this8.perPage }, ''); - }).then(function (comments) { - _this8.state.comments = comments; - return comments; - }); - } - }, { - key: 'loadUserInfo', - value: function loadUserInfo() { - var _this9 = this; - - if (!this.accessToken) { - this.logout(); - return Promise.resolve({}); - } - - return _utils.http.get('/user').then(function (user) { - _this9.state.user = user; - localStorage.setItem(_constants.LS_USER_KEY, JSON.stringify(user)); - return user; - }); - } - }, { - key: 'loadReactions', - value: function loadReactions() { - var _this10 = this; - - if (!this.accessToken) { - this.state.reactions = []; - return Promise.resolve([]); - } - - return this.getIssue().then(function (issue) { - if (!issue.reactions.total_count) return []; - return _utils.http.get(issue.reactions.url, {}, ''); - }).then(function (reactions) { - _this10.state.reactions = reactions; - return reactions; - }); - } - }, { - key: 'loadCommentReactions', - value: function loadCommentReactions() { - var _this11 = this; - - if (!this.accessToken) { - this.state.commentReactions = {}; - return Promise.resolve([]); - } - - var comments = this.state.comments; - var comentReactions = {}; - - return Promise.all(comments.map(function (comment) { - if (!comment.reactions.total_count) return []; - - var owner = _this11.owner, - repo = _this11.repo; - - return _utils.http.get('/repos/' + owner + '/' + repo + '/issues/comments/' + comment.id + '/reactions', {}); - })).then(function (reactionsArray) { - comments.forEach(function (comment, index) { - comentReactions[comment.id] = reactionsArray[index]; - }); - _this11.state.commentReactions = comentReactions; - - return comentReactions; - }); - } - }, { - key: 'login', - value: function login() { - window.location.href = this.loginLink; - } - }, { - key: 'logout', - value: function logout() { - localStorage.removeItem(_constants.LS_ACCESS_TOKEN_KEY); - localStorage.removeItem(_constants.LS_USER_KEY); - this.state.user = {}; - } - }, { - key: 'goto', - value: function goto(page) { - this.state.currentPage = page; - this.state.comments = undefined; - return this.loadComments(page); - } - }, { - key: 'like', - value: function like() { - var _this12 = this; - - if (!this.accessToken) { - alert('Login to Like'); - return Promise.reject(); - } - - var owner = this.owner, - repo = this.repo; - - - return _utils.http.post('/repos/' + owner + '/' + repo + '/issues/' + this.state.meta.number + '/reactions', { - content: 'heart' - }).then(function (reaction) { - _this12.state.reactions.push(reaction); - _this12.state.meta.reactions.heart++; - }); - } - }, { - key: 'unlike', - value: function unlike() { - var _this13 = this; - - if (!this.accessToken) return Promise.reject(); - - var _state = this.state, - user = _state.user, - reactions = _state.reactions; - - var index = reactions.findIndex(function (reaction) { - return reaction.user.login === user.login; - }); - return _utils.http.delete('/reactions/' + reactions[index].id).then(function () { - reactions.splice(index, 1); - _this13.state.meta.reactions.heart--; - }); - } - }, { - key: 'likeAComment', - value: function likeAComment(commentId) { - var _this14 = this; - - if (!this.accessToken) { - alert('Login to Like'); - return Promise.reject(); - } - - var owner = this.owner, - repo = this.repo; - - var comment = this.state.comments.find(function (comment) { - return comment.id === commentId; - }); - - return _utils.http.post('/repos/' + owner + '/' + repo + '/issues/comments/' + commentId + '/reactions', { - content: 'heart' - }).then(function (reaction) { - _this14.state.commentReactions[commentId].push(reaction); - comment.reactions.heart++; - }); - } - }, { - key: 'unlikeAComment', - value: function unlikeAComment(commentId) { - if (!this.accessToken) return Promise.reject(); - - var reactions = this.state.commentReactions[commentId]; - var comment = this.state.comments.find(function (comment) { - return comment.id === commentId; - }); - var user = this.state.user; - - var index = reactions.findIndex(function (reaction) { - return reaction.user.login === user.login; - }); - - return _utils.http.delete('/reactions/' + reactions[index].id).then(function () { - reactions.splice(index, 1); - comment.reactions.heart--; - }); - } - }]); - - return Gitment; - }(); - - module.exports = Gitment; - - /***/ }), - /* 6 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - /** - * Modified from https://github.com/evil-icons/evil-icons - */ - - var close = exports.close = ''; - var github = exports.github = ''; - var heart = exports.heart = ''; - var spinner = exports.spinner = ''; - - /***/ }) - /******/ ]); -//# sourceMappingURL=gitment.browser.js.map \ No newline at end of file diff --git a/js/index.js b/js/index.js deleted file mode 100644 index 776bbb95..00000000 --- a/js/index.js +++ /dev/null @@ -1,348 +0,0 @@ -/** - * Created by Xiaotao.Nie on 09/04/2018. - * All right reserved - * IF you have any question please email onlythen@yeah.net - */ - -// Global functions and listeners -window.onresize = () => { - // when window resize , we show remove some class that me be added - // often for debug - if(window.document.documentElement.clientWidth > 680){ - let aboutContent = document.getElementById('nav-content') - aboutContent.classList.remove('hide-block') - aboutContent.classList.remove('show-block'); - } - // if(window.isPost){ - // reLayout() - // } - - reHeightToc(); -}; - -// Nav switch function on mobile -/*****************************************************************************/ -const navToggle = document.getElementById('site-nav-toggle'); -navToggle.addEventListener('click', () => { - let aboutContent = document.getElementById('nav-content') - if (!aboutContent.classList.contains('show-block')) { - aboutContent.classList.add('show-block'); - aboutContent.classList.remove('hide-block') - } else { - aboutContent.classList.add('hide-block') - aboutContent.classList.remove('show-block'); - } -}) - - -// global search -/*****************************************************************************/ - -const searchButton = document.getElementById('search') -const searchField = document.getElementById('search-field') -const searchInput = document.getElementById('search-input') -const searchResultContainer = document.getElementById('search-result-container') -const escSearch = document.getElementById('esc-search') -const beginSearch = document.getElementById('begin-search') - -searchField.addEventListener('mousewheel',(e) => { - // e.preventDefault() - e.stopPropagation() - return false -}, false) - -var searchJson; -var caseSensitive = false - -searchButton.addEventListener('click', () => { - search() -}); - -escSearch.addEventListener('click',() => { - hideSearchField() -}) - -beginSearch.addEventListener('click',() => { - let keyword = searchInput.value; - if(keyword){ - searchFromKeyWord(keyword) - } -}) - -function toggleSeachField(){ - if (!searchField.classList.contains('show-flex-fade')) { - showSearchField() - } else { - hideSearchField() - } -} - -function showSearchField() { - searchInput.focus() - searchField.classList.add('show-flex-fade'); - searchField.classList.remove('hide-flex-fade'); -} - -function hideSearchField(){ - window.onkeydown = null; - searchField.classList.add('hide-flex-fade'); - searchField.classList.remove('show-flex-fade'); -} - -function searchFromKeyWord(keyword = ""){ - let result = []; - - let sildeWindowSize = 100; - - let handleKeyword = keyword - - if(!caseSensitive){ - handleKeyword = keyword.toLowerCase() - } - if(!searchJson) return -1; - else { - searchJson.forEach((item) => { - - if(!item.title || !item.content) return 0; // break - - let title = item.title - let content = item.content.trim().replace(/<[^>]+>/g,"").replace(/[`#\n]/g,""); - - let lowerTitle = title,lowerContent = content; - - if(!caseSensitive){ - lowerTitle = title.toLowerCase(); - lowerContent = content.toLowerCase(); - } - - - if(lowerTitle.indexOf(handleKeyword) !== -1 || lowerContent.indexOf(handleKeyword) !== -1){ - let resultItem = {} - resultItem.title = title.replace(keyword, "" + keyword + ''); - resultItem.url = item.url; - - resultItem.content = []; - - let lastend = 0 - - while(lowerContent.indexOf(handleKeyword) !== -1){ - let begin = lowerContent.indexOf(handleKeyword) - sildeWindowSize / 2 < 0 ? 0 : lowerContent.indexOf(handleKeyword) - sildeWindowSize / 2 - let end = begin + sildeWindowSize; - let reg = caseSensitive ? new RegExp('('+keyword+')','g') : new RegExp('('+keyword+')','ig') - resultItem.content.push("..." + content.slice(lastend + begin, lastend + end).replace(reg, "$1") + "...") - lowerContent = lowerContent.slice(end, lowerContent.length) - lastend = end - } - // resultItem.title = title.replace(keyword, "" + keyword + ''); - result.push(resultItem) - } - }) - } - - if(!result.length){ - searchResultContainer.innerHTML = ` -
No Result
- ` - return; - } - - let searchFragment = document.createElement('ul') - - for(let item of result){ - let searchItem = document.createElement('li'); - let searchTitle = document.createElement('a'); - searchTitle.href = item.url - searchTitle.innerHTML = item.title; - searchItem.appendChild(searchTitle) - if(item.content.length) { - let searchContentLiContainer = document.createElement('ul') - for (let citem of item.content) { - let searchContentFragment = document.createElement('li') - searchContentFragment.innerHTML = citem; - searchContentLiContainer.appendChild(searchContentFragment) - } - searchItem.appendChild(searchContentLiContainer) - } - searchFragment.appendChild(searchItem) - } - while(searchResultContainer.firstChild){ - searchResultContainer.removeChild(searchResultContainer.firstChild) - } - searchResultContainer.appendChild(searchFragment) -} - -function search(){ - - toggleSeachField() - - window.onkeydown = (e) => { - if (e.which === 27) { - /** 这里编写当ESC按下时的处理逻辑! */ - toggleSeachField() - } else if(e.which === 13){ - // 回车按下 - let keyword = searchInput.value; - if(keyword){ - searchFromKeyWord(keyword) - } - } - } - - - if(!searchJson){ - let isXml; - let search_path = window.hexo_search_path; - if (search_path.length === 0) { - search_path = "search.json"; - } else if (/json$/i.test(search_path)) { - isXml = false; - } - let path = window.hexo_root+ search_path; - $.ajax({ - url: path, - dataType: isXml ? "xml" : "json", - async: true, - success: function (res) { - searchJson = isXml ? $("entry", res).map(function() { - return { - title: $("title", this).text(), - content: $("content",this).text(), - url: $("url" , this).text() - }; - }).get() : res; - } - }); - } - -} - -// directory function in post pages -/*****************************************************************************/ -function getDistanceOfLeft(obj) { - let left = 0; - let top = 0; - while (obj) { - left += obj.offsetLeft; - top += obj.offsetTop; - obj = obj.offsetParent; - } - return { - left:left, - top:top - }; -} - -var toc = document.getElementById('toc') - -var tocToTop = getDistanceOfLeft(toc).top; - -function reHeightToc(){ - if(toc) { // resize toc height - toc.style.height = ( document.documentElement.clientHeight - 10 ) + 'px'; - toc.style.overflowY = 'scroll'; - } -} - -reHeightToc(); - -if(window.isPost){ - var result = [] - - var nameSet = new Set(); - - if(!toc || !toc.children || !toc.children[0]){ - // do nothing - } - else { - if (toc.children[0].nodeName === "OL") { - let ol = Array.from(toc.children[0].children) - - function getArrayFromOl(ol) { - let result = [] - - // let escape = function (item) { - // return item.replace(/<[^>]+>/g, "").replace(/^\s\s*/, '').replace(/\s\s*$/, '').replace(/[\. _]/g, '-') - // } - - ol.forEach((item) => { - if (item.children.length === 1) { - // TODO: need change - let value = item.children[0].getAttribute('href').replace(/^#/,"") - result.push({ - value: [value], - dom: item - }) - nameSet.add(value) - } - else { - let concatArray = getArrayFromOl(Array.from(item.children[1].children)) - nameSet.add(item.children[0].getAttribute('href').replace(/^#/,"")) - result.push({ - value: [item.children[0].getAttribute('href').replace(/^#/,"")].concat(concatArray.reduce((p, n) => { - p = p.concat(n.value) - return p; - }, [])), - dom: item - }) - result = result.concat(concatArray) - } - }) - return result - } - - result = getArrayFromOl(ol) - } - - var nameArray = Array.from(nameSet) - - function reLayout() { - let scrollToTop = document.documentElement.scrollTop || window.pageYOffset // Safari is special - if(tocToTop === 0) { - // Fix bug that when resize window the toc layout may be wrong - toc = document.getElementById('toc') - toc.classList.remove('toc-fixed') - tocToTop = getDistanceOfLeft(toc).top; - } - if (tocToTop <= scrollToTop + 10) { - if (!toc.classList.contains('toc-fixed')) - toc.classList.add('toc-fixed') - } else { - if (toc.classList.contains('toc-fixed')) - toc.classList.remove('toc-fixed') - } - - let minTop = 9999; - let minTopsValue = "" - - for (let item of nameArray) { - let dom = document.getElementById(item) || document.getElementById(item.replace(/\s/g, '')) - if (!dom) continue - let toTop = getDistanceOfLeft(dom).top - scrollToTop; - - if (Math.abs(toTop) < minTop) { - minTop = Math.abs(toTop) - minTopsValue = item - } - - // console.log(minTopsValue, minTop) - } - - if (minTopsValue) { - for (let item of result) { - if (item.value.indexOf(minTopsValue) !== -1) { - item.dom.classList.add("active") - } else { - item.dom.classList.remove("active") - } - } - } - } - - reLayout() - - window.addEventListener('scroll', (e) => { - reLayout() - }) - } -} - diff --git a/offdown/index.html b/offdown/index.html deleted file mode 100644 index ddb74787..00000000 --- a/offdown/index.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - 离线下载 - - -
- - -
-
- -
-

离线下载 -
- -

- -

Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。

-

百度网盘存储空间大,还支持离线下载。但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。
-本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。

-
    -
  • -

    超微浏览器上配置百度离线下载

    -
      -
    • -

      安装uweb定制Termux应用

      -
    • -
    • -

      安装baidupcs-go:

      -
        -
      • 直接下载BaiduPCS-Go,安卓手机请选择arm64版本。
      • -
      • 解压下载文件
      • -
      • 移动解压后文件至最终目的地。Termux运行以下命令
        -mv BaiduPCS-Go /data/data/com.termux/files/usr/bin/.
        -chmod 777 /data/data/com.termux/files/usr/bin/BaiduPCS-Go
        -
      • -
      -
    • -
    • -

      登录百度网盘, Termux执行如下命令:
      -BaiduPCS-Go login
      -BaiduPCS-Go config set -appid=266719

      -
    • -
    • -

      /sdcard/uweb/default.longclick配置如下:
      -百度离线下载:termux/*:BaiduPCS-Go od add

      -
    • -
    • -

      重启超微浏览器,此时长按链接将会出现菜单“百度离线下载”。

      -
    • -
    -
  • -
  • -

    离线下载资源至国外网盘,下载完成后在超微浏览器内点击资源下载,弹出菜单选择“百度离线下载”,完成整个流程。

    -
  • -
- -
- - - diff --git a/offlinedownload/index.html b/offlinedownload/index.html deleted file mode 100644 index ddb74787..00000000 --- a/offlinedownload/index.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - 离线下载 - - -
- - -
-
- -
-

离线下载 -
- -

- -

Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。

-

百度网盘存储空间大,还支持离线下载。但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。
-本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。

-
    -
  • -

    超微浏览器上配置百度离线下载

    -
      -
    • -

      安装uweb定制Termux应用

      -
    • -
    • -

      安装baidupcs-go:

      -
        -
      • 直接下载BaiduPCS-Go,安卓手机请选择arm64版本。
      • -
      • 解压下载文件
      • -
      • 移动解压后文件至最终目的地。Termux运行以下命令
        -mv BaiduPCS-Go /data/data/com.termux/files/usr/bin/.
        -chmod 777 /data/data/com.termux/files/usr/bin/BaiduPCS-Go
        -
      • -
      -
    • -
    • -

      登录百度网盘, Termux执行如下命令:
      -BaiduPCS-Go login
      -BaiduPCS-Go config set -appid=266719

      -
    • -
    • -

      /sdcard/uweb/default.longclick配置如下:
      -百度离线下载:termux/*:BaiduPCS-Go od add

      -
    • -
    • -

      重启超微浏览器,此时长按链接将会出现菜单“百度离线下载”。

      -
    • -
    -
  • -
  • -

    离线下载资源至国外网盘,下载完成后在超微浏览器内点击资源下载,弹出菜单选择“百度离线下载”,完成整个流程。

    -
  • -
- -
- - - diff --git a/searchurl/a.html b/searchurl/a.html deleted file mode 100644 index 17771432..00000000 --- a/searchurl/a.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/searchurl/a.html~ b/searchurl/a.html~ deleted file mode 100644 index 99f90e80..00000000 --- a/searchurl/a.html~ +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - -
- - diff --git a/sitemap.xml b/sitemap.xml index 9b73b8c5..c8d33fb2 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1,166 +1,16 @@ - - - https://jamesfengcao.gitee.io/uwebzh/ - 2022-06-25T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/_posts/ - 2022-06-25T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/adblock/ - 2022-06-25T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/javascript/ - 2022-06-24T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/ - 2022-06-24T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/bookmarklet/ - 2022-06-24T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/sitemap/ - 2022-05-28T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/androidtv/ - 2022-05-18T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/css/ - 2022-05-18T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/ - 2022-05-18T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/adblock_css/ - 2022-05-18T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/bookmark/ - 2022-05-18T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/links/ - 2022-05-10T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/ - 2022-04-25T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/ - 2022-04-25T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/redirect/ - 2022-04-25T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/pc/ - 2022-04-23T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/ssh/ - 2022-04-23T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/termux/ - 2022-04-23T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/windows/ - 2022-04-23T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/ - 2022-04-23T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/pccopy/ - 2022-04-23T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/globalcss/ - 2022-04-03T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/filenames/ - 2022-03-18T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/filemanager/ - 2022-02-11T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/bc/ - 2022-02-10T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/icons/ - 2022-02-06T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tips/ - 2021-11-01T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tcron/ - 2021-02-13T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/logcat/ - 2020-12-28T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/%E7%A6%BB%E7%BA%BF/ - 2020-12-15T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/loadbt/ - 2020-12-15T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/%E7%BD%91%E7%9B%98/ - 2020-12-15T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/%E8%B5%84%E6%BA%90/ - 2020-12-15T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/longclick/ - 2020-11-06T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/%E6%90%9C%E7%B4%A2/ - 2020-09-22T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/video/ - 2020-09-22T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/tdict/ - 2020-09-06T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/tools/ - 2020-09-06T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tools/ - 2020-09-06T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/tags/curl/ - 2020-08-24T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/filecap/ - 2020-08-24T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/html5/ - 2020-08-20T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/gesture/ - 2020-06-18T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/cmd/ - 2018-01-20T00:00:00+00:00 - - https://jamesfengcao.gitee.io/uwebzh/categories/ - - https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8B%E8%BD%BD/ - - https://jamesfengcao.gitee.io/uwebzh/urls/ - - https://jamesfengcao.gitee.io/uwebzh/searchcat/ - - https://jamesfengcao.gitee.io/uwebzh/multiaccount/ - - https://jamesfengcao.gitee.io/uwebzh/gnuplot/ - - https://jamesfengcao.gitee.io/uwebzh/hosts/ - - https://jamesfengcao.gitee.io/uwebzh/pcdown/ - - https://jamesfengcao.gitee.io/uwebzh/sitejs/ - - https://jamesfengcao.gitee.io/uwebzh/tags/%E7%94%B5%E8%A7%86/ - - https://jamesfengcao.gitee.io/uwebzh/tvlive/ - - https://jamesfengcao.gitee.io/uwebzh/adblock_domain/ - - https://jamesfengcao.gitee.io/uwebzh/offlinecache/ - - + + + + en/sitemap.xml + + + + + zh/sitemap.xml + + 2022-06-25T00:00:00+00:00 + + + + diff --git a/style.css b/style.css deleted file mode 100644 index e514b436..00000000 --- a/style.css +++ /dev/null @@ -1,34 +0,0 @@ -h1{font-size:100%;} - -header.header{ - position: fixed; - z-index: 2; - top:0; -} - -header.header>a.logo { - color:inherit; - text-decoration:inherit; - font-size:16px; -} - -ul.posts{ - list-style-type:none -} - -ul.posts>li.post { - line-height:2; -} - -ul.posts>li.post>a{ - color:inherit; - text-decoration:inherit; -} - -ul.tags{ - list-style-type:none -} - -ul.tags>li{ - display:inline; -} diff --git a/tags/PC/index.html b/tags/PC/index.html deleted file mode 100644 index c7097164..00000000 --- a/tags/PC/index.html +++ /dev/null @@ -1,516 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
- -
- - - - -
-
-
- - - search -
-
- -
-
-
-
- -
-
- -
- - - - - - -
- -
- - 2020 - - -
- - - -
-
-
- - -
-
    - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - diff --git a/tags/Windows/index.html b/tags/Windows/index.html deleted file mode 100644 index c7097164..00000000 --- a/tags/Windows/index.html +++ /dev/null @@ -1,516 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
- -
- - - - -
-
-
- - - search -
-
- -
-
-
-
- -
-
- -
- - - - - - -
- -
- - 2020 - - -
- - - -
-
-
- - -
-
    - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - diff --git a/tags/不良信息/index.html b/tags/不良信息/index.html deleted file mode 100644 index 992dfabd..00000000 --- a/tags/不良信息/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - 不良信息 - - -
- - -
-
- -
-

不良信息

- -
    -
- - - diff --git a/tags/不良信息/index.xml b/tags/不良信息/index.xml deleted file mode 100644 index f8b6fc25..00000000 --- a/tags/不良信息/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 不良信息 on - https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF/ - Recent content in 不良信息 on - Hugo -- gohugo.io - en-us - Sun, 23 Aug 2020 00:00:00 +0000 - - 拦截技术总览 - https://jamesfengcao.gitee.io/uwebzh/adblock/ - Sun, 23 Aug 2020 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/adblock/ - 超微浏览器提供了多种拦截技术,善于使用的话根本无需求助于复杂的规则。 - 如果网站并非视频类小网站,长按底部工具栏[☰]按钮,选取&quot;禁用iframe&quot;。更多可参看自定义样式拦截。 对非复杂交互非大厂网页而言,特别是小说网站,可以长按设置,选取&quot;拦截外链脚本&quot;。 全屏无干扰播放。 长按[☰]按钮可拦截浮动信息。 双正则表达式hosts文件。 针对特定网站的脚本样式。 对非图片为主的网站可直接关闭图像。 对非交互性网站,可关闭[JS]脚本。 - - - - diff --git a/tags/广告屏蔽/index.html b/tags/广告屏蔽/index.html deleted file mode 100644 index af0c8420..00000000 --- a/tags/广告屏蔽/index.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - 广告屏蔽 - - -
- - -
-
- - - - - diff --git a/tags/广告屏蔽/index.xml b/tags/广告屏蔽/index.xml deleted file mode 100644 index d3d85116..00000000 --- a/tags/广告屏蔽/index.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - - 广告屏蔽 on - https://jamesfengcao.gitee.io/uwebzh/tags/%E5%B9%BF%E5%91%8A%E5%B1%8F%E8%94%BD/ - Recent content in 广告屏蔽 on - Hugo -- gohugo.io - en-us - Tue, 22 Sep 2020 00:00:00 +0000 - - 视频播放小窍门 - https://jamesfengcao.gitee.io/uwebzh/video/ - Tue, 22 Sep 2020 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/video/ - 本文以超微浏览器为例来说明。 -点击安装&quot;视频播放增强(倍速等)&quot; - 长按设置按钮勾选“弹出视频地址”,则视频播放时会弹出真正的播放地址,点击地址播放可避免一切广告。如果点击后为下载操作,可长按链接分享给视频播放器。用户亦可配置在线播放或安装插件。嗅探的视频/资源类型可由文件“/sdcard/uweb/types.sniff”控制。 很多视频解析结果在UA为PC的情况下非常干净,没什么广告。故用户可在播放前切换UA至PC。如:wn.run/解析结果对PC非常干净。 某些视频网站在全屏播放时都会出现广告占住屏幕一部分。点击全屏播放之前,长按[☰]按钮,超微浏览器将弹出全局脚本菜单,勾选“移除浮动广告”后再点全屏播放则完美播放。 也可利用全屏播放屏蔽一切广告。方法如下: 长按[☰]按钮,勾选“全屏视频”。此选项将让无法全屏播放的网站强制允许全屏播放。 对无法全屏、无法放大的视频网站,可长按[☰]按钮,勾选“强制缩放”,然后手动放大至全屏。 灵活应用JS、图像开关屏蔽一切广告:视频搜索前关闭JS开关,进入播放网页前关闭图像显示并打开JS。 视频解析之电视剧: 首先在视频网站搜索电视剧片名,下面会显示不同的剧集,点击它们再用视频解析即可观看。如果直接点击电视剧用视频解析则每次播放均为第一集。 视频搜索预配置(超过400个引擎) -视频资源: - 视频解析配置 ddrk nfmovies 电视直播 OK资源 全国电视直播 免费视频 国外剧 纪录片 网络直播 - - - - 广告屏蔽技术总览 - https://jamesfengcao.gitee.io/uwebzh/adblock/ - Sun, 23 Aug 2020 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/adblock/ - 超微浏览器提供了形形色色的广告屏蔽技术,善于使用的话根本无需求助于复杂的屏蔽规则。 - 如果网站并非视频类小网站,长按底部工具栏[☰]按钮,选取&quot;禁用iframe&quot;,此法可屏蔽大多数广告。更多可参看自定义样式屏蔽广告。 对非复杂交互非国内广告大厂网页而言(譬如云盘管理属复杂交互),特别是小说网站,可以长按设置,选取&quot;屏蔽外链脚本&quot;。(内在逻辑:小网站一般无力开发完整的广告系统,它们经常使用大厂的广告脚本。) 利用视频全屏播放屏蔽一切广告。 长按[☰]按钮可屏蔽浮动广告。 双正则表达式hosts文件绝杀广告。 针对特定网站的脚本样式屏蔽广告。 对非图片为主的网站可直接关闭图像。 对非交互性网站,可关闭[JS]脚本。 - - - - 利用用户自定义样式屏蔽广告 - https://jamesfengcao.gitee.io/uwebzh/adblock_css/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/adblock_css/ - 超微浏览器支持超级hosts文件,这一技术可以完全绝杀手机广告小厂。但少部分广告大厂本身也提供高质量的内容服务,它们可以将广告伪装成正常的内容从而逃脱hosts文件绝杀。 -对这一部分广告而言,我们可以利用超微浏览器的自定义样式功能加以屏蔽。 -下载下面文件(可改名成“广告屏蔽.css”),将其放到/scard/uweb/css目录下: -广告屏蔽css文件 -重启浏览器,长按底部工具条[☰]按钮弹出对话框后勾选上述文件名即可屏蔽广告。 - - - - 利用超级hosts文件加速访问国外网站 - https://jamesfengcao.gitee.io/uwebzh/hosts/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/hosts/ - 不少国外网站本身虽可访问,但由于网站需要下载google, -facebook等屏蔽网址的资源而导致无法访问。超级hosts文件可屏蔽文件中域名的一切子域名、孙域名、......,从而主动屏蔽这些网址,最终允许浏览器快速访问合法网站。 -使用Android端uweb浏览器。 -/sdcard/uweb/default.hosts内容如下: -googleadservices.com -googlesyndication.com -adsense.com -google.com -google-analytics.com -googletagservices.com -twitter.com -facebook.com -fbcdn.net -其它国外网址访问技巧: - 尝试关闭javascript, 譬如程序员网站stackoverflow.com在关闭javascript的情况下国内一般均可快速访问。 关闭网页图片 - - - - 利用超级hosts绝杀广告 - https://jamesfengcao.gitee.io/uwebzh/adblock_hosts/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/adblock_hosts/ - 超级hosts文件可屏蔽文件中域名的一切子域名、孙域名、......,可彻底绝杀一切广告。所以用户屏蔽根域名时无需选择提示中出现的整个域名,只需选取最后两段或三段(少数很短的域名可取四段)。 - 长按广告链接,点击“图片:屏蔽根域名”,修改弹出域名,一般取最后两段,点击&quot;确定&quot;屏蔽当前图片网址。 - 部分广告没有链接可长按,或虽有链接但长按时不出现图片相关菜单。此时可长按[JS]点击&quot;背景图片&quot;或&quot;看图模式&quot;,再长按广告链接点击“图片:屏蔽根域名”,屏蔽图片网址。 - 可长按设置开启&quot;资源嗅探&quot;,推荐设置文件&quot;/sdcard/uweb/types.sniff&quot;内容为js,刷新网页后关闭&quot;资源嗅探&quot;选项。在弹出的资源网页上长按链接,屏蔽根域名。 - (可选) 长按广告链接,点击“屏蔽根域名”,屏蔽链接网址。 - (可选) 某些广告靠javascript激发,链接中不出现域名,可点击激发至新网址后将新网址根域名屏蔽。 - 超级hosts文件支持域名及整个网址正则表达式 -default.hosts文件格式每行如下: -根域名[空格]域名前缀正则表达式[空格]网址路径正则表达式 -空格及后面两个正则表达式为可选择项。正则表达式采用java标准。 - 部分国内大厂广告 (将下列内容放入/sdcard/uweb/default.hosts,点击本链接自动用以下内容覆盖default.hosts): -lianmeng.360.cn -appjiagu.com -adm-cnzz.net -alimama.com -ipinyou.com -mct01.com -tanx.com -wrating.com -cpro.baidu.com -pos.baidu.com -share.baidu.com -e.qq.com -gdt.qq.com -l.qq.com -push.qq.com -beacon.sina.com.cn -mix.sina.com.cn -go.sohu.com -inte.sogou.com -epro.sogou.com -golden1.sogou.com -uranus.sogou.com -inte.sogoucdn.com -lu.sogoucdn.com -theta.sogoucdn.com -ad.xiaomi.com - - - - diff --git a/uweb/index.html b/uweb/index.html deleted file mode 100644 index 908e99e4..00000000 --- a/uweb/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/uweb/style.css b/uweb/style.css deleted file mode 100644 index e514b436..00000000 --- a/uweb/style.css +++ /dev/null @@ -1,34 +0,0 @@ -h1{font-size:100%;} - -header.header{ - position: fixed; - z-index: 2; - top:0; -} - -header.header>a.logo { - color:inherit; - text-decoration:inherit; - font-size:16px; -} - -ul.posts{ - list-style-type:none -} - -ul.posts>li.post { - line-height:2; -} - -ul.posts>li.post>a{ - color:inherit; - text-decoration:inherit; -} - -ul.tags{ - list-style-type:none -} - -ul.tags>li{ - display:inline; -} diff --git a/uweb/tags/index.html b/uweb/tags/index.html deleted file mode 100644 index 99996202..00000000 --- a/uweb/tags/index.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/zh/_posts/index.html b/zh/_posts/index.html new file mode 100644 index 00000000..fc620d7d --- /dev/null +++ b/zh/_posts/index.html @@ -0,0 +1,8 @@ + + + +
    + +
+ + diff --git a/_posts/index.xml b/zh/_posts/index.xml similarity index 92% rename from _posts/index.xml rename to zh/_posts/index.xml index e34d35af..be1be77a 100644 --- a/_posts/index.xml +++ b/zh/_posts/index.xml @@ -2,21 +2,20 @@ _posts on - https://jamesfengcao.gitee.io/uwebzh/_posts/ + /zh/_posts/ Recent content in _posts on Hugo -- gohugo.io - en-us - Sat, 25 Jun 2022 00:00:00 +0000 + Sat, 25 Jun 2022 00:00:00 +0000 信息隐藏技术总览 - https://jamesfengcao.gitee.io/uwebzh/adblock/ + /zh/adblock/ Sat, 25 Jun 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/adblock/ + /zh/adblock/ 总体来说,分为手动控制和针对特定网站的规则两大类办法。手动控制可以保存为网站配置从而自动化。 双正则表达式根域名隐藏。 -可使用列出外部脚本小书签生成外部js文件列表,然后长按底部工具栏&quot;js&quot;按钮,执行&quot;网址转链接&quot;菜单命令,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。 针对特定网站的脚本样式。 -长按底部工具栏&quot;js&quot;按钮,执行&quot;标记不良元素&quot;菜单命令,点击页面元素会弹出对话框显示元素及祖先所有属性,并生成css屏蔽代码。默认使用“display:none”屏蔽,但如果上述显示属性中出现过&quot;display&quot;。则建议使用&quot;transform:scale(0)!important&quot;屏蔽。 长按底部工具栏窗口管理按钮,选取&quot;仅显示图片&quot;或&quot;仅显示视频&quot;,图片视频网站彻底干净。选取&quot;禁用伪元素&quot;,&quot;禁用iframe&quot;。更多可参看自定义样式。 +可使用列出外部脚本小书签生成外部js文件列表,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。 针对特定网站的脚本样式。 +长按底部工具栏&quot;js&quot;按钮,执行&quot;标记不良元素&quot;菜单命令,点击页面元素会弹出对话框显示元素及祖先所有属性,并生成css屏蔽代码。默认使用“display:none”屏蔽,但如果上述显示属性中出现过&quot;display&quot;,则建议使用&quot;transform:scale(0)!important&quot;屏蔽。 长按底部工具栏窗口管理按钮,选取&quot;仅显示图片&quot;或&quot;仅显示视频&quot;,图片视频网站彻底干净。选取&quot;禁用伪元素&quot;,&quot;禁用iframe&quot;。更多可参看自定义样式。 保存书签时可在网址前面添加&quot;i:0mc32:&quot;,则整个网址树自动采用&quot;仅显示图片&quot;。没有任何不良信息。改为&quot;c16&quot;则为&quot;仅显示视频&quot;。&quot;c12&quot;则同时采用&quot;禁用伪元素&quot;,&quot;禁用iframe&quot;。 长按[☰]按钮&quot;自动全屏播放&quot;,直接全屏无干扰播放。不良信息没有任何机会出现。不使用全局脚本“自动全屏播放”的情况下,还可以有以下几种方法: 使用常用服务自动全屏播放菜单(长按视频链接-&gt;命令),则页面视频会自动全屏播放。按设置按钮,如果勾选“允许自动播放”,则今后此窗口内其它任何视频网址都将会自动全屏无干扰播放。保存书签时可在网址前面添加&quot;i:5f&quot;。 保存书签时可在网址前面添加&quot;i:0mi:5f:&quot;,则整个网址树自动全屏播放。 长按设置,选取&quot;拦截外链脚本&quot;。可在界面配置及杂项网页额外拦截第三方可疑资源。可配置白名单js.allow。 长按[☰]按钮可隐藏浮动信息,移除横幅,清空定时器(防止定时触发不良信息),中断可疑事件(防止用户操作触发),等待(防止延迟触发)。 @@ -27,10 +26,10 @@ url.deny。需要屏蔽的url正则表达式(java语法),忽视回车, 小书签 - https://jamesfengcao.gitee.io/uwebzh/bookmarklet/ + /zh/bookmarklet/ Fri, 24 Jun 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/bookmarklet/ + /zh/bookmarklet/ 超微浏览器支持直接运行远程网址上的小书签(Bookmarklet),将本页面或其它包含小书签网址加入书签。使用时只需长按小书签链接,点击“新窗口打开”,小书签将作用于超微浏览器最后一个窗口(非小书签窗口)页面上。 列出外部脚本 查看浏览器UA @@ -55,19 +54,19 @@ BugMeNot 技巧网站导航 - https://jamesfengcao.gitee.io/uwebzh/sitemap/ + /zh/sitemap/ Sat, 28 May 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/sitemap/ + /zh/sitemap/ 界面配置 搜索引擎 主页 快速访问 界面配置及杂项 (gitee镜像) 备份与恢复 个性化 工具条按钮长按菜单 浏览器标识 js脚本 常用服务 常用链接 常用命令 远程脚本 选中文本类菜单 长按链接弹出菜单 底部工具条定制 手势 高级个性化定制 高级设置 内容类 信息隐藏 CSS样式 重定向 特定网址用户脚本及样式 网站离线资源 工具应用类 小书签 文件预处理 html5应用 文件管理器 工具汇总 终端应用及Termux 超级计算器 函数作图 定时脚本 离线下载 输入法辅助 部件检索 综合 配置文件列表 插件 使用技巧 使用技巧 视频 安卓系统出错诊断 Android TV - https://jamesfengcao.gitee.io/uwebzh/androidtv/ + /zh/androidtv/ Wed, 18 May 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/androidtv/ + /zh/androidtv/ TV端推荐打开自动播放选项,全局脚本打开自动全屏播放,全局样式打开“仅显示图片“,禁止js confirm对话框。 点击以下链接可直接设置主屏为书签并添加链接。Android TV可从手机端接收视频url并打开,发送见常用服务: 等待从网络接收url并打开 @@ -78,25 +77,12 @@ BugMeNot Android TV可利用顺序搜索使用箭头按钮切换频道。顺序搜索引擎文件engine.search中的搜索引擎url如果不包含'%s',则搜索引擎只是简单的固定网页url,此时顺序搜索表现为频道切换。更多信息见多引擎搜索页面。 - - 利用用户自定义样式屏蔽不良信息 - https://jamesfengcao.gitee.io/uwebzh/adblock_css/ - Wed, 18 May 2022 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/adblock_css/ - 点击以下链接可安装全局样式,清后台重启浏览器,长按底部工具条窗口按钮弹出对话框后勾选上述文件名即可屏蔽不良信息。 -floppymoose 广告屏蔽样式 -gozer 广告屏蔽样式 -超微浏览器支持根域名屏蔽,完全绝杀手机不良信息小厂。但少部分不良信息大厂本身也提供高质量的内容服务,它们可以将不良信息伪装成正常的内容从而逃脱域名绝杀。 -对这一部分不良信息而言,我们可以利用超微浏览器的自定义样式功能加以屏蔽。 - - 常用书签 - https://jamesfengcao.gitee.io/uwebzh/bookmark/ + /zh/bookmark/ Wed, 18 May 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/bookmark/ + /zh/bookmark/ gamezop 点击以下链接可安装模板至分类书签目录。保存至“小说”类别的网站会自动使用阅读模式。 &quot;小说.html&quot;: 自动使用阅读模式 @@ -115,12 +101,25 @@ wikipedia search gopher reddit gopher + + 利用用户自定义样式屏蔽不良信息 + /zh/adblock_css/ + Wed, 18 May 2022 00:00:00 +0000 + + /zh/adblock_css/ + 点击以下链接可安装全局样式,清后台重启浏览器,长按底部工具条窗口按钮弹出对话框后勾选上述文件名即可屏蔽不良信息。 +floppymoose 广告屏蔽样式 +gozer 广告屏蔽样式 +超微浏览器支持根域名屏蔽,完全绝杀手机不良信息小厂。但少部分不良信息大厂本身也提供高质量的内容服务,它们可以将不良信息伪装成正常的内容从而逃脱域名绝杀。 +对这一部分不良信息而言,我们可以利用超微浏览器的自定义样式功能加以屏蔽。 + + 常用链接 - https://jamesfengcao.gitee.io/uwebzh/links/ + /zh/links/ Tue, 10 May 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/links/ + /zh/links/ 点击以下链接可安装至常用链接 显示网站安全证书 迅雷盘离线 @@ -178,10 +177,10 @@ i:1c 重定向国外网址至国内镜像(附编辑本地文件) - https://jamesfengcao.gitee.io/uwebzh/redirect/ + /zh/redirect/ Mon, 25 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/redirect/ + /zh/redirect/ github mirror:fastgit github mirror 2 github mirror 3 @@ -222,10 +221,10 @@ item.gome.com.cn::item.gomevvv.com.cn 操作选中(富)文本/元素 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ Sat, 23 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ 点击以下链接可安装长按“链接”按钮菜单: google划词翻译 bing翻译 @@ -266,10 +265,10 @@ pclip CSS样式 - https://jamesfengcao.gitee.io/uwebzh/globalcss/ + /zh/globalcss/ Sun, 03 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/globalcss/ + /zh/globalcss/ 超微浏览器自动装载&quot;/sdcard/uweb/css&quot;目录下所有.css文件作为全局样式供用户选用。点击以下配置链接可自动添加为全局样式: 强制使用默认字体 配合透明状态栏(沉浸) @@ -280,10 +279,10 @@ webview 80- 夜间模式 超微浏览器配置文件列表 - https://jamesfengcao.gitee.io/uwebzh/filenames/ + /zh/filenames/ Fri, 18 Mar 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/filenames/ + /zh/filenames/ 下面列表中以&quot;/&quot;结尾者为目录,其余为文件。如果用户勾选“使用内部目录配置”,&quot;sitejs/&quot;,&quot;sitecache/&quot;等位于应用内部保护目录下。否则以下所有文件/目录均位于&quot;/sdcard/uweb&quot;: &quot;css/&quot;:全局样式目录 &quot;js/&quot;: 全局脚本目录 @@ -340,10 +339,10 @@ webview 80- 夜间模式 文件管理器及文件挑选并批量处理 - https://jamesfengcao.gitee.io/uwebzh/filemanager/ + /zh/filemanager/ Fri, 11 Feb 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/filemanager/ + /zh/filemanager/ 超微浏览器访问以&quot;/&quot;结尾 (包括&quot;/?&quot;及后面参数)的&quot;file://&quot; url,则进入文件管理器。 对任何目录型(以“/”结尾)文件url,后面可附&quot;?[文件前缀][*[文件后缀]]&quot;。譬如&quot;file:///sdcard/?*.png&quot;会列举出&quot;/sdcard&quot;目录下所有.png文件。&quot;?IMG&quot;列举出所有IMG开头的文件。此时可选定文件,并安装checked.js对选取文件进行批量处理。 文件批量处理配置default.select例子: @@ -352,10 +351,10 @@ webview 80- 夜间模式 超级计算器(bc) - https://jamesfengcao.gitee.io/uwebzh/bc/ + /zh/bc/ Thu, 10 Feb 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/bc/ + /zh/bc/ 使用uweb浏览器。 Gnu bc计算器支持无限精度,可扩展函数库、常数库。 安装bc (Android11+无需安装) 安装uweb定制Termux应用 Termux下运行以下命令: @@ -376,10 +375,10 @@ http://www.numbertheory.org/gnubc/gnubc.html 工具栏定制 - https://jamesfengcao.gitee.io/uwebzh/icons/ + /zh/icons/ Sun, 06 Feb 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/icons/ + /zh/icons/ 超微浏览器配置目录下如果存在目录&quot;icon&quot;,则此目录下的文件名为&quot;0&quot;,&quot;1&quot;,&quot;2&quot;... 会作为底部工具栏图标。文件&quot;0&quot;替换原后退按钮,&quot;1&quot;为前进按钮,&quot;2&quot;为设置按钮,&quot;3&quot;为主页按钮......。 如果定义有新按钮(当前版本存在文件&quot;20&quot;),则uweb支持向量格式图标VectorDrawable,格式为compiled XML。此时所有图标文件必须都是compiled XML格式,或都是普通的图像格式(png,jpg,gif等)。用户可将VectorDrawable XML文件放到安卓项目目录assets下面,重新生成apk文件以后将apk文件解压即可得compiled XML格式图标文件。 @@ -389,10 +388,10 @@ http://www.numbertheory.org/gnubc/gnubc.html 小技巧 - https://jamesfengcao.gitee.io/uwebzh/tips/ + /zh/tips/ Mon, 01 Nov 2021 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tips/ + /zh/tips/ 准确显示一切PC网页: PC模式 + 勾选选项&quot;宽屏显示&quot; + 全局脚本&quot;强制缩放&quot;。 多主屏: @@ -410,10 +409,10 @@ UA为非默认时,点击PC按钮将恢复UA为默认,同时触发不保存UA 定时脚本 - https://jamesfengcao.gitee.io/uwebzh/tcron/ + /zh/tcron/ Sat, 13 Feb 2021 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tcron/ + /zh/tcron/ 如果勾选“文件预处理”,则uweb启动时运行&quot;default.rc&quot; shell脚本。可与tcron定时管 理工具(安装tcron)配合运行定时任务,如存储清理、网页签到等。 勾选“文件预处理”的情况下,如果存在文件&quot;default.rc2&quot;,则在超微浏览器成为前台时,此文件代码被执行。在超微永不退出的情况下,&quot;default.rc&quot;将没有任何执行机会,而&quot;default.rc2&quot;保证即使超微长时间不重启,定时脚本仍可以执行。 @@ -446,10 +445,10 @@ crontab例子内容如下: 安卓系统出错诊断 - https://jamesfengcao.gitee.io/uwebzh/logcat/ + /zh/logcat/ Mon, 28 Dec 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/logcat/ + /zh/logcat/ 超微浏览器如果闪退,会生成出错文件&quot;/sdcard/uweb/error.log&quot;。 如果超微或安卓系统或任何应用出现问题,则可利用超微浏览器进行诊断,方法如下: 访问常用命令网页,点击安装logcat相关的两个命令。 清空后台并重启超微浏览器。 长按历史按钮,执行命令&quot;清空logcat&quot;。 触发有问题的功能。 长按历史按钮,执行命令&quot;输出logcat.log&quot;. 检查文件&quot;/sdcard/uweb/logcat.log&quot;内容。 超微浏览器是手机上调试javascript脚本的最佳工具,无需打包就可有多种方式运行javascript代码。webview dev版自带devtools,运行此工具,打开flag &quot;webview-log-js-console-messages&quot;以后所有js出错信息及console输出会被复制到logcat中。然后用户可根据上一段所述方法诊断。 @@ -460,10 +459,10 @@ devtools for com.android.webview 离线下载 - https://jamesfengcao.gitee.io/uwebzh/loadbt/ + /zh/loadbt/ Tue, 15 Dec 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/loadbt/ + /zh/loadbt/ seedr用户可使用常用链接利用seedr离线下载。使用时长按链接-&gt;命令-&gt;seedr离线...。 Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。使用时长按链接-&gt;命令-&gt;tg...。 百度网盘存储空间大,但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。 本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。 超微浏览器上配置百度离线下载 @@ -484,10 +483,10 @@ BaiduPCS-Go config set -appid=266719 长按链接弹出菜单 - https://jamesfengcao.gitee.io/uwebzh/longclick/ + /zh/longclick/ Fri, 06 Nov 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/longclick/ + /zh/longclick/ 长按链接运行第三方程序 配置文件/sdcard/uweb/default.longclick每行格式如下(同default.cmds) 菜单名:mimetype:命令路径 命令可以包含%c(当前网址cookie)等,执行时会被相应内容自动替换。 @@ -498,10 +497,10 @@ js文件格式如下: 视频播放小窍门 - https://jamesfengcao.gitee.io/uwebzh/video/ + /zh/video/ Tue, 22 Sep 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/video/ + /zh/video/ 覆盖安装全屏播放菜单示例:屏幕旋转,退出 本文以超微浏览器为例来说明。 创建文件&quot;default.playrate&quot;可定制全屏倍速播放菜单项,格式与文件default.link完全相同。倍速播放菜单链接部分为空,譬如&quot;.5x:&quot;,倍速菜单至少有一个。链接部分非空的菜单必须在所有倍速菜单之后。 长按设置按钮勾选“弹出视频地址”,则视频播放时会弹出真正的播放地址,点击地址播放可避免一切不良信息。如果点击后为下载操作,可长按链接分享给视频播放器。用户亦可配置在线播放或安装插件。嗅探的视频/资源类型可由文件“/sdcard/uweb/types.sniff”控制。 很多视频解析结果在UA为PC的情况下非常干净,没什么不良信息。故用户可在播放前切换UA至PC。如:wn.run/解析结果对PC非常干净。 某些视频网站在全屏播放时都会出现不良信息占住屏幕一部分。点击全屏播放之前,长按[☰]按钮,超微浏览器将弹出全局脚本菜单,勾选“移除浮动不良信息”后再点全屏播放则完美播放。 也可利用全屏播放屏蔽一切不良信息。方法如下: 长按[☰]按钮,勾选“全屏视频”。此选项将让无法全屏播放的网站强制允许全屏播放。 对无法全屏、无法放大的视频网站,可长按[☰]按钮,勾选“强制缩放”,然后手动放大至全屏。 灵活应用JS、图像开关屏蔽一切不良信息:视频搜索前关闭JS开关,进入播放网页前关闭图像显示并打开JS。 视频解析之电视剧: 首先在视频网站搜索电视剧片名,下面会显示不同的剧集,点击它们再用视频解析即可观看。如果直接点击电视剧用视频解析则每次播放均为第一集。 视频搜索预配置(超过400个引擎) @@ -511,10 +510,10 @@ js文件格式如下: 工具汇总 - https://jamesfengcao.gitee.io/uwebzh/tools/ + /zh/tools/ Sun, 06 Sep 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tools/ + /zh/tools/ 安装tdict检索工具 (本地检索,远程内容) 安装完tdict本地检索工具后,可选择性安装字典索引及对应的搜索引擎至主屏。以下引擎仅作测试使用。 安装双解字典索引 安装双解字典至主屏 @@ -545,10 +544,10 @@ Merriam Webster Unabridged 利用文件预处理预览/查看/播放一切可下载资源 - https://jamesfengcao.gitee.io/uwebzh/filecap/ + /zh/filecap/ Mon, 24 Aug 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/filecap/ + /zh/filecap/ 技巧等级:中级 文件预处理配置文件为/sdcard/uweb/default.filecap,每行格式如下: [文件后缀]:[mimetype]:[处理命令] @@ -565,10 +564,10 @@ pdf:uweb:echo file:///sdcard/uweb/app/pdf.js/web/viewer.html?file=%u djvu:uweb:e html5应用 - https://jamesfengcao.gitee.io/uwebzh/html5/ + /zh/html5/ Thu, 20 Aug 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/html5/ + /zh/html5/ 点击安装超大文件阅读器(支持txt, html, markdown) 点击安装超大文件阅读器(markdeep版, latex, diagram,graphviz等) 点击安装plyr视频播放器 @@ -604,10 +603,10 @@ MoePlayer/APlayer : music player 手势 - https://jamesfengcao.gitee.io/uwebzh/gesture/ + /zh/gesture/ Thu, 18 Jun 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/gesture/ + /zh/gesture/ 顶部下拉弹出地址栏; 顶部上划隐藏地址栏。底部下划隐藏工具条; 底部左右角落划动弹出工具条。 紧靠工具条左右划动切换当前窗口; 左右大幅度划动切换到第一或最后一个窗口。 起点终点紧靠地址栏划动操作调用&quot;default.gesture&quot;文件中对应链接。文件格式与文件default.link完全相同。每行第一部分为助记名,第二部分为链接。手势操作对应方式如下: @@ -621,10 +620,10 @@ back2:javascript:history.go(-2) 一键执行任意预定义命令(附手机PC剪贴板互通) - https://jamesfengcao.gitee.io/uwebzh/cmd/ + /zh/cmd/ Sat, 20 Jan 2018 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/cmd/ + /zh/cmd/ 技巧等级:中级 PC剪贴板(高级) uweb浏览器支持一键执行任意预定义命令,这些命令可以与剪贴板交互,可以将结果(文本、图像、音视频)输出到浏览器窗口。 手机推荐安装uweb定制Termux,否则能够执行的命令极其有限。 @@ -644,128 +643,19 @@ mimetype用来表示命令的输出类型。除了标准的mimetype之外,超 便利链接 - https://jamesfengcao.gitee.io/uwebzh/urls/ + /zh/urls/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/urls/ + /zh/urls/ Termux内部目录 - - 分类多引擎搜索 - https://jamesfengcao.gitee.io/uwebzh/searchcat/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/searchcat/ - 点击本链接自动安装分类多引擎文件至&quot;/sdcard/uweb/bookmark&quot;目录下。 -超微浏览器中通过“设置”-&gt;“总目录”-&gt;“↑”-&gt;“Download”,点击后缀为.search的下载文件,超微浏览器将自动显示分类多引擎搜索。此时可按菜单键(或长按底部工具条后退按钮)选择“添加到桌面”方便以后访问。 -.search文件每行格式为如下几种: -[搜索引擎名]:[不含%s的url] -[搜索引擎名]:[含%s的url] -[搜索引擎名]:POST:[含%s的post参数]:[url] -.search文件首行必须为第一种类型的搜索引擎。由于其它两种类型的引擎数量稀少,为性能考虑,超微限制了首个引擎的种类。 -本地引擎 搜索引擎已经支持命令行url,现在可添加离线字典查询至主页。命令行url格式为 -c:[含%s的命令行] -d:mimetype:[含%s的命令行]:[外部资源url] -查询时关键词会自动替换命令行中的%s。 -笔者用来查询各式词典,发现效果非常好。百兆以内的文本文件压缩以后可以直接快速检索,定位至特定位置以后可上下滚动阅读全部文本。 - - - - 利用多账号登录获取资源 - https://jamesfengcao.gitee.io/uwebzh/multiaccount/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/multiaccount/ - 谈到资源就离不开bt, bt下载费时费力,离线bt是最佳选择。国内离线下载由于关键节点屏蔽,基本没啥用。我的个人体验是彻彻底底完全没用,但别人也许还有点用?国外唯一一个有好体验的是seedr, 不过seedr有个大问题需要解决。 -其它我曾推荐过的台湾bt, bug实在太多,现在看来也成了半个垃圾。万般无奈之下只能重拾seedr. -seedr的问题是首次登录需要google人机验证,登录成功以后可以永久使用,无需小飞机辅助。 -以前偶尔飞飞一点问题也没有,毕竟1分钟飞行就可解决很长时间问题了。但目前的状态是信息基本被彻底封死,1分钟飞行也成了奢望。所以十分有必要珍惜这来之不易的1分钟飞行成果。 -现在直接上方案,使用超微浏览器多账号登录。飞行1分钟以后成功登录seedr, 此时退出浏览器,千万不能强退,一定要让运存中的登录信息写到内部存储。然后用户可备份应用内部目录下的.cjar文件,一旦浏览器失去登录状态,可恢复此文件,即可使用多账号登录重新登录,让这1分钟飞行成果保存下来,供万万年使用。需要注意的一点是:用户退出seedr账号会使保存的文件作废。故千万不要退出账号,需要用其它账号登录的请使用多账号登录。 - - - - 利用浏览器地址栏对函数作图 - https://jamesfengcao.gitee.io/uwebzh/gnuplot/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/gnuplot/ - 使用Android端uweb浏览器。 -Termux提供了方便的软件包管理系统,缺省的uWeb地址栏功能配置需用到作图软件gnuplot。 -安装gnuplot 安装 uweb定制Termux应用 Termux下运行以下命令: -apt update -apt upgrade -apt install gnuplot 地址栏功能配置: 配置文件/sdcard/uweb/default.acmd每行格式如下: -菜单名:mimeType:命令行 命令行可包含参数%s,运行时自动用地址栏输入内容替换。 如果浏览器窗口当前地址为本地url,则此目录同时作为命令行工作目录。 配置文件/sdcard/uweb/default.acmd如下: 命令:text/plain:%s 函数作图:image/svg+xml:gnuplot -e 'set term svg;set output; plot %s' 函数作图(3d):image/svg+xml:gnuplot -e 'set term svg;set output; splot %s' 超级计算器:text/html:echo &quot;%s&quot;|bc -l -q 长按uweb浏览器底部工具条刷新按钮弹出地址栏功能选择,选择“函数作图”,地址栏内输入函数如sin(x)**5就可显示函数图案。 -常见问题及诊断 确保gnuplot正确安装,在Termux提示符下,敲入gnuplot,然后回车,保证出现&quot;gnuplot&gt;&quot;。 确保gnuplot正常运行, 在Termux提示符下,执行下面命令: -gnuplot -e 'set term svg;set output; plot x' -屏幕输出应该为正常的svg文件(类似html文本)。 Termux应为uweb定制包,否则有一堆设定需要修改。 超微浏览器下长按设置按钮,勾选“标准错误输出”。再次在地址栏执行画图操作,此时浏览器会显示出错信息。 为保证地址栏输入函数符合gnuplot规范,首个测试函数建议为&quot;x&quot;,即整个地址栏内输入为&quot;x&quot;。 - - - - 加速访问国外网站 - https://jamesfengcao.gitee.io/uwebzh/hosts/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/hosts/ - 不少国外网站本身虽可访问,但由于网站需要下载其它网址的资源而导致无法访问。根域名屏蔽可屏蔽文件中域名的一切子域名、孙域名、......,从而主动排除这些网址,最终允许浏览器快速访问。 -使用Android端uweb浏览器。 -域名文件内容如下: -googleadservices.com -googlesyndication.com -adsense.com -googleapis.com -google-analytics.com -googletagservices.com -twitter.com -facebook.com -fbcdn.net -其它国外网址访问技巧: -尝试关闭javascript, 譬如程序员网站stackoverflow.com在关闭javascript的情况下国内一般均可快速访问。 关闭网页图片 - - - - 浏览器一键控制台式机/服务器下载资源 - https://jamesfengcao.gitee.io/uwebzh/pcdown/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/pcdown/ - 技巧等级:高级 -小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法: -手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令: -apt update -apt upgrade -apt install openssl -脚本pcdownload内容如下(可放置在任意应用内部目录下,并相应修改default.longclick配置中文件路径): -#!/data/data/com.termux/files/usr/bin/sh -ssh [user:password]@192.168.2.102 &quot;DISPLAY=:0 firefox \&quot;$1\&quot;&quot; -脚本需设置为可执行,Termux下执行命令: -chmod 755 /data/data/com.termux/files/usr/bin/pcdownload -这里假定用户已经在台式机上设好ssh服务,台式机IP地址为192.168.2.102,准备用firefox下载。如果下载工具不是图形程序,则上述脚本中可删去“DISPLAY=:0”。 -配置文件/sdcard/uweb/default.longclick如下: -PCdown:/data/data/com.termux/files/usr/bin/pcdownload -重启超微浏览器,点击链接下载时会弹出菜单,选择&quot;PCdown&quot;,台式机会启动firefox下载手机指定文档。 -可能大家有疑问,台式机无法登录,为什么手机可以登录?这是因为手机上应用多哈。 - - - - 特定网址用户脚本及样式 - https://jamesfengcao.gitee.io/uwebzh/sitejs/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/sitejs/ - 技巧等级:中级 -脚本 (第一时间装载js脚本见下面sitecss条目) -脚本需命名为 &quot;[根域名].js&quot;,譬如baidu.com.js 或tieba.baidu.com.js 。此脚本将自动作用于所有相同根域名的网址上。如有多个脚本满足条件,以最长文件名为准。 这些脚本需放到/sdcard/uweb/sitejs或/data/data/info.torapp.uweb/files/sitejs目录下,数量没有限制,上百万都不成问题。如果内部目录下sitejs存在,则/sdcard/uweb/sitejs不起任何作用。内部sitejs目录的存在同时也影响一切对安全敏感的资源(包括网站离线资源等)的配置,一旦内部sitejs目录存在,则这些资源必须位于内部目录才会生效。 长按窗口按钮,勾选“执行网址用户脚本”。 脚本执行对浏览器无性能影响,即使有百万脚本存在。 目前支持两段、三段及少数四段域名(最后两段不超过6字如com.cn的域名可取四段)。所以脚本请不要以很长的域名来命名。 样式及第一时间装载js脚本 -与此类似,用户样式需命名为 &quot;[根域名].css&quot;,譬如baidu.com.css 或tieba.baidu.com.css。 样式文件需放到/sdcard/uweb/sitecss目录下。 sitecss目录下&quot;[根域名].js&quot;文件会在第一时间装载。 长按窗口按钮,勾选“使用网址用户样式”。 如果文件“/sdcard/uweb/default.css”存在,访问网址时如果没有与域名匹配的css文件,则使用此默认样式文件。 default.css可作为夜间模式来使用,此时default.css为夜间模式css,而黑色主题类网址对应的域名为空文件。此种设定情况下仅白色主题网页会使用夜间模式css。 文件sitejs/.js 和sitecss/.css, sitecss/.js可作用于一切非http url(本地文件,浏览器界面等)。 - - 电视直播 - https://jamesfengcao.gitee.io/uwebzh/tvlive/ + /zh/tvlive/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tvlive/ + /zh/tvlive/ CCTV1 CCTV2财经 CCTV3综艺 @@ -839,11 +729,53 @@ CCTV17农村 - 绝杀完整域名树 - https://jamesfengcao.gitee.io/uwebzh/adblock_domain/ + 分类多引擎搜索 + /zh/searchcat/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/adblock_domain/ + /zh/searchcat/ + 点击本链接自动安装分类多引擎文件至&quot;/sdcard/uweb/bookmark&quot;目录下。 +超微浏览器中通过“设置”-&gt;“总目录”-&gt;“↑”-&gt;“Download”,点击后缀为.search的下载文件,超微浏览器将自动显示分类多引擎搜索。此时可按菜单键(或长按底部工具条后退按钮)选择“添加到桌面”方便以后访问。 +.search文件每行格式为如下几种: +[搜索引擎名]:[不含%s的url] +[搜索引擎名]:[含%s的url] +[搜索引擎名]:POST:[含%s的post参数]:[url] +.search文件首行必须为第一种类型的搜索引擎。由于其它两种类型的引擎数量稀少,为性能考虑,超微限制了首个引擎的种类。 +本地引擎 搜索引擎已经支持命令行url,现在可添加离线字典查询至主页。命令行url格式为 +c:[含%s的命令行] +d:mimetype:[含%s的命令行]:[外部资源url] +查询时关键词会自动替换命令行中的%s。 +笔者用来查询各式词典,发现效果非常好。百兆以内的文本文件压缩以后可以直接快速检索,定位至特定位置以后可上下滚动阅读全部文本。 + + + + 加速访问国外网站 + /zh/hosts/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zh/hosts/ + 不少国外网站本身虽可访问,但由于网站需要下载其它网址的资源而导致无法访问。根域名屏蔽可屏蔽文件中域名的一切子域名、孙域名、......,从而主动排除这些网址,最终允许浏览器快速访问。 +使用Android端uweb浏览器。 +域名文件内容如下: +googleadservices.com +googlesyndication.com +adsense.com +googleapis.com +google-analytics.com +googletagservices.com +twitter.com +facebook.com +fbcdn.net +其它国外网址访问技巧: +尝试关闭javascript, 譬如程序员网站stackoverflow.com在关闭javascript的情况下国内一般均可快速访问。 关闭网页图片 + + + + 绝杀完整域名树 + /zh/adblock_domain/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zh/adblock_domain/ 域名文件可屏蔽文件中域名的一切子域名、孙域名、......,可彻底绝杀一切不良信息。所以用户屏蔽根域名时无需选择提示中出现的整个域名,只需选取最后两段或三段(最后两段不超过6字符如com.cn的域名可取四段)。 可使用列出外部脚本小书签生成外部js文件列表,然后长按底部工具栏&quot;js&quot;按钮,执行&quot;网址转链接&quot;菜单命令,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。 长按不良信息链接,点击“图片:屏蔽根域名”,修改弹出域名,一般取最后两段,点击&quot;确定&quot;屏蔽当前图片网址。 @@ -860,11 +792,78 @@ CCTV17农村 - 装载网站离线资源 - https://jamesfengcao.gitee.io/uwebzh/offlinecache/ + 利用多账号登录获取资源 + /zh/multiaccount/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/offlinecache/ + /zh/multiaccount/ + 谈到资源就离不开bt, bt下载费时费力,离线bt是最佳选择。国内离线下载由于关键节点屏蔽,基本没啥用。我的个人体验是彻彻底底完全没用,但别人也许还有点用?国外唯一一个有好体验的是seedr, 不过seedr有个大问题需要解决。 +其它我曾推荐过的台湾bt, bug实在太多,现在看来也成了半个垃圾。万般无奈之下只能重拾seedr. +seedr的问题是首次登录需要google人机验证,登录成功以后可以永久使用,无需小飞机辅助。 +以前偶尔飞飞一点问题也没有,毕竟1分钟飞行就可解决很长时间问题了。但目前的状态是信息基本被彻底封死,1分钟飞行也成了奢望。所以十分有必要珍惜这来之不易的1分钟飞行成果。 +现在直接上方案,使用超微浏览器多账号登录。飞行1分钟以后成功登录seedr, 此时退出浏览器,千万不能强退,一定要让运存中的登录信息写到内部存储。然后用户可备份应用内部目录下的.cjar文件,一旦浏览器失去登录状态,可恢复此文件,即可使用多账号登录重新登录,让这1分钟飞行成果保存下来,供万万年使用。需要注意的一点是:用户退出seedr账号会使保存的文件作废。故千万不要退出账号,需要用其它账号登录的请使用多账号登录。 + + + + 利用浏览器地址栏对函数作图 + /zh/gnuplot/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zh/gnuplot/ + 使用Android端uweb浏览器。 +Termux提供了方便的软件包管理系统,缺省的uWeb地址栏功能配置需用到作图软件gnuplot。 +安装gnuplot 安装 uweb定制Termux应用 Termux下运行以下命令: +apt update +apt upgrade +apt install gnuplot 地址栏功能配置: 配置文件/sdcard/uweb/default.acmd每行格式如下: +菜单名:mimeType:命令行 命令行可包含参数%s,运行时自动用地址栏输入内容替换。 如果浏览器窗口当前地址为本地url,则此目录同时作为命令行工作目录。 配置文件/sdcard/uweb/default.acmd如下: 命令:text/plain:%s 函数作图:image/svg+xml:gnuplot -e 'set term svg;set output; plot %s' 函数作图(3d):image/svg+xml:gnuplot -e 'set term svg;set output; splot %s' 超级计算器:text/html:echo &quot;%s&quot;|bc -l -q 长按uweb浏览器底部工具条刷新按钮弹出地址栏功能选择,选择“函数作图”,地址栏内输入函数如sin(x)**5就可显示函数图案。 +常见问题及诊断 确保gnuplot正确安装,在Termux提示符下,敲入gnuplot,然后回车,保证出现&quot;gnuplot&gt;&quot;。 确保gnuplot正常运行, 在Termux提示符下,执行下面命令: +gnuplot -e 'set term svg;set output; plot x' +屏幕输出应该为正常的svg文件(类似html文本)。 Termux应为uweb定制包,否则有一堆设定需要修改。 超微浏览器下长按设置按钮,勾选“标准错误输出”。再次在地址栏执行画图操作,此时浏览器会显示出错信息。 为保证地址栏输入函数符合gnuplot规范,首个测试函数建议为&quot;x&quot;,即整个地址栏内输入为&quot;x&quot;。 + + + + 浏览器一键控制台式机/服务器下载资源 + /zh/pcdown/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zh/pcdown/ + 技巧等级:高级 +小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法: +手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令: +apt update +apt upgrade +apt install openssl +脚本pcdownload内容如下(可放置在任意应用内部目录下,并相应修改default.longclick配置中文件路径): +#!/data/data/com.termux/files/usr/bin/sh +ssh [user:password]@192.168.2.102 &quot;DISPLAY=:0 firefox \&quot;$1\&quot;&quot; +脚本需设置为可执行,Termux下执行命令: +chmod 755 /data/data/com.termux/files/usr/bin/pcdownload +这里假定用户已经在台式机上设好ssh服务,台式机IP地址为192.168.2.102,准备用firefox下载。如果下载工具不是图形程序,则上述脚本中可删去“DISPLAY=:0”。 +配置文件/sdcard/uweb/default.longclick如下: +PCdown:/data/data/com.termux/files/usr/bin/pcdownload +重启超微浏览器,点击链接下载时会弹出菜单,选择&quot;PCdown&quot;,台式机会启动firefox下载手机指定文档。 +可能大家有疑问,台式机无法登录,为什么手机可以登录?这是因为手机上应用多哈。 + + + + 特定网址用户脚本及样式 + /zh/sitejs/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zh/sitejs/ + 技巧等级:中级 +脚本 (第一时间装载js脚本见下面sitecss条目) +脚本需命名为 &quot;[根域名].js&quot;,譬如baidu.com.js 或tieba.baidu.com.js 。此脚本将自动作用于所有相同根域名的网址上。如有多个脚本满足条件,以最长文件名为准。 这些脚本需放到/sdcard/uweb/sitejs或/data/data/info.torapp.uweb/files/sitejs目录下,数量没有限制,上百万都不成问题。如果内部目录下sitejs存在,则/sdcard/uweb/sitejs不起任何作用。内部sitejs目录的存在同时也影响一切对安全敏感的资源(包括网站离线资源等)的配置,一旦内部sitejs目录存在,则这些资源必须位于内部目录才会生效。 长按窗口按钮,勾选“执行网址用户脚本”。 脚本执行对浏览器无性能影响,即使有百万脚本存在。 目前支持两段、三段及少数四段域名(最后两段不超过6字如com.cn的域名可取四段)。所以脚本请不要以很长的域名来命名。 样式及第一时间装载js脚本 +与此类似,用户样式需命名为 &quot;[根域名].css&quot;,譬如baidu.com.css 或tieba.baidu.com.css。 样式文件需放到/sdcard/uweb/sitecss目录下。 sitecss目录下&quot;[根域名].js&quot;文件会在第一时间装载。 长按窗口按钮,勾选“使用网址用户样式”。 如果文件“/sdcard/uweb/default.css”存在,访问网址时如果没有与域名匹配的css文件,则使用此默认样式文件。 default.css可作为夜间模式来使用,此时default.css为夜间模式css,而黑色主题类网址对应的域名为空文件。此种设定情况下仅白色主题网页会使用夜间模式css。 文件sitejs/.js 和sitecss/.css, sitecss/.js可作用于一切非http url(本地文件,浏览器界面等)。 + + + + 装载网站离线资源 + /zh/offlinecache/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zh/offlinecache/ uweb浏览器支持装载网站离线资源。只需要将离线资源存为文件&quot;/sdcard/uweb/sitecache/[域名]/[全部路径,包括文件名,?,&amp;,=, 与url一模一样]&quot;。如果应用内部目录有文件夹&quot;sitejs&quot;存在,则“/sdcard/uweb”下的离线资源不再生效,此时生效离线资源为内部目录下的&quot;sitecache&quot;文件夹。 打开选项以后超微将自动装载这些离线资源。 离线资源可作为缓存提高浏览器性能; 可作为国外网站部分备份修复服务访问; 也可替换部分网站资源达到定制网站的作用。 diff --git a/adblock/index.html b/zh/adblock/index.html similarity index 83% rename from adblock/index.html rename to zh/adblock/index.html index 880a9c73..a7a9ad69 100644 --- a/adblock/index.html +++ b/zh/adblock/index.html @@ -6,10 +6,20 @@ 信息隐藏技术总览 +
- +
@@ -28,13 +38,13 @@
  • 双正则表达式根域名隐藏

      -
    • 可使用列出外部脚本小书签生成外部js文件列表,然后长按底部工具栏"js"按钮,执行"网址转链接"菜单命令,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。
    • +
    • 可使用列出外部脚本小书签生成外部js文件列表,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。
  • 针对特定网站的脚本样式

      -
    • 长按底部工具栏"js"按钮,执行"标记不良元素"菜单命令,点击页面元素会弹出对话框显示元素及祖先所有属性,并生成css屏蔽代码。默认使用“display:none”屏蔽,但如果上述显示属性中出现过"display"。则建议使用"transform:scale(0)!important"屏蔽。
    • +
    • 长按底部工具栏"js"按钮,执行"标记不良元素"菜单命令,点击页面元素会弹出对话框显示元素及祖先所有属性,并生成css屏蔽代码。默认使用“display:none”屏蔽,但如果上述显示属性中出现过"display",则建议使用"transform:scale(0)!important"屏蔽。
  • diff --git a/adblock_css/index.html b/zh/adblock_css/index.html similarity index 76% rename from adblock_css/index.html rename to zh/adblock_css/index.html index 80c53083..2c8b91e7 100644 --- a/adblock_css/index.html +++ b/zh/adblock_css/index.html @@ -6,10 +6,20 @@ 利用用户自定义样式屏蔽不良信息 +
    - +
    diff --git a/adblock_domain/index.html b/zh/adblock_domain/index.html similarity index 85% rename from adblock_domain/index.html rename to zh/adblock_domain/index.html index 60e343ad..51044274 100644 --- a/adblock_domain/index.html +++ b/zh/adblock_domain/index.html @@ -6,10 +6,20 @@ 绝杀完整域名树 +
    - +
    diff --git a/androidtv/index.html b/zh/androidtv/index.html similarity index 76% rename from androidtv/index.html rename to zh/androidtv/index.html index 9a74412d..1f363f8a 100644 --- a/androidtv/index.html +++ b/zh/androidtv/index.html @@ -6,10 +6,20 @@ Android TV +
    - +
    diff --git a/bc/index.html b/zh/bc/index.html similarity index 80% rename from bc/index.html rename to zh/bc/index.html index b0df7dcd..bcbda19b 100644 --- a/bc/index.html +++ b/zh/bc/index.html @@ -6,10 +6,20 @@ 超级计算器(bc) +
    - +
    diff --git a/bookmark/index.html b/zh/bookmark/index.html similarity index 80% rename from bookmark/index.html rename to zh/bookmark/index.html index dcfbfd15..8e3065a3 100644 --- a/bookmark/index.html +++ b/zh/bookmark/index.html @@ -6,10 +6,20 @@ 常用书签 +
    - +
    diff --git a/bookmarklet/index.html b/zh/bookmarklet/index.html similarity index 94% rename from bookmarklet/index.html rename to zh/bookmarklet/index.html index 13a0d960..3db5d32c 100644 --- a/bookmarklet/index.html +++ b/zh/bookmarklet/index.html @@ -6,10 +6,20 @@ 小书签 +
    - +
    @@ -26,7 +36,7 @@

    超微浏览器支持直接运行远程网址上的小书签(Bookmarklet),将本页面或其它包含小书签网址加入书签。使用时只需长按小书签链接,点击“新窗口打开”,小书签将作用于超微浏览器最后一个窗口(非小书签窗口)页面上。

    -

    列出外部脚本

    +

    列出外部脚本

    查看浏览器UA
    网页cookie
    网页源码
    diff --git a/zh/categories/index.html b/zh/categories/index.html new file mode 100644 index 00000000..fc620d7d --- /dev/null +++ b/zh/categories/index.html @@ -0,0 +1,8 @@ + + + +

      + +
    + + diff --git a/zh/categories/index.xml b/zh/categories/index.xml new file mode 100644 index 00000000..351c8349 --- /dev/null +++ b/zh/categories/index.xml @@ -0,0 +1,9 @@ + + + + Categories on + /zh/categories/ + Recent content in Categories on + Hugo -- gohugo.io + + diff --git a/cmd/index.html b/zh/cmd/index.html similarity index 85% rename from cmd/index.html rename to zh/cmd/index.html index 6f398288..2f4ceede 100644 --- a/cmd/index.html +++ b/zh/cmd/index.html @@ -6,10 +6,20 @@ 一键执行任意预定义命令(附手机PC剪贴板互通) +
    - +
    diff --git a/filecap/index.html b/zh/filecap/index.html similarity index 89% rename from filecap/index.html rename to zh/filecap/index.html index 21b6a47f..eadc7e9e 100644 --- a/filecap/index.html +++ b/zh/filecap/index.html @@ -6,10 +6,20 @@ 利用文件预处理预览/查看/播放一切可下载资源 +
    - +
    diff --git a/filemanager/index.html b/zh/filemanager/index.html similarity index 73% rename from filemanager/index.html rename to zh/filemanager/index.html index f49553c7..8241606d 100644 --- a/filemanager/index.html +++ b/zh/filemanager/index.html @@ -6,10 +6,20 @@ 文件管理器及文件挑选并批量处理 +
    - +
    diff --git a/filenames/index.html b/zh/filenames/index.html similarity index 94% rename from filenames/index.html rename to zh/filenames/index.html index 8e3f16b7..a53b423a 100644 --- a/filenames/index.html +++ b/zh/filenames/index.html @@ -6,10 +6,20 @@ 超微浏览器配置文件列表 +
    - +
    diff --git a/gesture/index.html b/zh/gesture/index.html similarity index 77% rename from gesture/index.html rename to zh/gesture/index.html index ddd62839..09aa4a47 100644 --- a/gesture/index.html +++ b/zh/gesture/index.html @@ -6,10 +6,20 @@ 手势 +
    - +
    diff --git a/globalcss/index.html b/zh/globalcss/index.html similarity index 75% rename from globalcss/index.html rename to zh/globalcss/index.html index e32b0e97..32f8d25e 100644 --- a/globalcss/index.html +++ b/zh/globalcss/index.html @@ -6,10 +6,20 @@ CSS样式 +
    - +
    diff --git a/gnuplot/index.html b/zh/gnuplot/index.html similarity index 84% rename from gnuplot/index.html rename to zh/gnuplot/index.html index 175268cb..10b15920 100644 --- a/gnuplot/index.html +++ b/zh/gnuplot/index.html @@ -6,10 +6,20 @@ 利用浏览器地址栏对函数作图 +
    - +
    diff --git a/hosts/index.html b/zh/hosts/index.html similarity index 75% rename from hosts/index.html rename to zh/hosts/index.html index dfe38bed..5c92699e 100644 --- a/hosts/index.html +++ b/zh/hosts/index.html @@ -6,10 +6,20 @@ 加速访问国外网站 +
    - +
    diff --git a/html5/index.html b/zh/html5/index.html similarity index 88% rename from html5/index.html rename to zh/html5/index.html index 48075a07..0d5a0b0a 100644 --- a/html5/index.html +++ b/zh/html5/index.html @@ -6,10 +6,20 @@ html5应用 +
    - +
    diff --git a/icons/index.html b/zh/icons/index.html similarity index 76% rename from icons/index.html rename to zh/icons/index.html index 24e2e618..15180ce0 100644 --- a/icons/index.html +++ b/zh/icons/index.html @@ -6,10 +6,20 @@ 工具栏定制 +
    - +
    diff --git a/zh/index.html b/zh/index.html new file mode 100644 index 00000000..bfdefd0e --- /dev/null +++ b/zh/index.html @@ -0,0 +1,302 @@ + + + + + + + + + + + + +
    + + +
    +
    + + + + + + diff --git a/index.xml b/zh/index.xml similarity index 92% rename from index.xml rename to zh/index.xml index 0a7e761c..8764cba3 100644 --- a/index.xml +++ b/zh/index.xml @@ -2,21 +2,20 @@ - https://jamesfengcao.gitee.io/uwebzh/ + /zh/ Recent content on Hugo -- gohugo.io - en-us - Sat, 25 Jun 2022 00:00:00 +0000 + Sat, 25 Jun 2022 00:00:00 +0000 信息隐藏技术总览 - https://jamesfengcao.gitee.io/uwebzh/adblock/ + /zh/adblock/ Sat, 25 Jun 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/adblock/ + /zh/adblock/ 总体来说,分为手动控制和针对特定网站的规则两大类办法。手动控制可以保存为网站配置从而自动化。 双正则表达式根域名隐藏。 -可使用列出外部脚本小书签生成外部js文件列表,然后长按底部工具栏&quot;js&quot;按钮,执行&quot;网址转链接&quot;菜单命令,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。 针对特定网站的脚本样式。 -长按底部工具栏&quot;js&quot;按钮,执行&quot;标记不良元素&quot;菜单命令,点击页面元素会弹出对话框显示元素及祖先所有属性,并生成css屏蔽代码。默认使用“display:none”屏蔽,但如果上述显示属性中出现过&quot;display&quot;。则建议使用&quot;transform:scale(0)!important&quot;屏蔽。 长按底部工具栏窗口管理按钮,选取&quot;仅显示图片&quot;或&quot;仅显示视频&quot;,图片视频网站彻底干净。选取&quot;禁用伪元素&quot;,&quot;禁用iframe&quot;。更多可参看自定义样式。 +可使用列出外部脚本小书签生成外部js文件列表,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。 针对特定网站的脚本样式。 +长按底部工具栏&quot;js&quot;按钮,执行&quot;标记不良元素&quot;菜单命令,点击页面元素会弹出对话框显示元素及祖先所有属性,并生成css屏蔽代码。默认使用“display:none”屏蔽,但如果上述显示属性中出现过&quot;display&quot;,则建议使用&quot;transform:scale(0)!important&quot;屏蔽。 长按底部工具栏窗口管理按钮,选取&quot;仅显示图片&quot;或&quot;仅显示视频&quot;,图片视频网站彻底干净。选取&quot;禁用伪元素&quot;,&quot;禁用iframe&quot;。更多可参看自定义样式。 保存书签时可在网址前面添加&quot;i:0mc32:&quot;,则整个网址树自动采用&quot;仅显示图片&quot;。没有任何不良信息。改为&quot;c16&quot;则为&quot;仅显示视频&quot;。&quot;c12&quot;则同时采用&quot;禁用伪元素&quot;,&quot;禁用iframe&quot;。 长按[☰]按钮&quot;自动全屏播放&quot;,直接全屏无干扰播放。不良信息没有任何机会出现。不使用全局脚本“自动全屏播放”的情况下,还可以有以下几种方法: 使用常用服务自动全屏播放菜单(长按视频链接-&gt;命令),则页面视频会自动全屏播放。按设置按钮,如果勾选“允许自动播放”,则今后此窗口内其它任何视频网址都将会自动全屏无干扰播放。保存书签时可在网址前面添加&quot;i:5f&quot;。 保存书签时可在网址前面添加&quot;i:0mi:5f:&quot;,则整个网址树自动全屏播放。 长按设置,选取&quot;拦截外链脚本&quot;。可在界面配置及杂项网页额外拦截第三方可疑资源。可配置白名单js.allow。 长按[☰]按钮可隐藏浮动信息,移除横幅,清空定时器(防止定时触发不良信息),中断可疑事件(防止用户操作触发),等待(防止延迟触发)。 @@ -27,10 +26,10 @@ url.deny。需要屏蔽的url正则表达式(java语法),忽视回车, 小书签 - https://jamesfengcao.gitee.io/uwebzh/bookmarklet/ + /zh/bookmarklet/ Fri, 24 Jun 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/bookmarklet/ + /zh/bookmarklet/ 超微浏览器支持直接运行远程网址上的小书签(Bookmarklet),将本页面或其它包含小书签网址加入书签。使用时只需长按小书签链接,点击“新窗口打开”,小书签将作用于超微浏览器最后一个窗口(非小书签窗口)页面上。 列出外部脚本 查看浏览器UA @@ -55,19 +54,19 @@ BugMeNot 技巧网站导航 - https://jamesfengcao.gitee.io/uwebzh/sitemap/ + /zh/sitemap/ Sat, 28 May 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/sitemap/ + /zh/sitemap/ 界面配置 搜索引擎 主页 快速访问 界面配置及杂项 (gitee镜像) 备份与恢复 个性化 工具条按钮长按菜单 浏览器标识 js脚本 常用服务 常用链接 常用命令 远程脚本 选中文本类菜单 长按链接弹出菜单 底部工具条定制 手势 高级个性化定制 高级设置 内容类 信息隐藏 CSS样式 重定向 特定网址用户脚本及样式 网站离线资源 工具应用类 小书签 文件预处理 html5应用 文件管理器 工具汇总 终端应用及Termux 超级计算器 函数作图 定时脚本 离线下载 输入法辅助 部件检索 综合 配置文件列表 插件 使用技巧 使用技巧 视频 安卓系统出错诊断 Android TV - https://jamesfengcao.gitee.io/uwebzh/androidtv/ + /zh/androidtv/ Wed, 18 May 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/androidtv/ + /zh/androidtv/ TV端推荐打开自动播放选项,全局脚本打开自动全屏播放,全局样式打开“仅显示图片“,禁止js confirm对话框。 点击以下链接可直接设置主屏为书签并添加链接。Android TV可从手机端接收视频url并打开,发送见常用服务: 等待从网络接收url并打开 @@ -78,25 +77,12 @@ BugMeNot Android TV可利用顺序搜索使用箭头按钮切换频道。顺序搜索引擎文件engine.search中的搜索引擎url如果不包含'%s',则搜索引擎只是简单的固定网页url,此时顺序搜索表现为频道切换。更多信息见多引擎搜索页面。 - - 利用用户自定义样式屏蔽不良信息 - https://jamesfengcao.gitee.io/uwebzh/adblock_css/ - Wed, 18 May 2022 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/adblock_css/ - 点击以下链接可安装全局样式,清后台重启浏览器,长按底部工具条窗口按钮弹出对话框后勾选上述文件名即可屏蔽不良信息。 -floppymoose 广告屏蔽样式 -gozer 广告屏蔽样式 -超微浏览器支持根域名屏蔽,完全绝杀手机不良信息小厂。但少部分不良信息大厂本身也提供高质量的内容服务,它们可以将不良信息伪装成正常的内容从而逃脱域名绝杀。 -对这一部分不良信息而言,我们可以利用超微浏览器的自定义样式功能加以屏蔽。 - - 常用书签 - https://jamesfengcao.gitee.io/uwebzh/bookmark/ + /zh/bookmark/ Wed, 18 May 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/bookmark/ + /zh/bookmark/ gamezop 点击以下链接可安装模板至分类书签目录。保存至“小说”类别的网站会自动使用阅读模式。 &quot;小说.html&quot;: 自动使用阅读模式 @@ -115,12 +101,25 @@ wikipedia search gopher reddit gopher + + 利用用户自定义样式屏蔽不良信息 + /zh/adblock_css/ + Wed, 18 May 2022 00:00:00 +0000 + + /zh/adblock_css/ + 点击以下链接可安装全局样式,清后台重启浏览器,长按底部工具条窗口按钮弹出对话框后勾选上述文件名即可屏蔽不良信息。 +floppymoose 广告屏蔽样式 +gozer 广告屏蔽样式 +超微浏览器支持根域名屏蔽,完全绝杀手机不良信息小厂。但少部分不良信息大厂本身也提供高质量的内容服务,它们可以将不良信息伪装成正常的内容从而逃脱域名绝杀。 +对这一部分不良信息而言,我们可以利用超微浏览器的自定义样式功能加以屏蔽。 + + 常用链接 - https://jamesfengcao.gitee.io/uwebzh/links/ + /zh/links/ Tue, 10 May 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/links/ + /zh/links/ 点击以下链接可安装至常用链接 显示网站安全证书 迅雷盘离线 @@ -178,10 +177,10 @@ i:1c 重定向国外网址至国内镜像(附编辑本地文件) - https://jamesfengcao.gitee.io/uwebzh/redirect/ + /zh/redirect/ Mon, 25 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/redirect/ + /zh/redirect/ github mirror:fastgit github mirror 2 github mirror 3 @@ -222,10 +221,10 @@ item.gome.com.cn::item.gomevvv.com.cn 操作选中(富)文本/元素 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ Sat, 23 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ 点击以下链接可安装长按“链接”按钮菜单: google划词翻译 bing翻译 @@ -266,10 +265,10 @@ pclip CSS样式 - https://jamesfengcao.gitee.io/uwebzh/globalcss/ + /zh/globalcss/ Sun, 03 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/globalcss/ + /zh/globalcss/ 超微浏览器自动装载&quot;/sdcard/uweb/css&quot;目录下所有.css文件作为全局样式供用户选用。点击以下配置链接可自动添加为全局样式: 强制使用默认字体 配合透明状态栏(沉浸) @@ -280,10 +279,10 @@ webview 80- 夜间模式 超微浏览器配置文件列表 - https://jamesfengcao.gitee.io/uwebzh/filenames/ + /zh/filenames/ Fri, 18 Mar 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/filenames/ + /zh/filenames/ 下面列表中以&quot;/&quot;结尾者为目录,其余为文件。如果用户勾选“使用内部目录配置”,&quot;sitejs/&quot;,&quot;sitecache/&quot;等位于应用内部保护目录下。否则以下所有文件/目录均位于&quot;/sdcard/uweb&quot;: &quot;css/&quot;:全局样式目录 &quot;js/&quot;: 全局脚本目录 @@ -340,10 +339,10 @@ webview 80- 夜间模式 文件管理器及文件挑选并批量处理 - https://jamesfengcao.gitee.io/uwebzh/filemanager/ + /zh/filemanager/ Fri, 11 Feb 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/filemanager/ + /zh/filemanager/ 超微浏览器访问以&quot;/&quot;结尾 (包括&quot;/?&quot;及后面参数)的&quot;file://&quot; url,则进入文件管理器。 对任何目录型(以“/”结尾)文件url,后面可附&quot;?[文件前缀][*[文件后缀]]&quot;。譬如&quot;file:///sdcard/?*.png&quot;会列举出&quot;/sdcard&quot;目录下所有.png文件。&quot;?IMG&quot;列举出所有IMG开头的文件。此时可选定文件,并安装checked.js对选取文件进行批量处理。 文件批量处理配置default.select例子: @@ -352,10 +351,10 @@ webview 80- 夜间模式 超级计算器(bc) - https://jamesfengcao.gitee.io/uwebzh/bc/ + /zh/bc/ Thu, 10 Feb 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/bc/ + /zh/bc/ 使用uweb浏览器。 Gnu bc计算器支持无限精度,可扩展函数库、常数库。 安装bc (Android11+无需安装) 安装uweb定制Termux应用 Termux下运行以下命令: @@ -376,10 +375,10 @@ http://www.numbertheory.org/gnubc/gnubc.html 工具栏定制 - https://jamesfengcao.gitee.io/uwebzh/icons/ + /zh/icons/ Sun, 06 Feb 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/icons/ + /zh/icons/ 超微浏览器配置目录下如果存在目录&quot;icon&quot;,则此目录下的文件名为&quot;0&quot;,&quot;1&quot;,&quot;2&quot;... 会作为底部工具栏图标。文件&quot;0&quot;替换原后退按钮,&quot;1&quot;为前进按钮,&quot;2&quot;为设置按钮,&quot;3&quot;为主页按钮......。 如果定义有新按钮(当前版本存在文件&quot;20&quot;),则uweb支持向量格式图标VectorDrawable,格式为compiled XML。此时所有图标文件必须都是compiled XML格式,或都是普通的图像格式(png,jpg,gif等)。用户可将VectorDrawable XML文件放到安卓项目目录assets下面,重新生成apk文件以后将apk文件解压即可得compiled XML格式图标文件。 @@ -389,10 +388,10 @@ http://www.numbertheory.org/gnubc/gnubc.html 小技巧 - https://jamesfengcao.gitee.io/uwebzh/tips/ + /zh/tips/ Mon, 01 Nov 2021 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tips/ + /zh/tips/ 准确显示一切PC网页: PC模式 + 勾选选项&quot;宽屏显示&quot; + 全局脚本&quot;强制缩放&quot;。 多主屏: @@ -410,10 +409,10 @@ UA为非默认时,点击PC按钮将恢复UA为默认,同时触发不保存UA 定时脚本 - https://jamesfengcao.gitee.io/uwebzh/tcron/ + /zh/tcron/ Sat, 13 Feb 2021 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tcron/ + /zh/tcron/ 如果勾选“文件预处理”,则uweb启动时运行&quot;default.rc&quot; shell脚本。可与tcron定时管 理工具(安装tcron)配合运行定时任务,如存储清理、网页签到等。 勾选“文件预处理”的情况下,如果存在文件&quot;default.rc2&quot;,则在超微浏览器成为前台时,此文件代码被执行。在超微永不退出的情况下,&quot;default.rc&quot;将没有任何执行机会,而&quot;default.rc2&quot;保证即使超微长时间不重启,定时脚本仍可以执行。 @@ -446,10 +445,10 @@ crontab例子内容如下: 安卓系统出错诊断 - https://jamesfengcao.gitee.io/uwebzh/logcat/ + /zh/logcat/ Mon, 28 Dec 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/logcat/ + /zh/logcat/ 超微浏览器如果闪退,会生成出错文件&quot;/sdcard/uweb/error.log&quot;。 如果超微或安卓系统或任何应用出现问题,则可利用超微浏览器进行诊断,方法如下: 访问常用命令网页,点击安装logcat相关的两个命令。 清空后台并重启超微浏览器。 长按历史按钮,执行命令&quot;清空logcat&quot;。 触发有问题的功能。 长按历史按钮,执行命令&quot;输出logcat.log&quot;. 检查文件&quot;/sdcard/uweb/logcat.log&quot;内容。 超微浏览器是手机上调试javascript脚本的最佳工具,无需打包就可有多种方式运行javascript代码。webview dev版自带devtools,运行此工具,打开flag &quot;webview-log-js-console-messages&quot;以后所有js出错信息及console输出会被复制到logcat中。然后用户可根据上一段所述方法诊断。 @@ -460,10 +459,10 @@ devtools for com.android.webview 离线下载 - https://jamesfengcao.gitee.io/uwebzh/loadbt/ + /zh/loadbt/ Tue, 15 Dec 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/loadbt/ + /zh/loadbt/ seedr用户可使用常用链接利用seedr离线下载。使用时长按链接-&gt;命令-&gt;seedr离线...。 Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。使用时长按链接-&gt;命令-&gt;tg...。 百度网盘存储空间大,但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。 本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。 超微浏览器上配置百度离线下载 @@ -484,10 +483,10 @@ BaiduPCS-Go config set -appid=266719 长按链接弹出菜单 - https://jamesfengcao.gitee.io/uwebzh/longclick/ + /zh/longclick/ Fri, 06 Nov 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/longclick/ + /zh/longclick/ 长按链接运行第三方程序 配置文件/sdcard/uweb/default.longclick每行格式如下(同default.cmds) 菜单名:mimetype:命令路径 命令可以包含%c(当前网址cookie)等,执行时会被相应内容自动替换。 @@ -498,10 +497,10 @@ js文件格式如下: 视频播放小窍门 - https://jamesfengcao.gitee.io/uwebzh/video/ + /zh/video/ Tue, 22 Sep 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/video/ + /zh/video/ 覆盖安装全屏播放菜单示例:屏幕旋转,退出 本文以超微浏览器为例来说明。 创建文件&quot;default.playrate&quot;可定制全屏倍速播放菜单项,格式与文件default.link完全相同。倍速播放菜单链接部分为空,譬如&quot;.5x:&quot;,倍速菜单至少有一个。链接部分非空的菜单必须在所有倍速菜单之后。 长按设置按钮勾选“弹出视频地址”,则视频播放时会弹出真正的播放地址,点击地址播放可避免一切不良信息。如果点击后为下载操作,可长按链接分享给视频播放器。用户亦可配置在线播放或安装插件。嗅探的视频/资源类型可由文件“/sdcard/uweb/types.sniff”控制。 很多视频解析结果在UA为PC的情况下非常干净,没什么不良信息。故用户可在播放前切换UA至PC。如:wn.run/解析结果对PC非常干净。 某些视频网站在全屏播放时都会出现不良信息占住屏幕一部分。点击全屏播放之前,长按[☰]按钮,超微浏览器将弹出全局脚本菜单,勾选“移除浮动不良信息”后再点全屏播放则完美播放。 也可利用全屏播放屏蔽一切不良信息。方法如下: 长按[☰]按钮,勾选“全屏视频”。此选项将让无法全屏播放的网站强制允许全屏播放。 对无法全屏、无法放大的视频网站,可长按[☰]按钮,勾选“强制缩放”,然后手动放大至全屏。 灵活应用JS、图像开关屏蔽一切不良信息:视频搜索前关闭JS开关,进入播放网页前关闭图像显示并打开JS。 视频解析之电视剧: 首先在视频网站搜索电视剧片名,下面会显示不同的剧集,点击它们再用视频解析即可观看。如果直接点击电视剧用视频解析则每次播放均为第一集。 视频搜索预配置(超过400个引擎) @@ -511,10 +510,10 @@ js文件格式如下: 工具汇总 - https://jamesfengcao.gitee.io/uwebzh/tools/ + /zh/tools/ Sun, 06 Sep 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tools/ + /zh/tools/ 安装tdict检索工具 (本地检索,远程内容) 安装完tdict本地检索工具后,可选择性安装字典索引及对应的搜索引擎至主屏。以下引擎仅作测试使用。 安装双解字典索引 安装双解字典至主屏 @@ -545,10 +544,10 @@ Merriam Webster Unabridged 利用文件预处理预览/查看/播放一切可下载资源 - https://jamesfengcao.gitee.io/uwebzh/filecap/ + /zh/filecap/ Mon, 24 Aug 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/filecap/ + /zh/filecap/ 技巧等级:中级 文件预处理配置文件为/sdcard/uweb/default.filecap,每行格式如下: [文件后缀]:[mimetype]:[处理命令] @@ -565,10 +564,10 @@ pdf:uweb:echo file:///sdcard/uweb/app/pdf.js/web/viewer.html?file=%u djvu:uweb:e html5应用 - https://jamesfengcao.gitee.io/uwebzh/html5/ + /zh/html5/ Thu, 20 Aug 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/html5/ + /zh/html5/ 点击安装超大文件阅读器(支持txt, html, markdown) 点击安装超大文件阅读器(markdeep版, latex, diagram,graphviz等) 点击安装plyr视频播放器 @@ -604,10 +603,10 @@ MoePlayer/APlayer : music player 手势 - https://jamesfengcao.gitee.io/uwebzh/gesture/ + /zh/gesture/ Thu, 18 Jun 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/gesture/ + /zh/gesture/ 顶部下拉弹出地址栏; 顶部上划隐藏地址栏。底部下划隐藏工具条; 底部左右角落划动弹出工具条。 紧靠工具条左右划动切换当前窗口; 左右大幅度划动切换到第一或最后一个窗口。 起点终点紧靠地址栏划动操作调用&quot;default.gesture&quot;文件中对应链接。文件格式与文件default.link完全相同。每行第一部分为助记名,第二部分为链接。手势操作对应方式如下: @@ -621,10 +620,10 @@ back2:javascript:history.go(-2) 一键执行任意预定义命令(附手机PC剪贴板互通) - https://jamesfengcao.gitee.io/uwebzh/cmd/ + /zh/cmd/ Sat, 20 Jan 2018 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/cmd/ + /zh/cmd/ 技巧等级:中级 PC剪贴板(高级) uweb浏览器支持一键执行任意预定义命令,这些命令可以与剪贴板交互,可以将结果(文本、图像、音视频)输出到浏览器窗口。 手机推荐安装uweb定制Termux,否则能够执行的命令极其有限。 @@ -644,128 +643,19 @@ mimetype用来表示命令的输出类型。除了标准的mimetype之外,超 便利链接 - https://jamesfengcao.gitee.io/uwebzh/urls/ + /zh/urls/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/urls/ + /zh/urls/ Termux内部目录 - - 分类多引擎搜索 - https://jamesfengcao.gitee.io/uwebzh/searchcat/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/searchcat/ - 点击本链接自动安装分类多引擎文件至&quot;/sdcard/uweb/bookmark&quot;目录下。 -超微浏览器中通过“设置”-&gt;“总目录”-&gt;“↑”-&gt;“Download”,点击后缀为.search的下载文件,超微浏览器将自动显示分类多引擎搜索。此时可按菜单键(或长按底部工具条后退按钮)选择“添加到桌面”方便以后访问。 -.search文件每行格式为如下几种: -[搜索引擎名]:[不含%s的url] -[搜索引擎名]:[含%s的url] -[搜索引擎名]:POST:[含%s的post参数]:[url] -.search文件首行必须为第一种类型的搜索引擎。由于其它两种类型的引擎数量稀少,为性能考虑,超微限制了首个引擎的种类。 -本地引擎 搜索引擎已经支持命令行url,现在可添加离线字典查询至主页。命令行url格式为 -c:[含%s的命令行] -d:mimetype:[含%s的命令行]:[外部资源url] -查询时关键词会自动替换命令行中的%s。 -笔者用来查询各式词典,发现效果非常好。百兆以内的文本文件压缩以后可以直接快速检索,定位至特定位置以后可上下滚动阅读全部文本。 - - - - 利用多账号登录获取资源 - https://jamesfengcao.gitee.io/uwebzh/multiaccount/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/multiaccount/ - 谈到资源就离不开bt, bt下载费时费力,离线bt是最佳选择。国内离线下载由于关键节点屏蔽,基本没啥用。我的个人体验是彻彻底底完全没用,但别人也许还有点用?国外唯一一个有好体验的是seedr, 不过seedr有个大问题需要解决。 -其它我曾推荐过的台湾bt, bug实在太多,现在看来也成了半个垃圾。万般无奈之下只能重拾seedr. -seedr的问题是首次登录需要google人机验证,登录成功以后可以永久使用,无需小飞机辅助。 -以前偶尔飞飞一点问题也没有,毕竟1分钟飞行就可解决很长时间问题了。但目前的状态是信息基本被彻底封死,1分钟飞行也成了奢望。所以十分有必要珍惜这来之不易的1分钟飞行成果。 -现在直接上方案,使用超微浏览器多账号登录。飞行1分钟以后成功登录seedr, 此时退出浏览器,千万不能强退,一定要让运存中的登录信息写到内部存储。然后用户可备份应用内部目录下的.cjar文件,一旦浏览器失去登录状态,可恢复此文件,即可使用多账号登录重新登录,让这1分钟飞行成果保存下来,供万万年使用。需要注意的一点是:用户退出seedr账号会使保存的文件作废。故千万不要退出账号,需要用其它账号登录的请使用多账号登录。 - - - - 利用浏览器地址栏对函数作图 - https://jamesfengcao.gitee.io/uwebzh/gnuplot/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/gnuplot/ - 使用Android端uweb浏览器。 -Termux提供了方便的软件包管理系统,缺省的uWeb地址栏功能配置需用到作图软件gnuplot。 -安装gnuplot 安装 uweb定制Termux应用 Termux下运行以下命令: -apt update -apt upgrade -apt install gnuplot 地址栏功能配置: 配置文件/sdcard/uweb/default.acmd每行格式如下: -菜单名:mimeType:命令行 命令行可包含参数%s,运行时自动用地址栏输入内容替换。 如果浏览器窗口当前地址为本地url,则此目录同时作为命令行工作目录。 配置文件/sdcard/uweb/default.acmd如下: 命令:text/plain:%s 函数作图:image/svg+xml:gnuplot -e 'set term svg;set output; plot %s' 函数作图(3d):image/svg+xml:gnuplot -e 'set term svg;set output; splot %s' 超级计算器:text/html:echo &quot;%s&quot;|bc -l -q 长按uweb浏览器底部工具条刷新按钮弹出地址栏功能选择,选择“函数作图”,地址栏内输入函数如sin(x)**5就可显示函数图案。 -常见问题及诊断 确保gnuplot正确安装,在Termux提示符下,敲入gnuplot,然后回车,保证出现&quot;gnuplot&gt;&quot;。 确保gnuplot正常运行, 在Termux提示符下,执行下面命令: -gnuplot -e 'set term svg;set output; plot x' -屏幕输出应该为正常的svg文件(类似html文本)。 Termux应为uweb定制包,否则有一堆设定需要修改。 超微浏览器下长按设置按钮,勾选“标准错误输出”。再次在地址栏执行画图操作,此时浏览器会显示出错信息。 为保证地址栏输入函数符合gnuplot规范,首个测试函数建议为&quot;x&quot;,即整个地址栏内输入为&quot;x&quot;。 - - - - 加速访问国外网站 - https://jamesfengcao.gitee.io/uwebzh/hosts/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/hosts/ - 不少国外网站本身虽可访问,但由于网站需要下载其它网址的资源而导致无法访问。根域名屏蔽可屏蔽文件中域名的一切子域名、孙域名、......,从而主动排除这些网址,最终允许浏览器快速访问。 -使用Android端uweb浏览器。 -域名文件内容如下: -googleadservices.com -googlesyndication.com -adsense.com -googleapis.com -google-analytics.com -googletagservices.com -twitter.com -facebook.com -fbcdn.net -其它国外网址访问技巧: -尝试关闭javascript, 譬如程序员网站stackoverflow.com在关闭javascript的情况下国内一般均可快速访问。 关闭网页图片 - - - - 浏览器一键控制台式机/服务器下载资源 - https://jamesfengcao.gitee.io/uwebzh/pcdown/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/pcdown/ - 技巧等级:高级 -小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法: -手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令: -apt update -apt upgrade -apt install openssl -脚本pcdownload内容如下(可放置在任意应用内部目录下,并相应修改default.longclick配置中文件路径): -#!/data/data/com.termux/files/usr/bin/sh -ssh [user:password]@192.168.2.102 &quot;DISPLAY=:0 firefox \&quot;$1\&quot;&quot; -脚本需设置为可执行,Termux下执行命令: -chmod 755 /data/data/com.termux/files/usr/bin/pcdownload -这里假定用户已经在台式机上设好ssh服务,台式机IP地址为192.168.2.102,准备用firefox下载。如果下载工具不是图形程序,则上述脚本中可删去“DISPLAY=:0”。 -配置文件/sdcard/uweb/default.longclick如下: -PCdown:/data/data/com.termux/files/usr/bin/pcdownload -重启超微浏览器,点击链接下载时会弹出菜单,选择&quot;PCdown&quot;,台式机会启动firefox下载手机指定文档。 -可能大家有疑问,台式机无法登录,为什么手机可以登录?这是因为手机上应用多哈。 - - - - 特定网址用户脚本及样式 - https://jamesfengcao.gitee.io/uwebzh/sitejs/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/sitejs/ - 技巧等级:中级 -脚本 (第一时间装载js脚本见下面sitecss条目) -脚本需命名为 &quot;[根域名].js&quot;,譬如baidu.com.js 或tieba.baidu.com.js 。此脚本将自动作用于所有相同根域名的网址上。如有多个脚本满足条件,以最长文件名为准。 这些脚本需放到/sdcard/uweb/sitejs或/data/data/info.torapp.uweb/files/sitejs目录下,数量没有限制,上百万都不成问题。如果内部目录下sitejs存在,则/sdcard/uweb/sitejs不起任何作用。内部sitejs目录的存在同时也影响一切对安全敏感的资源(包括网站离线资源等)的配置,一旦内部sitejs目录存在,则这些资源必须位于内部目录才会生效。 长按窗口按钮,勾选“执行网址用户脚本”。 脚本执行对浏览器无性能影响,即使有百万脚本存在。 目前支持两段、三段及少数四段域名(最后两段不超过6字如com.cn的域名可取四段)。所以脚本请不要以很长的域名来命名。 样式及第一时间装载js脚本 -与此类似,用户样式需命名为 &quot;[根域名].css&quot;,譬如baidu.com.css 或tieba.baidu.com.css。 样式文件需放到/sdcard/uweb/sitecss目录下。 sitecss目录下&quot;[根域名].js&quot;文件会在第一时间装载。 长按窗口按钮,勾选“使用网址用户样式”。 如果文件“/sdcard/uweb/default.css”存在,访问网址时如果没有与域名匹配的css文件,则使用此默认样式文件。 default.css可作为夜间模式来使用,此时default.css为夜间模式css,而黑色主题类网址对应的域名为空文件。此种设定情况下仅白色主题网页会使用夜间模式css。 文件sitejs/.js 和sitecss/.css, sitecss/.js可作用于一切非http url(本地文件,浏览器界面等)。 - - 电视直播 - https://jamesfengcao.gitee.io/uwebzh/tvlive/ + /zh/tvlive/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tvlive/ + /zh/tvlive/ CCTV1 CCTV2财经 CCTV3综艺 @@ -839,11 +729,53 @@ CCTV17农村 - 绝杀完整域名树 - https://jamesfengcao.gitee.io/uwebzh/adblock_domain/ + 分类多引擎搜索 + /zh/searchcat/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/adblock_domain/ + /zh/searchcat/ + 点击本链接自动安装分类多引擎文件至&quot;/sdcard/uweb/bookmark&quot;目录下。 +超微浏览器中通过“设置”-&gt;“总目录”-&gt;“↑”-&gt;“Download”,点击后缀为.search的下载文件,超微浏览器将自动显示分类多引擎搜索。此时可按菜单键(或长按底部工具条后退按钮)选择“添加到桌面”方便以后访问。 +.search文件每行格式为如下几种: +[搜索引擎名]:[不含%s的url] +[搜索引擎名]:[含%s的url] +[搜索引擎名]:POST:[含%s的post参数]:[url] +.search文件首行必须为第一种类型的搜索引擎。由于其它两种类型的引擎数量稀少,为性能考虑,超微限制了首个引擎的种类。 +本地引擎 搜索引擎已经支持命令行url,现在可添加离线字典查询至主页。命令行url格式为 +c:[含%s的命令行] +d:mimetype:[含%s的命令行]:[外部资源url] +查询时关键词会自动替换命令行中的%s。 +笔者用来查询各式词典,发现效果非常好。百兆以内的文本文件压缩以后可以直接快速检索,定位至特定位置以后可上下滚动阅读全部文本。 + + + + 加速访问国外网站 + /zh/hosts/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zh/hosts/ + 不少国外网站本身虽可访问,但由于网站需要下载其它网址的资源而导致无法访问。根域名屏蔽可屏蔽文件中域名的一切子域名、孙域名、......,从而主动排除这些网址,最终允许浏览器快速访问。 +使用Android端uweb浏览器。 +域名文件内容如下: +googleadservices.com +googlesyndication.com +adsense.com +googleapis.com +google-analytics.com +googletagservices.com +twitter.com +facebook.com +fbcdn.net +其它国外网址访问技巧: +尝试关闭javascript, 譬如程序员网站stackoverflow.com在关闭javascript的情况下国内一般均可快速访问。 关闭网页图片 + + + + 绝杀完整域名树 + /zh/adblock_domain/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zh/adblock_domain/ 域名文件可屏蔽文件中域名的一切子域名、孙域名、......,可彻底绝杀一切不良信息。所以用户屏蔽根域名时无需选择提示中出现的整个域名,只需选取最后两段或三段(最后两段不超过6字符如com.cn的域名可取四段)。 可使用列出外部脚本小书签生成外部js文件列表,然后长按底部工具栏&quot;js&quot;按钮,执行&quot;网址转链接&quot;菜单命令,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。 长按不良信息链接,点击“图片:屏蔽根域名”,修改弹出域名,一般取最后两段,点击&quot;确定&quot;屏蔽当前图片网址。 @@ -860,11 +792,78 @@ CCTV17农村 - 装载网站离线资源 - https://jamesfengcao.gitee.io/uwebzh/offlinecache/ + 利用多账号登录获取资源 + /zh/multiaccount/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/offlinecache/ + /zh/multiaccount/ + 谈到资源就离不开bt, bt下载费时费力,离线bt是最佳选择。国内离线下载由于关键节点屏蔽,基本没啥用。我的个人体验是彻彻底底完全没用,但别人也许还有点用?国外唯一一个有好体验的是seedr, 不过seedr有个大问题需要解决。 +其它我曾推荐过的台湾bt, bug实在太多,现在看来也成了半个垃圾。万般无奈之下只能重拾seedr. +seedr的问题是首次登录需要google人机验证,登录成功以后可以永久使用,无需小飞机辅助。 +以前偶尔飞飞一点问题也没有,毕竟1分钟飞行就可解决很长时间问题了。但目前的状态是信息基本被彻底封死,1分钟飞行也成了奢望。所以十分有必要珍惜这来之不易的1分钟飞行成果。 +现在直接上方案,使用超微浏览器多账号登录。飞行1分钟以后成功登录seedr, 此时退出浏览器,千万不能强退,一定要让运存中的登录信息写到内部存储。然后用户可备份应用内部目录下的.cjar文件,一旦浏览器失去登录状态,可恢复此文件,即可使用多账号登录重新登录,让这1分钟飞行成果保存下来,供万万年使用。需要注意的一点是:用户退出seedr账号会使保存的文件作废。故千万不要退出账号,需要用其它账号登录的请使用多账号登录。 + + + + 利用浏览器地址栏对函数作图 + /zh/gnuplot/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zh/gnuplot/ + 使用Android端uweb浏览器。 +Termux提供了方便的软件包管理系统,缺省的uWeb地址栏功能配置需用到作图软件gnuplot。 +安装gnuplot 安装 uweb定制Termux应用 Termux下运行以下命令: +apt update +apt upgrade +apt install gnuplot 地址栏功能配置: 配置文件/sdcard/uweb/default.acmd每行格式如下: +菜单名:mimeType:命令行 命令行可包含参数%s,运行时自动用地址栏输入内容替换。 如果浏览器窗口当前地址为本地url,则此目录同时作为命令行工作目录。 配置文件/sdcard/uweb/default.acmd如下: 命令:text/plain:%s 函数作图:image/svg+xml:gnuplot -e 'set term svg;set output; plot %s' 函数作图(3d):image/svg+xml:gnuplot -e 'set term svg;set output; splot %s' 超级计算器:text/html:echo &quot;%s&quot;|bc -l -q 长按uweb浏览器底部工具条刷新按钮弹出地址栏功能选择,选择“函数作图”,地址栏内输入函数如sin(x)**5就可显示函数图案。 +常见问题及诊断 确保gnuplot正确安装,在Termux提示符下,敲入gnuplot,然后回车,保证出现&quot;gnuplot&gt;&quot;。 确保gnuplot正常运行, 在Termux提示符下,执行下面命令: +gnuplot -e 'set term svg;set output; plot x' +屏幕输出应该为正常的svg文件(类似html文本)。 Termux应为uweb定制包,否则有一堆设定需要修改。 超微浏览器下长按设置按钮,勾选“标准错误输出”。再次在地址栏执行画图操作,此时浏览器会显示出错信息。 为保证地址栏输入函数符合gnuplot规范,首个测试函数建议为&quot;x&quot;,即整个地址栏内输入为&quot;x&quot;。 + + + + 浏览器一键控制台式机/服务器下载资源 + /zh/pcdown/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zh/pcdown/ + 技巧等级:高级 +小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法: +手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令: +apt update +apt upgrade +apt install openssl +脚本pcdownload内容如下(可放置在任意应用内部目录下,并相应修改default.longclick配置中文件路径): +#!/data/data/com.termux/files/usr/bin/sh +ssh [user:password]@192.168.2.102 &quot;DISPLAY=:0 firefox \&quot;$1\&quot;&quot; +脚本需设置为可执行,Termux下执行命令: +chmod 755 /data/data/com.termux/files/usr/bin/pcdownload +这里假定用户已经在台式机上设好ssh服务,台式机IP地址为192.168.2.102,准备用firefox下载。如果下载工具不是图形程序,则上述脚本中可删去“DISPLAY=:0”。 +配置文件/sdcard/uweb/default.longclick如下: +PCdown:/data/data/com.termux/files/usr/bin/pcdownload +重启超微浏览器,点击链接下载时会弹出菜单,选择&quot;PCdown&quot;,台式机会启动firefox下载手机指定文档。 +可能大家有疑问,台式机无法登录,为什么手机可以登录?这是因为手机上应用多哈。 + + + + 特定网址用户脚本及样式 + /zh/sitejs/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zh/sitejs/ + 技巧等级:中级 +脚本 (第一时间装载js脚本见下面sitecss条目) +脚本需命名为 &quot;[根域名].js&quot;,譬如baidu.com.js 或tieba.baidu.com.js 。此脚本将自动作用于所有相同根域名的网址上。如有多个脚本满足条件,以最长文件名为准。 这些脚本需放到/sdcard/uweb/sitejs或/data/data/info.torapp.uweb/files/sitejs目录下,数量没有限制,上百万都不成问题。如果内部目录下sitejs存在,则/sdcard/uweb/sitejs不起任何作用。内部sitejs目录的存在同时也影响一切对安全敏感的资源(包括网站离线资源等)的配置,一旦内部sitejs目录存在,则这些资源必须位于内部目录才会生效。 长按窗口按钮,勾选“执行网址用户脚本”。 脚本执行对浏览器无性能影响,即使有百万脚本存在。 目前支持两段、三段及少数四段域名(最后两段不超过6字如com.cn的域名可取四段)。所以脚本请不要以很长的域名来命名。 样式及第一时间装载js脚本 +与此类似,用户样式需命名为 &quot;[根域名].css&quot;,譬如baidu.com.css 或tieba.baidu.com.css。 样式文件需放到/sdcard/uweb/sitecss目录下。 sitecss目录下&quot;[根域名].js&quot;文件会在第一时间装载。 长按窗口按钮,勾选“使用网址用户样式”。 如果文件“/sdcard/uweb/default.css”存在,访问网址时如果没有与域名匹配的css文件,则使用此默认样式文件。 default.css可作为夜间模式来使用,此时default.css为夜间模式css,而黑色主题类网址对应的域名为空文件。此种设定情况下仅白色主题网页会使用夜间模式css。 文件sitejs/.js 和sitecss/.css, sitecss/.js可作用于一切非http url(本地文件,浏览器界面等)。 + + + + 装载网站离线资源 + /zh/offlinecache/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zh/offlinecache/ uweb浏览器支持装载网站离线资源。只需要将离线资源存为文件&quot;/sdcard/uweb/sitecache/[域名]/[全部路径,包括文件名,?,&amp;,=, 与url一模一样]&quot;。如果应用内部目录有文件夹&quot;sitejs&quot;存在,则“/sdcard/uweb”下的离线资源不再生效,此时生效离线资源为内部目录下的&quot;sitecache&quot;文件夹。 打开选项以后超微将自动装载这些离线资源。 离线资源可作为缓存提高浏览器性能; 可作为国外网站部分备份修复服务访问; 也可替换部分网站资源达到定制网站的作用。 diff --git a/links/index.html b/zh/links/index.html similarity index 93% rename from links/index.html rename to zh/links/index.html index 496e121e..0c067574 100644 --- a/links/index.html +++ b/zh/links/index.html @@ -6,10 +6,20 @@ 常用链接 +
    - +
    diff --git a/loadbt/index.html b/zh/loadbt/index.html similarity index 84% rename from loadbt/index.html rename to zh/loadbt/index.html index 66d27958..e8f90898 100644 --- a/loadbt/index.html +++ b/zh/loadbt/index.html @@ -6,10 +6,20 @@ 离线下载 +
    - +
    diff --git a/logcat/index.html b/zh/logcat/index.html similarity index 79% rename from logcat/index.html rename to zh/logcat/index.html index ffac7516..f4760a4a 100644 --- a/logcat/index.html +++ b/zh/logcat/index.html @@ -6,10 +6,20 @@ 安卓系统出错诊断 +
    - +
    diff --git a/longclick/index.html b/zh/longclick/index.html similarity index 77% rename from longclick/index.html rename to zh/longclick/index.html index bda34bfc..a01c4637 100644 --- a/longclick/index.html +++ b/zh/longclick/index.html @@ -6,10 +6,20 @@ 长按链接弹出菜单 +
    - +
    diff --git a/multiaccount/index.html b/zh/multiaccount/index.html similarity index 80% rename from multiaccount/index.html rename to zh/multiaccount/index.html index 3a0f83b4..6935058a 100644 --- a/multiaccount/index.html +++ b/zh/multiaccount/index.html @@ -6,10 +6,20 @@ 利用多账号登录获取资源 +
    - +
    diff --git a/offlinecache/index.html b/zh/offlinecache/index.html similarity index 82% rename from offlinecache/index.html rename to zh/offlinecache/index.html index 53b65407..a992a540 100644 --- a/offlinecache/index.html +++ b/zh/offlinecache/index.html @@ -6,10 +6,20 @@ 装载网站离线资源 +
    - +
    diff --git a/pccopy/index.html b/zh/pccopy/index.html similarity index 92% rename from pccopy/index.html rename to zh/pccopy/index.html index f303dfab..37ac4864 100644 --- a/pccopy/index.html +++ b/zh/pccopy/index.html @@ -6,10 +6,20 @@ 操作选中(富)文本/元素 +
    - +
    diff --git a/pcdown/index.html b/zh/pcdown/index.html similarity index 83% rename from pcdown/index.html rename to zh/pcdown/index.html index 50e5abc8..540f3161 100644 --- a/pcdown/index.html +++ b/zh/pcdown/index.html @@ -6,10 +6,20 @@ 浏览器一键控制台式机/服务器下载资源 +
    - +
    diff --git a/redirect/index.html b/zh/redirect/index.html similarity index 88% rename from redirect/index.html rename to zh/redirect/index.html index a3f55c7a..7e029ef0 100644 --- a/redirect/index.html +++ b/zh/redirect/index.html @@ -6,10 +6,20 @@ 重定向国外网址至国内镜像(附编辑本地文件) +
    - +
    diff --git a/searchcat/index.html b/zh/searchcat/index.html similarity index 80% rename from searchcat/index.html rename to zh/searchcat/index.html index f1e570dc..091df821 100644 --- a/searchcat/index.html +++ b/zh/searchcat/index.html @@ -6,10 +6,20 @@ 分类多引擎搜索 +
    - +
    diff --git a/searchurl/ace.js b/zh/searchurl/ace.js similarity index 100% rename from searchurl/ace.js rename to zh/searchurl/ace.js diff --git a/searchurl/ace_t.html b/zh/searchurl/ace_t.html similarity index 100% rename from searchurl/ace_t.html rename to zh/searchurl/ace_t.html diff --git a/searchurl/alipay.png b/zh/searchurl/alipay.png similarity index 100% rename from searchurl/alipay.png rename to zh/searchurl/alipay.png diff --git a/searchurl/backup.html b/zh/searchurl/backup.html similarity index 100% rename from searchurl/backup.html rename to zh/searchurl/backup.html diff --git a/searchurl/bin/tdict.tar.gz b/zh/searchurl/bin/tdict.tar.gz similarity index 100% rename from searchurl/bin/tdict.tar.gz rename to zh/searchurl/bin/tdict.tar.gz diff --git a/searchurl/bml/content/comparecells.js b/zh/searchurl/bml/content/comparecells.js similarity index 100% rename from searchurl/bml/content/comparecells.js rename to zh/searchurl/bml/content/comparecells.js diff --git a/searchurl/bml/content/designmode.js b/zh/searchurl/bml/content/designmode.js similarity index 100% rename from searchurl/bml/content/designmode.js rename to zh/searchurl/bml/content/designmode.js diff --git a/searchurl/bml/content/freeviddy.js b/zh/searchurl/bml/content/freeviddy.js similarity index 100% rename from searchurl/bml/content/freeviddy.js rename to zh/searchurl/bml/content/freeviddy.js diff --git a/searchurl/bml/content/fullimg.js b/zh/searchurl/bml/content/fullimg.js similarity index 100% rename from searchurl/bml/content/fullimg.js rename to zh/searchurl/bml/content/fullimg.js diff --git a/searchurl/bml/content/read.js b/zh/searchurl/bml/content/read.js similarity index 100% rename from searchurl/bml/content/read.js rename to zh/searchurl/bml/content/read.js diff --git a/searchurl/bml/content/rmi.js b/zh/searchurl/bml/content/rmi.js similarity index 100% rename from searchurl/bml/content/rmi.js rename to zh/searchurl/bml/content/rmi.js diff --git a/searchurl/bml/content/rmo.js b/zh/searchurl/bml/content/rmo.js similarity index 100% rename from searchurl/bml/content/rmo.js rename to zh/searchurl/bml/content/rmo.js diff --git a/searchurl/bml/content/vidspeed.js b/zh/searchurl/bml/content/vidspeed.js similarity index 100% rename from searchurl/bml/content/vidspeed.js rename to zh/searchurl/bml/content/vidspeed.js diff --git a/searchurl/bookmark/novel.html b/zh/searchurl/bookmark/novel.html similarity index 100% rename from searchurl/bookmark/novel.html rename to zh/searchurl/bookmark/novel.html diff --git a/searchurl/bookmark/viewtxt.html b/zh/searchurl/bookmark/viewtxt.html similarity index 100% rename from searchurl/bookmark/viewtxt.html rename to zh/searchurl/bookmark/viewtxt.html diff --git a/searchurl/cmds.html b/zh/searchurl/cmds.html similarity index 100% rename from searchurl/cmds.html rename to zh/searchurl/cmds.html diff --git a/searchurl/config.html b/zh/searchurl/config.html similarity index 100% rename from searchurl/config.html rename to zh/searchurl/config.html diff --git a/searchurl/config.js b/zh/searchurl/config.js similarity index 100% rename from searchurl/config.js rename to zh/searchurl/config.js diff --git a/searchurl/default.hosts.tar.gz b/zh/searchurl/default.hosts.tar.gz similarity index 100% rename from searchurl/default.hosts.tar.gz rename to zh/searchurl/default.hosts.tar.gz diff --git a/searchurl/donate.html b/zh/searchurl/donate.html similarity index 100% rename from searchurl/donate.html rename to zh/searchurl/donate.html diff --git a/searchurl/func.html b/zh/searchurl/func.html similarity index 100% rename from searchurl/func.html rename to zh/searchurl/func.html diff --git a/searchurl/homescreen.html b/zh/searchurl/homescreen.html similarity index 100% rename from searchurl/homescreen.html rename to zh/searchurl/homescreen.html diff --git a/searchurl/input.html b/zh/searchurl/input.html similarity index 100% rename from searchurl/input.html rename to zh/searchurl/input.html diff --git a/searchurl/js/beep.js b/zh/searchurl/js/beep.js similarity index 100% rename from searchurl/js/beep.js rename to zh/searchurl/js/beep.js diff --git a/searchurl/plugins.html b/zh/searchurl/plugins.html similarity index 100% rename from searchurl/plugins.html rename to zh/searchurl/plugins.html diff --git a/searchurl/privacy.html b/zh/searchurl/privacy.html similarity index 100% rename from searchurl/privacy.html rename to zh/searchurl/privacy.html diff --git a/searchurl/quickstart.html b/zh/searchurl/quickstart.html similarity index 100% rename from searchurl/quickstart.html rename to zh/searchurl/quickstart.html diff --git a/searchurl/res.html b/zh/searchurl/res.html similarity index 100% rename from searchurl/res.html rename to zh/searchurl/res.html diff --git a/searchurl/rjs.html b/zh/searchurl/rjs.html similarity index 100% rename from searchurl/rjs.html rename to zh/searchurl/rjs.html diff --git a/searchurl/script/axel.sh b/zh/searchurl/script/axel.sh similarity index 100% rename from searchurl/script/axel.sh rename to zh/searchurl/script/axel.sh diff --git a/searchurl/script/baidupcs.sh b/zh/searchurl/script/baidupcs.sh similarity index 100% rename from searchurl/script/baidupcs.sh rename to zh/searchurl/script/baidupcs.sh diff --git a/searchurl/script/bc.sh b/zh/searchurl/script/bc.sh similarity index 100% rename from searchurl/script/bc.sh rename to zh/searchurl/script/bc.sh diff --git a/searchurl/script/disable_sh.sh b/zh/searchurl/script/disable_sh.sh similarity index 100% rename from searchurl/script/disable_sh.sh rename to zh/searchurl/script/disable_sh.sh diff --git a/searchurl/script/filecap_app.sh b/zh/searchurl/script/filecap_app.sh similarity index 100% rename from searchurl/script/filecap_app.sh rename to zh/searchurl/script/filecap_app.sh diff --git a/searchurl/script/filecap_microsoft.sh b/zh/searchurl/script/filecap_microsoft.sh similarity index 100% rename from searchurl/script/filecap_microsoft.sh rename to zh/searchurl/script/filecap_microsoft.sh diff --git a/searchurl/script/filecap_search.sh b/zh/searchurl/script/filecap_search.sh similarity index 100% rename from searchurl/script/filecap_search.sh rename to zh/searchurl/script/filecap_search.sh diff --git a/searchurl/script/filecap_sh.sh b/zh/searchurl/script/filecap_sh.sh similarity index 100% rename from searchurl/script/filecap_sh.sh rename to zh/searchurl/script/filecap_sh.sh diff --git a/searchurl/script/filecap_tar.sh b/zh/searchurl/script/filecap_tar.sh similarity index 100% rename from searchurl/script/filecap_tar.sh rename to zh/searchurl/script/filecap_tar.sh diff --git a/searchurl/script/filecap_ziprar.sh b/zh/searchurl/script/filecap_ziprar.sh similarity index 100% rename from searchurl/script/filecap_ziprar.sh rename to zh/searchurl/script/filecap_ziprar.sh diff --git a/searchurl/script/gnuplot.sh b/zh/searchurl/script/gnuplot.sh similarity index 100% rename from searchurl/script/gnuplot.sh rename to zh/searchurl/script/gnuplot.sh diff --git a/searchurl/script/histuniq.sh b/zh/searchurl/script/histuniq.sh similarity index 100% rename from searchurl/script/histuniq.sh rename to zh/searchurl/script/histuniq.sh diff --git a/searchurl/script/hosts_ad.sh b/zh/searchurl/script/hosts_ad.sh similarity index 100% rename from searchurl/script/hosts_ad.sh rename to zh/searchurl/script/hosts_ad.sh diff --git a/searchurl/script/js_caiyun.sh b/zh/searchurl/script/js_caiyun.sh similarity index 100% rename from searchurl/script/js_caiyun.sh rename to zh/searchurl/script/js_caiyun.sh diff --git a/searchurl/script/xzdic.sh b/zh/searchurl/script/xzdic.sh similarity index 100% rename from searchurl/script/xzdic.sh rename to zh/searchurl/script/xzdic.sh diff --git a/searchurl/script/xzgrep.sh b/zh/searchurl/script/xzgrep.sh similarity index 100% rename from searchurl/script/xzgrep.sh rename to zh/searchurl/script/xzgrep.sh diff --git a/searchurl/sdcard/uweb/bookmark/movie_zh.search b/zh/searchurl/sdcard/uweb/bookmark/movie_zh.search similarity index 100% rename from searchurl/sdcard/uweb/bookmark/movie_zh.search rename to zh/searchurl/sdcard/uweb/bookmark/movie_zh.search diff --git a/searchurl/sdcard/uweb/bookmark/novel_zh.search b/zh/searchurl/sdcard/uweb/bookmark/novel_zh.search similarity index 100% rename from searchurl/sdcard/uweb/bookmark/novel_zh.search rename to zh/searchurl/sdcard/uweb/bookmark/novel_zh.search diff --git a/searchurl/sdcard/uweb/default.hosts b/zh/searchurl/sdcard/uweb/default.hosts similarity index 100% rename from searchurl/sdcard/uweb/default.hosts rename to zh/searchurl/sdcard/uweb/default.hosts diff --git a/searchurl/search.html b/zh/searchurl/search.html similarity index 100% rename from searchurl/search.html rename to zh/searchurl/search.html diff --git a/searchurl/searchcat.tar.gz b/zh/searchurl/searchcat.tar.gz similarity index 100% rename from searchurl/searchcat.tar.gz rename to zh/searchurl/searchcat.tar.gz diff --git a/searchurl/sitecss/m.baidu.com.css b/zh/searchurl/sitecss/m.baidu.com.css similarity index 100% rename from searchurl/sitecss/m.baidu.com.css rename to zh/searchurl/sitecss/m.baidu.com.css diff --git a/searchurl/sitejs/m.baidu.com.js b/zh/searchurl/sitejs/m.baidu.com.js similarity index 100% rename from searchurl/sitejs/m.baidu.com.js rename to zh/searchurl/sitejs/m.baidu.com.js diff --git a/searchurl/template/backup.html b/zh/searchurl/template/backup.html similarity index 100% rename from searchurl/template/backup.html rename to zh/searchurl/template/backup.html diff --git a/searchurl/template/config.html b/zh/searchurl/template/config.html similarity index 100% rename from searchurl/template/config.html rename to zh/searchurl/template/config.html diff --git a/searchurl/template/font.css b/zh/searchurl/template/font.css similarity index 100% rename from searchurl/template/font.css rename to zh/searchurl/template/font.css diff --git a/searchurl/template/home.css b/zh/searchurl/template/home.css similarity index 100% rename from searchurl/template/home.css rename to zh/searchurl/template/home.css diff --git a/searchurl/template/refresh.html b/zh/searchurl/template/refresh.html similarity index 100% rename from searchurl/template/refresh.html rename to zh/searchurl/template/refresh.html diff --git a/searchurl/textarea.js b/zh/searchurl/textarea.js similarity index 100% rename from searchurl/textarea.js rename to zh/searchurl/textarea.js diff --git a/searchurl/textarea_t.html b/zh/searchurl/textarea_t.html similarity index 100% rename from searchurl/textarea_t.html rename to zh/searchurl/textarea_t.html diff --git a/searchurl/txt/accusoft.html b/zh/searchurl/txt/accusoft.html similarity index 100% rename from searchurl/txt/accusoft.html rename to zh/searchurl/txt/accusoft.html diff --git a/searchurl/txt/checked.js b/zh/searchurl/txt/checked.js similarity index 100% rename from searchurl/txt/checked.js rename to zh/searchurl/txt/checked.js diff --git a/searchurl/txt/clearfont.css b/zh/searchurl/txt/clearfont.css similarity index 100% rename from searchurl/txt/clearfont.css rename to zh/searchurl/txt/clearfont.css diff --git a/searchurl/txt/cmds.cfg b/zh/searchurl/txt/cmds.cfg similarity index 100% rename from searchurl/txt/cmds.cfg rename to zh/searchurl/txt/cmds.cfg diff --git a/searchurl/txt/default.rc b/zh/searchurl/txt/default.rc similarity index 100% rename from searchurl/txt/default.rc rename to zh/searchurl/txt/default.rc diff --git a/searchurl/txt/djvu.html b/zh/searchurl/txt/djvu.html similarity index 100% rename from searchurl/txt/djvu.html rename to zh/searchurl/txt/djvu.html diff --git a/searchurl/txt/dplayer.html b/zh/searchurl/txt/dplayer.html similarity index 100% rename from searchurl/txt/dplayer.html rename to zh/searchurl/txt/dplayer.html diff --git a/searchurl/txt/epub.html b/zh/searchurl/txt/epub.html similarity index 100% rename from searchurl/txt/epub.html rename to zh/searchurl/txt/epub.html diff --git a/searchurl/txt/filecap.cfg b/zh/searchurl/txt/filecap.cfg similarity index 100% rename from searchurl/txt/filecap.cfg rename to zh/searchurl/txt/filecap.cfg diff --git a/searchurl/txt/filecap_css.cfg b/zh/searchurl/txt/filecap_css.cfg similarity index 100% rename from searchurl/txt/filecap_css.cfg rename to zh/searchurl/txt/filecap_css.cfg diff --git a/searchurl/txt/filecap_video.cfg b/zh/searchurl/txt/filecap_video.cfg similarity index 100% rename from searchurl/txt/filecap_video.cfg rename to zh/searchurl/txt/filecap_video.cfg diff --git a/searchurl/txt/link.cfg b/zh/searchurl/txt/link.cfg similarity index 100% rename from searchurl/txt/link.cfg rename to zh/searchurl/txt/link.cfg diff --git a/searchurl/txt/magnet.search b/zh/searchurl/txt/magnet.search similarity index 100% rename from searchurl/txt/magnet.search rename to zh/searchurl/txt/magnet.search diff --git a/searchurl/txt/margintop.css b/zh/searchurl/txt/margintop.css similarity index 100% rename from searchurl/txt/margintop.css rename to zh/searchurl/txt/margintop.css diff --git a/searchurl/txt/markdeep.html b/zh/searchurl/txt/markdeep.html similarity index 100% rename from searchurl/txt/markdeep.html rename to zh/searchurl/txt/markdeep.html diff --git a/searchurl/txt/mdict.html b/zh/searchurl/txt/mdict.html similarity index 100% rename from searchurl/txt/mdict.html rename to zh/searchurl/txt/mdict.html diff --git a/searchurl/txt/nav.cfg b/zh/searchurl/txt/nav.cfg similarity index 100% rename from searchurl/txt/nav.cfg rename to zh/searchurl/txt/nav.cfg diff --git a/searchurl/txt/night.css b/zh/searchurl/txt/night.css similarity index 100% rename from searchurl/txt/night.css rename to zh/searchurl/txt/night.css diff --git a/searchurl/txt/night1.css b/zh/searchurl/txt/night1.css similarity index 100% rename from searchurl/txt/night1.css rename to zh/searchurl/txt/night1.css diff --git a/searchurl/txt/night_old.css b/zh/searchurl/txt/night_old.css similarity index 100% rename from searchurl/txt/night_old.css rename to zh/searchurl/txt/night_old.css diff --git a/searchurl/txt/offline.link b/zh/searchurl/txt/offline.link similarity index 100% rename from searchurl/txt/offline.link rename to zh/searchurl/txt/offline.link diff --git a/searchurl/txt/onlyimg.css b/zh/searchurl/txt/onlyimg.css similarity index 100% rename from searchurl/txt/onlyimg.css rename to zh/searchurl/txt/onlyimg.css diff --git a/searchurl/txt/passwdsave.js b/zh/searchurl/txt/passwdsave.js similarity index 100% rename from searchurl/txt/passwdsave.js rename to zh/searchurl/txt/passwdsave.js diff --git a/searchurl/txt/pdfviewer.html b/zh/searchurl/txt/pdfviewer.html similarity index 100% rename from searchurl/txt/pdfviewer.html rename to zh/searchurl/txt/pdfviewer.html diff --git a/searchurl/txt/pdfviewer.js b/zh/searchurl/txt/pdfviewer.js similarity index 100% rename from searchurl/txt/pdfviewer.js rename to zh/searchurl/txt/pdfviewer.js diff --git a/searchurl/txt/plyr.cfg b/zh/searchurl/txt/plyr.cfg similarity index 100% rename from searchurl/txt/plyr.cfg rename to zh/searchurl/txt/plyr.cfg diff --git a/searchurl/txt/query.autoc b/zh/searchurl/txt/query.autoc similarity index 100% rename from searchurl/txt/query.autoc rename to zh/searchurl/txt/query.autoc diff --git a/searchurl/txt/redirect.cfg b/zh/searchurl/txt/redirect.cfg similarity index 100% rename from searchurl/txt/redirect.cfg rename to zh/searchurl/txt/redirect.cfg diff --git a/searchurl/txt/rjs.cfg b/zh/searchurl/txt/rjs.cfg similarity index 100% rename from searchurl/txt/rjs.cfg rename to zh/searchurl/txt/rjs.cfg diff --git a/searchurl/txt/select.cfg b/zh/searchurl/txt/select.cfg similarity index 100% rename from searchurl/txt/select.cfg rename to zh/searchurl/txt/select.cfg diff --git a/searchurl/txt/txtview.html b/zh/searchurl/txt/txtview.html similarity index 100% rename from searchurl/txt/txtview.html rename to zh/searchurl/txt/txtview.html diff --git a/searchurl/txt/videojs.html b/zh/searchurl/txt/videojs.html similarity index 100% rename from searchurl/txt/videojs.html rename to zh/searchurl/txt/videojs.html diff --git a/searchurl/txt/videoplay.js b/zh/searchurl/txt/videoplay.js similarity index 100% rename from searchurl/txt/videoplay.js rename to zh/searchurl/txt/videoplay.js diff --git a/searchurl/uas.html b/zh/searchurl/uas.html similarity index 100% rename from searchurl/uas.html rename to zh/searchurl/uas.html diff --git a/searchurl/urls.html b/zh/searchurl/urls.html similarity index 100% rename from searchurl/urls.html rename to zh/searchurl/urls.html diff --git a/searchurl/useragreement.html b/zh/searchurl/useragreement.html similarity index 100% rename from searchurl/useragreement.html rename to zh/searchurl/useragreement.html diff --git a/searchurl/v541.search b/zh/searchurl/v541.search similarity index 100% rename from searchurl/v541.search rename to zh/searchurl/v541.search diff --git a/searchurl/v678.search b/zh/searchurl/v678.search similarity index 100% rename from searchurl/v678.search rename to zh/searchurl/v678.search diff --git a/searchurl/weixin.png b/zh/searchurl/weixin.png similarity index 100% rename from searchurl/weixin.png rename to zh/searchurl/weixin.png diff --git a/sitejs/index.html b/zh/sitejs/index.html similarity index 84% rename from sitejs/index.html rename to zh/sitejs/index.html index f6f20f78..80c55dfc 100644 --- a/sitejs/index.html +++ b/zh/sitejs/index.html @@ -6,10 +6,20 @@ 特定网址用户脚本及样式 +
    - +
    diff --git a/zh/sitemap.xml b/zh/sitemap.xml new file mode 100644 index 00000000..250c5036 --- /dev/null +++ b/zh/sitemap.xml @@ -0,0 +1,196 @@ + + + + /zh/ + 2022-06-25T00:00:00+00:00 + + + + /zh/_posts/ + 2022-06-25T00:00:00+00:00 + + /zh/adblock/ + 2022-06-25T00:00:00+00:00 + + /zh/tags/javascript/ + 2022-06-24T00:00:00+00:00 + + /zh/tags/ + 2022-06-24T00:00:00+00:00 + + + + /zh/bookmarklet/ + 2022-06-24T00:00:00+00:00 + + /zh/sitemap/ + 2022-05-28T00:00:00+00:00 + + /zh/androidtv/ + 2022-05-18T00:00:00+00:00 + + /zh/tags/css/ + 2022-05-18T00:00:00+00:00 + + /zh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/ + 2022-05-18T00:00:00+00:00 + + /zh/bookmark/ + 2022-05-18T00:00:00+00:00 + + /zh/adblock_css/ + 2022-05-18T00:00:00+00:00 + + /zh/links/ + 2022-05-10T00:00:00+00:00 + + /zh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/ + 2022-04-25T00:00:00+00:00 + + /zh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/ + 2022-04-25T00:00:00+00:00 + + /zh/redirect/ + 2022-04-25T00:00:00+00:00 + + /zh/tags/pc/ + 2022-04-23T00:00:00+00:00 + + /zh/tags/ssh/ + 2022-04-23T00:00:00+00:00 + + /zh/tags/termux/ + 2022-04-23T00:00:00+00:00 + + /zh/tags/windows/ + 2022-04-23T00:00:00+00:00 + + /zh/pccopy/ + 2022-04-23T00:00:00+00:00 + + /zh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/ + 2022-04-23T00:00:00+00:00 + + /zh/globalcss/ + 2022-04-03T00:00:00+00:00 + + /zh/filenames/ + 2022-03-18T00:00:00+00:00 + + /zh/filemanager/ + 2022-02-11T00:00:00+00:00 + + /zh/bc/ + 2022-02-10T00:00:00+00:00 + + /zh/icons/ + 2022-02-06T00:00:00+00:00 + + /zh/tips/ + 2021-11-01T00:00:00+00:00 + + /zh/tcron/ + 2021-02-13T00:00:00+00:00 + + /zh/logcat/ + 2020-12-28T00:00:00+00:00 + + /zh/tags/%E7%A6%BB%E7%BA%BF/ + 2020-12-15T00:00:00+00:00 + + /zh/loadbt/ + 2020-12-15T00:00:00+00:00 + + /zh/tags/%E7%BD%91%E7%9B%98/ + 2020-12-15T00:00:00+00:00 + + /zh/tags/%E8%B5%84%E6%BA%90/ + 2020-12-15T00:00:00+00:00 + + /zh/longclick/ + 2020-11-06T00:00:00+00:00 + + /zh/video/ + 2020-09-22T00:00:00+00:00 + + /zh/tags/%E6%90%9C%E7%B4%A2/ + 2020-09-22T00:00:00+00:00 + + /zh/tags/tdict/ + 2020-09-06T00:00:00+00:00 + + /zh/tags/tools/ + 2020-09-06T00:00:00+00:00 + + /zh/tools/ + 2020-09-06T00:00:00+00:00 + + /zh/tags/curl/ + 2020-08-24T00:00:00+00:00 + + /zh/filecap/ + 2020-08-24T00:00:00+00:00 + + /zh/html5/ + 2020-08-20T00:00:00+00:00 + + /zh/gesture/ + 2020-06-18T00:00:00+00:00 + + /zh/cmd/ + 2018-01-20T00:00:00+00:00 + + /zh/categories/ + + + + /zh/urls/ + + /zh/tags/%E7%94%B5%E8%A7%86/ + + /zh/tvlive/ + + /zh/searchcat/ + + /zh/hosts/ + + /zh/adblock_domain/ + + /zh/multiaccount/ + + /zh/gnuplot/ + + /zh/pcdown/ + + /zh/sitejs/ + + /zh/tags/%E4%B8%8B%E8%BD%BD/ + + /zh/offlinecache/ + + diff --git a/sitemap/index.html b/zh/sitemap/index.html similarity index 87% rename from sitemap/index.html rename to zh/sitemap/index.html index 28cd7fe5..9722d5d8 100644 --- a/sitemap/index.html +++ b/zh/sitemap/index.html @@ -6,10 +6,20 @@ 技巧网站导航 +
    - +
    diff --git a/tags/css/index.html b/zh/tags/css/index.html similarity index 59% rename from tags/css/index.html rename to zh/tags/css/index.html index 480f5c5c..1f889d30 100644 --- a/tags/css/index.html +++ b/zh/tags/css/index.html @@ -6,10 +6,20 @@ css +
    - +
    diff --git a/tags/css/index.xml b/zh/tags/css/index.xml similarity index 86% rename from tags/css/index.xml rename to zh/tags/css/index.xml index 82dd810b..b9472117 100644 --- a/tags/css/index.xml +++ b/zh/tags/css/index.xml @@ -2,17 +2,16 @@ css on - https://jamesfengcao.gitee.io/uwebzh/tags/css/ + /zh/tags/css/ Recent content in css on Hugo -- gohugo.io - en-us - Wed, 18 May 2022 00:00:00 +0000 + Wed, 18 May 2022 00:00:00 +0000 利用用户自定义样式屏蔽不良信息 - https://jamesfengcao.gitee.io/uwebzh/adblock_css/ + /zh/adblock_css/ Wed, 18 May 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/adblock_css/ + /zh/adblock_css/ 点击以下链接可安装全局样式,清后台重启浏览器,长按底部工具条窗口按钮弹出对话框后勾选上述文件名即可屏蔽不良信息。 floppymoose 广告屏蔽样式 gozer 广告屏蔽样式 @@ -22,10 +21,10 @@ gozer 广告屏蔽样式 特定网址用户脚本及样式 - https://jamesfengcao.gitee.io/uwebzh/sitejs/ + /zh/sitejs/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/sitejs/ + /zh/sitejs/ 技巧等级:中级 脚本 (第一时间装载js脚本见下面sitecss条目) 脚本需命名为 &quot;[根域名].js&quot;,譬如baidu.com.js 或tieba.baidu.com.js 。此脚本将自动作用于所有相同根域名的网址上。如有多个脚本满足条件,以最长文件名为准。 这些脚本需放到/sdcard/uweb/sitejs或/data/data/info.torapp.uweb/files/sitejs目录下,数量没有限制,上百万都不成问题。如果内部目录下sitejs存在,则/sdcard/uweb/sitejs不起任何作用。内部sitejs目录的存在同时也影响一切对安全敏感的资源(包括网站离线资源等)的配置,一旦内部sitejs目录存在,则这些资源必须位于内部目录才会生效。 长按窗口按钮,勾选“执行网址用户脚本”。 脚本执行对浏览器无性能影响,即使有百万脚本存在。 目前支持两段、三段及少数四段域名(最后两段不超过6字如com.cn的域名可取四段)。所以脚本请不要以很长的域名来命名。 样式及第一时间装载js脚本 diff --git a/tags/curl/index.html b/zh/tags/curl/index.html similarity index 55% rename from tags/curl/index.html rename to zh/tags/curl/index.html index 5e738365..76dc3b56 100644 --- a/tags/curl/index.html +++ b/zh/tags/curl/index.html @@ -6,10 +6,20 @@ curl +
    - +
    diff --git a/tags/curl/index.xml b/zh/tags/curl/index.xml similarity index 89% rename from tags/curl/index.xml rename to zh/tags/curl/index.xml index 8aba75e7..927d6387 100644 --- a/tags/curl/index.xml +++ b/zh/tags/curl/index.xml @@ -2,17 +2,16 @@ curl on - https://jamesfengcao.gitee.io/uwebzh/tags/curl/ + /zh/tags/curl/ Recent content in curl on Hugo -- gohugo.io - en-us - Mon, 24 Aug 2020 00:00:00 +0000 + Mon, 24 Aug 2020 00:00:00 +0000 利用文件预处理预览/查看/播放一切可下载资源 - https://jamesfengcao.gitee.io/uwebzh/filecap/ + /zh/filecap/ Mon, 24 Aug 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/filecap/ + /zh/filecap/ 技巧等级:中级 文件预处理配置文件为/sdcard/uweb/default.filecap,每行格式如下: [文件后缀]:[mimetype]:[处理命令] diff --git a/tags/index.html b/zh/tags/index.html similarity index 100% rename from tags/index.html rename to zh/tags/index.html index f2ba4f41..71aaa01d 100644 --- a/tags/index.html +++ b/zh/tags/index.html @@ -21,26 +21,26 @@
  • Windows 1
  • -
  • 下载 1
  • -
  • 不良信息屏蔽 4
  • -
  • 剪贴板 2
  • - -
  • 国外网址 2
  • - -
  • 搜索 2
  • -
  • 电视 1
  • +
  • 国外网址 2
  • + +
  • 剪贴板 2
  • +
  • 离线 1
  • +
  • 搜索 2
  • +
  • 网盘 1
  • -
  • 资源 2
  • +
  • 下载 1
  • 重定向 1
  • +
  • 资源 2
  • + diff --git a/tags/index.xml b/zh/tags/index.xml similarity index 50% rename from tags/index.xml rename to zh/tags/index.xml index c64184dd..f829a6fe 100644 --- a/tags/index.xml +++ b/zh/tags/index.xml @@ -2,179 +2,178 @@ Tags on - https://jamesfengcao.gitee.io/uwebzh/tags/ + /zh/tags/ Recent content in Tags on Hugo -- gohugo.io - en-us - Fri, 24 Jun 2022 00:00:00 +0000 + Fri, 24 Jun 2022 00:00:00 +0000 javascript - https://jamesfengcao.gitee.io/uwebzh/tags/javascript/ + /zh/tags/javascript/ Fri, 24 Jun 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/javascript/ + /zh/tags/javascript/ css - https://jamesfengcao.gitee.io/uwebzh/tags/css/ + /zh/tags/css/ Wed, 18 May 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/css/ + /zh/tags/css/ 不良信息屏蔽 - https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/ + /zh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/ Wed, 18 May 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/ + /zh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/ 国外网址 - https://jamesfengcao.gitee.io/uwebzh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/ + /zh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/ Mon, 25 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/ + /zh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/ 重定向 - https://jamesfengcao.gitee.io/uwebzh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/ + /zh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/ Mon, 25 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/ + /zh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/ PC - https://jamesfengcao.gitee.io/uwebzh/tags/pc/ + /zh/tags/pc/ Sat, 23 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/pc/ + /zh/tags/pc/ ssh - https://jamesfengcao.gitee.io/uwebzh/tags/ssh/ + /zh/tags/ssh/ Sat, 23 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/ssh/ + /zh/tags/ssh/ termux - https://jamesfengcao.gitee.io/uwebzh/tags/termux/ + /zh/tags/termux/ Sat, 23 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/termux/ + /zh/tags/termux/ Windows - https://jamesfengcao.gitee.io/uwebzh/tags/windows/ + /zh/tags/windows/ Sat, 23 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/windows/ + /zh/tags/windows/ 剪贴板 - https://jamesfengcao.gitee.io/uwebzh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/ + /zh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/ Sat, 23 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/ + /zh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/ 离线 - https://jamesfengcao.gitee.io/uwebzh/tags/%E7%A6%BB%E7%BA%BF/ + /zh/tags/%E7%A6%BB%E7%BA%BF/ Tue, 15 Dec 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/%E7%A6%BB%E7%BA%BF/ + /zh/tags/%E7%A6%BB%E7%BA%BF/ 网盘 - https://jamesfengcao.gitee.io/uwebzh/tags/%E7%BD%91%E7%9B%98/ + /zh/tags/%E7%BD%91%E7%9B%98/ Tue, 15 Dec 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/%E7%BD%91%E7%9B%98/ + /zh/tags/%E7%BD%91%E7%9B%98/ 资源 - https://jamesfengcao.gitee.io/uwebzh/tags/%E8%B5%84%E6%BA%90/ + /zh/tags/%E8%B5%84%E6%BA%90/ Tue, 15 Dec 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/%E8%B5%84%E6%BA%90/ + /zh/tags/%E8%B5%84%E6%BA%90/ 搜索 - https://jamesfengcao.gitee.io/uwebzh/tags/%E6%90%9C%E7%B4%A2/ + /zh/tags/%E6%90%9C%E7%B4%A2/ Tue, 22 Sep 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/%E6%90%9C%E7%B4%A2/ + /zh/tags/%E6%90%9C%E7%B4%A2/ tdict - https://jamesfengcao.gitee.io/uwebzh/tags/tdict/ + /zh/tags/tdict/ Sun, 06 Sep 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/tdict/ + /zh/tags/tdict/ tools - https://jamesfengcao.gitee.io/uwebzh/tags/tools/ + /zh/tags/tools/ Sun, 06 Sep 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/tools/ + /zh/tags/tools/ curl - https://jamesfengcao.gitee.io/uwebzh/tags/curl/ + /zh/tags/curl/ Mon, 24 Aug 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/curl/ - - - - - 下载 - https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8B%E8%BD%BD/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8B%E8%BD%BD/ + /zh/tags/curl/ 电视 - https://jamesfengcao.gitee.io/uwebzh/tags/%E7%94%B5%E8%A7%86/ + /zh/tags/%E7%94%B5%E8%A7%86/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tags/%E7%94%B5%E8%A7%86/ + /zh/tags/%E7%94%B5%E8%A7%86/ + + + + + 下载 + /zh/tags/%E4%B8%8B%E8%BD%BD/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zh/tags/%E4%B8%8B%E8%BD%BD/ diff --git a/tags/javascript/index.html b/zh/tags/javascript/index.html similarity index 63% rename from tags/javascript/index.html rename to zh/tags/javascript/index.html index 4c77ba34..8feed891 100644 --- a/tags/javascript/index.html +++ b/zh/tags/javascript/index.html @@ -6,10 +6,20 @@ javascript +
    - +
    diff --git a/tags/javascript/index.xml b/zh/tags/javascript/index.xml similarity index 87% rename from tags/javascript/index.xml rename to zh/tags/javascript/index.xml index ad859d9a..6af99fc7 100644 --- a/tags/javascript/index.xml +++ b/zh/tags/javascript/index.xml @@ -2,17 +2,16 @@ javascript on - https://jamesfengcao.gitee.io/uwebzh/tags/javascript/ + /zh/tags/javascript/ Recent content in javascript on Hugo -- gohugo.io - en-us - Fri, 24 Jun 2022 00:00:00 +0000 + Fri, 24 Jun 2022 00:00:00 +0000 小书签 - https://jamesfengcao.gitee.io/uwebzh/bookmarklet/ + /zh/bookmarklet/ Fri, 24 Jun 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/bookmarklet/ + /zh/bookmarklet/ 超微浏览器支持直接运行远程网址上的小书签(Bookmarklet),将本页面或其它包含小书签网址加入书签。使用时只需长按小书签链接,点击“新窗口打开”,小书签将作用于超微浏览器最后一个窗口(非小书签窗口)页面上。 列出外部脚本 查看浏览器UA @@ -37,10 +36,10 @@ BugMeNot 长按链接弹出菜单 - https://jamesfengcao.gitee.io/uwebzh/longclick/ + /zh/longclick/ Fri, 06 Nov 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/longclick/ + /zh/longclick/ 长按链接运行第三方程序 配置文件/sdcard/uweb/default.longclick每行格式如下(同default.cmds) 菜单名:mimetype:命令路径 命令可以包含%c(当前网址cookie)等,执行时会被相应内容自动替换。 @@ -51,10 +50,10 @@ js文件格式如下: 特定网址用户脚本及样式 - https://jamesfengcao.gitee.io/uwebzh/sitejs/ + /zh/sitejs/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/sitejs/ + /zh/sitejs/ 技巧等级:中级 脚本 (第一时间装载js脚本见下面sitecss条目) 脚本需命名为 &quot;[根域名].js&quot;,譬如baidu.com.js 或tieba.baidu.com.js 。此脚本将自动作用于所有相同根域名的网址上。如有多个脚本满足条件,以最长文件名为准。 这些脚本需放到/sdcard/uweb/sitejs或/data/data/info.torapp.uweb/files/sitejs目录下,数量没有限制,上百万都不成问题。如果内部目录下sitejs存在,则/sdcard/uweb/sitejs不起任何作用。内部sitejs目录的存在同时也影响一切对安全敏感的资源(包括网站离线资源等)的配置,一旦内部sitejs目录存在,则这些资源必须位于内部目录才会生效。 长按窗口按钮,勾选“执行网址用户脚本”。 脚本执行对浏览器无性能影响,即使有百万脚本存在。 目前支持两段、三段及少数四段域名(最后两段不超过6字如com.cn的域名可取四段)。所以脚本请不要以很长的域名来命名。 样式及第一时间装载js脚本 diff --git a/tags/pc/index.html b/zh/tags/pc/index.html similarity index 60% rename from tags/pc/index.html rename to zh/tags/pc/index.html index ac17c827..adddc347 100644 --- a/tags/pc/index.html +++ b/zh/tags/pc/index.html @@ -6,10 +6,20 @@ PC +
    - +
    diff --git a/tags/pc/index.xml b/zh/tags/pc/index.xml similarity index 92% rename from tags/pc/index.xml rename to zh/tags/pc/index.xml index 1403466c..47e04cc8 100644 --- a/tags/pc/index.xml +++ b/zh/tags/pc/index.xml @@ -2,17 +2,16 @@ PC on - https://jamesfengcao.gitee.io/uwebzh/tags/pc/ + /zh/tags/pc/ Recent content in PC on Hugo -- gohugo.io - en-us - Sat, 23 Apr 2022 00:00:00 +0000 + Sat, 23 Apr 2022 00:00:00 +0000 操作选中(富)文本/元素 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ Sat, 23 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ 点击以下链接可安装长按“链接”按钮菜单: google划词翻译 bing翻译 @@ -53,10 +52,10 @@ pclip 浏览器一键控制台式机/服务器下载资源 - https://jamesfengcao.gitee.io/uwebzh/pcdown/ + /zh/pcdown/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/pcdown/ + /zh/pcdown/ 技巧等级:高级 小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法: 手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令: diff --git a/tags/ssh/index.html b/zh/tags/ssh/index.html similarity index 64% rename from tags/ssh/index.html rename to zh/tags/ssh/index.html index 1de0e4b9..2b6c8cbe 100644 --- a/tags/ssh/index.html +++ b/zh/tags/ssh/index.html @@ -6,10 +6,20 @@ ssh +
    - +
    diff --git a/tags/ssh/index.xml b/zh/tags/ssh/index.xml similarity index 92% rename from tags/ssh/index.xml rename to zh/tags/ssh/index.xml index 77b88af7..3a5f5ac0 100644 --- a/tags/ssh/index.xml +++ b/zh/tags/ssh/index.xml @@ -2,17 +2,16 @@ ssh on - https://jamesfengcao.gitee.io/uwebzh/tags/ssh/ + /zh/tags/ssh/ Recent content in ssh on Hugo -- gohugo.io - en-us - Sat, 23 Apr 2022 00:00:00 +0000 + Sat, 23 Apr 2022 00:00:00 +0000 操作选中(富)文本/元素 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ Sat, 23 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ 点击以下链接可安装长按“链接”按钮菜单: google划词翻译 bing翻译 @@ -53,10 +52,10 @@ pclip 一键执行任意预定义命令(附手机PC剪贴板互通) - https://jamesfengcao.gitee.io/uwebzh/cmd/ + /zh/cmd/ Sat, 20 Jan 2018 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/cmd/ + /zh/cmd/ 技巧等级:中级 PC剪贴板(高级) uweb浏览器支持一键执行任意预定义命令,这些命令可以与剪贴板交互,可以将结果(文本、图像、音视频)输出到浏览器窗口。 手机推荐安装uweb定制Termux,否则能够执行的命令极其有限。 @@ -76,10 +75,10 @@ mimetype用来表示命令的输出类型。除了标准的mimetype之外,超 浏览器一键控制台式机/服务器下载资源 - https://jamesfengcao.gitee.io/uwebzh/pcdown/ + /zh/pcdown/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/pcdown/ + /zh/pcdown/ 技巧等级:高级 小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法: 手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令: diff --git a/tags/tdict/index.html b/zh/tags/tdict/index.html similarity index 53% rename from tags/tdict/index.html rename to zh/tags/tdict/index.html index ecc4dc68..9aacab76 100644 --- a/tags/tdict/index.html +++ b/zh/tags/tdict/index.html @@ -6,10 +6,20 @@ tdict +
    - +
    diff --git a/tags/tdict/index.xml b/zh/tags/tdict/index.xml similarity index 84% rename from tags/tdict/index.xml rename to zh/tags/tdict/index.xml index bc2d4460..366f5a31 100644 --- a/tags/tdict/index.xml +++ b/zh/tags/tdict/index.xml @@ -2,17 +2,16 @@ tdict on - https://jamesfengcao.gitee.io/uwebzh/tags/tdict/ + /zh/tags/tdict/ Recent content in tdict on Hugo -- gohugo.io - en-us - Sun, 06 Sep 2020 00:00:00 +0000 + Sun, 06 Sep 2020 00:00:00 +0000 工具汇总 - https://jamesfengcao.gitee.io/uwebzh/tools/ + /zh/tools/ Sun, 06 Sep 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tools/ + /zh/tools/ 安装tdict检索工具 (本地检索,远程内容) 安装完tdict本地检索工具后,可选择性安装字典索引及对应的搜索引擎至主屏。以下引擎仅作测试使用。 安装双解字典索引 安装双解字典至主屏 diff --git a/tags/termux/index.html b/zh/tags/termux/index.html similarity index 74% rename from tags/termux/index.html rename to zh/tags/termux/index.html index 029219b6..69bd2445 100644 --- a/tags/termux/index.html +++ b/zh/tags/termux/index.html @@ -6,10 +6,20 @@ termux +
    - +
    diff --git a/tags/termux/index.xml b/zh/tags/termux/index.xml similarity index 93% rename from tags/termux/index.xml rename to zh/tags/termux/index.xml index 78854eb8..5ad576ad 100644 --- a/tags/termux/index.xml +++ b/zh/tags/termux/index.xml @@ -2,17 +2,16 @@ termux on - https://jamesfengcao.gitee.io/uwebzh/tags/termux/ + /zh/tags/termux/ Recent content in termux on Hugo -- gohugo.io - en-us - Sat, 23 Apr 2022 00:00:00 +0000 + Sat, 23 Apr 2022 00:00:00 +0000 操作选中(富)文本/元素 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ Sat, 23 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ 点击以下链接可安装长按“链接”按钮菜单: google划词翻译 bing翻译 @@ -53,10 +52,10 @@ pclip 离线下载 - https://jamesfengcao.gitee.io/uwebzh/loadbt/ + /zh/loadbt/ Tue, 15 Dec 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/loadbt/ + /zh/loadbt/ seedr用户可使用常用链接利用seedr离线下载。使用时长按链接-&gt;命令-&gt;seedr离线...。 Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。使用时长按链接-&gt;命令-&gt;tg...。 百度网盘存储空间大,但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。 本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。 超微浏览器上配置百度离线下载 @@ -77,10 +76,10 @@ BaiduPCS-Go config set -appid=266719 工具汇总 - https://jamesfengcao.gitee.io/uwebzh/tools/ + /zh/tools/ Sun, 06 Sep 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tools/ + /zh/tools/ 安装tdict检索工具 (本地检索,远程内容) 安装完tdict本地检索工具后,可选择性安装字典索引及对应的搜索引擎至主屏。以下引擎仅作测试使用。 安装双解字典索引 安装双解字典至主屏 @@ -111,10 +110,10 @@ Merriam Webster Unabridged 利用文件预处理预览/查看/播放一切可下载资源 - https://jamesfengcao.gitee.io/uwebzh/filecap/ + /zh/filecap/ Mon, 24 Aug 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/filecap/ + /zh/filecap/ 技巧等级:中级 文件预处理配置文件为/sdcard/uweb/default.filecap,每行格式如下: [文件后缀]:[mimetype]:[处理命令] @@ -131,10 +130,10 @@ pdf:uweb:echo file:///sdcard/uweb/app/pdf.js/web/viewer.html?file=%u djvu:uweb:e 一键执行任意预定义命令(附手机PC剪贴板互通) - https://jamesfengcao.gitee.io/uwebzh/cmd/ + /zh/cmd/ Sat, 20 Jan 2018 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/cmd/ + /zh/cmd/ 技巧等级:中级 PC剪贴板(高级) uweb浏览器支持一键执行任意预定义命令,这些命令可以与剪贴板交互,可以将结果(文本、图像、音视频)输出到浏览器窗口。 手机推荐安装uweb定制Termux,否则能够执行的命令极其有限。 @@ -154,10 +153,10 @@ mimetype用来表示命令的输出类型。除了标准的mimetype之外,超 利用浏览器地址栏对函数作图 - https://jamesfengcao.gitee.io/uwebzh/gnuplot/ + /zh/gnuplot/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/gnuplot/ + /zh/gnuplot/ 使用Android端uweb浏览器。 Termux提供了方便的软件包管理系统,缺省的uWeb地址栏功能配置需用到作图软件gnuplot。 安装gnuplot 安装 uweb定制Termux应用 Termux下运行以下命令: @@ -172,10 +171,10 @@ gnuplot -e 'set term svg;set output; plot x' 浏览器一键控制台式机/服务器下载资源 - https://jamesfengcao.gitee.io/uwebzh/pcdown/ + /zh/pcdown/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/pcdown/ + /zh/pcdown/ 技巧等级:高级 小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法: 手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令: diff --git a/tags/tools/index.html b/zh/tags/tools/index.html similarity index 53% rename from tags/tools/index.html rename to zh/tags/tools/index.html index 0952739d..65754f8e 100644 --- a/tags/tools/index.html +++ b/zh/tags/tools/index.html @@ -6,10 +6,20 @@ tools +
    - +
    diff --git a/tags/tools/index.xml b/zh/tags/tools/index.xml similarity index 84% rename from tags/tools/index.xml rename to zh/tags/tools/index.xml index 8cafc46c..134d4cb6 100644 --- a/tags/tools/index.xml +++ b/zh/tags/tools/index.xml @@ -2,17 +2,16 @@ tools on - https://jamesfengcao.gitee.io/uwebzh/tags/tools/ + /zh/tags/tools/ Recent content in tools on Hugo -- gohugo.io - en-us - Sun, 06 Sep 2020 00:00:00 +0000 + Sun, 06 Sep 2020 00:00:00 +0000 工具汇总 - https://jamesfengcao.gitee.io/uwebzh/tools/ + /zh/tools/ Sun, 06 Sep 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tools/ + /zh/tools/ 安装tdict检索工具 (本地检索,远程内容) 安装完tdict本地检索工具后,可选择性安装字典索引及对应的搜索引擎至主屏。以下引擎仅作测试使用。 安装双解字典索引 安装双解字典至主屏 diff --git a/tags/windows/index.html b/zh/tags/windows/index.html similarity index 54% rename from tags/windows/index.html rename to zh/tags/windows/index.html index 4c7c9edb..793f8e0e 100644 --- a/tags/windows/index.html +++ b/zh/tags/windows/index.html @@ -6,10 +6,20 @@ Windows +
    - +
    diff --git a/tags/windows/index.xml b/zh/tags/windows/index.xml similarity index 91% rename from tags/windows/index.xml rename to zh/tags/windows/index.xml index 5ab7a2dc..cbfc7966 100644 --- a/tags/windows/index.xml +++ b/zh/tags/windows/index.xml @@ -2,17 +2,16 @@ Windows on - https://jamesfengcao.gitee.io/uwebzh/tags/windows/ + /zh/tags/windows/ Recent content in Windows on Hugo -- gohugo.io - en-us - Sat, 23 Apr 2022 00:00:00 +0000 + Sat, 23 Apr 2022 00:00:00 +0000 操作选中(富)文本/元素 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ Sat, 23 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ 点击以下链接可安装长按“链接”按钮菜单: google划词翻译 bing翻译 diff --git a/tags/下载/index.html b/zh/tags/下载/index.html similarity index 55% rename from tags/下载/index.html rename to zh/tags/下载/index.html index ca8ac72f..0d139e2c 100644 --- a/tags/下载/index.html +++ b/zh/tags/下载/index.html @@ -6,10 +6,20 @@ 下载 +
    - +
    diff --git a/tags/下载/index.xml b/zh/tags/下载/index.xml similarity index 82% rename from tags/下载/index.xml rename to zh/tags/下载/index.xml index b12cb6be..b019ec98 100644 --- a/tags/下载/index.xml +++ b/zh/tags/下载/index.xml @@ -2,16 +2,15 @@ 下载 on - https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8B%E8%BD%BD/ + /zh/tags/%E4%B8%8B%E8%BD%BD/ Recent content in 下载 on - Hugo -- gohugo.io - en-us + Hugo -- gohugo.io 浏览器一键控制台式机/服务器下载资源 - https://jamesfengcao.gitee.io/uwebzh/pcdown/ + /zh/pcdown/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/pcdown/ + /zh/pcdown/ 技巧等级:高级 小孩要听英文有声书“The lying games”,国内服务器没一个能下的,最后还是在手机上用seedr秒下。但seedr的登录要用google人机交互确认,用过代理、tunnel至手机等方法,台式机死活登录不上。下面言归正传,讲一下超微浏览器直接下载资源至台式机的方法: 手机需安装uweb定制Termux,并在termux下安装openssl,在Termux窗口下依次敲入如下命令: diff --git a/tags/不良信息屏蔽/index.html b/zh/tags/不良信息屏蔽/index.html similarity index 67% rename from tags/不良信息屏蔽/index.html rename to zh/tags/不良信息屏蔽/index.html index 72670333..07309a36 100644 --- a/tags/不良信息屏蔽/index.html +++ b/zh/tags/不良信息屏蔽/index.html @@ -6,10 +6,20 @@ 不良信息屏蔽 +
    - +
    diff --git a/tags/不良信息屏蔽/index.xml b/zh/tags/不良信息屏蔽/index.xml similarity index 88% rename from tags/不良信息屏蔽/index.xml rename to zh/tags/不良信息屏蔽/index.xml index b8df53b5..833de65f 100644 --- a/tags/不良信息屏蔽/index.xml +++ b/zh/tags/不良信息屏蔽/index.xml @@ -2,17 +2,16 @@ 不良信息屏蔽 on - https://jamesfengcao.gitee.io/uwebzh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/ + /zh/tags/%E4%B8%8D%E8%89%AF%E4%BF%A1%E6%81%AF%E5%B1%8F%E8%94%BD/ Recent content in 不良信息屏蔽 on Hugo -- gohugo.io - en-us - Wed, 18 May 2022 00:00:00 +0000 + Wed, 18 May 2022 00:00:00 +0000 利用用户自定义样式屏蔽不良信息 - https://jamesfengcao.gitee.io/uwebzh/adblock_css/ + /zh/adblock_css/ Wed, 18 May 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/adblock_css/ + /zh/adblock_css/ 点击以下链接可安装全局样式,清后台重启浏览器,长按底部工具条窗口按钮弹出对话框后勾选上述文件名即可屏蔽不良信息。 floppymoose 广告屏蔽样式 gozer 广告屏蔽样式 @@ -22,10 +21,10 @@ gozer 广告屏蔽样式 视频播放小窍门 - https://jamesfengcao.gitee.io/uwebzh/video/ + /zh/video/ Tue, 22 Sep 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/video/ + /zh/video/ 覆盖安装全屏播放菜单示例:屏幕旋转,退出 本文以超微浏览器为例来说明。 创建文件&quot;default.playrate&quot;可定制全屏倍速播放菜单项,格式与文件default.link完全相同。倍速播放菜单链接部分为空,譬如&quot;.5x:&quot;,倍速菜单至少有一个。链接部分非空的菜单必须在所有倍速菜单之后。 长按设置按钮勾选“弹出视频地址”,则视频播放时会弹出真正的播放地址,点击地址播放可避免一切不良信息。如果点击后为下载操作,可长按链接分享给视频播放器。用户亦可配置在线播放或安装插件。嗅探的视频/资源类型可由文件“/sdcard/uweb/types.sniff”控制。 很多视频解析结果在UA为PC的情况下非常干净,没什么不良信息。故用户可在播放前切换UA至PC。如:wn.run/解析结果对PC非常干净。 某些视频网站在全屏播放时都会出现不良信息占住屏幕一部分。点击全屏播放之前,长按[☰]按钮,超微浏览器将弹出全局脚本菜单,勾选“移除浮动不良信息”后再点全屏播放则完美播放。 也可利用全屏播放屏蔽一切不良信息。方法如下: 长按[☰]按钮,勾选“全屏视频”。此选项将让无法全屏播放的网站强制允许全屏播放。 对无法全屏、无法放大的视频网站,可长按[☰]按钮,勾选“强制缩放”,然后手动放大至全屏。 灵活应用JS、图像开关屏蔽一切不良信息:视频搜索前关闭JS开关,进入播放网页前关闭图像显示并打开JS。 视频解析之电视剧: 首先在视频网站搜索电视剧片名,下面会显示不同的剧集,点击它们再用视频解析即可观看。如果直接点击电视剧用视频解析则每次播放均为第一集。 视频搜索预配置(超过400个引擎) @@ -35,10 +34,10 @@ gozer 广告屏蔽样式 加速访问国外网站 - https://jamesfengcao.gitee.io/uwebzh/hosts/ + /zh/hosts/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/hosts/ + /zh/hosts/ 不少国外网站本身虽可访问,但由于网站需要下载其它网址的资源而导致无法访问。根域名屏蔽可屏蔽文件中域名的一切子域名、孙域名、......,从而主动排除这些网址,最终允许浏览器快速访问。 使用Android端uweb浏览器。 域名文件内容如下: @@ -57,10 +56,10 @@ fbcdn.net 绝杀完整域名树 - https://jamesfengcao.gitee.io/uwebzh/adblock_domain/ + /zh/adblock_domain/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/adblock_domain/ + /zh/adblock_domain/ 域名文件可屏蔽文件中域名的一切子域名、孙域名、......,可彻底绝杀一切不良信息。所以用户屏蔽根域名时无需选择提示中出现的整个域名,只需选取最后两段或三段(最后两段不超过6字符如com.cn的域名可取四段)。 可使用列出外部脚本小书签生成外部js文件列表,然后长按底部工具栏&quot;js&quot;按钮,执行&quot;网址转链接&quot;菜单命令,长按可疑链接(一般为域名不同的外链),执行“屏蔽根域名”。 长按不良信息链接,点击“图片:屏蔽根域名”,修改弹出域名,一般取最后两段,点击&quot;确定&quot;屏蔽当前图片网址。 diff --git a/tags/剪贴板/index.html b/zh/tags/剪贴板/index.html similarity index 60% rename from tags/剪贴板/index.html rename to zh/tags/剪贴板/index.html index 4f154294..462c05e9 100644 --- a/tags/剪贴板/index.html +++ b/zh/tags/剪贴板/index.html @@ -6,10 +6,20 @@ 剪贴板 +
    - +
    diff --git a/tags/剪贴板/index.xml b/zh/tags/剪贴板/index.xml similarity index 92% rename from tags/剪贴板/index.xml rename to zh/tags/剪贴板/index.xml index 02cd8369..55f6a119 100644 --- a/tags/剪贴板/index.xml +++ b/zh/tags/剪贴板/index.xml @@ -2,17 +2,16 @@ 剪贴板 on - https://jamesfengcao.gitee.io/uwebzh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/ + /zh/tags/%E5%89%AA%E8%B4%B4%E6%9D%BF/ Recent content in 剪贴板 on Hugo -- gohugo.io - en-us - Sat, 23 Apr 2022 00:00:00 +0000 + Sat, 23 Apr 2022 00:00:00 +0000 操作选中(富)文本/元素 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ Sat, 23 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/pccopy/ + /zh/pccopy/ 点击以下链接可安装长按“链接”按钮菜单: google划词翻译 bing翻译 @@ -53,10 +52,10 @@ pclip 一键执行任意预定义命令(附手机PC剪贴板互通) - https://jamesfengcao.gitee.io/uwebzh/cmd/ + /zh/cmd/ Sat, 20 Jan 2018 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/cmd/ + /zh/cmd/ 技巧等级:中级 PC剪贴板(高级) uweb浏览器支持一键执行任意预定义命令,这些命令可以与剪贴板交互,可以将结果(文本、图像、音视频)输出到浏览器窗口。 手机推荐安装uweb定制Termux,否则能够执行的命令极其有限。 diff --git a/tags/国外网址/index.html b/zh/tags/国外网址/index.html similarity index 60% rename from tags/国外网址/index.html rename to zh/tags/国外网址/index.html index dc6f0932..14150af6 100644 --- a/tags/国外网址/index.html +++ b/zh/tags/国外网址/index.html @@ -6,10 +6,20 @@ 国外网址 +
    - +
    diff --git a/tags/国外网址/index.xml b/zh/tags/国外网址/index.xml similarity index 87% rename from tags/国外网址/index.xml rename to zh/tags/国外网址/index.xml index 12206b71..4a33db27 100644 --- a/tags/国外网址/index.xml +++ b/zh/tags/国外网址/index.xml @@ -2,17 +2,16 @@ 国外网址 on - https://jamesfengcao.gitee.io/uwebzh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/ + /zh/tags/%E5%9B%BD%E5%A4%96%E7%BD%91%E5%9D%80/ Recent content in 国外网址 on Hugo -- gohugo.io - en-us - Mon, 25 Apr 2022 00:00:00 +0000 + Mon, 25 Apr 2022 00:00:00 +0000 重定向国外网址至国内镜像(附编辑本地文件) - https://jamesfengcao.gitee.io/uwebzh/redirect/ + /zh/redirect/ Mon, 25 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/redirect/ + /zh/redirect/ github mirror:fastgit github mirror 2 github mirror 3 @@ -53,10 +52,10 @@ item.gome.com.cn::item.gomevvv.com.cn 加速访问国外网站 - https://jamesfengcao.gitee.io/uwebzh/hosts/ + /zh/hosts/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/hosts/ + /zh/hosts/ 不少国外网站本身虽可访问,但由于网站需要下载其它网址的资源而导致无法访问。根域名屏蔽可屏蔽文件中域名的一切子域名、孙域名、......,从而主动排除这些网址,最终允许浏览器快速访问。 使用Android端uweb浏览器。 域名文件内容如下: diff --git a/tags/搜索/index.html b/zh/tags/搜索/index.html similarity index 58% rename from tags/搜索/index.html rename to zh/tags/搜索/index.html index add7fb89..c4bcb6a7 100644 --- a/tags/搜索/index.html +++ b/zh/tags/搜索/index.html @@ -6,10 +6,20 @@ 搜索 +
    - +
    diff --git a/tags/搜索/index.xml b/zh/tags/搜索/index.xml similarity index 88% rename from tags/搜索/index.xml rename to zh/tags/搜索/index.xml index 4895f104..2b6c85d5 100644 --- a/tags/搜索/index.xml +++ b/zh/tags/搜索/index.xml @@ -2,17 +2,16 @@ 搜索 on - https://jamesfengcao.gitee.io/uwebzh/tags/%E6%90%9C%E7%B4%A2/ + /zh/tags/%E6%90%9C%E7%B4%A2/ Recent content in 搜索 on Hugo -- gohugo.io - en-us - Tue, 22 Sep 2020 00:00:00 +0000 + Tue, 22 Sep 2020 00:00:00 +0000 视频播放小窍门 - https://jamesfengcao.gitee.io/uwebzh/video/ + /zh/video/ Tue, 22 Sep 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/video/ + /zh/video/ 覆盖安装全屏播放菜单示例:屏幕旋转,退出 本文以超微浏览器为例来说明。 创建文件&quot;default.playrate&quot;可定制全屏倍速播放菜单项,格式与文件default.link完全相同。倍速播放菜单链接部分为空,譬如&quot;.5x:&quot;,倍速菜单至少有一个。链接部分非空的菜单必须在所有倍速菜单之后。 长按设置按钮勾选“弹出视频地址”,则视频播放时会弹出真正的播放地址,点击地址播放可避免一切不良信息。如果点击后为下载操作,可长按链接分享给视频播放器。用户亦可配置在线播放或安装插件。嗅探的视频/资源类型可由文件“/sdcard/uweb/types.sniff”控制。 很多视频解析结果在UA为PC的情况下非常干净,没什么不良信息。故用户可在播放前切换UA至PC。如:wn.run/解析结果对PC非常干净。 某些视频网站在全屏播放时都会出现不良信息占住屏幕一部分。点击全屏播放之前,长按[☰]按钮,超微浏览器将弹出全局脚本菜单,勾选“移除浮动不良信息”后再点全屏播放则完美播放。 也可利用全屏播放屏蔽一切不良信息。方法如下: 长按[☰]按钮,勾选“全屏视频”。此选项将让无法全屏播放的网站强制允许全屏播放。 对无法全屏、无法放大的视频网站,可长按[☰]按钮,勾选“强制缩放”,然后手动放大至全屏。 灵活应用JS、图像开关屏蔽一切不良信息:视频搜索前关闭JS开关,进入播放网页前关闭图像显示并打开JS。 视频解析之电视剧: 首先在视频网站搜索电视剧片名,下面会显示不同的剧集,点击它们再用视频解析即可观看。如果直接点击电视剧用视频解析则每次播放均为第一集。 视频搜索预配置(超过400个引擎) @@ -22,10 +21,10 @@ 分类多引擎搜索 - https://jamesfengcao.gitee.io/uwebzh/searchcat/ + /zh/searchcat/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/searchcat/ + /zh/searchcat/ 点击本链接自动安装分类多引擎文件至&quot;/sdcard/uweb/bookmark&quot;目录下。 超微浏览器中通过“设置”-&gt;“总目录”-&gt;“↑”-&gt;“Download”,点击后缀为.search的下载文件,超微浏览器将自动显示分类多引擎搜索。此时可按菜单键(或长按底部工具条后退按钮)选择“添加到桌面”方便以后访问。 .search文件每行格式为如下几种: diff --git a/tags/电视/index.html b/zh/tags/电视/index.html similarity index 53% rename from tags/电视/index.html rename to zh/tags/电视/index.html index 52c811c7..c3b7d6a1 100644 --- a/tags/电视/index.html +++ b/zh/tags/电视/index.html @@ -6,10 +6,20 @@ 电视 +
    - +
    diff --git a/tags/电视/index.xml b/zh/tags/电视/index.xml similarity index 79% rename from tags/电视/index.xml rename to zh/tags/电视/index.xml index 404a8820..5f0cfb3d 100644 --- a/tags/电视/index.xml +++ b/zh/tags/电视/index.xml @@ -2,16 +2,15 @@ 电视 on - https://jamesfengcao.gitee.io/uwebzh/tags/%E7%94%B5%E8%A7%86/ + /zh/tags/%E7%94%B5%E8%A7%86/ Recent content in 电视 on - Hugo -- gohugo.io - en-us + Hugo -- gohugo.io 电视直播 - https://jamesfengcao.gitee.io/uwebzh/tvlive/ + /zh/tvlive/ Mon, 01 Jan 0001 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/tvlive/ + /zh/tvlive/ CCTV1 CCTV2财经 CCTV3综艺 diff --git a/tags/离线/index.html b/zh/tags/离线/index.html similarity index 53% rename from tags/离线/index.html rename to zh/tags/离线/index.html index d8ba5956..d6507f40 100644 --- a/tags/离线/index.html +++ b/zh/tags/离线/index.html @@ -6,10 +6,20 @@ 离线 +
    - +
    diff --git a/tags/离线/index.xml b/zh/tags/离线/index.xml similarity index 84% rename from tags/离线/index.xml rename to zh/tags/离线/index.xml index 7eff9634..eeff2e87 100644 --- a/tags/离线/index.xml +++ b/zh/tags/离线/index.xml @@ -2,17 +2,16 @@ 离线 on - https://jamesfengcao.gitee.io/uwebzh/tags/%E7%A6%BB%E7%BA%BF/ + /zh/tags/%E7%A6%BB%E7%BA%BF/ Recent content in 离线 on Hugo -- gohugo.io - en-us - Tue, 15 Dec 2020 00:00:00 +0000 + Tue, 15 Dec 2020 00:00:00 +0000 离线下载 - https://jamesfengcao.gitee.io/uwebzh/loadbt/ + /zh/loadbt/ Tue, 15 Dec 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/loadbt/ + /zh/loadbt/ seedr用户可使用常用链接利用seedr离线下载。使用时长按链接-&gt;命令-&gt;seedr离线...。 Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。使用时长按链接-&gt;命令-&gt;tg...。 百度网盘存储空间大,但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。 本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。 超微浏览器上配置百度离线下载 diff --git a/tags/网盘/index.html b/zh/tags/网盘/index.html similarity index 53% rename from tags/网盘/index.html rename to zh/tags/网盘/index.html index 93d58547..535c4d1d 100644 --- a/tags/网盘/index.html +++ b/zh/tags/网盘/index.html @@ -6,10 +6,20 @@ 网盘 +
    - +
    diff --git a/tags/网盘/index.xml b/zh/tags/网盘/index.xml similarity index 84% rename from tags/网盘/index.xml rename to zh/tags/网盘/index.xml index 88a14885..b021e48b 100644 --- a/tags/网盘/index.xml +++ b/zh/tags/网盘/index.xml @@ -2,17 +2,16 @@ 网盘 on - https://jamesfengcao.gitee.io/uwebzh/tags/%E7%BD%91%E7%9B%98/ + /zh/tags/%E7%BD%91%E7%9B%98/ Recent content in 网盘 on Hugo -- gohugo.io - en-us - Tue, 15 Dec 2020 00:00:00 +0000 + Tue, 15 Dec 2020 00:00:00 +0000 离线下载 - https://jamesfengcao.gitee.io/uwebzh/loadbt/ + /zh/loadbt/ Tue, 15 Dec 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/loadbt/ + /zh/loadbt/ seedr用户可使用常用链接利用seedr离线下载。使用时长按链接-&gt;命令-&gt;seedr离线...。 Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。使用时长按链接-&gt;命令-&gt;tg...。 百度网盘存储空间大,但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。 本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。 超微浏览器上配置百度离线下载 diff --git a/tags/资源/index.html b/zh/tags/资源/index.html similarity index 58% rename from tags/资源/index.html rename to zh/tags/资源/index.html index b8b2b929..0a1b7480 100644 --- a/tags/资源/index.html +++ b/zh/tags/资源/index.html @@ -6,10 +6,20 @@ 资源 +
    - +
    diff --git a/tags/资源/index.xml b/zh/tags/资源/index.xml similarity index 89% rename from tags/资源/index.xml rename to zh/tags/资源/index.xml index 43c56668..b8ead936 100644 --- a/tags/资源/index.xml +++ b/zh/tags/资源/index.xml @@ -2,17 +2,16 @@ 资源 on - https://jamesfengcao.gitee.io/uwebzh/tags/%E8%B5%84%E6%BA%90/ + /zh/tags/%E8%B5%84%E6%BA%90/ Recent content in 资源 on Hugo -- gohugo.io - en-us - Tue, 15 Dec 2020 00:00:00 +0000 + Tue, 15 Dec 2020 00:00:00 +0000 离线下载 - https://jamesfengcao.gitee.io/uwebzh/loadbt/ + /zh/loadbt/ Tue, 15 Dec 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/loadbt/ + /zh/loadbt/ seedr用户可使用常用链接利用seedr离线下载。使用时长按链接-&gt;命令-&gt;seedr离线...。 Telegram用户可使用特色服务利用tg bot离线下载至bot支持网盘。使用时长按链接-&gt;命令-&gt;tg...。 百度网盘存储空间大,但其离线下载限制很多,可能由于某些重要节点被屏蔽的原因,下载国外资料基本都会失败。国外离线网盘空间小,但下载成功率很高。 本文介绍一种技术,使用国外离线网盘下载资源,然后一键离线至百度网盘。 超微浏览器上配置百度离线下载 @@ -33,10 +32,10 @@ BaiduPCS-Go config set -appid=266719 视频播放小窍门 - https://jamesfengcao.gitee.io/uwebzh/video/ + /zh/video/ Tue, 22 Sep 2020 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/video/ + /zh/video/ 覆盖安装全屏播放菜单示例:屏幕旋转,退出 本文以超微浏览器为例来说明。 创建文件&quot;default.playrate&quot;可定制全屏倍速播放菜单项,格式与文件default.link完全相同。倍速播放菜单链接部分为空,譬如&quot;.5x:&quot;,倍速菜单至少有一个。链接部分非空的菜单必须在所有倍速菜单之后。 长按设置按钮勾选“弹出视频地址”,则视频播放时会弹出真正的播放地址,点击地址播放可避免一切不良信息。如果点击后为下载操作,可长按链接分享给视频播放器。用户亦可配置在线播放或安装插件。嗅探的视频/资源类型可由文件“/sdcard/uweb/types.sniff”控制。 很多视频解析结果在UA为PC的情况下非常干净,没什么不良信息。故用户可在播放前切换UA至PC。如:wn.run/解析结果对PC非常干净。 某些视频网站在全屏播放时都会出现不良信息占住屏幕一部分。点击全屏播放之前,长按[☰]按钮,超微浏览器将弹出全局脚本菜单,勾选“移除浮动不良信息”后再点全屏播放则完美播放。 也可利用全屏播放屏蔽一切不良信息。方法如下: 长按[☰]按钮,勾选“全屏视频”。此选项将让无法全屏播放的网站强制允许全屏播放。 对无法全屏、无法放大的视频网站,可长按[☰]按钮,勾选“强制缩放”,然后手动放大至全屏。 灵活应用JS、图像开关屏蔽一切不良信息:视频搜索前关闭JS开关,进入播放网页前关闭图像显示并打开JS。 视频解析之电视剧: 首先在视频网站搜索电视剧片名,下面会显示不同的剧集,点击它们再用视频解析即可观看。如果直接点击电视剧用视频解析则每次播放均为第一集。 视频搜索预配置(超过400个引擎) diff --git a/tags/重定向/index.html b/zh/tags/重定向/index.html similarity index 56% rename from tags/重定向/index.html rename to zh/tags/重定向/index.html index a961b8f8..67ae836e 100644 --- a/tags/重定向/index.html +++ b/zh/tags/重定向/index.html @@ -6,10 +6,20 @@ 重定向 +
    - +
    diff --git a/tags/重定向/index.xml b/zh/tags/重定向/index.xml similarity index 88% rename from tags/重定向/index.xml rename to zh/tags/重定向/index.xml index 4ec2ac4c..d97d6178 100644 --- a/tags/重定向/index.xml +++ b/zh/tags/重定向/index.xml @@ -2,17 +2,16 @@ 重定向 on - https://jamesfengcao.gitee.io/uwebzh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/ + /zh/tags/%E9%87%8D%E5%AE%9A%E5%90%91/ Recent content in 重定向 on Hugo -- gohugo.io - en-us - Mon, 25 Apr 2022 00:00:00 +0000 + Mon, 25 Apr 2022 00:00:00 +0000 重定向国外网址至国内镜像(附编辑本地文件) - https://jamesfengcao.gitee.io/uwebzh/redirect/ + /zh/redirect/ Mon, 25 Apr 2022 00:00:00 +0000 - https://jamesfengcao.gitee.io/uwebzh/redirect/ + /zh/redirect/ github mirror:fastgit github mirror 2 github mirror 3 diff --git a/tcron/index.html b/zh/tcron/index.html similarity index 87% rename from tcron/index.html rename to zh/tcron/index.html index ea8f888d..5b429044 100644 --- a/tcron/index.html +++ b/zh/tcron/index.html @@ -6,10 +6,20 @@ 定时脚本 +
    - +
    diff --git a/tips/index.html b/zh/tips/index.html similarity index 79% rename from tips/index.html rename to zh/tips/index.html index fffcce1d..cc25aa46 100644 --- a/tips/index.html +++ b/zh/tips/index.html @@ -6,10 +6,20 @@ 小技巧 +
    - +
    diff --git a/tools/index.html b/zh/tools/index.html similarity index 91% rename from tools/index.html rename to zh/tools/index.html index 070ba346..89d0ccfa 100644 --- a/tools/index.html +++ b/zh/tools/index.html @@ -6,10 +6,20 @@ 工具汇总 +
    - +
    diff --git a/tvlive/index.html b/zh/tvlive/index.html similarity index 98% rename from tvlive/index.html rename to zh/tvlive/index.html index 701e1dd9..14330b29 100644 --- a/tvlive/index.html +++ b/zh/tvlive/index.html @@ -6,10 +6,20 @@ 电视直播 +
    - +
    diff --git a/urls/index.html b/zh/urls/index.html similarity index 54% rename from urls/index.html rename to zh/urls/index.html index 36cd0496..578c6599 100644 --- a/urls/index.html +++ b/zh/urls/index.html @@ -6,10 +6,20 @@ 便利链接 +
    - +
    diff --git a/video/index.html b/zh/video/index.html similarity index 89% rename from video/index.html rename to zh/video/index.html index 635c6dd5..cbbc1258 100644 --- a/video/index.html +++ b/zh/video/index.html @@ -6,10 +6,20 @@ 视频播放小窍门 +
    - +