├── .gitattributes ├── .gitignore ├── LICENSE ├── librian ├── __init__.py ├── __main__.py ├── librian_util │ ├── 加載器.py │ ├── 文件.py │ └── 路徑.py ├── librian本體 │ ├── librian.py │ ├── librian虛擬機 │ │ ├── 命令.py │ │ ├── 立繪.py │ │ ├── 箱庭.py │ │ ├── 虛擬機環境.py │ │ ├── 角色.py │ │ ├── 讀者.py │ │ └── 鏡頭.py │ ├── 前端 │ │ ├── adv.html │ │ ├── adv.ptml │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ │ ├── _統合.sass │ │ │ ├── psd處理.coffee │ │ │ ├── 主樣式.sass │ │ │ ├── 全局.coffee │ │ │ ├── 加載畫面.sass │ │ │ ├── 各種面板.sass │ │ │ ├── 存檔讀檔.coffee │ │ │ ├── 按鈕.sass │ │ │ ├── 控制.coffee │ │ │ ├── 演出.coffee │ │ │ ├── 特效.sass │ │ │ └── 狀態切換.sass │ │ ├── webpack.config.js │ │ ├── 素材 │ │ │ ├── NotoSerifSC-SemiBold.otf │ │ │ └── t0.png │ │ ├── 黑科技 │ │ │ ├── font-awesome-4.7.0 │ │ │ │ ├── HELP-US-OUT.txt │ │ │ │ ├── css │ │ │ │ │ ├── font-awesome.css │ │ │ │ │ └── font-awesome.min.css │ │ │ │ ├── fonts │ │ │ │ │ ├── FontAwesome.otf │ │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ │ ├── fontawesome-webfont.svg │ │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ │ └── fontawesome-webfont.woff2 │ │ │ │ ├── less │ │ │ │ │ ├── animated.less │ │ │ │ │ ├── bordered-pulled.less │ │ │ │ │ ├── core.less │ │ │ │ │ ├── fixed-width.less │ │ │ │ │ ├── font-awesome.less │ │ │ │ │ ├── icons.less │ │ │ │ │ ├── larger.less │ │ │ │ │ ├── list.less │ │ │ │ │ ├── mixins.less │ │ │ │ │ ├── path.less │ │ │ │ │ ├── rotated-flipped.less │ │ │ │ │ ├── screen-reader.less │ │ │ │ │ ├── stacked.less │ │ │ │ │ └── variables.less │ │ │ │ └── scss │ │ │ │ │ ├── _animated.scss │ │ │ │ │ ├── _bordered-pulled.scss │ │ │ │ │ ├── _core.scss │ │ │ │ │ ├── _fixed-width.scss │ │ │ │ │ ├── _icons.scss │ │ │ │ │ ├── _larger.scss │ │ │ │ │ ├── _list.scss │ │ │ │ │ ├── _mixins.scss │ │ │ │ │ ├── _path.scss │ │ │ │ │ ├── _rotated-flipped.scss │ │ │ │ │ ├── _screen-reader.scss │ │ │ │ │ ├── _stacked.scss │ │ │ │ │ ├── _variables.scss │ │ │ │ │ └── font-awesome.scss │ │ │ └── synthetic_css │ │ │ │ ├── _synthetic_offline.sass │ │ │ │ ├── synthetic_offline.css │ │ │ │ ├── 紙背景花紋.webp │ │ │ │ └── 紙背景花紋模糊.webp │ │ └── 默認標題畫面 │ │ │ ├── 定位.coffee │ │ │ ├── 定位.js │ │ │ ├── 標題.html │ │ │ ├── 標題.ptml │ │ │ ├── 樣式.css │ │ │ └── 虛僞的假面.png │ ├── 土特產 │ │ ├── liber.sublime-syntax │ │ ├── protobuf.cson │ │ ├── syntax_demo.liber │ │ └── 導出pdf用 │ │ │ ├── 紙樣式.css │ │ │ ├── 紙背景插入.webp │ │ │ └── 紙背景花紋印刷.webp │ ├── 導出文件.py │ ├── 山彥.py │ ├── 幻象.py │ ├── 環境.py │ ├── 窗口.py │ ├── 資源 │ │ ├── Librian小.png │ │ └── librian.ico │ └── 配置.yaml └── librian閱讀器 │ └── 配置.json ├── readme.md ├── requirements.txt ├── setup.py └── 文檔 ├── Librian2.jpg ├── 樣例_潘大爺.jpg └── 視頻佔位.jpg /.gitattributes: -------------------------------------------------------------------------------- 1 | librian/librian本體/前端/黑科技/** linguist-vendored 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | node_modules/ 3 | .idea/ 4 | .vim/ 5 | *.swp 6 | error.log 7 | /存檔資料/ 8 | /librian本體/project/ 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /librian/__init__.py: -------------------------------------------------------------------------------- 1 | from librian.librian本體.librian import ember 2 | 3 | __version__ = '2.0.2' 4 | -------------------------------------------------------------------------------- /librian/__main__.py: -------------------------------------------------------------------------------- 1 | import fire 2 | 3 | from librian.librian本體.librian import ember 4 | 5 | 6 | fire.Fire(ember) 7 | -------------------------------------------------------------------------------- /librian/librian_util/加載器.py: -------------------------------------------------------------------------------- 1 | import os 2 | import logging 3 | 4 | 5 | def yaml(文件名, 默認=[]): 6 | import yaml 7 | return 加載(文件名, yaml.safe_load, 默認) 8 | 9 | 10 | def 加載(文件名, 加載方法, 默認): 11 | if os.path.isfile(文件名): 12 | try: 13 | with open(文件名, encoding='utf8') as f: 14 | 內容 = 加載方法(f) 15 | return 內容 16 | except Exception as e: 17 | logging.exception(e) 18 | logging.warning(f'「{文件名}」沒能讀入。') 19 | return 默認 20 | 21 | 22 | -------------------------------------------------------------------------------- /librian/librian_util/文件.py: -------------------------------------------------------------------------------- 1 | import os 2 | import logging 3 | 4 | 5 | def 補充擴展名(文件名, 擴展名表, 路徑='./'): 6 | if '.' in os.path.split(文件名)[-1]: 7 | if not os.path.isfile(f'{路徑}/{文件名}'): 8 | logging.warning(f'「{文件名}」不存在。') 9 | return 文件名 10 | for 擴展名 in 擴展名表: 11 | if os.path.isfile(f'{路徑}/{文件名}.{擴展名}'): 12 | return f'{文件名}.{擴展名}' 13 | logging.warning(f'「{文件名}」不存在。') 14 | return 文件名 15 | 16 | def 轉爲網址路徑(路徑): 17 | 絕對路徑 = os.path.abspath(路徑) 18 | return f'file:///{絕對路徑}' -------------------------------------------------------------------------------- /librian/librian_util/路徑.py: -------------------------------------------------------------------------------- 1 | import os 2 | from pathlib import Path 3 | 4 | 5 | 此處 = Path(__file__).parent 6 | 7 | librian = (此處 / '..').resolve() 8 | 9 | librian面板 = librian / 'librian面板' 10 | librian本體 = librian / 'librian本體' 11 | 12 | 13 | 14 | def 虛擬相對前端路徑(x): 15 | 源 = librian本體 / 'v' / x 16 | 前端 = librian本體 / '前端' 17 | return os.path.relpath(源, start=前端) 18 | -------------------------------------------------------------------------------- /librian/librian本體/librian.py: -------------------------------------------------------------------------------- 1 | import os 2 | import logging 3 | 4 | from . import 環境 5 | from . import librian虛擬機 6 | from . import 窗口 7 | 8 | from .librian虛擬機 import 虛擬機環境 9 | 10 | 11 | def ember(project, 編寫模式=False): 12 | logging.info('librian_main啓動。') 13 | librian虛擬機.虛擬機環境.加載配置(project) 14 | 環境.導入全局配置({ 15 | '編寫模式': 編寫模式 16 | }) 17 | 18 | os.makedirs(f'{虛擬機環境.工程路徑}/存檔資料/手動存檔', exist_ok=True) 19 | 20 | app = 窗口.啓動app() 21 | app.MainLoop() 22 | -------------------------------------------------------------------------------- /librian/librian本體/librian虛擬機/命令.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from librian.librian_util import 文件 4 | 5 | from . import 虛擬機環境 6 | 7 | 8 | def 別名適用(x): 9 | for i, f in list(x.__dict__.items()): 10 | if '別名' in dir(f): 11 | for 各別名 in f.別名: 12 | x.__class__.__setattr__(x, 各別名, f) 13 | return x 14 | 15 | 16 | def 別名(*li): 17 | def f2(x): 18 | x.別名 = li 19 | return x 20 | return f2 21 | 22 | 23 | @別名適用 24 | class 命令: 25 | def __init__(self, 函數, 參數表, 原文): 26 | self.函數 = 函數 27 | self.參數 = [i['a'] for i in 參數表] 28 | self.原文 = 原文 29 | 30 | def 執行(self, 讀者): 31 | try: 32 | t = eval(self.原文, { 33 | i: (lambda *li, f=f: f(self, 讀者, *li)) 34 | for i, f in self.__class__.__dict__.items() 35 | if i not in ('py', 'js') and i[0] != '_' 36 | }) 37 | if t is not None: 38 | raise Exception('不太對勁……') 39 | except: 40 | try: 41 | 函數 = eval('self.' + self.函數) 42 | 函數(*([讀者] + self.參數)) 43 | except AttributeError as e: 44 | raise AttributeError('沒有可用的函數「%s」。' % self.函數) 45 | except Exception as e: 46 | s = '%s(%s)' % (self.函數, ', '.join(self.參數)) 47 | logging.warning(f'在劇本中執行方法「{s}」時遇到了意外。') 48 | logging.exception(e) 49 | 50 | # —————————————————————————————— 51 | 52 | @別名('背景') 53 | def BG(self, 讀者, bg, 淡入時間=1, 位置='0% 0%', 漸變方法='_淡出'): 54 | bg = 文件.補充擴展名(bg, ['webp', 'png', 'jpg'], 虛擬機環境.工程路徑 / 虛擬機環境.圖片文件夾) 55 | 讀者.狀態.背景 = bg, 淡入時間, 位置, 漸變方法 56 | 57 | @別名('特效') 58 | def EF(self, 讀者, 標識, 類名=None): 59 | if 類名 is None and 標識 in 讀者.狀態.特效表: 60 | del 讀者.狀態.特效表[標識] 61 | else: 62 | 讀者.狀態.特效表[標識] = 類名 63 | 64 | @別名('背景音樂', '背景音乐') 65 | def BGM(self, 讀者, 文件名, 音量=1): 66 | if 文件名 is None or 文件名 == 'None': 67 | 讀者.狀態.背景音樂 = None 68 | else: 69 | 文件名 = 文件.補充擴展名(文件名, ['opus', 'mp3', 'ogg'], 虛擬機環境.工程路徑 / 虛擬機環境.音樂文件夾) 70 | 讀者.狀態.背景音樂 = 文件名, 音量 71 | 72 | def CG(self, 讀者, cg, 淡入時間=1, 漸變方法='_淡出'): 73 | if cg is None or cg == 'None': 74 | 讀者.狀態.cg = None 75 | else: 76 | cg = 文件.補充擴展名(cg, ['webp', 'png', 'jpg'], 虛擬機環境.工程路徑 / 虛擬機環境.圖片文件夾) 77 | 讀者.狀態.cg = cg, 淡入時間, 漸變方法 78 | 79 | @別名('效果音') 80 | def SE(self, 讀者, 文件名, 音量=1): 81 | 文件名 = 文件.補充擴展名(文件名, ['opus', 'mp3', 'ogg'], 虛擬機環境.工程路徑 / 虛擬機環境.音樂文件夾) 82 | 讀者.狀態.效果音 = 文件名, 音量 83 | 84 | @別名('視頻', '视频') 85 | def VIDEO(self, 讀者, 文件名, 可以跳過=False): 86 | 讀者.狀態.重置() 87 | 讀者.狀態.視頻 = 文件名, 可以跳過 88 | -------------------------------------------------------------------------------- /librian/librian本體/librian虛擬機/立繪.py: -------------------------------------------------------------------------------- 1 | import copy 2 | 3 | from . import 角色 4 | 5 | 6 | def 人物拆解(人名: str, 镜头參數): 7 | 人 = 角色.取角色(人名) 8 | 9 | if not 人.有立繪: 10 | return None 11 | 12 | 位置 = copy.deepcopy(镜头參數['位置']) 13 | 語 = 镜头參數['語'] 14 | 15 | if 人.使用png: 16 | return { 17 | '使用png': True, 18 | '位置': 位置, 19 | '特效': 人.現特效, 20 | '名字': 人名, 21 | } 22 | 23 | 位置[2] *= 人.固有縮放 24 | 25 | 衣配件 = 人.現衣圖層[::-1] 26 | 顏 = 人.現顏圖層 27 | if isinstance(顏, dict): 28 | if 語: 29 | 顏 = 顏['_語'] 30 | else: 31 | 顏 = 顏['_默認'] 32 | 顏配件 = 顏[::-1] 33 | 34 | return { 35 | '圖層': 衣配件 + 顏配件, 36 | '位置': 位置, 37 | '特效': 人.現特效, 38 | '名字': 人名, 39 | } 40 | -------------------------------------------------------------------------------- /librian/librian本體/librian虛擬機/箱庭.py: -------------------------------------------------------------------------------- 1 | import os 2 | import logging 3 | 4 | import liber 5 | 6 | from . import 讀者 7 | 8 | 9 | class 箱庭: 10 | def __init__(self, 關聯讀者): 11 | self.關聯讀者 = 關聯讀者 12 | self.箱庭內容 = { 13 | 'goto': self.跳轉, 14 | 'call': self.棧跳轉, 15 | 'choice': self.產生選項, 16 | 'fusion': self.同化, 17 | 'adv_end': self.演出終了, 18 | 19 | '跳轉': self.跳轉, 20 | '調用': self.棧跳轉, 21 | '產生選項': self.產生選項, 22 | '同化': self.同化, 23 | '演出終了': self.演出終了, 24 | 25 | '跳转': self.跳轉, 26 | '调用': self.棧跳轉, 27 | '产生选项': self.產生選項, 28 | '同化': self.同化, 29 | '演出终了': self.演出終了, 30 | } 31 | 32 | def 跳轉(self, path=None, lable=None, 彈=True): 33 | 現名 = self.關聯讀者.劇本文件.名 34 | if not path: 35 | path = 現名 36 | else: 37 | path = '%s/%s' % (os.path.dirname(現名), path) 38 | 39 | if 彈: 40 | self.關聯讀者.劇本棧.pop() 41 | self.關聯讀者.劇本棧.append(self.關聯讀者.編譯(path)) 42 | if lable: 43 | while True: 44 | t = self.關聯讀者.劇本文件.下一句() 45 | if t is None: 46 | raise Exception(f'沒有找到躍點「{lable}」') 47 | if '躍點' in t and t['躍點'] == lable: 48 | break 49 | 50 | def 棧跳轉(self, path=None, lable=None): 51 | self.跳轉(path, lable, 彈=False) 52 | 53 | def 產生選項(self, *li): 54 | li = [(i[0], i[1]) for i in li] 55 | self.關聯讀者.狀態.選項 = li 56 | 57 | def 同化(self, s): 58 | self.關聯讀者.劇本棧.append(讀者.劇本(liber.load(s), '_字串')) 59 | 60 | def 演出終了(self): 61 | self.關聯讀者.劇本棧 = [] 62 | -------------------------------------------------------------------------------- /librian/librian本體/librian虛擬機/虛擬機環境.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import logging 3 | from pathlib import Path 4 | 5 | import yaml 6 | 7 | 8 | class 假面: 9 | 配置 = {} 10 | 11 | def 加載配置(self, 工程路徑): 12 | 工程路徑 = Path(工程路徑) 13 | with open(工程路徑 / '工程配置.yaml', encoding='utf8') as f: 14 | a = yaml.safe_load(f) 15 | for i in a: 16 | self.配置.update(a[i]) 17 | self.配置['工程路徑'] = 工程路徑 18 | self.配置['psd立繪路徑'] = 工程路徑 / self.配置['立繪文件夾'] 19 | 20 | def __getattr__(self, x): 21 | return self.配置[x] 22 | 23 | 24 | sys.modules[__name__] = 假面() 25 | -------------------------------------------------------------------------------- /librian/librian本體/librian虛擬機/角色.py: -------------------------------------------------------------------------------- 1 | import os 2 | import logging 3 | 4 | import yaml 5 | from rimo_utils import good_open 6 | 7 | from . import 虛擬機環境 8 | 9 | 10 | 角色表 = {} 11 | 12 | 13 | def 初始化(): 14 | if '了' in dir(初始化): 15 | return 16 | 初始化.了 = True 17 | 導入有立繪的角色() 18 | 19 | 20 | def 取角色(名字): 21 | 初始化() 22 | if 名字 in 角色表: 23 | return 角色表[名字] 24 | else: 25 | return 角色(名字) 26 | 27 | 28 | def 導入有立繪的角色(): 29 | try: 30 | with good_open(虛擬機環境.psd立繪路徑 / '映射.yaml') as f: 31 | 映射表 = yaml.load(f, Loader=yaml.BaseLoader) 32 | if 映射表: 33 | for 角色名 in 映射表: 34 | 角色(角色名, 映射表[角色名]) 35 | for i in os.listdir(虛擬機環境.psd立繪路徑): 36 | if i.endswith('.png'): 37 | 前名 = os.path.basename(os.path.splitext(i)[0]) 38 | 角色(前名, 使用png=True) 39 | except Exception as e: 40 | logging.warning('角色立繪沒有導入。') 41 | logging.exception(e) 42 | 43 | 44 | class 角色: 45 | def __init__(self, 名字: str, 立繪表: dict = None, 使用png=False): 46 | self.名字 = 名字 47 | self.顯示名字 = None 48 | self.使用png = 使用png 49 | self.有立繪 = bool(立繪表 or 使用png) 50 | if not self.有立繪: 51 | logging.warning(f'新建了沒有立繪的角色「{名字}」') 52 | if 立繪表: 53 | self.衣圖層 = 立繪表['衣'] 54 | self.顏圖層 = 立繪表['顏'] 55 | self.固有縮放 = 立繪表.get('縮放', 1) 56 | self.現顏 = None 57 | self.現衣 = None 58 | self.現特效 = None 59 | 60 | assert self.名字 not in 角色表 61 | 角色表[self.名字] = self 62 | 63 | @property 64 | def 現衣圖層(self): 65 | try: 66 | return self.衣圖層[self.現衣 or '_默認'] 67 | except Exception: 68 | logging.warning(f'衣「{self.現衣}」沒有配置。') 69 | return [] 70 | 71 | @property 72 | def 現顏圖層(self): 73 | try: 74 | return self.顏圖層[self.現顏 or '_默認'] 75 | except Exception: 76 | logging.warning(f'顏「{self.現顏}」沒有配置。') 77 | return [] 78 | 79 | def __repr__(self): 80 | return f'角色{"|"+self.顯示名字 if self.顯示名字 else ""}({self.名字}->[衣:{self.衣圖層}],[顏:{self.顏圖層}])' 81 | -------------------------------------------------------------------------------- /librian/librian本體/librian虛擬機/讀者.py: -------------------------------------------------------------------------------- 1 | import copy 2 | import logging 3 | 4 | import yaml 5 | import sass 6 | import liber 7 | import cloudpickle as pickle 8 | from rimo_utils import good_open 9 | 10 | from . import 鏡頭 11 | from . import 角色 12 | from . import 命令 13 | from . import 箱庭 14 | 15 | 16 | 17 | class 狀態: 18 | def __init__(self): 19 | self.話語 = None # str 20 | self.名字 = None # str 21 | self.語者 = None # str 22 | self.人物 = None # str 23 | self.背景 = None # [圖名, 淡入時間, 位置, 漸變方法] 24 | self.背景音樂 = None # [音樂名, 音量] 25 | self.效果音 = None # [音樂名, 音量] 26 | self.插入圖 = None # str 27 | self.cg = None # [圖名, 淡入時間, 漸變方法] 28 | self.視頻 = None # [視頻名, 可以跳過] 29 | self.js = None # str 30 | self.html = None # str 31 | self.選項 = [] 32 | self.特效表 = {} 33 | self.額外信息 = () 34 | self.源 = [] 35 | 36 | def 導出(self): 37 | 鏡頭.語者 = self.語者 38 | if self.人物: 39 | 立繪 = 鏡頭.查詢(self.人物).拆解() 40 | else: 41 | 立繪 = [] 42 | if self.語者: 43 | 表情 = 角色.取角色(self.語者).現顏 44 | else: 45 | 表情 = '' 46 | 快照 = { 47 | '話語': self.話語, 48 | '名字': self.名字, 49 | '立繪': 立繪, 50 | '表情': 表情, 51 | '語者': self.語者, 52 | '背景': self.背景, 53 | '背景音樂': self.背景音樂, 54 | '效果音': self.效果音, 55 | '插入圖': self.插入圖, 56 | 'cg': self.cg, 57 | '視頻': self.視頻, 58 | 'js': self.js, 59 | 'html': self.html, 60 | '選項': [i[0] for i in self.選項], 61 | '特效表': copy.deepcopy(self.特效表), 62 | '額外信息': self.額外信息, 63 | '源': self.源, 64 | } 65 | self.清除臨時狀態() 66 | return 快照 67 | 68 | def 重置(self): 69 | self.__init__() 70 | 71 | def 清除臨時狀態(self): 72 | self.js = None 73 | self.插入圖 = None 74 | self.效果音 = None 75 | self.視頻 = None 76 | self.額外信息 = () 77 | self.源 = [] 78 | 79 | 80 | class 劇本: 81 | def __init__(self, 內容, 名): 82 | self.內容 = 內容 83 | self.指針 = 0 84 | self.名 = 名 85 | 86 | def 下一句(self): 87 | if self.指針 >= len(self.內容): 88 | return None 89 | r = self.內容[self.指針] 90 | self.指針 += 1 91 | return r 92 | 93 | 94 | class 讀者: 95 | def __init__(self, 初始劇本): 96 | self.劇本棧 = [self.編譯(初始劇本)] 97 | self.狀態 = 狀態() 98 | self.狀態.重置() 99 | self.箱庭 = 箱庭.箱庭(self) 100 | 鏡頭.鏡頭對應 = {} 101 | 102 | @property 103 | def 劇本文件(self): 104 | return self.劇本棧[-1] 105 | 106 | def 下一句(self): 107 | if not self.劇本棧: 108 | return {'旁白': '【演出結束了】', '類型': '終焉'} 109 | s = self.劇本文件.下一句() 110 | if s: 111 | return s 112 | else: 113 | self.劇本棧.pop() 114 | return self.下一句() 115 | 116 | def 編譯(self, s): 117 | with good_open(s) as f: 118 | return 劇本(liber.load(f), s) 119 | 120 | def 步進(self, 防止終焉=False): 121 | s = self.下一句() 122 | if s['類型'] == '終焉' and 防止終焉: 123 | return True 124 | self.狀態.源.append(copy.copy(s)) 125 | 讀者句控制(self, s['類型'], s) 126 | 127 | def 迭代器(self): 128 | while True: 129 | self.步進() 130 | s = self.狀態.導出() 131 | if s['額外信息'] and s['額外信息'][0] == '終焉': 132 | break 133 | else: 134 | yield s 135 | 136 | def 從一而終(self, 劇本): 137 | self.__init__(劇本) 138 | logging.debug(self.劇本文件.內容) 139 | while True: 140 | if self.步進(防止終焉=True): 141 | break 142 | 143 | def 存檔(self, 路徑, 存檔信息=None): 144 | 虛擬機狀態 = { 145 | '讀者狀態': self.狀態, 146 | '角色表': 角色.角色表, 147 | '鏡頭對應': 鏡頭.鏡頭對應, 148 | '劇本棧': self.劇本棧, 149 | '箱庭': self.箱庭, 150 | } 151 | with open(路徑, 'wb') as f: 152 | pickle.dump({ 153 | '虛擬機狀態': 虛擬機狀態, 154 | '存檔信息': 存檔信息 155 | }, f) 156 | 157 | def 讀檔(self, 路徑): 158 | try: 159 | with open(路徑, 'rb') as f: 160 | data = pickle.load(f)['虛擬機狀態'] 161 | 角色.角色表 = data['角色表'] 162 | 鏡頭.鏡頭對應 = data['鏡頭對應'] 163 | self.狀態 = data['讀者狀態'] 164 | self.狀態.額外信息 = ('load',) 165 | self.劇本棧 = data['劇本棧'] 166 | self.箱庭 = data['箱庭'] 167 | except Exception as e: 168 | logging.warning('讀檔失敗……') 169 | logging.exception(e) 170 | 171 | 172 | class 讀者句控制: 173 | def __init__(self, 讀者, 類型, 參數表): 174 | del 參數表['類型'] 175 | if '縮進數' in 參數表: 176 | del 參數表['縮進數'] 177 | if '之後的空白' in 參數表: 178 | del 參數表['之後的空白'] 179 | logging.debug(類型) 180 | logging.debug(參數表) 181 | 讀者句控制.__getattribute__(self, 類型)(讀者, **參數表) 182 | 183 | @staticmethod 184 | def 註釋(讀者, 註釋): 185 | 讀者.步進() 186 | 187 | @staticmethod 188 | def 躍點(讀者, 躍點): 189 | 讀者.步進() 190 | 191 | @staticmethod 192 | def 函數調用(讀者, 函數, 參數表, 原文): 193 | 命令.命令(函數, 參數表, 原文).執行(讀者) 194 | if not 讀者.狀態.選項: 195 | 讀者.步進() 196 | 197 | @staticmethod 198 | def 插入代碼(讀者, 代碼類型, 代碼內容): 199 | if 代碼類型 in ['', 'py', 'python']: 200 | exec(代碼內容, 讀者.箱庭.箱庭內容) 201 | elif 代碼類型 in ['js', 'javascript']: 202 | 讀者.狀態.js = 代碼內容 203 | elif 代碼類型 in ['html']: 204 | 讀者.狀態.html = 代碼內容 205 | elif 代碼類型 in ['css']: 206 | 讀者.狀態.html = f'' 207 | elif 代碼類型 in ['sass']: 208 | 讀者.狀態.html = f'' 209 | elif 代碼類型 in ['scss']: 210 | 讀者.狀態.html = f'' 211 | else: 212 | raise Exception(f'『{代碼類型}』代碼類型不明白。') 213 | if not 讀者.狀態.選項: 214 | 讀者.步進() 215 | 216 | @staticmethod 217 | def 插入圖(讀者, 插入圖): 218 | logging.debug('插入圖: %s' % 插入圖) 219 | 讀者.狀態.插入圖 = 插入圖 220 | 221 | @staticmethod 222 | def 終焉(讀者, 旁白): 223 | 讀者.狀態.額外信息 = ('終焉',) 224 | 讀者.狀態.話語 = 旁白 225 | 讀者.狀態.名字 = '' 226 | 讀者.狀態.語者 = '' 227 | 228 | @staticmethod 229 | def 鏡頭(讀者, 鏡頭符號, 內容): 230 | if 鏡頭符號 == '+': 231 | try: 232 | d = yaml.load(內容) 233 | 鏡頭.生成鏡頭(d) 234 | except Exception as e: 235 | logging.exception(e) 236 | logging.warning(f'鏡頭「{內容}」的內容不正確。') 237 | 讀者.步進() 238 | elif 鏡頭符號 == '-': 239 | try: 240 | 鏡頭.解除鏡頭(yaml.load(內容)) 241 | except Exception as e: 242 | logging.exception(e) 243 | logging.warning(f'鏡頭「{內容}」的內容不正確。') 244 | 讀者.步進() 245 | 246 | @staticmethod 247 | def 旁白(讀者, 旁白): 248 | 讀者.狀態.話語 = 旁白 249 | 讀者.狀態.名字 = '' 250 | 讀者.狀態.語者 = '' 251 | 252 | @staticmethod 253 | def 人物操作(讀者, 人物名, 目標, 操作符): 254 | if 操作符 == '+': 255 | 角色.取角色(人物名).現衣 = 目標 256 | if 操作符 == '|': 257 | 角色.取角色(人物名).顯示名字 = 目標 258 | 讀者.步進() 259 | 260 | @staticmethod 261 | def 人物對話(讀者, 名, 顏, 語, 代, 特效): 262 | 人物 = 讀者句控制._表情變化(讀者, 名, 顏, 代, 特效) 263 | 讀者.狀態.話語 = 語 264 | 讀者.狀態.名字 = 代 or 人物.顯示名字 or 名 265 | 讀者.狀態.語者 = 名 266 | logging.debug([名, 代, 顏, 語].__str__()) 267 | 268 | @staticmethod 269 | def 人物表情(讀者, 名, 顏, 代, 特效): 270 | 人物 = 讀者句控制._表情變化(讀者, 名, 顏, 代, 特效) 271 | logging.debug([名, 代, 顏].__str__()) 272 | 讀者.步進() 273 | 274 | @staticmethod 275 | def 選項(讀者, 選項名, 文件, 位置): 276 | 讀者.狀態.選項.append([選項名, lambda: 讀者.箱庭.棧跳轉(文件, 位置)]) 277 | if 讀者.劇本文件.指針 < len(讀者.劇本文件.內容): 278 | if 讀者.劇本文件.內容[讀者.劇本文件.指針]['類型'] == '選項': 279 | 讀者.步進() 280 | 281 | @staticmethod 282 | def _表情變化(讀者, 名, 顏, 代, 特效): 283 | 人物 = 角色.取角色(名) 284 | 人物.現顏 = 顏 285 | if 特效: 286 | 人物.現特效 = [特效] 287 | else: 288 | 人物.現特效 = [] 289 | if 鏡頭.查詢(名) and 讀者.狀態.人物 != 名: 290 | 讀者.狀態.人物 = 名 291 | return 人物 292 | -------------------------------------------------------------------------------- /librian/librian本體/librian虛擬機/鏡頭.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from . import 立繪 4 | from . import 虛擬機環境 5 | 6 | 語者 = '' 7 | 8 | 鏡頭對應 = {} 9 | 10 | 上次位置 = {} 11 | 12 | 13 | class 鏡頭: 14 | def __init__(self, 所有位置): 15 | self.所有位置 = 所有位置 16 | for 人, 位置 in 所有位置.items(): 17 | 鏡頭對應[人] = self 18 | if len(位置) == 2: 19 | 位置.append(1) 20 | 21 | def 統合(self): 22 | global 上次位置 23 | t = {} 24 | for 人 in self.所有位置: 25 | 位置 = self.所有位置[人] 26 | t[人] = { 27 | '位置': 位置, 28 | '語': 人 == 語者 29 | } 30 | 上次位置 = {} 31 | for 人 in self.所有位置: 32 | 上次位置[人] = self.所有位置[人] 33 | return t 34 | 35 | def 拆解(self): 36 | 立繪組 = [立繪.人物拆解(人, 參數) for 人, 參數 in self.統合().items()] 37 | return [立繪 for 立繪 in 立繪組 if 立繪 is not None] 38 | 39 | def __repr__(self): 40 | return str(self.所有位置) 41 | 42 | def __bool__(self): 43 | return bool(self.所有位置) 44 | 45 | 46 | 空鏡頭 = 鏡頭({}) 47 | 48 | 49 | def 查詢(人): 50 | if 人 not in 鏡頭對應: 51 | 鏡頭({人: 虛擬機環境.默認立繪位置[1][0]}) 52 | return 鏡頭對應[人] 53 | 54 | # ['潘大爺'] -> {'潘大爺':[0,0]} 55 | 56 | 57 | def 生成鏡頭(x): 58 | if type(x) == dict: 59 | return 鏡頭(x) 60 | if type(x) == list: 61 | m = 虛擬機環境.默認立繪位置[len(x)] 62 | a = dict(zip(x, m)) 63 | return 鏡頭(a) 64 | 65 | 66 | def 解除鏡頭(人): 67 | 鏡頭對應[人] = 空鏡頭 68 | 69 | 70 | if __name__ == '__main__': 71 | print(查詢('潘大爺')) 72 | print(空鏡頭) 73 | -------------------------------------------------------------------------------- /librian/librian本體/前端/adv.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 加載資源 14 |
15 |
16 | 17 |
18 |
19 | 20 | 開始 21 | 22 |
23 |
24 |
25 | 26 |
27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
36 | 41 | 44 |
45 |
46 |
47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | {{存檔讀檔.啓動功能}} 56 |
57 |
58 | 77 |
78 |
79 |
80 | 110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 | 137 | 138 | -------------------------------------------------------------------------------- /librian/librian本體/前端/adv.ptml: -------------------------------------------------------------------------------- 1 | html: 2 | head: 3 | title: 4 | meta charset='utf-8'; 5 | link rel="stylesheet" href='./黑科技/font-awesome-4.7.0/css/font-awesome.css'; 6 | script src='./虛擬核心.js': 7 | script src='./dist/bundle.js': 8 | 9 | style#style: 10 | 11 | body oncontextmenu='window.event.returnValue=false;': 12 | div#加載畫面: 13 | div: 14 | 加載資源 15 | div: 16 | progress v-bind:value='計數' v-bind:max='最大值': 17 | div v-if='計數 == 最大值': 18 | a onclick='加載完成的初始化()': 19 | 開始 20 | div#總畫面: 21 | video#視頻 width="1366" height="768" src="" autoplay="autoplay": 22 | div#配置面板: 23 | span.按鈕組: 24 | a#重置設置: 25 | i.fa.fa-rotate-left: 26 | a#退出設置: 27 | i.fa.fa-check: 28 | div v-for='(內容, 設置名) in 用戶設置' v-bind:名字='設置名': 29 | template v-if='內容.類型 === "number"': 30 | {{內容.提示[0]}} 31 | input type="range" v-bind:min="內容.範圍[0]" v-bind:max="內容.範圍[1]" v-bind:step='(內容.範圍[1]-內容.範圍[0])/32' v-model="內容['值']": 32 | {{內容.提示[1]}} 33 | template v-if='內容.類型 === "boolean"': 34 | input type="checkbox" v-model="內容['值']": 35 | 36 | div#存檔讀檔面板 v-if='本地運行': 37 | span.按鈕組: 38 | a#新建存檔 v-if='存檔讀檔.啓動功能 === "存檔"': 39 | i.fa.fa-plus: 40 | a#退出存檔讀檔: 41 | i.fa.fa-close: 42 | {{存檔讀檔.啓動功能}} 43 | hr; 44 | div#檔表: 45 | template v-for='檔 in 存檔讀檔.檔表': 46 | div.檔 v-bind:名字='檔.名字': 47 | img.截圖 v-bind:src='檔.截圖'; 48 | div.信息: 49 | {{檔.名字}} 50 | br; 51 | {{檔.描述}} 52 | br; 53 | {{檔.時間}} 54 | a.讀取 v-if='存檔讀檔.啓動功能 === "讀檔"': 55 | 讀取 56 | a.覆蓋 v-if='存檔讀檔.啓動功能 === "存檔"': 57 | 覆蓋 58 | hr; 59 | 60 | div#工具欄: 61 | div#工具容器 v-bind:class="{自動收起: 用戶設置.自動收起控制面板.值}": 62 | a#存檔準備 v-if='本地運行': 63 | i.fa.fa-floppy-o: 64 | i.fa.fa-angle-double-down style='text-shadow:0 0 4px #000;': 65 | a#讀檔準備 v-if='本地運行': 66 | i.fa.fa-floppy-o: 67 | i.fa.fa-angle-double-up style='text-shadow:0 0 4px #000;': 68 | a#快速存檔 v-if='本地運行': 69 | i.fa.fa-floppy-o: 70 | i.fa.fa-angle-double-down style='color:#fd1; text-shadow:0 0 4px #000;': 71 | a#快速讀檔 v-if='本地運行': 72 | i.fa.fa-floppy-o: 73 | i.fa.fa-angle-double-up style='color:#fd1; text-shadow:0 0 4px #000;': 74 | a#切換快進: 75 | i.fa.fa-fast-forward: 76 | a#全屏 href='javascript:山彥.切換全屏();': 77 | i.fa.fa-arrows-alt: 78 | a#進入設置: 79 | i.fa.fa-gear: 80 | a#回標題 v-if='本地運行': 81 | i.fa.fa-mail-reply: 82 | 83 | div#adv畫面: 84 | div#選項: 85 | div#對話歷史: 86 | div#主畫面: 87 | div#覆蓋: 88 | div#html疊加: 89 | div#cg: 90 | div#bg: 91 | div#立繪: 92 | div#對話框: 93 | div#名字框: 94 | div#名字: 95 | div#名字框背景 v-bind:style="{opacity: 用戶設置.對話框背景透明度.值}": 96 | div#話語框: 97 | div#話語: 98 | div#話語框背景 v-bind:style="{opacity: 用戶設置.對話框背景透明度.值}": 99 | div#對話框背景 v-bind:style="{opacity: 用戶設置.對話框背景透明度.值}": 100 | 101 | div#提示: 102 | 103 | div#墊底: 104 | -------------------------------------------------------------------------------- /librian/librian本體/前端/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "q", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "webpack.config.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "coffee-loader": "^0.9.0", 13 | "coffeescript": "^2.5.0", 14 | "css-loader": "^5.0.0", 15 | "file-loader": "^4.3.0", 16 | "imports-loader": "^0.8.0", 17 | "jquery": "^3.4.1", 18 | "jquery-browserify": "^1.8.1", 19 | "jquery-mousewheel": "^3.1.13", 20 | "node-opencc": "^2.0.1", 21 | "node-sass": "^4.13.0", 22 | "psd.js": "^3.3.12", 23 | "resolve-url-loader": "^3.1.0", 24 | "sass-loader": "^8.0.0", 25 | "style-loader": "^1.3.0", 26 | "vue": "^2.6.11", 27 | "webpack": "^4.43.0", 28 | "webpack-cli": "^3.3.12", 29 | "webpackbar": "^4.0.0" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /librian/librian本體/前端/src/_統合.sass: -------------------------------------------------------------------------------- 1 | @import "按鈕.sass" 2 | @import "狀態切換.sass" 3 | @import "主樣式.sass" 4 | @import "特效.sass" 5 | @import "加載畫面.sass" 6 | @import "各種面板.sass" 7 | @import "對話框.sass" 8 | -------------------------------------------------------------------------------- /librian/librian本體/前端/src/psd處理.coffee: -------------------------------------------------------------------------------- 1 | import PSD from 'psd.js' 2 | 3 | 4 | psd緩存 = {} 5 | 圖層緩存 = {} 6 | 圖緩存 = {} 7 | 8 | export default psd拆包 = 9 | 10 | 獲取圖層: (psd路徑, 圖層名) -> 11 | if not psd緩存[psd路徑] 12 | psd緩存[psd路徑] = await PSD.fromURL(psd路徑) 13 | psd = psd緩存[psd路徑] 14 | 15 | key = [psd路徑, 圖層名].toString() 16 | if not 圖層緩存[key] 17 | 現層 = psd.tree().childrenAtPath(圖層名)[0] 18 | 圖層緩存[key] = { 19 | '位置': 現層.coords 20 | 'img': 現層.layer.image.toPng() 21 | } 22 | return 圖層緩存[key] 23 | 24 | 獲取圖層組: (psd路徑, 圖層名組) -> 25 | return ( 26 | for i, 圖層名 of 圖層名組 27 | await this.獲取圖層(psd路徑, 圖層名) 28 | ) 29 | 30 | 圖層融合: (圖層組) -> 31 | m = 0 32 | 33 | 極x = Math.max.apply(Math, (圖層.位置.right for 圖層 in 圖層組)) 34 | 極y = Math.max.apply(Math, (圖層.位置.bottom for 圖層 in 圖層組)) 35 | 36 | canvas = document.createElement('canvas') 37 | canvas.width = 極x 38 | canvas.height = 極y 39 | 40 | context = canvas.getContext('2d') 41 | for 圖層 in 圖層組 42 | {left, top, bottom, right} = 圖層.位置 43 | context.drawImage(圖層.img, left, top) 44 | 45 | base64 = canvas.toDataURL('image/png') 46 | 47 | return [極x, 極y, base64] 48 | 49 | 融合到div: (base64, width, height, 過渡時間, div名) -> 50 | dv = document.getElementById(div名) 51 | dv.style.transition = "background #{過渡時間}s, width #{過渡時間}s, height #{過渡時間}s" 52 | dv.style.width = width 53 | dv.style.height = height 54 | dv.style.backgroundImage = "url(#{base64})" 55 | 56 | 渲染圖層組到div: (psd路徑, 圖層名組, div名) -> 57 | key = [psd路徑, 圖層名組].toString() 58 | if not 圖緩存[key] 59 | 圖層組 = await this.獲取圖層組(psd路徑, 圖層名組) 60 | 圖緩存[key] = this.圖層融合(圖層組) 61 | [width, height, base64] = 圖緩存[key] 62 | this.融合到div(base64, width, height, 0.5, div名) 63 | 64 | 渲染png到div: (png路徑, div名) -> 65 | t = new Image() 66 | t.setAttribute("crossOrigin", 'Anonymous') 67 | t.src = png路徑 68 | t.onload = () => 69 | [width, height, base64] = this.圖層融合([{ 70 | '位置': 71 | 'top': 0, 72 | 'left': 0, 73 | 'bottom': t.height, 74 | 'right': t.width, 75 | 'img': t, 76 | }]) 77 | this.融合到div(base64, width, height, 0.5, div名) 78 | -------------------------------------------------------------------------------- /librian/librian本體/前端/src/主樣式.sass: -------------------------------------------------------------------------------- 1 | @font-face 2 | font-family: 思源宋體SemiBold 3 | src: url('../素材/NotoSerifSC-SemiBold.otf') 4 | 5 | body 6 | font-family: 思源宋體SemiBold 7 | line-height: 1.5 8 | margin: 0px 9 | padding: 0px 10 | -webkit-user-select: none 11 | color: #fff 12 | overflow: hidden 13 | background-color: #fff 14 | background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee), linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee) 15 | background-size: 24px 24px 16 | background-position: 0px 0px, 12px 12px 17 | 18 | div 19 | margin: 0px 20 | padding: 0px 21 | 22 | #總畫面 23 | position: relative 24 | 25 | #視頻 26 | position: absolute 27 | z-index: 999 28 | display: None 29 | 30 | #adv畫面 31 | width: 100% 32 | height: 100% 33 | position: relative 34 | margin: 0 35 | overflow: hidden 36 | #覆蓋 37 | width: 100% 38 | height: 100% 39 | position: absolute 40 | background-size: cover 41 | z-index: 99 42 | #選項 43 | position: absolute 44 | width: 60% 45 | height: 60% 46 | left: 20% 47 | top: 20% 48 | font-size: 27px 49 | z-index: 20 50 | display: None 51 | #主畫面 52 | width: 100% 53 | height: 100% 54 | #bg, #cg, #html疊加 55 | width: 100% 56 | height: 100% 57 | position: absolute 58 | background-size: cover 59 | #bg 60 | z-index: -10 61 | #cg 62 | z-index: -1 63 | #立繪 64 | position: absolute 65 | top: 0px 66 | left: 0px 67 | z-index: -2 68 | &>div 69 | position: absolute 70 | transform-origin: 0% 0% 71 | #對話框 72 | width: 1000px 73 | height: 240px 74 | color: #fff 75 | font-size: 24px 76 | margin: 0 auto 77 | text-shadow: 0px 0px 3px #000, 0px 0px 3px #000 78 | position: absolute 79 | top: 528px 80 | left: 185px 81 | #名字框 82 | opacity: 0 83 | transition: opacity 0.3s, width 0.3s 84 | position: absolute 85 | top: 0px 86 | left: 80px 87 | #話語框 88 | position: absolute 89 | top: 25% 90 | z-index: 10 91 | width: 100% 92 | height: 100% 93 | #話語 94 | white-space: pre-line 95 | &[對話類型=旁白] #話語 96 | // text-indent: 2em each-line 97 | --幹你娘老子就是要每行都縮進: 2 98 | &[對話類型=對話] #話語 99 | &:before 100 | content: '「' 101 | display: block 102 | height: 100% 103 | float: left 104 | &>span:nth-last-child(1):after 105 | content: '」' 106 | #名字框背景 107 | position: absolute 108 | top: 0px 109 | left: 0px 110 | z-index: -1 111 | width: 100% 112 | height: 100% 113 | #話語框背景 114 | position: absolute 115 | top: 0px 116 | left: 0px 117 | z-index: -1 118 | width: 100% 119 | height: 100% 120 | 121 | .舊淡出 122 | width: 100% 123 | height: 100% 124 | position: absolute 125 | background-size: cover 126 | 127 | #工具欄 128 | right: 0px 129 | bottom: 0px 130 | padding: 0px 131 | margin: 5px 132 | position: absolute 133 | z-index: 10 134 | #工具容器.自動收起 135 | opacity: 0 136 | transition: opacity 4s 137 | &:hover 138 | opacity: 1 139 | transition: opacity 0.5s 140 | 141 | #墊底 142 | position: absolute 143 | top: 0px 144 | left: 0px 145 | width: 100% 146 | height: 100% 147 | background: #000 148 | z-index: -999 149 | 150 | #提示 151 | position: absolute 152 | left: 0px 153 | top: 0px 154 | padding: 20px 155 | background: rgba(0, 0, 0, 0.65) 156 | z-index: 999 157 | width: 200px 158 | display: none 159 | -------------------------------------------------------------------------------- /librian/librian本體/前端/src/全局.coffee: -------------------------------------------------------------------------------- 1 | import Vue from 'vue/dist/vue.esm.js' 2 | import $ from 'jquery' 3 | 4 | import 演出 from './演出.coffee' 5 | import 控制 from './控制.coffee' 6 | import 存檔讀檔 from './存檔讀檔.coffee' 7 | 8 | cccc = require('./_統合.sass') 9 | console.log cccc 10 | 11 | window._py演出 = 演出 12 | 13 | window.onload = -> 14 | 查詢參數 = {} 15 | new URLSearchParams(window.location.search).forEach (value, key)-> 16 | 查詢參數[key] = value 17 | if window.山彥 18 | console.log '在本地演出' 19 | 本地運行(查詢參數['入口']) 20 | else 21 | console.log '在瀏覽器上演出' 22 | 在線運行() 23 | 控制.控制初始化() 24 | 25 | 本地運行 = (入口)-> 26 | window.v = new Vue 27 | el: '#總畫面' 28 | data: 29 | 本地運行: true 30 | 圖片文件夾: '' 31 | 音樂文件夾: '' 32 | 視頻文件夾: '' 33 | psd立繪路徑: '' 34 | 自定css: '' 35 | 主題css: '' 36 | 解析度: '' 37 | 邊界: '' 38 | 翻譯: false 39 | 存檔讀檔: 40 | 啓動功能: '???' 41 | 檔表: [] 42 | 用戶設置: 43 | 文字速度: 44 | 類型: 'number' 45 | 值: 35 46 | 範圍: [0, 100] 47 | 提示: ['須臾', '永恆'] 48 | 對話框背景透明度: 49 | 類型: 'number' 50 | 值: 0.8 51 | 範圍: [0, 1] 52 | 提示: ['通透', '固實'] 53 | 總體音量: 54 | 類型: 'number' 55 | 值: 1 56 | 範圍: [0, 1] 57 | 提示: ['小聲', '大聲(沒用)'] 58 | 自動收起控制面板: 59 | 類型: 'boolean' 60 | 值: false 61 | watch: 62 | $data: 63 | handler: (val, oldVal) -> 64 | 山彥.vue更新(val) 65 | deep: true 66 | 山彥.vue連接初始化((x)-> 67 | for a,b of x 68 | v[a]=b 69 | ) 70 | if 入口=='讀檔' 71 | 山彥.初始化 -> 72 | 演出.準備工作() 73 | 存檔讀檔.讀檔準備() 74 | else 75 | 山彥.初始化 -> 76 | 演出.準備工作() 77 | 演出.更新() 78 | 79 | 80 | 81 | 從虛擬核心提取資源 = (心)-> 82 | 集合 = {} 83 | 步 = JSON.parse(JSON.stringify(心.演出步)) 84 | for data in 步 85 | if data.背景 86 | 集合["#{v.圖片文件夾}/#{data.背景[0]}"] = true 87 | if data.cg 88 | 集合["#{v.圖片文件夾}/#{data.cg[0]}"] = true 89 | if data.插入圖 90 | 集合["#{v.圖片文件夾}/#{data.插入圖}"] = true 91 | for 人 in data.立繪 92 | 集合["#{v.psd立繪路徑}/#{人.名字}.psd"] = true 93 | return (i for i of 集合) 94 | 95 | window.加載完成的初始化 = -> 96 | $('#加載畫面').fadeOut() 97 | 山彥.初始化 -> 98 | 演出.準備工作() 99 | 演出.更新() 100 | 101 | 在線運行 = -> 102 | if typeof(虛擬核心) == "undefined" 103 | alert '無法加載虛擬核心。' 104 | return 105 | 106 | ua = window.navigator.userAgent 107 | isChrome = ua.indexOf("Chrome") && window.chrome 108 | if not isChrome 109 | alert '只有chrome能用。' 110 | return 111 | 112 | $('#加載畫面').css('display', 'flex') 113 | 114 | window.山彥 = 115 | n: 0 116 | 步進: -> 117 | this.n += 1 118 | 更新: -> 119 | 演出.改變演出狀態(虛擬核心.演出步[this.n]) 120 | 狀態回調: (步進, callback)-> 121 | if 步進 122 | this.步進() 123 | callback(虛擬核心.演出步[this.n]) 124 | 初始化: (callback)-> 125 | callback() 126 | 切換全屏: -> 127 | doc = window.document 128 | docEl = doc.documentElement 129 | 130 | requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen 131 | cancelFullScreen = doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen 132 | 133 | if(!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement) 134 | requestFullScreen.call(docEl) 135 | else 136 | cancelFullScreen.call(doc) 137 | 138 | window.v = new Vue 139 | el: '#總畫面' 140 | data: 141 | 本地運行: false 142 | 圖片文件夾: 虛擬核心.圖片文件夾 143 | 音樂文件夾: 虛擬核心.音樂文件夾 144 | 視頻文件夾: 虛擬核心.視頻文件夾 145 | psd立繪路徑: 虛擬核心.psd立繪路徑 146 | 自定css: 虛擬核心.自定css 147 | 主題css: 虛擬核心.主題css 148 | 解析度: 虛擬核心.解析度 149 | 邊界: 虛擬核心.邊界 150 | 翻譯: false 151 | 用戶設置: 152 | 文字速度: 153 | 類型: 'number' 154 | 值: 35 155 | 範圍: [0, 100] 156 | 提示: ['須臾', '永恆'] 157 | 對話框背景透明度: 158 | 類型: 'number' 159 | 值: 0.8 160 | 範圍: [0, 1] 161 | 提示: ['通透', '固實'] 162 | 總體音量: 163 | 類型: 'number' 164 | 值: 1 165 | 範圍: [0, 1] 166 | 提示: ['小聲', '大聲(沒用)'] 167 | 自動收起控制面板: 168 | 類型: 'boolean' 169 | 值: false 170 | 171 | 資源組 = 從虛擬核心提取資源(虛擬核心) 172 | window.v加載 = new Vue 173 | el: '#加載畫面' 174 | data: 175 | 最大值: 資源組.length 176 | 計數: 0 177 | for 資源 in 資源組 178 | console.log 資源 179 | $.get(資源, -> 180 | v加載.計數+=1 181 | ) 182 | $('title').html 虛擬核心.作品名 183 | -------------------------------------------------------------------------------- /librian/librian本體/前端/src/加載畫面.sass: -------------------------------------------------------------------------------- 1 | @import "../黑科技/synthetic_css/synthetic_offline.sass" 2 | 3 | #加載畫面 4 | background-image: url('../黑科技/synthetic_css/紙背景花紋.webp') 5 | color: 000 6 | display: none 7 | flex-direction: column 8 | justify-content: center 9 | align-items: center 10 | height: 100% 11 | width: 100% 12 | a 13 | @extend a, .synth 14 | progress 15 | @extend progress, .synth 16 | -------------------------------------------------------------------------------- /librian/librian本體/前端/src/各種面板.sass: -------------------------------------------------------------------------------- 1 | @import "../黑科技/synthetic_css/synthetic_offline.sass" 2 | 3 | =面板 4 | @extend div, .synth 5 | background-image: url('../黑科技/synthetic_css/紙背景花紋.webp') 6 | background-attachment: scroll 7 | color: #000 8 | font-size: 24px 9 | border-radius: 1vw 10 | .按鈕組 11 | position: absolute 12 | right: 2% 13 | top: 2% 14 | 15 | #存檔讀檔面板 16 | +面板 17 | position: absolute 18 | top: 12% 19 | left: 12% 20 | height: 70% 21 | width: 72% 22 | padding: 2% 2% 2% 2% 23 | z-index: 999 24 | a 25 | @extend a, .synth 26 | padding: 8px 27 | margin: 8px 28 | border-radius: 8px 29 | hr 30 | width: 90% 31 | border: none 32 | border-top: 1px solid rgba(120, 50, 0, 0.5) 33 | .檔 34 | display: flex 35 | justify-content: space-between 36 | align-items: center 37 | width: 100% 38 | .截圖 39 | width: 160px 40 | height: 90px 41 | border: 1px solid rgba(0,0,0,0.34) 42 | border-radius: 3px 43 | margin: 15px 44 | .信息 45 | flex-grow: 999 46 | 47 | #配置面板 48 | +面板 49 | position: absolute 50 | top: 10% 51 | left: 10% 52 | height: 74% 53 | width: 76% 54 | padding: 4% 2% 2% 2% 55 | z-index: 998 56 | a 57 | @extend a, .synth 58 | padding: 8px 59 | margin: 8px 60 | border-radius: 8px 61 | input 62 | @extend input, .synth 63 | &>div 64 | height: 80px 65 | display: flex 66 | align-items: center 67 | &::before 68 | content: '【' attr(名字) '】' 69 | 70 | #對話歷史 71 | +面板 72 | position: absolute 73 | top: 10% 74 | left: 18% 75 | width: 60% 76 | height: 80% 77 | padding: 0 2% 78 | z-index: 10 79 | -------------------------------------------------------------------------------- /librian/librian本體/前端/src/存檔讀檔.coffee: -------------------------------------------------------------------------------- 1 | import Vue from 'vue/dist/vue.esm.js' 2 | import $ from 'jquery' 3 | 4 | import 演出 from './演出.coffee' 5 | 6 | 7 | export default 存檔讀檔 = 8 | 存檔準備: -> 9 | 山彥.取檔 (檔表) -> 10 | v.存檔讀檔.檔表 = 檔表 11 | v.存檔讀檔.啓動功能 = '存檔' 12 | $('#總畫面').attr('存檔讀檔面板', 'on') 13 | 讀檔準備: -> 14 | 山彥.取檔 (檔表) -> 15 | v.存檔讀檔.檔表 = 檔表 16 | v.存檔讀檔.啓動功能 = '讀檔' 17 | $('#總畫面').attr('存檔讀檔面板', 'on') 18 | 存檔: (名字, 描述)-> 19 | this.截圖轉換 160, 90, (截圖)-> 20 | 山彥.存檔(名字, 描述, 截圖) 21 | 山彥.取檔 (檔表) -> 22 | v.存檔讀檔.檔表 = 檔表 23 | 讀檔: (名字)-> 24 | 山彥.讀檔(名字) 25 | $('#總畫面').attr('存檔讀檔面板', 'off') 26 | 快速存檔: -> 27 | 山彥.快速存檔() 28 | 快速讀檔: -> 29 | 山彥.快速讀檔() 30 | 截圖轉換: (x, y, 回調)-> 31 | bg = 演出.當前狀態.背景[0].slice(5,-2) 32 | t = new Image() 33 | t.src = bg 34 | t.setAttribute("crossOrigin", 'Anonymous') 35 | t.onload = -> 36 | canvas = document.createElement("canvas") 37 | canvas.width = x 38 | canvas.height = y 39 | context = canvas.getContext("2d") 40 | context.drawImage(t, 0, 0, 160, 90) 41 | base64 = canvas.toDataURL("image/webp") 42 | 回調(base64) -------------------------------------------------------------------------------- /librian/librian本體/前端/src/按鈕.sass: -------------------------------------------------------------------------------- 1 | #工具欄 a 2 | display: block 3 | margin: 10px 4 | cursor: pointer 5 | font-size: 25px 6 | text-decoration: none 7 | text-align: center 8 | height: 40px 9 | width: 40px 10 | border-radius: 50% 11 | position: relative 12 | z-index: 1 13 | color: #fff 14 | transition: transform 0.1s 15 | &:before 16 | position: absolute 17 | width: 100% 18 | height: 100% 19 | background-color: rgba(255, 255, 255, 0.2) 20 | display: block 21 | content: '' 22 | border-radius: 50% 23 | transition: background-color 0.1s, transform 0.1s 24 | &:hover:before 25 | background-color: rgba(255, 255, 255, 0.4) 26 | transform: scale(1.2) 27 | transition: background-color 0.1s, transform 0.1s 28 | 29 | & > i 30 | display: block 31 | position: absolute 32 | top: 50% 33 | left: 50% 34 | transform: translate(-50%, -50%) 35 | 36 | #選項 a 37 | display: block 38 | width: 100% 39 | padding: 10px 40 | margin: 10px 41 | text-align: center 42 | border-radius: 3px 43 | background: rgba(0, 0, 0, 0.5) 44 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.6), 0px 0px 5px rgba(0, 0, 0, 0) inset 45 | cursor: pointer -------------------------------------------------------------------------------- /librian/librian本體/前端/src/控制.coffee: -------------------------------------------------------------------------------- 1 | $ = require('jquery-browserify') 2 | require("imports-loader?define=>false!jquery-mousewheel")($) 3 | 4 | import 演出 from './演出.coffee' 5 | import 存檔讀檔 from './存檔讀檔.coffee' 6 | 7 | 8 | export default 控制 = 9 | 右鍵功能: -> 10 | window.event.returnValue = false 11 | $('#總畫面').attr('歷史', 'off') 12 | if $('#總畫面').attr('對話框') == 'off' 13 | $('#總畫面').attr('對話框', 'on') 14 | else 15 | $('#總畫面').attr('對話框', 'off') 16 | 17 | 左鍵屏蔽: false 18 | 左鍵功能: -> 19 | if this.左鍵屏蔽 or 演出.選擇之刻 20 | return 21 | 22 | if $('#總畫面').attr('歷史') == 'on' 23 | $('#總畫面').attr('歷史', 'off') 24 | 25 | if $('#總畫面').attr('對話框') == 'off' 26 | $('#總畫面').attr('對話框', 'on') 27 | else 28 | if Date.now() < 演出.淡入過期時間 29 | 演出.淡入過期時間 = 0 30 | 演出.早泄() 31 | else 32 | 演出.步進更新() 33 | 34 | 顯示履歷: -> 35 | $('#總畫面').attr('歷史', 'on') 36 | $('#總畫面').attr('對話框', 'off') 37 | $('#對話歷史').scrollTop($('#對話歷史')[0].scrollHeight) 38 | 39 | 正在快進: false, 40 | 41 | 開始快進: -> 42 | if this.正在快進 == false 43 | this.正在快進 = true 44 | this.快進輪迴() 45 | 結束快進: -> 46 | this.正在快進 = false 47 | 48 | 切換快進: -> 49 | if this.正在快進 == false 50 | this.正在快進 = true 51 | this.快進輪迴() 52 | else 53 | this.正在快進 = false 54 | 55 | 快進輪迴: -> 56 | if not 控制.正在快進 57 | return 58 | else 59 | 控制.左鍵功能() 60 | setTimeout(控制.快進輪迴, 35) 61 | 62 | 進入設置: -> 63 | $('#總畫面').attr('配置面板', 'on') 64 | 65 | 退出設置: -> 66 | $('#總畫面').attr('配置面板', 'off') 67 | 68 | 退出存檔讀檔: -> 69 | $('#總畫面').attr('存檔讀檔面板', 'off') 70 | 71 | 控制初始化: -> 72 | window.document.onkeydown = (evt) -> 73 | k = evt.keyCode 74 | # [ctrl] skip 75 | if k == 17 76 | console.log 'ctrl按下' 77 | 控制.開始快進() 78 | # [空格 回車 z] 左鍵 79 | if k == 32 || k == 13 || k == 90 80 | 控制.左鍵功能() 81 | # [esc] 右鍵 82 | if k == 27 83 | 控制.右鍵功能() 84 | # [Page_up] 歷史 85 | if k == 33 86 | 控制.顯示履歷() 87 | window.document.onkeyup = (evt) -> 88 | # [ctrl] skip 89 | if evt.keyCode == 17 90 | console.log 'ctrl放開' 91 | 控制.結束快進() 92 | 93 | # 滚轮功能 94 | $('#主畫面').mousewheel (event, delta)-> 95 | if delta > 0 96 | 控制.顯示履歷() 97 | if delta < 0 98 | 控制.左鍵功能() 99 | 100 | $("#主畫面").mousedown (e)-> 101 | if e.which == 3 102 | 控制.右鍵功能() 103 | else if e.which == 1 104 | 控制.左鍵功能() 105 | 106 | $('#存檔準備').click -> 107 | 存檔讀檔.存檔準備() 108 | $('#讀檔準備').click -> 109 | 存檔讀檔.讀檔準備() 110 | $('#快速存檔').click -> 111 | 存檔讀檔.快速存檔() 112 | $('#快速讀檔').click -> 113 | 存檔讀檔.快速讀檔() 114 | $('#自動模式').click -> 115 | alert("沒做這個功能") 116 | $('#切換快進').click -> 117 | 控制.切換快進() 118 | $('#進入設置').click -> 119 | 控制.進入設置() 120 | $('#回標題').click -> 121 | 山彥.回標題() 122 | 123 | $('#退出設置').click -> 124 | 控制.退出設置() 125 | $('#退出存檔讀檔').click -> 126 | 控制.退出存檔讀檔() 127 | 128 | $('body').on 'click','.檔 > .讀取', (event)-> 129 | 名字 = $(this).parent().attr('名字') 130 | 存檔讀檔.讀檔(名字) 131 | 132 | $('body').on 'click','.檔 > .覆蓋', (event)-> 133 | 名字 = $(this).parent().attr('名字') 134 | 描述 = 演出.當前狀態.話語 135 | 存檔讀檔.存檔(名字, 描述) 136 | 137 | $('body').on 'click','#新建存檔', (event)-> 138 | 名字 = '存檔' + new Date().getTime() 139 | 描述 = 演出.當前狀態.話語 140 | 存檔讀檔.存檔(名字, 描述) 141 | -------------------------------------------------------------------------------- /librian/librian本體/前端/src/演出.coffee: -------------------------------------------------------------------------------- 1 | import $ from 'jquery' 2 | import opencc from 'node-opencc' 3 | 4 | import 控制 from './控制.coffee' 5 | import psd處理 from './psd處理.coffee' 6 | 7 | 8 | export default 演出 = 9 | 準備工作: -> 10 | $ '' 11 | .attr 12 | rel: 'stylesheet' 13 | type: 'text/css' 14 | href: v.主題css 15 | .appendTo("head") 16 | for i in v.自定css 17 | $ '' 18 | .attr 19 | rel: 'stylesheet' 20 | type: 'text/css' 21 | href: i 22 | .appendTo('head') 23 | 24 | $('#總畫面').css 'width', v.解析度[0] 25 | $('#總畫面').css 'height', v.解析度[1] 26 | 27 | if v.邊界 28 | $ 'div' 29 | .css 'border','1px solid #22f' 30 | 31 | this.縮放調整() 32 | 33 | 縮放調整: -> 34 | a = document.body.clientWidth / v.解析度[0] 35 | b = document.body.clientHeight / v.解析度[1] 36 | t = Math.min(a, b) 37 | $('#總畫面').css( 38 | "transform-origin": "0% 0%" 39 | "transform": "scale("+t+")" 40 | ) 41 | setTimeout(演出.縮放調整, 200) 42 | 43 | 更新: (瞬間化=false)-> 44 | 山彥.狀態回調 false, (狀態, 步進=false)-> 45 | 演出.改變演出狀態(狀態, 瞬間化) 46 | 47 | 步進更新: (瞬間化=false)-> 48 | 山彥.狀態回調 true, (狀態)-> 49 | 演出.改變演出狀態(狀態, 瞬間化) 50 | 51 | 翻譯: (s)-> 52 | if not v.翻譯 53 | return s 54 | return opencc[v.翻譯](s) 55 | 56 | 信息預處理: (data) -> 57 | if data.背景 58 | data.背景[0] = "url('#{v.圖片文件夾}/#{data.背景[0]}')".replace(/(\\)/g, '/') 59 | if data.cg 60 | data.cg[0] = "url('#{v.圖片文件夾}/#{data.cg[0]}')".replace(/\\/g, '/') 61 | if data.背景音樂 62 | data.背景音樂[0] = v.音樂文件夾 + '/' + data.背景音樂[0] 63 | if data.效果音 64 | data.效果音[0] = v.音樂文件夾 + '/' + data.效果音[0] 65 | if data.插入圖 66 | data.插入圖 = "url('#{v.圖片文件夾}/#{data.插入圖}')".replace(/\\/g, '/') 67 | 68 | 當前狀態: {} 69 | 改變演出狀態: (data, 瞬間化=false) -> 70 | console.log data 71 | this.信息預處理 data 72 | this.當前狀態 = data 73 | {特效表, 插入圖, 立繪, 名字, 話語, 額外信息, 語者, 背景, 背景音樂, 效果音, cg, 選項, js, html, 視頻} = data 74 | this.特效處理 特效表 75 | if 選項.length > 0 76 | this.處理選項 選項 77 | return 78 | 79 | if 插入圖 80 | this.換背景音樂(null) 81 | this.換圖('覆蓋', 插入圖, 0) 82 | $('#覆蓋').attr('顯現', 'true') 83 | return 84 | else 85 | if $('#覆蓋').attr('顯現') == 'true' 86 | 瞬間化 = true 87 | $('#覆蓋').attr('顯現', 'false') 88 | 89 | if 額外信息 90 | if 額外信息[0] == 'load' 91 | this.load特效() 92 | try 93 | eval(js) 94 | catch e 95 | console.log e 96 | 97 | $('#html疊加').html(html) 98 | this.放視頻(視頻) 99 | this.換cg(cg) 100 | this.換背景(背景, 瞬間化) 101 | this.換立繪(立繪, 瞬間化) 102 | this.換背景音樂(背景音樂) 103 | this.放效果音(效果音) 104 | this.換人名(語者, 名字) 105 | this.換對話(話語, 名字, 瞬間化) 106 | 107 | 特效處理: (特效表) -> 108 | 可特效块 = [ 109 | '總畫面','adv畫面','主畫面','覆蓋','選項','cg','bg','立繪','對話歷史', 110 | '對話框','名字框','名字','名字框背景','話語框','話語','話語框背景', 111 | '對話框背景' 112 | ] 113 | for i in 可特效块 114 | if $('#' + i).attr('特效') 115 | $('#' + i).attr('特效', '') 116 | for i of 特效表 117 | $('#' + i).attr('特效', 特效表[i]) 118 | 119 | 選擇之刻: false, 120 | 處理選項: (選項) -> 121 | $('#選項').html('') 122 | for i, p in 選項 123 | t = $("#{i}") 124 | $('#選項').append(t) 125 | t.click () -> 126 | 演出.點選項(parseInt($(this).attr('選項號'))) 127 | $('#選項').fadeIn(200) 128 | this.選擇之刻 = true 129 | 點選項: (x) -> 130 | $('#選項').fadeOut(50) 131 | 山彥.選(x) 132 | this.選擇之刻 = false 133 | 134 | 放視頻: (視頻) -> 135 | if ! 視頻 136 | return 137 | [視頻文件, 可以跳過] = 視頻 138 | video = $('#視頻') 139 | video.css('display', 'block') 140 | video.attr('src', v.視頻文件夾+'/' + 視頻文件) 141 | video.click if 可以跳過 142 | -> 143 | video.css('animation', '_黑出 0.5s') 144 | video.css('animation-fill-mode', 'forwards') 145 | setTimeout -> 146 | video.css('animation', '') 147 | video.attr('src', '') 148 | video[0].style.display = 'none' 149 | , 600 150 | else 151 | -> null 152 | 153 | video[0].addEventListener 'ended', -> 154 | video[0].style.display = 'none' 155 | , false 156 | video[0].play() 157 | 158 | load特效: -> 159 | 控制.左鍵屏蔽 = true 160 | $('#adv畫面').fadeOut(0) 161 | $('#adv畫面').fadeIn(400) 162 | setTimeout -> 163 | 控制.左鍵屏蔽 = false 164 | , 300 165 | 提示: (x) -> 166 | $('#提示').html(x) 167 | $('#提示').fadeIn(300) 168 | $('#提示').hide(1000) 169 | 170 | 現在cg: null, 171 | 換cg: (cg) -> 172 | if cg 173 | [cg圖片, 淡入時間, 漸變方法] = cg 174 | else 175 | [cg圖片, 淡入時間, 漸變方法] = ['', 0, ''] 176 | if cg圖片 == this.現在cg 177 | return 178 | this.現在cg = cg圖片 179 | this.換圖('cg', cg圖片, 淡入時間, 漸變方法) 180 | 181 | 當前人物組: [] 182 | 換立繪: (立繪組, 瞬=false) -> 183 | 名字組 = (立繪.名字 for 立繪 in 立繪組) 184 | 185 | # 垃圾回收 186 | for 名字 in this.當前人物組 187 | if 名字組.indexOf(名字) == - 1 188 | $("#立繪--#{名字}").remove() 189 | console.log "去除 #{名字}" 190 | else 191 | $("#立繪--#{名字}").attr('特效', '') 192 | 193 | # 新建 194 | for 名字 in 名字組 195 | if this.當前人物組.indexOf(名字) == - 1 196 | $('#立繪').append($("
")) 197 | console.log "加入 #{名字}" 198 | 199 | # 設定位置 200 | for 立繪 in 立繪組 201 | t = $("#立繪--#{立繪.名字}") 202 | if 瞬 203 | t.css('transition', '') 204 | else 205 | 移動時間 = 0.5 206 | t.css('transition', "top #{移動時間}s, left #{移動時間}s, transform #{移動時間}s") 207 | t.css('left', "#{立繪.位置[0]}px") 208 | t.css('top', "#{立繪.位置[1]}px") 209 | t.css('transform', "scale(#{立繪.位置[2]})") 210 | $("#立繪--#{立繪.名字}--圖像").attr('特效', 立繪.特效.join(' ')) 211 | 212 | # 貼圖 213 | for 立繪 in 立繪組 214 | if 立繪.使用png 215 | png名 = "#{v.psd立繪路徑}/#{立繪.名字}.png" 216 | await psd處理.渲染png到div(png名, "立繪--#{立繪.名字}--圖像") 217 | else 218 | psd名 = "#{v.psd立繪路徑}/#{立繪.名字}.psd" 219 | await psd處理.渲染圖層組到div(psd名, 立繪.圖層, "立繪--#{立繪.名字}--圖像") 220 | if this.當前人物組.indexOf(立繪.名字) == -1 221 | $("#立繪--#{立繪.名字}").attr('特效','淡入') 222 | 223 | this.當前人物組 = 名字組 224 | 225 | 現在背景: [null, "0% 0%"], 226 | 換背景: (背景, 瞬) -> 227 | if 背景 228 | [背景圖片, 淡入時間, 位置, 漸變方法] = 背景 229 | else 230 | [背景圖片, 淡入時間, 位置, 漸變方法] = ['', 0, ''] 231 | if 瞬 232 | 淡入時間 = 0 233 | if 背景圖片 != this.現在背景[0] 234 | $('#bg').css('background-position', 位置) 235 | this.換圖('bg', 背景圖片, 淡入時間, 漸變方法) 236 | else if 位置 != this.現在背景[1] 237 | $('#bg').css('background-position', 位置) 238 | this.現在背景 = [背景圖片, 位置] 239 | 240 | 換人名: (語者, 名字) -> 241 | 名字 = this.翻譯(名字) 242 | if 名字 243 | $('#名字').html(名字) 244 | $('#名字框').css('opacity', 1) 245 | else 246 | $('#名字框').css('opacity', 0) 247 | $('#對話歷史').append(名字+'
') 248 | $('#對話框').attr('名字', 語者) 249 | 250 | 淡入過期時間: 0, 251 | 換對話: (話語, 名字, 瞬間化) -> 252 | 話語 = this.翻譯(話語) 253 | 名字 = this.翻譯(名字) 254 | $('#對話歷史').append(話語+'

') 255 | 256 | if 名字 != '' 257 | $('#對話框').attr('對話類型','對話') 258 | else 259 | $('#對話框').attr('對話類型','旁白') 260 | 261 | if $("#話語").css("--幹你娘老子就是要每行都縮進") 262 | 縮進 = ' '.repeat(parseInt($("#話語").css("--幹你娘老子就是要每行都縮進"))) 263 | 話語 = 話語.replace(/(^|\n)/g, "$1#{縮進}") 264 | 265 | if 瞬間化 266 | $('#話語').html(話語 + '') 267 | else 268 | 淡入字 = 演出.文字淡入(話語) 269 | $('#話語').html(淡入字.內容) 270 | 演出.淡入過期時間 = Date.now() + 淡入字.文字時間 * 1000 271 | 早泄: -> 272 | $('#話語 *').css('animation','None') 273 | $('#話語 *').css('opacity','1') 274 | 275 | 當前曲名: null, 276 | 換背景音樂: (背景音樂) -> 277 | if 背景音樂 278 | [曲名, 音量] = 背景音樂 279 | else 280 | [曲名, 音量] = [null, 0] 281 | 282 | if this.當前曲名 == 曲名 283 | return 284 | this.當前曲名 = 曲名 285 | 286 | for i in $('#總畫面 > audio.背景音樂') 287 | if i.volume==0 288 | i.remove() 289 | $('#總畫面 > audio.背景音樂').animate({volume: 0}, 500) 290 | 291 | 音樂 = $("") 292 | 音樂.volume = 音量 293 | $('#總畫面').append(音樂) 294 | 295 | 放效果音: (效果音) -> 296 | if ! 效果音 297 | return 298 | [曲名, 音量] = 效果音 299 | 音樂 = $("") 300 | 音樂.volume = 音量 301 | 音樂[0].addEventListener('ended', -> 302 | 音樂.remove() 303 | , false) 304 | $('#總畫面').append(音樂) 305 | 306 | 換圖: (目標, 新圖, 漸變時間, 漸變方法 = '_淡出') -> 307 | 目標 = $('#'+目標) 308 | 原背景 = 目標.css('background-image') 309 | 目標.css('background-image', 新圖) 310 | 311 | 目標.html('
') 312 | 舊淡出 = 目標.children() 313 | 314 | if 漸變時間 > 0 315 | 舊淡出.css('background-image', 原背景) 316 | 舊淡出.css('animation', "#{漸變方法} #{漸變時間}s") 317 | 舊淡出.css('animation-fill-mode', 'forwards') 318 | 舊淡出.css('animation-play-state', 'running') 319 | 320 | 文字淡入: (s, 動畫名 = '_淡入') -> 321 | 時間間隔 = v.用戶設置.文字速度.值 / 800 322 | group = s.replace(/(\s*((<.*?>)|(.)))/g, "$1\0").split('\0') 323 | 動畫時間 = 時間間隔 * 8 324 | 時間 = 0 325 | 內容 = (for i in group 326 | if i[0] == '<' 327 | i 328 | else 329 | 時間 += 時間間隔 330 | "#{i}" 331 | ).join('') 332 | {內容, 文字時間: 時間, 總時間: 時間 + 動畫時間} 333 | -------------------------------------------------------------------------------- /librian/librian本體/前端/src/特效.sass: -------------------------------------------------------------------------------- 1 | @keyframes _淡入 2 | 0% 3 | opacity: 0 4 | 100% 5 | opacity: 1 6 | 7 | @keyframes _下入 8 | 0% 9 | position: relative 10 | top: 50px 11 | opacity: 0 12 | 100% 13 | opacity: 1 14 | position: relative 15 | top: 0px 16 | 17 | @keyframes _淡出 18 | 0% 19 | opacity: 1 20 | 21 | 100% 22 | opacity: 0 23 | 24 | @keyframes _黑出 25 | 0% 26 | opacity: 1 27 | filter: brightness(100%) 28 | 50% 29 | opacity: 1 30 | filter: brightness(0%) 31 | 100% 32 | opacity: 0 33 | filter: brightness(0%) 34 | 35 | [特效~=淡入] 36 | animation: _淡入 0.6s 37 | animation-fill-mode: forwards 38 | 39 | [特效~=下入] 40 | animation: _下入 0.6s 41 | animation-fill-mode: forwards 42 | 43 | [特效~=灰] 44 | filter: grayscale(1) 45 | 46 | [特效~=透明] 47 | opacity: 0.5 48 | -------------------------------------------------------------------------------- /librian/librian本體/前端/src/狀態切換.sass: -------------------------------------------------------------------------------- 1 | #總畫面 2 | #配置面板, #對話歷史, #存檔讀檔面板 3 | opacity: 0 4 | visibility: hidden 5 | #adv畫面, #工具欄 6 | transition: filter 0.25s 7 | 8 | &[配置面板=off] 9 | #配置面板 10 | transition: visibility 0s 0.25s, opacity 0.25s 11 | &[配置面板=on] 12 | #配置面板 13 | opacity: 1 14 | visibility: visible 15 | transition: opacity 0.25s 16 | #adv畫面, #工具欄 17 | pointer-events: none 18 | filter: brightness(0.6) 19 | 20 | &[存檔讀檔面板=off] 21 | #存檔讀檔面板 22 | transition: visibility 0s 0.25s, opacity 0.25s 23 | &[存檔讀檔面板=on] 24 | #存檔讀檔面板 25 | opacity: 1 26 | visibility: visible 27 | transition: opacity 0.25s 28 | #adv畫面, #工具欄 29 | pointer-events: none 30 | filter: brightness(0.6) 31 | #對話框 32 | visibility: hidden 33 | &[歷史=off] 34 | #對話歷史 35 | transition: visibility 0s 0.25s, opacity 0.25s 36 | &[歷史=on] 37 | #對話歷史 38 | opacity: 1 39 | visibility: visible 40 | transition: opacity 0.25s 41 | 42 | &[對話框=off] 43 | #對話框 44 | opacity: 0 45 | visibility: hidden 46 | transition: visibility 0s 0.25s, opacity 0.25s 47 | &[對話框=on] 48 | #對話框 49 | opacity: 1 50 | visibility: visible 51 | transition: opacity 0.25s 52 | 53 | 54 | #adv畫面 55 | #覆蓋 56 | visibility: hidden 57 | opacity: 0 58 | filter: brightness(0) 59 | transition: visibility 0s 0.4s, opacity 0.4s, filter 0s 0.4s 60 | &[顯現=true] 61 | visibility: visible 62 | opacity: 1 63 | filter: brightness(1) 64 | transition: visibility 0s, opacity 1s, filter 2s 1s 65 | -------------------------------------------------------------------------------- /librian/librian本體/前端/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const WebpackBar = require('webpackbar'); 3 | 4 | module.exports = { 5 | entry: './src/全局.coffee', 6 | output: { 7 | path: path.resolve(__dirname, 'dist'), 8 | filename: 'bundle.js', 9 | publicPath: './dist/', 10 | }, 11 | module: { 12 | rules: [ 13 | { 14 | test: /\.coffee$/, 15 | use: ['coffee-loader'] 16 | }, { 17 | test: /\.sass$/, 18 | use: [ 19 | { loader: 'style-loader' }, 20 | { loader: 'css-loader' }, 21 | { loader: 'resolve-url-loader' }, 22 | { loader: 'sass-loader', options: { sourceMap: true } } 23 | ] 24 | }, { 25 | test: /\.(otf|png|jpg|webp|svg)$/, 26 | use: [ 27 | { 28 | loader: 'file-loader', options: { 29 | name: () => '[name].[ext]', 30 | } 31 | }, 32 | ] 33 | }, 34 | ], 35 | }, 36 | plugins: [ 37 | new WebpackBar() 38 | ], 39 | node: { fs: 'empty' }, 40 | mode: 'development', 41 | // mode: 'production', 42 | }; -------------------------------------------------------------------------------- /librian/librian本體/前端/素材/NotoSerifSC-SemiBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/素材/NotoSerifSC-SemiBold.otf -------------------------------------------------------------------------------- /librian/librian本體/前端/素材/t0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/素材/t0.png -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | .sr-only() { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | .sr-only-focusable() { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/less/variables.less: -------------------------------------------------------------------------------- 1 | // Variables 2 | // -------------------------- 3 | 4 | @fa-font-path: "../fonts"; 5 | @fa-font-size-base: 14px; 6 | @fa-line-height-base: 1; 7 | //@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly 8 | @fa-css-prefix: fa; 9 | @fa-version: "4.7.0"; 10 | @fa-border-color: #eee; 11 | @fa-inverse: #fff; 12 | @fa-li-width: (30em / 14); 13 | 14 | @fa-var-500px: "\f26e"; 15 | @fa-var-address-book: "\f2b9"; 16 | @fa-var-address-book-o: "\f2ba"; 17 | @fa-var-address-card: "\f2bb"; 18 | @fa-var-address-card-o: "\f2bc"; 19 | @fa-var-adjust: "\f042"; 20 | @fa-var-adn: "\f170"; 21 | @fa-var-align-center: "\f037"; 22 | @fa-var-align-justify: "\f039"; 23 | @fa-var-align-left: "\f036"; 24 | @fa-var-align-right: "\f038"; 25 | @fa-var-amazon: "\f270"; 26 | @fa-var-ambulance: "\f0f9"; 27 | @fa-var-american-sign-language-interpreting: "\f2a3"; 28 | @fa-var-anchor: "\f13d"; 29 | @fa-var-android: "\f17b"; 30 | @fa-var-angellist: "\f209"; 31 | @fa-var-angle-double-down: "\f103"; 32 | @fa-var-angle-double-left: "\f100"; 33 | @fa-var-angle-double-right: "\f101"; 34 | @fa-var-angle-double-up: "\f102"; 35 | @fa-var-angle-down: "\f107"; 36 | @fa-var-angle-left: "\f104"; 37 | @fa-var-angle-right: "\f105"; 38 | @fa-var-angle-up: "\f106"; 39 | @fa-var-apple: "\f179"; 40 | @fa-var-archive: "\f187"; 41 | @fa-var-area-chart: "\f1fe"; 42 | @fa-var-arrow-circle-down: "\f0ab"; 43 | @fa-var-arrow-circle-left: "\f0a8"; 44 | @fa-var-arrow-circle-o-down: "\f01a"; 45 | @fa-var-arrow-circle-o-left: "\f190"; 46 | @fa-var-arrow-circle-o-right: "\f18e"; 47 | @fa-var-arrow-circle-o-up: "\f01b"; 48 | @fa-var-arrow-circle-right: "\f0a9"; 49 | @fa-var-arrow-circle-up: "\f0aa"; 50 | @fa-var-arrow-down: "\f063"; 51 | @fa-var-arrow-left: "\f060"; 52 | @fa-var-arrow-right: "\f061"; 53 | @fa-var-arrow-up: "\f062"; 54 | @fa-var-arrows: "\f047"; 55 | @fa-var-arrows-alt: "\f0b2"; 56 | @fa-var-arrows-h: "\f07e"; 57 | @fa-var-arrows-v: "\f07d"; 58 | @fa-var-asl-interpreting: "\f2a3"; 59 | @fa-var-assistive-listening-systems: "\f2a2"; 60 | @fa-var-asterisk: "\f069"; 61 | @fa-var-at: "\f1fa"; 62 | @fa-var-audio-description: "\f29e"; 63 | @fa-var-automobile: "\f1b9"; 64 | @fa-var-backward: "\f04a"; 65 | @fa-var-balance-scale: "\f24e"; 66 | @fa-var-ban: "\f05e"; 67 | @fa-var-bandcamp: "\f2d5"; 68 | @fa-var-bank: "\f19c"; 69 | @fa-var-bar-chart: "\f080"; 70 | @fa-var-bar-chart-o: "\f080"; 71 | @fa-var-barcode: "\f02a"; 72 | @fa-var-bars: "\f0c9"; 73 | @fa-var-bath: "\f2cd"; 74 | @fa-var-bathtub: "\f2cd"; 75 | @fa-var-battery: "\f240"; 76 | @fa-var-battery-0: "\f244"; 77 | @fa-var-battery-1: "\f243"; 78 | @fa-var-battery-2: "\f242"; 79 | @fa-var-battery-3: "\f241"; 80 | @fa-var-battery-4: "\f240"; 81 | @fa-var-battery-empty: "\f244"; 82 | @fa-var-battery-full: "\f240"; 83 | @fa-var-battery-half: "\f242"; 84 | @fa-var-battery-quarter: "\f243"; 85 | @fa-var-battery-three-quarters: "\f241"; 86 | @fa-var-bed: "\f236"; 87 | @fa-var-beer: "\f0fc"; 88 | @fa-var-behance: "\f1b4"; 89 | @fa-var-behance-square: "\f1b5"; 90 | @fa-var-bell: "\f0f3"; 91 | @fa-var-bell-o: "\f0a2"; 92 | @fa-var-bell-slash: "\f1f6"; 93 | @fa-var-bell-slash-o: "\f1f7"; 94 | @fa-var-bicycle: "\f206"; 95 | @fa-var-binoculars: "\f1e5"; 96 | @fa-var-birthday-cake: "\f1fd"; 97 | @fa-var-bitbucket: "\f171"; 98 | @fa-var-bitbucket-square: "\f172"; 99 | @fa-var-bitcoin: "\f15a"; 100 | @fa-var-black-tie: "\f27e"; 101 | @fa-var-blind: "\f29d"; 102 | @fa-var-bluetooth: "\f293"; 103 | @fa-var-bluetooth-b: "\f294"; 104 | @fa-var-bold: "\f032"; 105 | @fa-var-bolt: "\f0e7"; 106 | @fa-var-bomb: "\f1e2"; 107 | @fa-var-book: "\f02d"; 108 | @fa-var-bookmark: "\f02e"; 109 | @fa-var-bookmark-o: "\f097"; 110 | @fa-var-braille: "\f2a1"; 111 | @fa-var-briefcase: "\f0b1"; 112 | @fa-var-btc: "\f15a"; 113 | @fa-var-bug: "\f188"; 114 | @fa-var-building: "\f1ad"; 115 | @fa-var-building-o: "\f0f7"; 116 | @fa-var-bullhorn: "\f0a1"; 117 | @fa-var-bullseye: "\f140"; 118 | @fa-var-bus: "\f207"; 119 | @fa-var-buysellads: "\f20d"; 120 | @fa-var-cab: "\f1ba"; 121 | @fa-var-calculator: "\f1ec"; 122 | @fa-var-calendar: "\f073"; 123 | @fa-var-calendar-check-o: "\f274"; 124 | @fa-var-calendar-minus-o: "\f272"; 125 | @fa-var-calendar-o: "\f133"; 126 | @fa-var-calendar-plus-o: "\f271"; 127 | @fa-var-calendar-times-o: "\f273"; 128 | @fa-var-camera: "\f030"; 129 | @fa-var-camera-retro: "\f083"; 130 | @fa-var-car: "\f1b9"; 131 | @fa-var-caret-down: "\f0d7"; 132 | @fa-var-caret-left: "\f0d9"; 133 | @fa-var-caret-right: "\f0da"; 134 | @fa-var-caret-square-o-down: "\f150"; 135 | @fa-var-caret-square-o-left: "\f191"; 136 | @fa-var-caret-square-o-right: "\f152"; 137 | @fa-var-caret-square-o-up: "\f151"; 138 | @fa-var-caret-up: "\f0d8"; 139 | @fa-var-cart-arrow-down: "\f218"; 140 | @fa-var-cart-plus: "\f217"; 141 | @fa-var-cc: "\f20a"; 142 | @fa-var-cc-amex: "\f1f3"; 143 | @fa-var-cc-diners-club: "\f24c"; 144 | @fa-var-cc-discover: "\f1f2"; 145 | @fa-var-cc-jcb: "\f24b"; 146 | @fa-var-cc-mastercard: "\f1f1"; 147 | @fa-var-cc-paypal: "\f1f4"; 148 | @fa-var-cc-stripe: "\f1f5"; 149 | @fa-var-cc-visa: "\f1f0"; 150 | @fa-var-certificate: "\f0a3"; 151 | @fa-var-chain: "\f0c1"; 152 | @fa-var-chain-broken: "\f127"; 153 | @fa-var-check: "\f00c"; 154 | @fa-var-check-circle: "\f058"; 155 | @fa-var-check-circle-o: "\f05d"; 156 | @fa-var-check-square: "\f14a"; 157 | @fa-var-check-square-o: "\f046"; 158 | @fa-var-chevron-circle-down: "\f13a"; 159 | @fa-var-chevron-circle-left: "\f137"; 160 | @fa-var-chevron-circle-right: "\f138"; 161 | @fa-var-chevron-circle-up: "\f139"; 162 | @fa-var-chevron-down: "\f078"; 163 | @fa-var-chevron-left: "\f053"; 164 | @fa-var-chevron-right: "\f054"; 165 | @fa-var-chevron-up: "\f077"; 166 | @fa-var-child: "\f1ae"; 167 | @fa-var-chrome: "\f268"; 168 | @fa-var-circle: "\f111"; 169 | @fa-var-circle-o: "\f10c"; 170 | @fa-var-circle-o-notch: "\f1ce"; 171 | @fa-var-circle-thin: "\f1db"; 172 | @fa-var-clipboard: "\f0ea"; 173 | @fa-var-clock-o: "\f017"; 174 | @fa-var-clone: "\f24d"; 175 | @fa-var-close: "\f00d"; 176 | @fa-var-cloud: "\f0c2"; 177 | @fa-var-cloud-download: "\f0ed"; 178 | @fa-var-cloud-upload: "\f0ee"; 179 | @fa-var-cny: "\f157"; 180 | @fa-var-code: "\f121"; 181 | @fa-var-code-fork: "\f126"; 182 | @fa-var-codepen: "\f1cb"; 183 | @fa-var-codiepie: "\f284"; 184 | @fa-var-coffee: "\f0f4"; 185 | @fa-var-cog: "\f013"; 186 | @fa-var-cogs: "\f085"; 187 | @fa-var-columns: "\f0db"; 188 | @fa-var-comment: "\f075"; 189 | @fa-var-comment-o: "\f0e5"; 190 | @fa-var-commenting: "\f27a"; 191 | @fa-var-commenting-o: "\f27b"; 192 | @fa-var-comments: "\f086"; 193 | @fa-var-comments-o: "\f0e6"; 194 | @fa-var-compass: "\f14e"; 195 | @fa-var-compress: "\f066"; 196 | @fa-var-connectdevelop: "\f20e"; 197 | @fa-var-contao: "\f26d"; 198 | @fa-var-copy: "\f0c5"; 199 | @fa-var-copyright: "\f1f9"; 200 | @fa-var-creative-commons: "\f25e"; 201 | @fa-var-credit-card: "\f09d"; 202 | @fa-var-credit-card-alt: "\f283"; 203 | @fa-var-crop: "\f125"; 204 | @fa-var-crosshairs: "\f05b"; 205 | @fa-var-css3: "\f13c"; 206 | @fa-var-cube: "\f1b2"; 207 | @fa-var-cubes: "\f1b3"; 208 | @fa-var-cut: "\f0c4"; 209 | @fa-var-cutlery: "\f0f5"; 210 | @fa-var-dashboard: "\f0e4"; 211 | @fa-var-dashcube: "\f210"; 212 | @fa-var-database: "\f1c0"; 213 | @fa-var-deaf: "\f2a4"; 214 | @fa-var-deafness: "\f2a4"; 215 | @fa-var-dedent: "\f03b"; 216 | @fa-var-delicious: "\f1a5"; 217 | @fa-var-desktop: "\f108"; 218 | @fa-var-deviantart: "\f1bd"; 219 | @fa-var-diamond: "\f219"; 220 | @fa-var-digg: "\f1a6"; 221 | @fa-var-dollar: "\f155"; 222 | @fa-var-dot-circle-o: "\f192"; 223 | @fa-var-download: "\f019"; 224 | @fa-var-dribbble: "\f17d"; 225 | @fa-var-drivers-license: "\f2c2"; 226 | @fa-var-drivers-license-o: "\f2c3"; 227 | @fa-var-dropbox: "\f16b"; 228 | @fa-var-drupal: "\f1a9"; 229 | @fa-var-edge: "\f282"; 230 | @fa-var-edit: "\f044"; 231 | @fa-var-eercast: "\f2da"; 232 | @fa-var-eject: "\f052"; 233 | @fa-var-ellipsis-h: "\f141"; 234 | @fa-var-ellipsis-v: "\f142"; 235 | @fa-var-empire: "\f1d1"; 236 | @fa-var-envelope: "\f0e0"; 237 | @fa-var-envelope-o: "\f003"; 238 | @fa-var-envelope-open: "\f2b6"; 239 | @fa-var-envelope-open-o: "\f2b7"; 240 | @fa-var-envelope-square: "\f199"; 241 | @fa-var-envira: "\f299"; 242 | @fa-var-eraser: "\f12d"; 243 | @fa-var-etsy: "\f2d7"; 244 | @fa-var-eur: "\f153"; 245 | @fa-var-euro: "\f153"; 246 | @fa-var-exchange: "\f0ec"; 247 | @fa-var-exclamation: "\f12a"; 248 | @fa-var-exclamation-circle: "\f06a"; 249 | @fa-var-exclamation-triangle: "\f071"; 250 | @fa-var-expand: "\f065"; 251 | @fa-var-expeditedssl: "\f23e"; 252 | @fa-var-external-link: "\f08e"; 253 | @fa-var-external-link-square: "\f14c"; 254 | @fa-var-eye: "\f06e"; 255 | @fa-var-eye-slash: "\f070"; 256 | @fa-var-eyedropper: "\f1fb"; 257 | @fa-var-fa: "\f2b4"; 258 | @fa-var-facebook: "\f09a"; 259 | @fa-var-facebook-f: "\f09a"; 260 | @fa-var-facebook-official: "\f230"; 261 | @fa-var-facebook-square: "\f082"; 262 | @fa-var-fast-backward: "\f049"; 263 | @fa-var-fast-forward: "\f050"; 264 | @fa-var-fax: "\f1ac"; 265 | @fa-var-feed: "\f09e"; 266 | @fa-var-female: "\f182"; 267 | @fa-var-fighter-jet: "\f0fb"; 268 | @fa-var-file: "\f15b"; 269 | @fa-var-file-archive-o: "\f1c6"; 270 | @fa-var-file-audio-o: "\f1c7"; 271 | @fa-var-file-code-o: "\f1c9"; 272 | @fa-var-file-excel-o: "\f1c3"; 273 | @fa-var-file-image-o: "\f1c5"; 274 | @fa-var-file-movie-o: "\f1c8"; 275 | @fa-var-file-o: "\f016"; 276 | @fa-var-file-pdf-o: "\f1c1"; 277 | @fa-var-file-photo-o: "\f1c5"; 278 | @fa-var-file-picture-o: "\f1c5"; 279 | @fa-var-file-powerpoint-o: "\f1c4"; 280 | @fa-var-file-sound-o: "\f1c7"; 281 | @fa-var-file-text: "\f15c"; 282 | @fa-var-file-text-o: "\f0f6"; 283 | @fa-var-file-video-o: "\f1c8"; 284 | @fa-var-file-word-o: "\f1c2"; 285 | @fa-var-file-zip-o: "\f1c6"; 286 | @fa-var-files-o: "\f0c5"; 287 | @fa-var-film: "\f008"; 288 | @fa-var-filter: "\f0b0"; 289 | @fa-var-fire: "\f06d"; 290 | @fa-var-fire-extinguisher: "\f134"; 291 | @fa-var-firefox: "\f269"; 292 | @fa-var-first-order: "\f2b0"; 293 | @fa-var-flag: "\f024"; 294 | @fa-var-flag-checkered: "\f11e"; 295 | @fa-var-flag-o: "\f11d"; 296 | @fa-var-flash: "\f0e7"; 297 | @fa-var-flask: "\f0c3"; 298 | @fa-var-flickr: "\f16e"; 299 | @fa-var-floppy-o: "\f0c7"; 300 | @fa-var-folder: "\f07b"; 301 | @fa-var-folder-o: "\f114"; 302 | @fa-var-folder-open: "\f07c"; 303 | @fa-var-folder-open-o: "\f115"; 304 | @fa-var-font: "\f031"; 305 | @fa-var-font-awesome: "\f2b4"; 306 | @fa-var-fonticons: "\f280"; 307 | @fa-var-fort-awesome: "\f286"; 308 | @fa-var-forumbee: "\f211"; 309 | @fa-var-forward: "\f04e"; 310 | @fa-var-foursquare: "\f180"; 311 | @fa-var-free-code-camp: "\f2c5"; 312 | @fa-var-frown-o: "\f119"; 313 | @fa-var-futbol-o: "\f1e3"; 314 | @fa-var-gamepad: "\f11b"; 315 | @fa-var-gavel: "\f0e3"; 316 | @fa-var-gbp: "\f154"; 317 | @fa-var-ge: "\f1d1"; 318 | @fa-var-gear: "\f013"; 319 | @fa-var-gears: "\f085"; 320 | @fa-var-genderless: "\f22d"; 321 | @fa-var-get-pocket: "\f265"; 322 | @fa-var-gg: "\f260"; 323 | @fa-var-gg-circle: "\f261"; 324 | @fa-var-gift: "\f06b"; 325 | @fa-var-git: "\f1d3"; 326 | @fa-var-git-square: "\f1d2"; 327 | @fa-var-github: "\f09b"; 328 | @fa-var-github-alt: "\f113"; 329 | @fa-var-github-square: "\f092"; 330 | @fa-var-gitlab: "\f296"; 331 | @fa-var-gittip: "\f184"; 332 | @fa-var-glass: "\f000"; 333 | @fa-var-glide: "\f2a5"; 334 | @fa-var-glide-g: "\f2a6"; 335 | @fa-var-globe: "\f0ac"; 336 | @fa-var-google: "\f1a0"; 337 | @fa-var-google-plus: "\f0d5"; 338 | @fa-var-google-plus-circle: "\f2b3"; 339 | @fa-var-google-plus-official: "\f2b3"; 340 | @fa-var-google-plus-square: "\f0d4"; 341 | @fa-var-google-wallet: "\f1ee"; 342 | @fa-var-graduation-cap: "\f19d"; 343 | @fa-var-gratipay: "\f184"; 344 | @fa-var-grav: "\f2d6"; 345 | @fa-var-group: "\f0c0"; 346 | @fa-var-h-square: "\f0fd"; 347 | @fa-var-hacker-news: "\f1d4"; 348 | @fa-var-hand-grab-o: "\f255"; 349 | @fa-var-hand-lizard-o: "\f258"; 350 | @fa-var-hand-o-down: "\f0a7"; 351 | @fa-var-hand-o-left: "\f0a5"; 352 | @fa-var-hand-o-right: "\f0a4"; 353 | @fa-var-hand-o-up: "\f0a6"; 354 | @fa-var-hand-paper-o: "\f256"; 355 | @fa-var-hand-peace-o: "\f25b"; 356 | @fa-var-hand-pointer-o: "\f25a"; 357 | @fa-var-hand-rock-o: "\f255"; 358 | @fa-var-hand-scissors-o: "\f257"; 359 | @fa-var-hand-spock-o: "\f259"; 360 | @fa-var-hand-stop-o: "\f256"; 361 | @fa-var-handshake-o: "\f2b5"; 362 | @fa-var-hard-of-hearing: "\f2a4"; 363 | @fa-var-hashtag: "\f292"; 364 | @fa-var-hdd-o: "\f0a0"; 365 | @fa-var-header: "\f1dc"; 366 | @fa-var-headphones: "\f025"; 367 | @fa-var-heart: "\f004"; 368 | @fa-var-heart-o: "\f08a"; 369 | @fa-var-heartbeat: "\f21e"; 370 | @fa-var-history: "\f1da"; 371 | @fa-var-home: "\f015"; 372 | @fa-var-hospital-o: "\f0f8"; 373 | @fa-var-hotel: "\f236"; 374 | @fa-var-hourglass: "\f254"; 375 | @fa-var-hourglass-1: "\f251"; 376 | @fa-var-hourglass-2: "\f252"; 377 | @fa-var-hourglass-3: "\f253"; 378 | @fa-var-hourglass-end: "\f253"; 379 | @fa-var-hourglass-half: "\f252"; 380 | @fa-var-hourglass-o: "\f250"; 381 | @fa-var-hourglass-start: "\f251"; 382 | @fa-var-houzz: "\f27c"; 383 | @fa-var-html5: "\f13b"; 384 | @fa-var-i-cursor: "\f246"; 385 | @fa-var-id-badge: "\f2c1"; 386 | @fa-var-id-card: "\f2c2"; 387 | @fa-var-id-card-o: "\f2c3"; 388 | @fa-var-ils: "\f20b"; 389 | @fa-var-image: "\f03e"; 390 | @fa-var-imdb: "\f2d8"; 391 | @fa-var-inbox: "\f01c"; 392 | @fa-var-indent: "\f03c"; 393 | @fa-var-industry: "\f275"; 394 | @fa-var-info: "\f129"; 395 | @fa-var-info-circle: "\f05a"; 396 | @fa-var-inr: "\f156"; 397 | @fa-var-instagram: "\f16d"; 398 | @fa-var-institution: "\f19c"; 399 | @fa-var-internet-explorer: "\f26b"; 400 | @fa-var-intersex: "\f224"; 401 | @fa-var-ioxhost: "\f208"; 402 | @fa-var-italic: "\f033"; 403 | @fa-var-joomla: "\f1aa"; 404 | @fa-var-jpy: "\f157"; 405 | @fa-var-jsfiddle: "\f1cc"; 406 | @fa-var-key: "\f084"; 407 | @fa-var-keyboard-o: "\f11c"; 408 | @fa-var-krw: "\f159"; 409 | @fa-var-language: "\f1ab"; 410 | @fa-var-laptop: "\f109"; 411 | @fa-var-lastfm: "\f202"; 412 | @fa-var-lastfm-square: "\f203"; 413 | @fa-var-leaf: "\f06c"; 414 | @fa-var-leanpub: "\f212"; 415 | @fa-var-legal: "\f0e3"; 416 | @fa-var-lemon-o: "\f094"; 417 | @fa-var-level-down: "\f149"; 418 | @fa-var-level-up: "\f148"; 419 | @fa-var-life-bouy: "\f1cd"; 420 | @fa-var-life-buoy: "\f1cd"; 421 | @fa-var-life-ring: "\f1cd"; 422 | @fa-var-life-saver: "\f1cd"; 423 | @fa-var-lightbulb-o: "\f0eb"; 424 | @fa-var-line-chart: "\f201"; 425 | @fa-var-link: "\f0c1"; 426 | @fa-var-linkedin: "\f0e1"; 427 | @fa-var-linkedin-square: "\f08c"; 428 | @fa-var-linode: "\f2b8"; 429 | @fa-var-linux: "\f17c"; 430 | @fa-var-list: "\f03a"; 431 | @fa-var-list-alt: "\f022"; 432 | @fa-var-list-ol: "\f0cb"; 433 | @fa-var-list-ul: "\f0ca"; 434 | @fa-var-location-arrow: "\f124"; 435 | @fa-var-lock: "\f023"; 436 | @fa-var-long-arrow-down: "\f175"; 437 | @fa-var-long-arrow-left: "\f177"; 438 | @fa-var-long-arrow-right: "\f178"; 439 | @fa-var-long-arrow-up: "\f176"; 440 | @fa-var-low-vision: "\f2a8"; 441 | @fa-var-magic: "\f0d0"; 442 | @fa-var-magnet: "\f076"; 443 | @fa-var-mail-forward: "\f064"; 444 | @fa-var-mail-reply: "\f112"; 445 | @fa-var-mail-reply-all: "\f122"; 446 | @fa-var-male: "\f183"; 447 | @fa-var-map: "\f279"; 448 | @fa-var-map-marker: "\f041"; 449 | @fa-var-map-o: "\f278"; 450 | @fa-var-map-pin: "\f276"; 451 | @fa-var-map-signs: "\f277"; 452 | @fa-var-mars: "\f222"; 453 | @fa-var-mars-double: "\f227"; 454 | @fa-var-mars-stroke: "\f229"; 455 | @fa-var-mars-stroke-h: "\f22b"; 456 | @fa-var-mars-stroke-v: "\f22a"; 457 | @fa-var-maxcdn: "\f136"; 458 | @fa-var-meanpath: "\f20c"; 459 | @fa-var-medium: "\f23a"; 460 | @fa-var-medkit: "\f0fa"; 461 | @fa-var-meetup: "\f2e0"; 462 | @fa-var-meh-o: "\f11a"; 463 | @fa-var-mercury: "\f223"; 464 | @fa-var-microchip: "\f2db"; 465 | @fa-var-microphone: "\f130"; 466 | @fa-var-microphone-slash: "\f131"; 467 | @fa-var-minus: "\f068"; 468 | @fa-var-minus-circle: "\f056"; 469 | @fa-var-minus-square: "\f146"; 470 | @fa-var-minus-square-o: "\f147"; 471 | @fa-var-mixcloud: "\f289"; 472 | @fa-var-mobile: "\f10b"; 473 | @fa-var-mobile-phone: "\f10b"; 474 | @fa-var-modx: "\f285"; 475 | @fa-var-money: "\f0d6"; 476 | @fa-var-moon-o: "\f186"; 477 | @fa-var-mortar-board: "\f19d"; 478 | @fa-var-motorcycle: "\f21c"; 479 | @fa-var-mouse-pointer: "\f245"; 480 | @fa-var-music: "\f001"; 481 | @fa-var-navicon: "\f0c9"; 482 | @fa-var-neuter: "\f22c"; 483 | @fa-var-newspaper-o: "\f1ea"; 484 | @fa-var-object-group: "\f247"; 485 | @fa-var-object-ungroup: "\f248"; 486 | @fa-var-odnoklassniki: "\f263"; 487 | @fa-var-odnoklassniki-square: "\f264"; 488 | @fa-var-opencart: "\f23d"; 489 | @fa-var-openid: "\f19b"; 490 | @fa-var-opera: "\f26a"; 491 | @fa-var-optin-monster: "\f23c"; 492 | @fa-var-outdent: "\f03b"; 493 | @fa-var-pagelines: "\f18c"; 494 | @fa-var-paint-brush: "\f1fc"; 495 | @fa-var-paper-plane: "\f1d8"; 496 | @fa-var-paper-plane-o: "\f1d9"; 497 | @fa-var-paperclip: "\f0c6"; 498 | @fa-var-paragraph: "\f1dd"; 499 | @fa-var-paste: "\f0ea"; 500 | @fa-var-pause: "\f04c"; 501 | @fa-var-pause-circle: "\f28b"; 502 | @fa-var-pause-circle-o: "\f28c"; 503 | @fa-var-paw: "\f1b0"; 504 | @fa-var-paypal: "\f1ed"; 505 | @fa-var-pencil: "\f040"; 506 | @fa-var-pencil-square: "\f14b"; 507 | @fa-var-pencil-square-o: "\f044"; 508 | @fa-var-percent: "\f295"; 509 | @fa-var-phone: "\f095"; 510 | @fa-var-phone-square: "\f098"; 511 | @fa-var-photo: "\f03e"; 512 | @fa-var-picture-o: "\f03e"; 513 | @fa-var-pie-chart: "\f200"; 514 | @fa-var-pied-piper: "\f2ae"; 515 | @fa-var-pied-piper-alt: "\f1a8"; 516 | @fa-var-pied-piper-pp: "\f1a7"; 517 | @fa-var-pinterest: "\f0d2"; 518 | @fa-var-pinterest-p: "\f231"; 519 | @fa-var-pinterest-square: "\f0d3"; 520 | @fa-var-plane: "\f072"; 521 | @fa-var-play: "\f04b"; 522 | @fa-var-play-circle: "\f144"; 523 | @fa-var-play-circle-o: "\f01d"; 524 | @fa-var-plug: "\f1e6"; 525 | @fa-var-plus: "\f067"; 526 | @fa-var-plus-circle: "\f055"; 527 | @fa-var-plus-square: "\f0fe"; 528 | @fa-var-plus-square-o: "\f196"; 529 | @fa-var-podcast: "\f2ce"; 530 | @fa-var-power-off: "\f011"; 531 | @fa-var-print: "\f02f"; 532 | @fa-var-product-hunt: "\f288"; 533 | @fa-var-puzzle-piece: "\f12e"; 534 | @fa-var-qq: "\f1d6"; 535 | @fa-var-qrcode: "\f029"; 536 | @fa-var-question: "\f128"; 537 | @fa-var-question-circle: "\f059"; 538 | @fa-var-question-circle-o: "\f29c"; 539 | @fa-var-quora: "\f2c4"; 540 | @fa-var-quote-left: "\f10d"; 541 | @fa-var-quote-right: "\f10e"; 542 | @fa-var-ra: "\f1d0"; 543 | @fa-var-random: "\f074"; 544 | @fa-var-ravelry: "\f2d9"; 545 | @fa-var-rebel: "\f1d0"; 546 | @fa-var-recycle: "\f1b8"; 547 | @fa-var-reddit: "\f1a1"; 548 | @fa-var-reddit-alien: "\f281"; 549 | @fa-var-reddit-square: "\f1a2"; 550 | @fa-var-refresh: "\f021"; 551 | @fa-var-registered: "\f25d"; 552 | @fa-var-remove: "\f00d"; 553 | @fa-var-renren: "\f18b"; 554 | @fa-var-reorder: "\f0c9"; 555 | @fa-var-repeat: "\f01e"; 556 | @fa-var-reply: "\f112"; 557 | @fa-var-reply-all: "\f122"; 558 | @fa-var-resistance: "\f1d0"; 559 | @fa-var-retweet: "\f079"; 560 | @fa-var-rmb: "\f157"; 561 | @fa-var-road: "\f018"; 562 | @fa-var-rocket: "\f135"; 563 | @fa-var-rotate-left: "\f0e2"; 564 | @fa-var-rotate-right: "\f01e"; 565 | @fa-var-rouble: "\f158"; 566 | @fa-var-rss: "\f09e"; 567 | @fa-var-rss-square: "\f143"; 568 | @fa-var-rub: "\f158"; 569 | @fa-var-ruble: "\f158"; 570 | @fa-var-rupee: "\f156"; 571 | @fa-var-s15: "\f2cd"; 572 | @fa-var-safari: "\f267"; 573 | @fa-var-save: "\f0c7"; 574 | @fa-var-scissors: "\f0c4"; 575 | @fa-var-scribd: "\f28a"; 576 | @fa-var-search: "\f002"; 577 | @fa-var-search-minus: "\f010"; 578 | @fa-var-search-plus: "\f00e"; 579 | @fa-var-sellsy: "\f213"; 580 | @fa-var-send: "\f1d8"; 581 | @fa-var-send-o: "\f1d9"; 582 | @fa-var-server: "\f233"; 583 | @fa-var-share: "\f064"; 584 | @fa-var-share-alt: "\f1e0"; 585 | @fa-var-share-alt-square: "\f1e1"; 586 | @fa-var-share-square: "\f14d"; 587 | @fa-var-share-square-o: "\f045"; 588 | @fa-var-shekel: "\f20b"; 589 | @fa-var-sheqel: "\f20b"; 590 | @fa-var-shield: "\f132"; 591 | @fa-var-ship: "\f21a"; 592 | @fa-var-shirtsinbulk: "\f214"; 593 | @fa-var-shopping-bag: "\f290"; 594 | @fa-var-shopping-basket: "\f291"; 595 | @fa-var-shopping-cart: "\f07a"; 596 | @fa-var-shower: "\f2cc"; 597 | @fa-var-sign-in: "\f090"; 598 | @fa-var-sign-language: "\f2a7"; 599 | @fa-var-sign-out: "\f08b"; 600 | @fa-var-signal: "\f012"; 601 | @fa-var-signing: "\f2a7"; 602 | @fa-var-simplybuilt: "\f215"; 603 | @fa-var-sitemap: "\f0e8"; 604 | @fa-var-skyatlas: "\f216"; 605 | @fa-var-skype: "\f17e"; 606 | @fa-var-slack: "\f198"; 607 | @fa-var-sliders: "\f1de"; 608 | @fa-var-slideshare: "\f1e7"; 609 | @fa-var-smile-o: "\f118"; 610 | @fa-var-snapchat: "\f2ab"; 611 | @fa-var-snapchat-ghost: "\f2ac"; 612 | @fa-var-snapchat-square: "\f2ad"; 613 | @fa-var-snowflake-o: "\f2dc"; 614 | @fa-var-soccer-ball-o: "\f1e3"; 615 | @fa-var-sort: "\f0dc"; 616 | @fa-var-sort-alpha-asc: "\f15d"; 617 | @fa-var-sort-alpha-desc: "\f15e"; 618 | @fa-var-sort-amount-asc: "\f160"; 619 | @fa-var-sort-amount-desc: "\f161"; 620 | @fa-var-sort-asc: "\f0de"; 621 | @fa-var-sort-desc: "\f0dd"; 622 | @fa-var-sort-down: "\f0dd"; 623 | @fa-var-sort-numeric-asc: "\f162"; 624 | @fa-var-sort-numeric-desc: "\f163"; 625 | @fa-var-sort-up: "\f0de"; 626 | @fa-var-soundcloud: "\f1be"; 627 | @fa-var-space-shuttle: "\f197"; 628 | @fa-var-spinner: "\f110"; 629 | @fa-var-spoon: "\f1b1"; 630 | @fa-var-spotify: "\f1bc"; 631 | @fa-var-square: "\f0c8"; 632 | @fa-var-square-o: "\f096"; 633 | @fa-var-stack-exchange: "\f18d"; 634 | @fa-var-stack-overflow: "\f16c"; 635 | @fa-var-star: "\f005"; 636 | @fa-var-star-half: "\f089"; 637 | @fa-var-star-half-empty: "\f123"; 638 | @fa-var-star-half-full: "\f123"; 639 | @fa-var-star-half-o: "\f123"; 640 | @fa-var-star-o: "\f006"; 641 | @fa-var-steam: "\f1b6"; 642 | @fa-var-steam-square: "\f1b7"; 643 | @fa-var-step-backward: "\f048"; 644 | @fa-var-step-forward: "\f051"; 645 | @fa-var-stethoscope: "\f0f1"; 646 | @fa-var-sticky-note: "\f249"; 647 | @fa-var-sticky-note-o: "\f24a"; 648 | @fa-var-stop: "\f04d"; 649 | @fa-var-stop-circle: "\f28d"; 650 | @fa-var-stop-circle-o: "\f28e"; 651 | @fa-var-street-view: "\f21d"; 652 | @fa-var-strikethrough: "\f0cc"; 653 | @fa-var-stumbleupon: "\f1a4"; 654 | @fa-var-stumbleupon-circle: "\f1a3"; 655 | @fa-var-subscript: "\f12c"; 656 | @fa-var-subway: "\f239"; 657 | @fa-var-suitcase: "\f0f2"; 658 | @fa-var-sun-o: "\f185"; 659 | @fa-var-superpowers: "\f2dd"; 660 | @fa-var-superscript: "\f12b"; 661 | @fa-var-support: "\f1cd"; 662 | @fa-var-table: "\f0ce"; 663 | @fa-var-tablet: "\f10a"; 664 | @fa-var-tachometer: "\f0e4"; 665 | @fa-var-tag: "\f02b"; 666 | @fa-var-tags: "\f02c"; 667 | @fa-var-tasks: "\f0ae"; 668 | @fa-var-taxi: "\f1ba"; 669 | @fa-var-telegram: "\f2c6"; 670 | @fa-var-television: "\f26c"; 671 | @fa-var-tencent-weibo: "\f1d5"; 672 | @fa-var-terminal: "\f120"; 673 | @fa-var-text-height: "\f034"; 674 | @fa-var-text-width: "\f035"; 675 | @fa-var-th: "\f00a"; 676 | @fa-var-th-large: "\f009"; 677 | @fa-var-th-list: "\f00b"; 678 | @fa-var-themeisle: "\f2b2"; 679 | @fa-var-thermometer: "\f2c7"; 680 | @fa-var-thermometer-0: "\f2cb"; 681 | @fa-var-thermometer-1: "\f2ca"; 682 | @fa-var-thermometer-2: "\f2c9"; 683 | @fa-var-thermometer-3: "\f2c8"; 684 | @fa-var-thermometer-4: "\f2c7"; 685 | @fa-var-thermometer-empty: "\f2cb"; 686 | @fa-var-thermometer-full: "\f2c7"; 687 | @fa-var-thermometer-half: "\f2c9"; 688 | @fa-var-thermometer-quarter: "\f2ca"; 689 | @fa-var-thermometer-three-quarters: "\f2c8"; 690 | @fa-var-thumb-tack: "\f08d"; 691 | @fa-var-thumbs-down: "\f165"; 692 | @fa-var-thumbs-o-down: "\f088"; 693 | @fa-var-thumbs-o-up: "\f087"; 694 | @fa-var-thumbs-up: "\f164"; 695 | @fa-var-ticket: "\f145"; 696 | @fa-var-times: "\f00d"; 697 | @fa-var-times-circle: "\f057"; 698 | @fa-var-times-circle-o: "\f05c"; 699 | @fa-var-times-rectangle: "\f2d3"; 700 | @fa-var-times-rectangle-o: "\f2d4"; 701 | @fa-var-tint: "\f043"; 702 | @fa-var-toggle-down: "\f150"; 703 | @fa-var-toggle-left: "\f191"; 704 | @fa-var-toggle-off: "\f204"; 705 | @fa-var-toggle-on: "\f205"; 706 | @fa-var-toggle-right: "\f152"; 707 | @fa-var-toggle-up: "\f151"; 708 | @fa-var-trademark: "\f25c"; 709 | @fa-var-train: "\f238"; 710 | @fa-var-transgender: "\f224"; 711 | @fa-var-transgender-alt: "\f225"; 712 | @fa-var-trash: "\f1f8"; 713 | @fa-var-trash-o: "\f014"; 714 | @fa-var-tree: "\f1bb"; 715 | @fa-var-trello: "\f181"; 716 | @fa-var-tripadvisor: "\f262"; 717 | @fa-var-trophy: "\f091"; 718 | @fa-var-truck: "\f0d1"; 719 | @fa-var-try: "\f195"; 720 | @fa-var-tty: "\f1e4"; 721 | @fa-var-tumblr: "\f173"; 722 | @fa-var-tumblr-square: "\f174"; 723 | @fa-var-turkish-lira: "\f195"; 724 | @fa-var-tv: "\f26c"; 725 | @fa-var-twitch: "\f1e8"; 726 | @fa-var-twitter: "\f099"; 727 | @fa-var-twitter-square: "\f081"; 728 | @fa-var-umbrella: "\f0e9"; 729 | @fa-var-underline: "\f0cd"; 730 | @fa-var-undo: "\f0e2"; 731 | @fa-var-universal-access: "\f29a"; 732 | @fa-var-university: "\f19c"; 733 | @fa-var-unlink: "\f127"; 734 | @fa-var-unlock: "\f09c"; 735 | @fa-var-unlock-alt: "\f13e"; 736 | @fa-var-unsorted: "\f0dc"; 737 | @fa-var-upload: "\f093"; 738 | @fa-var-usb: "\f287"; 739 | @fa-var-usd: "\f155"; 740 | @fa-var-user: "\f007"; 741 | @fa-var-user-circle: "\f2bd"; 742 | @fa-var-user-circle-o: "\f2be"; 743 | @fa-var-user-md: "\f0f0"; 744 | @fa-var-user-o: "\f2c0"; 745 | @fa-var-user-plus: "\f234"; 746 | @fa-var-user-secret: "\f21b"; 747 | @fa-var-user-times: "\f235"; 748 | @fa-var-users: "\f0c0"; 749 | @fa-var-vcard: "\f2bb"; 750 | @fa-var-vcard-o: "\f2bc"; 751 | @fa-var-venus: "\f221"; 752 | @fa-var-venus-double: "\f226"; 753 | @fa-var-venus-mars: "\f228"; 754 | @fa-var-viacoin: "\f237"; 755 | @fa-var-viadeo: "\f2a9"; 756 | @fa-var-viadeo-square: "\f2aa"; 757 | @fa-var-video-camera: "\f03d"; 758 | @fa-var-vimeo: "\f27d"; 759 | @fa-var-vimeo-square: "\f194"; 760 | @fa-var-vine: "\f1ca"; 761 | @fa-var-vk: "\f189"; 762 | @fa-var-volume-control-phone: "\f2a0"; 763 | @fa-var-volume-down: "\f027"; 764 | @fa-var-volume-off: "\f026"; 765 | @fa-var-volume-up: "\f028"; 766 | @fa-var-warning: "\f071"; 767 | @fa-var-wechat: "\f1d7"; 768 | @fa-var-weibo: "\f18a"; 769 | @fa-var-weixin: "\f1d7"; 770 | @fa-var-whatsapp: "\f232"; 771 | @fa-var-wheelchair: "\f193"; 772 | @fa-var-wheelchair-alt: "\f29b"; 773 | @fa-var-wifi: "\f1eb"; 774 | @fa-var-wikipedia-w: "\f266"; 775 | @fa-var-window-close: "\f2d3"; 776 | @fa-var-window-close-o: "\f2d4"; 777 | @fa-var-window-maximize: "\f2d0"; 778 | @fa-var-window-minimize: "\f2d1"; 779 | @fa-var-window-restore: "\f2d2"; 780 | @fa-var-windows: "\f17a"; 781 | @fa-var-won: "\f159"; 782 | @fa-var-wordpress: "\f19a"; 783 | @fa-var-wpbeginner: "\f297"; 784 | @fa-var-wpexplorer: "\f2de"; 785 | @fa-var-wpforms: "\f298"; 786 | @fa-var-wrench: "\f0ad"; 787 | @fa-var-xing: "\f168"; 788 | @fa-var-xing-square: "\f169"; 789 | @fa-var-y-combinator: "\f23b"; 790 | @fa-var-y-combinator-square: "\f1d4"; 791 | @fa-var-yahoo: "\f19e"; 792 | @fa-var-yc: "\f23b"; 793 | @fa-var-yc-square: "\f1d4"; 794 | @fa-var-yelp: "\f1e9"; 795 | @fa-var-yen: "\f157"; 796 | @fa-var-yoast: "\f2b1"; 797 | @fa-var-youtube: "\f167"; 798 | @fa-var-youtube-play: "\f16a"; 799 | @fa-var-youtube-square: "\f166"; 800 | 801 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | // -------------------------- 3 | 4 | $fa-font-path: "../fonts" !default; 5 | $fa-font-size-base: 14px !default; 6 | $fa-line-height-base: 1 !default; 7 | //$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly 8 | $fa-css-prefix: fa !default; 9 | $fa-version: "4.7.0" !default; 10 | $fa-border-color: #eee !default; 11 | $fa-inverse: #fff !default; 12 | $fa-li-width: (30em / 14) !default; 13 | 14 | $fa-var-500px: "\f26e"; 15 | $fa-var-address-book: "\f2b9"; 16 | $fa-var-address-book-o: "\f2ba"; 17 | $fa-var-address-card: "\f2bb"; 18 | $fa-var-address-card-o: "\f2bc"; 19 | $fa-var-adjust: "\f042"; 20 | $fa-var-adn: "\f170"; 21 | $fa-var-align-center: "\f037"; 22 | $fa-var-align-justify: "\f039"; 23 | $fa-var-align-left: "\f036"; 24 | $fa-var-align-right: "\f038"; 25 | $fa-var-amazon: "\f270"; 26 | $fa-var-ambulance: "\f0f9"; 27 | $fa-var-american-sign-language-interpreting: "\f2a3"; 28 | $fa-var-anchor: "\f13d"; 29 | $fa-var-android: "\f17b"; 30 | $fa-var-angellist: "\f209"; 31 | $fa-var-angle-double-down: "\f103"; 32 | $fa-var-angle-double-left: "\f100"; 33 | $fa-var-angle-double-right: "\f101"; 34 | $fa-var-angle-double-up: "\f102"; 35 | $fa-var-angle-down: "\f107"; 36 | $fa-var-angle-left: "\f104"; 37 | $fa-var-angle-right: "\f105"; 38 | $fa-var-angle-up: "\f106"; 39 | $fa-var-apple: "\f179"; 40 | $fa-var-archive: "\f187"; 41 | $fa-var-area-chart: "\f1fe"; 42 | $fa-var-arrow-circle-down: "\f0ab"; 43 | $fa-var-arrow-circle-left: "\f0a8"; 44 | $fa-var-arrow-circle-o-down: "\f01a"; 45 | $fa-var-arrow-circle-o-left: "\f190"; 46 | $fa-var-arrow-circle-o-right: "\f18e"; 47 | $fa-var-arrow-circle-o-up: "\f01b"; 48 | $fa-var-arrow-circle-right: "\f0a9"; 49 | $fa-var-arrow-circle-up: "\f0aa"; 50 | $fa-var-arrow-down: "\f063"; 51 | $fa-var-arrow-left: "\f060"; 52 | $fa-var-arrow-right: "\f061"; 53 | $fa-var-arrow-up: "\f062"; 54 | $fa-var-arrows: "\f047"; 55 | $fa-var-arrows-alt: "\f0b2"; 56 | $fa-var-arrows-h: "\f07e"; 57 | $fa-var-arrows-v: "\f07d"; 58 | $fa-var-asl-interpreting: "\f2a3"; 59 | $fa-var-assistive-listening-systems: "\f2a2"; 60 | $fa-var-asterisk: "\f069"; 61 | $fa-var-at: "\f1fa"; 62 | $fa-var-audio-description: "\f29e"; 63 | $fa-var-automobile: "\f1b9"; 64 | $fa-var-backward: "\f04a"; 65 | $fa-var-balance-scale: "\f24e"; 66 | $fa-var-ban: "\f05e"; 67 | $fa-var-bandcamp: "\f2d5"; 68 | $fa-var-bank: "\f19c"; 69 | $fa-var-bar-chart: "\f080"; 70 | $fa-var-bar-chart-o: "\f080"; 71 | $fa-var-barcode: "\f02a"; 72 | $fa-var-bars: "\f0c9"; 73 | $fa-var-bath: "\f2cd"; 74 | $fa-var-bathtub: "\f2cd"; 75 | $fa-var-battery: "\f240"; 76 | $fa-var-battery-0: "\f244"; 77 | $fa-var-battery-1: "\f243"; 78 | $fa-var-battery-2: "\f242"; 79 | $fa-var-battery-3: "\f241"; 80 | $fa-var-battery-4: "\f240"; 81 | $fa-var-battery-empty: "\f244"; 82 | $fa-var-battery-full: "\f240"; 83 | $fa-var-battery-half: "\f242"; 84 | $fa-var-battery-quarter: "\f243"; 85 | $fa-var-battery-three-quarters: "\f241"; 86 | $fa-var-bed: "\f236"; 87 | $fa-var-beer: "\f0fc"; 88 | $fa-var-behance: "\f1b4"; 89 | $fa-var-behance-square: "\f1b5"; 90 | $fa-var-bell: "\f0f3"; 91 | $fa-var-bell-o: "\f0a2"; 92 | $fa-var-bell-slash: "\f1f6"; 93 | $fa-var-bell-slash-o: "\f1f7"; 94 | $fa-var-bicycle: "\f206"; 95 | $fa-var-binoculars: "\f1e5"; 96 | $fa-var-birthday-cake: "\f1fd"; 97 | $fa-var-bitbucket: "\f171"; 98 | $fa-var-bitbucket-square: "\f172"; 99 | $fa-var-bitcoin: "\f15a"; 100 | $fa-var-black-tie: "\f27e"; 101 | $fa-var-blind: "\f29d"; 102 | $fa-var-bluetooth: "\f293"; 103 | $fa-var-bluetooth-b: "\f294"; 104 | $fa-var-bold: "\f032"; 105 | $fa-var-bolt: "\f0e7"; 106 | $fa-var-bomb: "\f1e2"; 107 | $fa-var-book: "\f02d"; 108 | $fa-var-bookmark: "\f02e"; 109 | $fa-var-bookmark-o: "\f097"; 110 | $fa-var-braille: "\f2a1"; 111 | $fa-var-briefcase: "\f0b1"; 112 | $fa-var-btc: "\f15a"; 113 | $fa-var-bug: "\f188"; 114 | $fa-var-building: "\f1ad"; 115 | $fa-var-building-o: "\f0f7"; 116 | $fa-var-bullhorn: "\f0a1"; 117 | $fa-var-bullseye: "\f140"; 118 | $fa-var-bus: "\f207"; 119 | $fa-var-buysellads: "\f20d"; 120 | $fa-var-cab: "\f1ba"; 121 | $fa-var-calculator: "\f1ec"; 122 | $fa-var-calendar: "\f073"; 123 | $fa-var-calendar-check-o: "\f274"; 124 | $fa-var-calendar-minus-o: "\f272"; 125 | $fa-var-calendar-o: "\f133"; 126 | $fa-var-calendar-plus-o: "\f271"; 127 | $fa-var-calendar-times-o: "\f273"; 128 | $fa-var-camera: "\f030"; 129 | $fa-var-camera-retro: "\f083"; 130 | $fa-var-car: "\f1b9"; 131 | $fa-var-caret-down: "\f0d7"; 132 | $fa-var-caret-left: "\f0d9"; 133 | $fa-var-caret-right: "\f0da"; 134 | $fa-var-caret-square-o-down: "\f150"; 135 | $fa-var-caret-square-o-left: "\f191"; 136 | $fa-var-caret-square-o-right: "\f152"; 137 | $fa-var-caret-square-o-up: "\f151"; 138 | $fa-var-caret-up: "\f0d8"; 139 | $fa-var-cart-arrow-down: "\f218"; 140 | $fa-var-cart-plus: "\f217"; 141 | $fa-var-cc: "\f20a"; 142 | $fa-var-cc-amex: "\f1f3"; 143 | $fa-var-cc-diners-club: "\f24c"; 144 | $fa-var-cc-discover: "\f1f2"; 145 | $fa-var-cc-jcb: "\f24b"; 146 | $fa-var-cc-mastercard: "\f1f1"; 147 | $fa-var-cc-paypal: "\f1f4"; 148 | $fa-var-cc-stripe: "\f1f5"; 149 | $fa-var-cc-visa: "\f1f0"; 150 | $fa-var-certificate: "\f0a3"; 151 | $fa-var-chain: "\f0c1"; 152 | $fa-var-chain-broken: "\f127"; 153 | $fa-var-check: "\f00c"; 154 | $fa-var-check-circle: "\f058"; 155 | $fa-var-check-circle-o: "\f05d"; 156 | $fa-var-check-square: "\f14a"; 157 | $fa-var-check-square-o: "\f046"; 158 | $fa-var-chevron-circle-down: "\f13a"; 159 | $fa-var-chevron-circle-left: "\f137"; 160 | $fa-var-chevron-circle-right: "\f138"; 161 | $fa-var-chevron-circle-up: "\f139"; 162 | $fa-var-chevron-down: "\f078"; 163 | $fa-var-chevron-left: "\f053"; 164 | $fa-var-chevron-right: "\f054"; 165 | $fa-var-chevron-up: "\f077"; 166 | $fa-var-child: "\f1ae"; 167 | $fa-var-chrome: "\f268"; 168 | $fa-var-circle: "\f111"; 169 | $fa-var-circle-o: "\f10c"; 170 | $fa-var-circle-o-notch: "\f1ce"; 171 | $fa-var-circle-thin: "\f1db"; 172 | $fa-var-clipboard: "\f0ea"; 173 | $fa-var-clock-o: "\f017"; 174 | $fa-var-clone: "\f24d"; 175 | $fa-var-close: "\f00d"; 176 | $fa-var-cloud: "\f0c2"; 177 | $fa-var-cloud-download: "\f0ed"; 178 | $fa-var-cloud-upload: "\f0ee"; 179 | $fa-var-cny: "\f157"; 180 | $fa-var-code: "\f121"; 181 | $fa-var-code-fork: "\f126"; 182 | $fa-var-codepen: "\f1cb"; 183 | $fa-var-codiepie: "\f284"; 184 | $fa-var-coffee: "\f0f4"; 185 | $fa-var-cog: "\f013"; 186 | $fa-var-cogs: "\f085"; 187 | $fa-var-columns: "\f0db"; 188 | $fa-var-comment: "\f075"; 189 | $fa-var-comment-o: "\f0e5"; 190 | $fa-var-commenting: "\f27a"; 191 | $fa-var-commenting-o: "\f27b"; 192 | $fa-var-comments: "\f086"; 193 | $fa-var-comments-o: "\f0e6"; 194 | $fa-var-compass: "\f14e"; 195 | $fa-var-compress: "\f066"; 196 | $fa-var-connectdevelop: "\f20e"; 197 | $fa-var-contao: "\f26d"; 198 | $fa-var-copy: "\f0c5"; 199 | $fa-var-copyright: "\f1f9"; 200 | $fa-var-creative-commons: "\f25e"; 201 | $fa-var-credit-card: "\f09d"; 202 | $fa-var-credit-card-alt: "\f283"; 203 | $fa-var-crop: "\f125"; 204 | $fa-var-crosshairs: "\f05b"; 205 | $fa-var-css3: "\f13c"; 206 | $fa-var-cube: "\f1b2"; 207 | $fa-var-cubes: "\f1b3"; 208 | $fa-var-cut: "\f0c4"; 209 | $fa-var-cutlery: "\f0f5"; 210 | $fa-var-dashboard: "\f0e4"; 211 | $fa-var-dashcube: "\f210"; 212 | $fa-var-database: "\f1c0"; 213 | $fa-var-deaf: "\f2a4"; 214 | $fa-var-deafness: "\f2a4"; 215 | $fa-var-dedent: "\f03b"; 216 | $fa-var-delicious: "\f1a5"; 217 | $fa-var-desktop: "\f108"; 218 | $fa-var-deviantart: "\f1bd"; 219 | $fa-var-diamond: "\f219"; 220 | $fa-var-digg: "\f1a6"; 221 | $fa-var-dollar: "\f155"; 222 | $fa-var-dot-circle-o: "\f192"; 223 | $fa-var-download: "\f019"; 224 | $fa-var-dribbble: "\f17d"; 225 | $fa-var-drivers-license: "\f2c2"; 226 | $fa-var-drivers-license-o: "\f2c3"; 227 | $fa-var-dropbox: "\f16b"; 228 | $fa-var-drupal: "\f1a9"; 229 | $fa-var-edge: "\f282"; 230 | $fa-var-edit: "\f044"; 231 | $fa-var-eercast: "\f2da"; 232 | $fa-var-eject: "\f052"; 233 | $fa-var-ellipsis-h: "\f141"; 234 | $fa-var-ellipsis-v: "\f142"; 235 | $fa-var-empire: "\f1d1"; 236 | $fa-var-envelope: "\f0e0"; 237 | $fa-var-envelope-o: "\f003"; 238 | $fa-var-envelope-open: "\f2b6"; 239 | $fa-var-envelope-open-o: "\f2b7"; 240 | $fa-var-envelope-square: "\f199"; 241 | $fa-var-envira: "\f299"; 242 | $fa-var-eraser: "\f12d"; 243 | $fa-var-etsy: "\f2d7"; 244 | $fa-var-eur: "\f153"; 245 | $fa-var-euro: "\f153"; 246 | $fa-var-exchange: "\f0ec"; 247 | $fa-var-exclamation: "\f12a"; 248 | $fa-var-exclamation-circle: "\f06a"; 249 | $fa-var-exclamation-triangle: "\f071"; 250 | $fa-var-expand: "\f065"; 251 | $fa-var-expeditedssl: "\f23e"; 252 | $fa-var-external-link: "\f08e"; 253 | $fa-var-external-link-square: "\f14c"; 254 | $fa-var-eye: "\f06e"; 255 | $fa-var-eye-slash: "\f070"; 256 | $fa-var-eyedropper: "\f1fb"; 257 | $fa-var-fa: "\f2b4"; 258 | $fa-var-facebook: "\f09a"; 259 | $fa-var-facebook-f: "\f09a"; 260 | $fa-var-facebook-official: "\f230"; 261 | $fa-var-facebook-square: "\f082"; 262 | $fa-var-fast-backward: "\f049"; 263 | $fa-var-fast-forward: "\f050"; 264 | $fa-var-fax: "\f1ac"; 265 | $fa-var-feed: "\f09e"; 266 | $fa-var-female: "\f182"; 267 | $fa-var-fighter-jet: "\f0fb"; 268 | $fa-var-file: "\f15b"; 269 | $fa-var-file-archive-o: "\f1c6"; 270 | $fa-var-file-audio-o: "\f1c7"; 271 | $fa-var-file-code-o: "\f1c9"; 272 | $fa-var-file-excel-o: "\f1c3"; 273 | $fa-var-file-image-o: "\f1c5"; 274 | $fa-var-file-movie-o: "\f1c8"; 275 | $fa-var-file-o: "\f016"; 276 | $fa-var-file-pdf-o: "\f1c1"; 277 | $fa-var-file-photo-o: "\f1c5"; 278 | $fa-var-file-picture-o: "\f1c5"; 279 | $fa-var-file-powerpoint-o: "\f1c4"; 280 | $fa-var-file-sound-o: "\f1c7"; 281 | $fa-var-file-text: "\f15c"; 282 | $fa-var-file-text-o: "\f0f6"; 283 | $fa-var-file-video-o: "\f1c8"; 284 | $fa-var-file-word-o: "\f1c2"; 285 | $fa-var-file-zip-o: "\f1c6"; 286 | $fa-var-files-o: "\f0c5"; 287 | $fa-var-film: "\f008"; 288 | $fa-var-filter: "\f0b0"; 289 | $fa-var-fire: "\f06d"; 290 | $fa-var-fire-extinguisher: "\f134"; 291 | $fa-var-firefox: "\f269"; 292 | $fa-var-first-order: "\f2b0"; 293 | $fa-var-flag: "\f024"; 294 | $fa-var-flag-checkered: "\f11e"; 295 | $fa-var-flag-o: "\f11d"; 296 | $fa-var-flash: "\f0e7"; 297 | $fa-var-flask: "\f0c3"; 298 | $fa-var-flickr: "\f16e"; 299 | $fa-var-floppy-o: "\f0c7"; 300 | $fa-var-folder: "\f07b"; 301 | $fa-var-folder-o: "\f114"; 302 | $fa-var-folder-open: "\f07c"; 303 | $fa-var-folder-open-o: "\f115"; 304 | $fa-var-font: "\f031"; 305 | $fa-var-font-awesome: "\f2b4"; 306 | $fa-var-fonticons: "\f280"; 307 | $fa-var-fort-awesome: "\f286"; 308 | $fa-var-forumbee: "\f211"; 309 | $fa-var-forward: "\f04e"; 310 | $fa-var-foursquare: "\f180"; 311 | $fa-var-free-code-camp: "\f2c5"; 312 | $fa-var-frown-o: "\f119"; 313 | $fa-var-futbol-o: "\f1e3"; 314 | $fa-var-gamepad: "\f11b"; 315 | $fa-var-gavel: "\f0e3"; 316 | $fa-var-gbp: "\f154"; 317 | $fa-var-ge: "\f1d1"; 318 | $fa-var-gear: "\f013"; 319 | $fa-var-gears: "\f085"; 320 | $fa-var-genderless: "\f22d"; 321 | $fa-var-get-pocket: "\f265"; 322 | $fa-var-gg: "\f260"; 323 | $fa-var-gg-circle: "\f261"; 324 | $fa-var-gift: "\f06b"; 325 | $fa-var-git: "\f1d3"; 326 | $fa-var-git-square: "\f1d2"; 327 | $fa-var-github: "\f09b"; 328 | $fa-var-github-alt: "\f113"; 329 | $fa-var-github-square: "\f092"; 330 | $fa-var-gitlab: "\f296"; 331 | $fa-var-gittip: "\f184"; 332 | $fa-var-glass: "\f000"; 333 | $fa-var-glide: "\f2a5"; 334 | $fa-var-glide-g: "\f2a6"; 335 | $fa-var-globe: "\f0ac"; 336 | $fa-var-google: "\f1a0"; 337 | $fa-var-google-plus: "\f0d5"; 338 | $fa-var-google-plus-circle: "\f2b3"; 339 | $fa-var-google-plus-official: "\f2b3"; 340 | $fa-var-google-plus-square: "\f0d4"; 341 | $fa-var-google-wallet: "\f1ee"; 342 | $fa-var-graduation-cap: "\f19d"; 343 | $fa-var-gratipay: "\f184"; 344 | $fa-var-grav: "\f2d6"; 345 | $fa-var-group: "\f0c0"; 346 | $fa-var-h-square: "\f0fd"; 347 | $fa-var-hacker-news: "\f1d4"; 348 | $fa-var-hand-grab-o: "\f255"; 349 | $fa-var-hand-lizard-o: "\f258"; 350 | $fa-var-hand-o-down: "\f0a7"; 351 | $fa-var-hand-o-left: "\f0a5"; 352 | $fa-var-hand-o-right: "\f0a4"; 353 | $fa-var-hand-o-up: "\f0a6"; 354 | $fa-var-hand-paper-o: "\f256"; 355 | $fa-var-hand-peace-o: "\f25b"; 356 | $fa-var-hand-pointer-o: "\f25a"; 357 | $fa-var-hand-rock-o: "\f255"; 358 | $fa-var-hand-scissors-o: "\f257"; 359 | $fa-var-hand-spock-o: "\f259"; 360 | $fa-var-hand-stop-o: "\f256"; 361 | $fa-var-handshake-o: "\f2b5"; 362 | $fa-var-hard-of-hearing: "\f2a4"; 363 | $fa-var-hashtag: "\f292"; 364 | $fa-var-hdd-o: "\f0a0"; 365 | $fa-var-header: "\f1dc"; 366 | $fa-var-headphones: "\f025"; 367 | $fa-var-heart: "\f004"; 368 | $fa-var-heart-o: "\f08a"; 369 | $fa-var-heartbeat: "\f21e"; 370 | $fa-var-history: "\f1da"; 371 | $fa-var-home: "\f015"; 372 | $fa-var-hospital-o: "\f0f8"; 373 | $fa-var-hotel: "\f236"; 374 | $fa-var-hourglass: "\f254"; 375 | $fa-var-hourglass-1: "\f251"; 376 | $fa-var-hourglass-2: "\f252"; 377 | $fa-var-hourglass-3: "\f253"; 378 | $fa-var-hourglass-end: "\f253"; 379 | $fa-var-hourglass-half: "\f252"; 380 | $fa-var-hourglass-o: "\f250"; 381 | $fa-var-hourglass-start: "\f251"; 382 | $fa-var-houzz: "\f27c"; 383 | $fa-var-html5: "\f13b"; 384 | $fa-var-i-cursor: "\f246"; 385 | $fa-var-id-badge: "\f2c1"; 386 | $fa-var-id-card: "\f2c2"; 387 | $fa-var-id-card-o: "\f2c3"; 388 | $fa-var-ils: "\f20b"; 389 | $fa-var-image: "\f03e"; 390 | $fa-var-imdb: "\f2d8"; 391 | $fa-var-inbox: "\f01c"; 392 | $fa-var-indent: "\f03c"; 393 | $fa-var-industry: "\f275"; 394 | $fa-var-info: "\f129"; 395 | $fa-var-info-circle: "\f05a"; 396 | $fa-var-inr: "\f156"; 397 | $fa-var-instagram: "\f16d"; 398 | $fa-var-institution: "\f19c"; 399 | $fa-var-internet-explorer: "\f26b"; 400 | $fa-var-intersex: "\f224"; 401 | $fa-var-ioxhost: "\f208"; 402 | $fa-var-italic: "\f033"; 403 | $fa-var-joomla: "\f1aa"; 404 | $fa-var-jpy: "\f157"; 405 | $fa-var-jsfiddle: "\f1cc"; 406 | $fa-var-key: "\f084"; 407 | $fa-var-keyboard-o: "\f11c"; 408 | $fa-var-krw: "\f159"; 409 | $fa-var-language: "\f1ab"; 410 | $fa-var-laptop: "\f109"; 411 | $fa-var-lastfm: "\f202"; 412 | $fa-var-lastfm-square: "\f203"; 413 | $fa-var-leaf: "\f06c"; 414 | $fa-var-leanpub: "\f212"; 415 | $fa-var-legal: "\f0e3"; 416 | $fa-var-lemon-o: "\f094"; 417 | $fa-var-level-down: "\f149"; 418 | $fa-var-level-up: "\f148"; 419 | $fa-var-life-bouy: "\f1cd"; 420 | $fa-var-life-buoy: "\f1cd"; 421 | $fa-var-life-ring: "\f1cd"; 422 | $fa-var-life-saver: "\f1cd"; 423 | $fa-var-lightbulb-o: "\f0eb"; 424 | $fa-var-line-chart: "\f201"; 425 | $fa-var-link: "\f0c1"; 426 | $fa-var-linkedin: "\f0e1"; 427 | $fa-var-linkedin-square: "\f08c"; 428 | $fa-var-linode: "\f2b8"; 429 | $fa-var-linux: "\f17c"; 430 | $fa-var-list: "\f03a"; 431 | $fa-var-list-alt: "\f022"; 432 | $fa-var-list-ol: "\f0cb"; 433 | $fa-var-list-ul: "\f0ca"; 434 | $fa-var-location-arrow: "\f124"; 435 | $fa-var-lock: "\f023"; 436 | $fa-var-long-arrow-down: "\f175"; 437 | $fa-var-long-arrow-left: "\f177"; 438 | $fa-var-long-arrow-right: "\f178"; 439 | $fa-var-long-arrow-up: "\f176"; 440 | $fa-var-low-vision: "\f2a8"; 441 | $fa-var-magic: "\f0d0"; 442 | $fa-var-magnet: "\f076"; 443 | $fa-var-mail-forward: "\f064"; 444 | $fa-var-mail-reply: "\f112"; 445 | $fa-var-mail-reply-all: "\f122"; 446 | $fa-var-male: "\f183"; 447 | $fa-var-map: "\f279"; 448 | $fa-var-map-marker: "\f041"; 449 | $fa-var-map-o: "\f278"; 450 | $fa-var-map-pin: "\f276"; 451 | $fa-var-map-signs: "\f277"; 452 | $fa-var-mars: "\f222"; 453 | $fa-var-mars-double: "\f227"; 454 | $fa-var-mars-stroke: "\f229"; 455 | $fa-var-mars-stroke-h: "\f22b"; 456 | $fa-var-mars-stroke-v: "\f22a"; 457 | $fa-var-maxcdn: "\f136"; 458 | $fa-var-meanpath: "\f20c"; 459 | $fa-var-medium: "\f23a"; 460 | $fa-var-medkit: "\f0fa"; 461 | $fa-var-meetup: "\f2e0"; 462 | $fa-var-meh-o: "\f11a"; 463 | $fa-var-mercury: "\f223"; 464 | $fa-var-microchip: "\f2db"; 465 | $fa-var-microphone: "\f130"; 466 | $fa-var-microphone-slash: "\f131"; 467 | $fa-var-minus: "\f068"; 468 | $fa-var-minus-circle: "\f056"; 469 | $fa-var-minus-square: "\f146"; 470 | $fa-var-minus-square-o: "\f147"; 471 | $fa-var-mixcloud: "\f289"; 472 | $fa-var-mobile: "\f10b"; 473 | $fa-var-mobile-phone: "\f10b"; 474 | $fa-var-modx: "\f285"; 475 | $fa-var-money: "\f0d6"; 476 | $fa-var-moon-o: "\f186"; 477 | $fa-var-mortar-board: "\f19d"; 478 | $fa-var-motorcycle: "\f21c"; 479 | $fa-var-mouse-pointer: "\f245"; 480 | $fa-var-music: "\f001"; 481 | $fa-var-navicon: "\f0c9"; 482 | $fa-var-neuter: "\f22c"; 483 | $fa-var-newspaper-o: "\f1ea"; 484 | $fa-var-object-group: "\f247"; 485 | $fa-var-object-ungroup: "\f248"; 486 | $fa-var-odnoklassniki: "\f263"; 487 | $fa-var-odnoklassniki-square: "\f264"; 488 | $fa-var-opencart: "\f23d"; 489 | $fa-var-openid: "\f19b"; 490 | $fa-var-opera: "\f26a"; 491 | $fa-var-optin-monster: "\f23c"; 492 | $fa-var-outdent: "\f03b"; 493 | $fa-var-pagelines: "\f18c"; 494 | $fa-var-paint-brush: "\f1fc"; 495 | $fa-var-paper-plane: "\f1d8"; 496 | $fa-var-paper-plane-o: "\f1d9"; 497 | $fa-var-paperclip: "\f0c6"; 498 | $fa-var-paragraph: "\f1dd"; 499 | $fa-var-paste: "\f0ea"; 500 | $fa-var-pause: "\f04c"; 501 | $fa-var-pause-circle: "\f28b"; 502 | $fa-var-pause-circle-o: "\f28c"; 503 | $fa-var-paw: "\f1b0"; 504 | $fa-var-paypal: "\f1ed"; 505 | $fa-var-pencil: "\f040"; 506 | $fa-var-pencil-square: "\f14b"; 507 | $fa-var-pencil-square-o: "\f044"; 508 | $fa-var-percent: "\f295"; 509 | $fa-var-phone: "\f095"; 510 | $fa-var-phone-square: "\f098"; 511 | $fa-var-photo: "\f03e"; 512 | $fa-var-picture-o: "\f03e"; 513 | $fa-var-pie-chart: "\f200"; 514 | $fa-var-pied-piper: "\f2ae"; 515 | $fa-var-pied-piper-alt: "\f1a8"; 516 | $fa-var-pied-piper-pp: "\f1a7"; 517 | $fa-var-pinterest: "\f0d2"; 518 | $fa-var-pinterest-p: "\f231"; 519 | $fa-var-pinterest-square: "\f0d3"; 520 | $fa-var-plane: "\f072"; 521 | $fa-var-play: "\f04b"; 522 | $fa-var-play-circle: "\f144"; 523 | $fa-var-play-circle-o: "\f01d"; 524 | $fa-var-plug: "\f1e6"; 525 | $fa-var-plus: "\f067"; 526 | $fa-var-plus-circle: "\f055"; 527 | $fa-var-plus-square: "\f0fe"; 528 | $fa-var-plus-square-o: "\f196"; 529 | $fa-var-podcast: "\f2ce"; 530 | $fa-var-power-off: "\f011"; 531 | $fa-var-print: "\f02f"; 532 | $fa-var-product-hunt: "\f288"; 533 | $fa-var-puzzle-piece: "\f12e"; 534 | $fa-var-qq: "\f1d6"; 535 | $fa-var-qrcode: "\f029"; 536 | $fa-var-question: "\f128"; 537 | $fa-var-question-circle: "\f059"; 538 | $fa-var-question-circle-o: "\f29c"; 539 | $fa-var-quora: "\f2c4"; 540 | $fa-var-quote-left: "\f10d"; 541 | $fa-var-quote-right: "\f10e"; 542 | $fa-var-ra: "\f1d0"; 543 | $fa-var-random: "\f074"; 544 | $fa-var-ravelry: "\f2d9"; 545 | $fa-var-rebel: "\f1d0"; 546 | $fa-var-recycle: "\f1b8"; 547 | $fa-var-reddit: "\f1a1"; 548 | $fa-var-reddit-alien: "\f281"; 549 | $fa-var-reddit-square: "\f1a2"; 550 | $fa-var-refresh: "\f021"; 551 | $fa-var-registered: "\f25d"; 552 | $fa-var-remove: "\f00d"; 553 | $fa-var-renren: "\f18b"; 554 | $fa-var-reorder: "\f0c9"; 555 | $fa-var-repeat: "\f01e"; 556 | $fa-var-reply: "\f112"; 557 | $fa-var-reply-all: "\f122"; 558 | $fa-var-resistance: "\f1d0"; 559 | $fa-var-retweet: "\f079"; 560 | $fa-var-rmb: "\f157"; 561 | $fa-var-road: "\f018"; 562 | $fa-var-rocket: "\f135"; 563 | $fa-var-rotate-left: "\f0e2"; 564 | $fa-var-rotate-right: "\f01e"; 565 | $fa-var-rouble: "\f158"; 566 | $fa-var-rss: "\f09e"; 567 | $fa-var-rss-square: "\f143"; 568 | $fa-var-rub: "\f158"; 569 | $fa-var-ruble: "\f158"; 570 | $fa-var-rupee: "\f156"; 571 | $fa-var-s15: "\f2cd"; 572 | $fa-var-safari: "\f267"; 573 | $fa-var-save: "\f0c7"; 574 | $fa-var-scissors: "\f0c4"; 575 | $fa-var-scribd: "\f28a"; 576 | $fa-var-search: "\f002"; 577 | $fa-var-search-minus: "\f010"; 578 | $fa-var-search-plus: "\f00e"; 579 | $fa-var-sellsy: "\f213"; 580 | $fa-var-send: "\f1d8"; 581 | $fa-var-send-o: "\f1d9"; 582 | $fa-var-server: "\f233"; 583 | $fa-var-share: "\f064"; 584 | $fa-var-share-alt: "\f1e0"; 585 | $fa-var-share-alt-square: "\f1e1"; 586 | $fa-var-share-square: "\f14d"; 587 | $fa-var-share-square-o: "\f045"; 588 | $fa-var-shekel: "\f20b"; 589 | $fa-var-sheqel: "\f20b"; 590 | $fa-var-shield: "\f132"; 591 | $fa-var-ship: "\f21a"; 592 | $fa-var-shirtsinbulk: "\f214"; 593 | $fa-var-shopping-bag: "\f290"; 594 | $fa-var-shopping-basket: "\f291"; 595 | $fa-var-shopping-cart: "\f07a"; 596 | $fa-var-shower: "\f2cc"; 597 | $fa-var-sign-in: "\f090"; 598 | $fa-var-sign-language: "\f2a7"; 599 | $fa-var-sign-out: "\f08b"; 600 | $fa-var-signal: "\f012"; 601 | $fa-var-signing: "\f2a7"; 602 | $fa-var-simplybuilt: "\f215"; 603 | $fa-var-sitemap: "\f0e8"; 604 | $fa-var-skyatlas: "\f216"; 605 | $fa-var-skype: "\f17e"; 606 | $fa-var-slack: "\f198"; 607 | $fa-var-sliders: "\f1de"; 608 | $fa-var-slideshare: "\f1e7"; 609 | $fa-var-smile-o: "\f118"; 610 | $fa-var-snapchat: "\f2ab"; 611 | $fa-var-snapchat-ghost: "\f2ac"; 612 | $fa-var-snapchat-square: "\f2ad"; 613 | $fa-var-snowflake-o: "\f2dc"; 614 | $fa-var-soccer-ball-o: "\f1e3"; 615 | $fa-var-sort: "\f0dc"; 616 | $fa-var-sort-alpha-asc: "\f15d"; 617 | $fa-var-sort-alpha-desc: "\f15e"; 618 | $fa-var-sort-amount-asc: "\f160"; 619 | $fa-var-sort-amount-desc: "\f161"; 620 | $fa-var-sort-asc: "\f0de"; 621 | $fa-var-sort-desc: "\f0dd"; 622 | $fa-var-sort-down: "\f0dd"; 623 | $fa-var-sort-numeric-asc: "\f162"; 624 | $fa-var-sort-numeric-desc: "\f163"; 625 | $fa-var-sort-up: "\f0de"; 626 | $fa-var-soundcloud: "\f1be"; 627 | $fa-var-space-shuttle: "\f197"; 628 | $fa-var-spinner: "\f110"; 629 | $fa-var-spoon: "\f1b1"; 630 | $fa-var-spotify: "\f1bc"; 631 | $fa-var-square: "\f0c8"; 632 | $fa-var-square-o: "\f096"; 633 | $fa-var-stack-exchange: "\f18d"; 634 | $fa-var-stack-overflow: "\f16c"; 635 | $fa-var-star: "\f005"; 636 | $fa-var-star-half: "\f089"; 637 | $fa-var-star-half-empty: "\f123"; 638 | $fa-var-star-half-full: "\f123"; 639 | $fa-var-star-half-o: "\f123"; 640 | $fa-var-star-o: "\f006"; 641 | $fa-var-steam: "\f1b6"; 642 | $fa-var-steam-square: "\f1b7"; 643 | $fa-var-step-backward: "\f048"; 644 | $fa-var-step-forward: "\f051"; 645 | $fa-var-stethoscope: "\f0f1"; 646 | $fa-var-sticky-note: "\f249"; 647 | $fa-var-sticky-note-o: "\f24a"; 648 | $fa-var-stop: "\f04d"; 649 | $fa-var-stop-circle: "\f28d"; 650 | $fa-var-stop-circle-o: "\f28e"; 651 | $fa-var-street-view: "\f21d"; 652 | $fa-var-strikethrough: "\f0cc"; 653 | $fa-var-stumbleupon: "\f1a4"; 654 | $fa-var-stumbleupon-circle: "\f1a3"; 655 | $fa-var-subscript: "\f12c"; 656 | $fa-var-subway: "\f239"; 657 | $fa-var-suitcase: "\f0f2"; 658 | $fa-var-sun-o: "\f185"; 659 | $fa-var-superpowers: "\f2dd"; 660 | $fa-var-superscript: "\f12b"; 661 | $fa-var-support: "\f1cd"; 662 | $fa-var-table: "\f0ce"; 663 | $fa-var-tablet: "\f10a"; 664 | $fa-var-tachometer: "\f0e4"; 665 | $fa-var-tag: "\f02b"; 666 | $fa-var-tags: "\f02c"; 667 | $fa-var-tasks: "\f0ae"; 668 | $fa-var-taxi: "\f1ba"; 669 | $fa-var-telegram: "\f2c6"; 670 | $fa-var-television: "\f26c"; 671 | $fa-var-tencent-weibo: "\f1d5"; 672 | $fa-var-terminal: "\f120"; 673 | $fa-var-text-height: "\f034"; 674 | $fa-var-text-width: "\f035"; 675 | $fa-var-th: "\f00a"; 676 | $fa-var-th-large: "\f009"; 677 | $fa-var-th-list: "\f00b"; 678 | $fa-var-themeisle: "\f2b2"; 679 | $fa-var-thermometer: "\f2c7"; 680 | $fa-var-thermometer-0: "\f2cb"; 681 | $fa-var-thermometer-1: "\f2ca"; 682 | $fa-var-thermometer-2: "\f2c9"; 683 | $fa-var-thermometer-3: "\f2c8"; 684 | $fa-var-thermometer-4: "\f2c7"; 685 | $fa-var-thermometer-empty: "\f2cb"; 686 | $fa-var-thermometer-full: "\f2c7"; 687 | $fa-var-thermometer-half: "\f2c9"; 688 | $fa-var-thermometer-quarter: "\f2ca"; 689 | $fa-var-thermometer-three-quarters: "\f2c8"; 690 | $fa-var-thumb-tack: "\f08d"; 691 | $fa-var-thumbs-down: "\f165"; 692 | $fa-var-thumbs-o-down: "\f088"; 693 | $fa-var-thumbs-o-up: "\f087"; 694 | $fa-var-thumbs-up: "\f164"; 695 | $fa-var-ticket: "\f145"; 696 | $fa-var-times: "\f00d"; 697 | $fa-var-times-circle: "\f057"; 698 | $fa-var-times-circle-o: "\f05c"; 699 | $fa-var-times-rectangle: "\f2d3"; 700 | $fa-var-times-rectangle-o: "\f2d4"; 701 | $fa-var-tint: "\f043"; 702 | $fa-var-toggle-down: "\f150"; 703 | $fa-var-toggle-left: "\f191"; 704 | $fa-var-toggle-off: "\f204"; 705 | $fa-var-toggle-on: "\f205"; 706 | $fa-var-toggle-right: "\f152"; 707 | $fa-var-toggle-up: "\f151"; 708 | $fa-var-trademark: "\f25c"; 709 | $fa-var-train: "\f238"; 710 | $fa-var-transgender: "\f224"; 711 | $fa-var-transgender-alt: "\f225"; 712 | $fa-var-trash: "\f1f8"; 713 | $fa-var-trash-o: "\f014"; 714 | $fa-var-tree: "\f1bb"; 715 | $fa-var-trello: "\f181"; 716 | $fa-var-tripadvisor: "\f262"; 717 | $fa-var-trophy: "\f091"; 718 | $fa-var-truck: "\f0d1"; 719 | $fa-var-try: "\f195"; 720 | $fa-var-tty: "\f1e4"; 721 | $fa-var-tumblr: "\f173"; 722 | $fa-var-tumblr-square: "\f174"; 723 | $fa-var-turkish-lira: "\f195"; 724 | $fa-var-tv: "\f26c"; 725 | $fa-var-twitch: "\f1e8"; 726 | $fa-var-twitter: "\f099"; 727 | $fa-var-twitter-square: "\f081"; 728 | $fa-var-umbrella: "\f0e9"; 729 | $fa-var-underline: "\f0cd"; 730 | $fa-var-undo: "\f0e2"; 731 | $fa-var-universal-access: "\f29a"; 732 | $fa-var-university: "\f19c"; 733 | $fa-var-unlink: "\f127"; 734 | $fa-var-unlock: "\f09c"; 735 | $fa-var-unlock-alt: "\f13e"; 736 | $fa-var-unsorted: "\f0dc"; 737 | $fa-var-upload: "\f093"; 738 | $fa-var-usb: "\f287"; 739 | $fa-var-usd: "\f155"; 740 | $fa-var-user: "\f007"; 741 | $fa-var-user-circle: "\f2bd"; 742 | $fa-var-user-circle-o: "\f2be"; 743 | $fa-var-user-md: "\f0f0"; 744 | $fa-var-user-o: "\f2c0"; 745 | $fa-var-user-plus: "\f234"; 746 | $fa-var-user-secret: "\f21b"; 747 | $fa-var-user-times: "\f235"; 748 | $fa-var-users: "\f0c0"; 749 | $fa-var-vcard: "\f2bb"; 750 | $fa-var-vcard-o: "\f2bc"; 751 | $fa-var-venus: "\f221"; 752 | $fa-var-venus-double: "\f226"; 753 | $fa-var-venus-mars: "\f228"; 754 | $fa-var-viacoin: "\f237"; 755 | $fa-var-viadeo: "\f2a9"; 756 | $fa-var-viadeo-square: "\f2aa"; 757 | $fa-var-video-camera: "\f03d"; 758 | $fa-var-vimeo: "\f27d"; 759 | $fa-var-vimeo-square: "\f194"; 760 | $fa-var-vine: "\f1ca"; 761 | $fa-var-vk: "\f189"; 762 | $fa-var-volume-control-phone: "\f2a0"; 763 | $fa-var-volume-down: "\f027"; 764 | $fa-var-volume-off: "\f026"; 765 | $fa-var-volume-up: "\f028"; 766 | $fa-var-warning: "\f071"; 767 | $fa-var-wechat: "\f1d7"; 768 | $fa-var-weibo: "\f18a"; 769 | $fa-var-weixin: "\f1d7"; 770 | $fa-var-whatsapp: "\f232"; 771 | $fa-var-wheelchair: "\f193"; 772 | $fa-var-wheelchair-alt: "\f29b"; 773 | $fa-var-wifi: "\f1eb"; 774 | $fa-var-wikipedia-w: "\f266"; 775 | $fa-var-window-close: "\f2d3"; 776 | $fa-var-window-close-o: "\f2d4"; 777 | $fa-var-window-maximize: "\f2d0"; 778 | $fa-var-window-minimize: "\f2d1"; 779 | $fa-var-window-restore: "\f2d2"; 780 | $fa-var-windows: "\f17a"; 781 | $fa-var-won: "\f159"; 782 | $fa-var-wordpress: "\f19a"; 783 | $fa-var-wpbeginner: "\f297"; 784 | $fa-var-wpexplorer: "\f2de"; 785 | $fa-var-wpforms: "\f298"; 786 | $fa-var-wrench: "\f0ad"; 787 | $fa-var-xing: "\f168"; 788 | $fa-var-xing-square: "\f169"; 789 | $fa-var-y-combinator: "\f23b"; 790 | $fa-var-y-combinator-square: "\f1d4"; 791 | $fa-var-yahoo: "\f19e"; 792 | $fa-var-yc: "\f23b"; 793 | $fa-var-yc-square: "\f1d4"; 794 | $fa-var-yelp: "\f1e9"; 795 | $fa-var-yen: "\f157"; 796 | $fa-var-yoast: "\f2b1"; 797 | $fa-var-youtube: "\f167"; 798 | $fa-var-youtube-play: "\f16a"; 799 | $fa-var-youtube-square: "\f166"; 800 | 801 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/font-awesome-4.7.0/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/synthetic_css/_synthetic_offline.sass: -------------------------------------------------------------------------------- 1 | =bg($x) 2 | background-color: #dec6a1 3 | background-image: url($x) 4 | background-size: cover 5 | background-attachment: fixed 6 | 7 | 8 | body 9 | &.syn 10 | +bg('紙背景花紋.webp') 11 | font-family: 'Noto Serif SC' 12 | button, input, textarea 13 | font-family: 'Noto Serif SC' 14 | 15 | &.synth 16 | @extend .syn 17 | margin: 0px 18 | strong, b 19 | font-weight: normal 20 | text-shadow: 0px 0px 2px rgba(0, 0, 0, 1) 21 | h1, h2, h3, h4, h5 22 | font-weight: normal 23 | hr 24 | border: none 25 | border-top: 1px solid rgba(120, 50 ,0 ,0.5) 26 | ::-moz-focus-inner 27 | border: none 28 | ::-moz-focus-outer 29 | border: none 30 | 31 | header 32 | &.syn 33 | background: rgba(0, 0, 0, 0.3) 34 | box-shadow: 0px 0px 2vh rgba(0, 0, 0, 0.4) 35 | &.synth 36 | @extend .syn 37 | display: flex 38 | justify-content: center 39 | align-items: center 40 | 41 | div 42 | &.syn 43 | +bg('紙背景花紋模糊.webp') 44 | box-shadow: 0px 0px 1vw rgba(0, 0, 0, 0.6) 45 | &.synth 46 | @extend .syn 47 | margin: 0.5vw 48 | padding: 0.5vw 49 | border-radius: 0.5vw 50 | overflow-y: auto 51 | &::-webkit-scrollbar 52 | cursor: pointer 53 | width: 20px 54 | background-image: -webkit-linear-gradient(0deg, transparent 40%, rgba(0,0,0,0.2)40%,rgba(0,0,0,0.2)60%,transparent 60%, transparent) 55 | border-radius: 16px 56 | &::-webkit-scrollbar-thumb 57 | border-radius: 0.5vw 58 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.35), 0px 0px 10px rgba(255, 255, 255, 1) inset 59 | background: rgba(255,255,200,0.65) 60 | backdrop-filter: blur(4px) 61 | 62 | table 63 | &.syn 64 | border-radius: 2px 65 | border-collapse: collapse 66 | border-style: hidden 67 | box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5) 68 | th 69 | background-color: rgba(0, 0, 0, 0.08) 70 | td,th 71 | padding: 0.2em 1em 72 | text-align: center 73 | vertical-align: center 74 | border: 1px solid rgba(0, 0, 0, 0.5) 75 | &.synth 76 | @extend .syn 77 | 78 | button, a 79 | &.syn 80 | $shadow_range: 0.8vw 81 | 82 | outline: none 83 | border: none 84 | -webkit-user-select: none 85 | text-decoration: none 86 | 87 | color: inherit 88 | cursor: pointer 89 | 90 | +bg('./紙背景花紋模糊.webp') 91 | 92 | box-shadow: 0px 0px $shadow_range rgba(0, 0, 0, 0.6), 0px 0px $shadow_range/2 rgba(0, 0, 0, 0) inset 93 | filter: brightness(1.05) hue-rotate(-6deg) 94 | 95 | transition: box-shadow 0.2s, filter 0.1s 96 | &:enabled 97 | &:hover 98 | box-shadow: 0px 0px $shadow_range/2 rgba(0, 0, 0, 0.7), 0px 0px $shadow_range/2 rgba(0, 0, 0, 0) inset 99 | filter: brightness(1.1) hue-rotate(-12deg) 100 | &:active 101 | box-shadow: 0px 0px $shadow_range/2 rgba(0, 0, 0, 0), 0px 0px $shadow_range/2 rgba(0, 0, 0, 0.6) inset 102 | filter: blur(0.1vw) 103 | &:disabled 104 | cursor: not-allowed 105 | color: rgba(0, 0, 0, 0.6) 106 | 107 | &.synth 108 | @extend .syn 109 | font-size: inherit 110 | display: inline-block 111 | padding: 0.5vw 112 | margin: 0.5vw 113 | border-radius: 0.5vw 114 | 115 | 116 | blockquote 117 | &.syn 118 | color: rgba(0, 0, 60, 1) 119 | border-left: 3px solid rgba(0, 0, 0, 0.4) 120 | &.synth 121 | @extend .syn 122 | padding-left: 6px 123 | margin-left: 6px 124 | 125 | img 126 | &.syn 127 | box-shadow: 0px 0px 1vw rgba(0, 0, 0, 0.6) 128 | border-radius: 0.5vw 129 | &.synth 130 | @extend .syn 131 | margin: 0.5vw 132 | 133 | 134 | hr 135 | &.syn 136 | width: 90% 137 | &.synth 138 | border: none !important 139 | height: 6px 140 | border-radius: 40% 141 | background: rgba(0, 0, 0, 0.2) 142 | 143 | input[type="range"] 144 | &.syn 145 | outline: none 146 | -webkit-appearance: none 147 | -moz-appearance: none 148 | background: linear-gradient(rgba(0,0,0,0.3), rgba(0,0,0,0.2), rgba(0,0,0,0.3)) 149 | border-radius: 5px 150 | height: 5px 151 | transition: all 0.2s 152 | &:hover 153 | transform: scaleY(2) 154 | // 其實乘好不總是1我也不知道怎麼辦…… 155 | &::-webkit-slider-thumb 156 | transform: scaleY(0.5) 157 | &::-moz-range-thumb 158 | transform: scaleY(0.5) 159 | 160 | &::-webkit-slider-thumb 161 | transition: all 0.2s 162 | cursor: pointer 163 | -webkit-appearance: none 164 | height: 20px 165 | width: 20px 166 | border-radius: 100% 167 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5), 0px 0px 10px rgba(255, 255, 255, 1) inset 168 | background: rgba(255,255,200,0.5) 169 | &::-moz-range-thumb 170 | transition: all 0.2s 171 | cursor: pointer 172 | height: 20px 173 | width: 20px 174 | border-radius: 100% 175 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5), 0px 0px 10px rgba(255, 255, 255, 1) inset 176 | background: rgba(255,255,200,0.5) 177 | &.synth 178 | @extend .syn 179 | 180 | input[type="checkbox"] 181 | &.syn 182 | -webkit-appearance: none 183 | -moz-appearance: none 184 | outline: none 185 | cursor: pointer 186 | height: 20px 187 | width: 20px 188 | border-radius: 100% 189 | background-color: rgba(0,0,0,0.15) 190 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0), 0px 0px 10px rgba(0, 0, 0, 0.4) inset 191 | transition: all 0.2s 192 | 193 | display: flex 194 | justify-content: center 195 | align-items: center 196 | &::before 197 | font-size: 16px 198 | content: '✗' 199 | color: rgba(0,0,0,0) 200 | text-shadow: 0px 0px 1px rgba(0, 0, 0, 0.8) 201 | &:checked 202 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5), 0px 0px 10px rgba(255, 255, 255, 1) inset 203 | background: rgba(255,255,200,0.5) 204 | &::before 205 | content: '✓' 206 | text-shadow: 0px 0px 2px rgba(255, 0, 0, 0.8) 207 | &.synth 208 | @extend .syn 209 | 210 | input[type="text"], input[type="password"], input[type="number"] 211 | &.syn 212 | background: rgba(0,0,0,0) 213 | outline: none 214 | border: solid 1px rgba(0,0,0,0.3) 215 | border-radius: 2px 216 | padding: 2px 217 | 218 | &.synth 219 | @extend .syn 220 | border: none 221 | border-radius: 0px 222 | border-bottom: solid 1px rgba(55,55,0,0.6) 223 | border-top: solid 1px rgba(0,0,0,0) 224 | text-align: center 225 | &:hover 226 | padding: 0px 2px 227 | border-top: solid 3px rgba(0,0,0,0) 228 | border-bottom: solid 3px rgba(55,55,0,0.4) 229 | 230 | textarea 231 | &.syn 232 | background: rgba(0,0,0,0) 233 | outline: none 234 | border: solid 1px rgba(0,0,0,0.3) 235 | border-radius: 2px 236 | 237 | progress 238 | &.syn 239 | -webkit-appearance: none 240 | -moz-appearence: none 241 | appearance: none 242 | background: transparent 243 | border: 1px solid rgba(0, 0, 0, 0.15) 244 | border-radius: 3px 245 | box-shadow: 0px 0px 8px rgba(0,0,0,0.3) inset 246 | background: rgba(0,0,0,0.2) 247 | &::-webkit-progress-bar 248 | background: transparent 249 | &::-webkit-progress-value 250 | background: transparent 251 | border-radius: 3px 252 | border-right: 1px solid rgba(0, 0, 0, 0.3) 253 | backdrop-filter: saturate(0.8) contrast(1.8) brightness(1.3) 254 | 255 | &::-moz-progress-bar 256 | +bg('紙背景花紋模糊.webp') 257 | border-radius: 3px 258 | filter: brightness(0.8) saturate(0.8) contrast(1.8) brightness(1.3) 259 | 260 | &.synth 261 | @extend .syn 262 | display: flex 263 | justify-content: center 264 | align-items: center 265 | height: 24px 266 | margin: 4px 267 | &::after 268 | content: attr(value)"/"attr(max) 269 | position: absolute 270 | opacity: 0.75 271 | text-shadow: 0px 0px 3px rgba(0, 0, 0, 1) 272 | color: #ffd 273 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/synthetic_css/synthetic_offline.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | body.syn, body.synth { 3 | background-color: #dec6a1; 4 | background-image: url("紙背景花紋.webp"); 5 | background-size: cover; 6 | background-attachment: fixed; 7 | font-family: "Noto Serif SC"; } 8 | body.syn button, body.synth button, body.syn input, body.synth input, body.syn textarea, body.synth textarea { 9 | font-family: "Noto Serif SC"; } 10 | body.synth { 11 | margin: 0px; } 12 | body.synth strong, body.synth b { 13 | font-weight: normal; 14 | text-shadow: 0px 0px 2px black; } 15 | body.synth h1, body.synth h2, body.synth h3, body.synth h4, body.synth h5 { 16 | font-weight: normal; } 17 | body.synth hr { 18 | border: none; 19 | border-top: 1px solid rgba(120, 50, 0, 0.5); } 20 | body.synth ::-moz-focus-inner { 21 | border: none; } 22 | body.synth ::-moz-focus-outer { 23 | border: none; } 24 | 25 | header.syn, header.synth { 26 | background: rgba(0, 0, 0, 0.3); 27 | box-shadow: 0px 0px 2vh rgba(0, 0, 0, 0.4); } 28 | header.synth { 29 | display: flex; 30 | justify-content: center; 31 | align-items: center; } 32 | 33 | div.syn, div.synth { 34 | background-color: #dec6a1; 35 | background-image: url("紙背景花紋模糊.webp"); 36 | background-size: cover; 37 | background-attachment: fixed; 38 | box-shadow: 0px 0px 1vw rgba(0, 0, 0, 0.6); } 39 | div.synth { 40 | margin: 0.5vw; 41 | padding: 0.5vw; 42 | border-radius: 0.5vw; 43 | overflow-y: auto; } 44 | div.synth::-webkit-scrollbar { 45 | cursor: pointer; 46 | width: 20px; 47 | background-image: -webkit-linear-gradient(0deg, transparent 40%, rgba(0, 0, 0, 0.2) 40%, rgba(0, 0, 0, 0.2) 60%, transparent 60%, transparent); 48 | border-radius: 16px; } 49 | div.synth::-webkit-scrollbar-thumb { 50 | border-radius: 0.5vw; 51 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.35), 0px 0px 10px white inset; 52 | background: rgba(255, 255, 200, 0.65); 53 | backdrop-filter: blur(4px); } 54 | 55 | table.syn, table.synth { 56 | border-radius: 2px; 57 | border-collapse: collapse; 58 | border-style: hidden; 59 | box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5); } 60 | table.syn th, table.synth th { 61 | background-color: rgba(0, 0, 0, 0.08); } 62 | table.syn td, table.synth td, table.syn th, table.synth th { 63 | padding: 0.2em 1em; 64 | text-align: center; 65 | vertical-align: center; 66 | border: 1px solid rgba(0, 0, 0, 0.5); } 67 | 68 | button.syn, button.synth, a.syn, a.synth { 69 | outline: none; 70 | border: none; 71 | -webkit-user-select: none; 72 | text-decoration: none; 73 | color: inherit; 74 | cursor: pointer; 75 | background-color: #dec6a1; 76 | background-image: url("./紙背景花紋模糊.webp"); 77 | background-size: cover; 78 | background-attachment: fixed; 79 | box-shadow: 0px 0px 0.8vw rgba(0, 0, 0, 0.6), 0px 0px 0.4vw rgba(0, 0, 0, 0) inset; 80 | filter: brightness(1.05) hue-rotate(-6deg); 81 | transition: box-shadow 0.2s, filter 0.1s; } 82 | button.syn:enabled:hover, button.synth:enabled:hover, a.syn:enabled:hover, a.synth:enabled:hover { 83 | box-shadow: 0px 0px 0.4vw rgba(0, 0, 0, 0.7), 0px 0px 0.4vw rgba(0, 0, 0, 0) inset; 84 | box-shadow-filter: brightness(1.1) hue-rotate(-12deg); } 85 | button.syn:enabled:active, button.synth:enabled:active, a.syn:enabled:active, a.synth:enabled:active { 86 | box-shadow: 0px 0px 0.4vw rgba(0, 0, 0, 0), 0px 0px 0.4vw rgba(0, 0, 0, 0.6) inset; 87 | filter: blur(0.1vw); } 88 | button.syn:disabled, button.synth:disabled, a.syn:disabled, a.synth:disabled { 89 | cursor: not-allowed; 90 | color: rgba(0, 0, 0, 0.6); } 91 | button.synth, a.synth { 92 | font-size: inherit; 93 | display: inline-block; 94 | padding: 0.5vw; 95 | margin: 0.5vw; 96 | border-radius: 0.5vw; } 97 | 98 | blockquote.syn, blockquote.synth { 99 | color: #00003c; 100 | border-left: 3px solid rgba(0, 0, 0, 0.4); } 101 | blockquote.synth { 102 | padding-left: 6px; 103 | margin-left: 6px; } 104 | 105 | img.syn, img.synth { 106 | box-shadow: 0px 0px 1vw rgba(0, 0, 0, 0.6); 107 | border-radius: 0.5vw; } 108 | img.synth { 109 | margin: 0.5vw; } 110 | 111 | hr.syn { 112 | width: 90%; } 113 | hr.synth { 114 | border: none !important; 115 | height: 6px; 116 | border-radius: 40%; 117 | background: rgba(0, 0, 0, 0.2); } 118 | 119 | input[type="range"].syn, input[type="range"].synth { 120 | outline: none; 121 | -webkit-appearance: none; 122 | -moz-appearance: none; 123 | background: linear-gradient(rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.3)); 124 | border-radius: 5px; 125 | height: 5px; 126 | transition: all 0.2s; } 127 | input[type="range"].syn:hover, input[type="range"].synth:hover { 128 | transform: scaleY(2); } 129 | input[type="range"].syn:hover::-webkit-slider-thumb, input[type="range"].synth:hover::-webkit-slider-thumb { 130 | transform: scaleY(0.5); } 131 | input[type="range"].syn:hover::-moz-range-thumb, input[type="range"].synth:hover::-moz-range-thumb { 132 | transform: scaleY(0.5); } 133 | input[type="range"].syn::-webkit-slider-thumb, input[type="range"].synth::-webkit-slider-thumb { 134 | transition: all 0.2s; 135 | cursor: pointer; 136 | -webkit-appearance: none; 137 | height: 20px; 138 | width: 20px; 139 | border-radius: 100%; 140 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5), 0px 0px 10px white inset; 141 | background: rgba(255, 255, 200, 0.5); } 142 | input[type="range"].syn::-moz-range-thumb, input[type="range"].synth::-moz-range-thumb { 143 | transition: all 0.2s; 144 | cursor: pointer; 145 | height: 20px; 146 | width: 20px; 147 | border-radius: 100%; 148 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5), 0px 0px 10px white inset; 149 | background: rgba(255, 255, 200, 0.5); } 150 | 151 | input[type="checkbox"].syn, input[type="checkbox"].synth { 152 | -webkit-appearance: none; 153 | -moz-appearance: none; 154 | outline: none; 155 | cursor: pointer; 156 | height: 20px; 157 | width: 20px; 158 | border-radius: 100%; 159 | background-color: rgba(0, 0, 0, 0.15); 160 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0), 0px 0px 10px rgba(0, 0, 0, 0.4) inset; 161 | transition: all 0.2s; 162 | display: flex; 163 | justify-content: center; 164 | align-items: center; } 165 | input[type="checkbox"].syn::before, input[type="checkbox"].synth::before { 166 | font-size: 16px; 167 | content: "✗"; 168 | color: rgba(0, 0, 0, 0); 169 | text-shadow: 0px 0px 1px rgba(0, 0, 0, 0.8); } 170 | input[type="checkbox"].syn:checked, input[type="checkbox"].synth:checked { 171 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5), 0px 0px 10px white inset; 172 | background: rgba(255, 255, 200, 0.5); } 173 | input[type="checkbox"].syn:checked::before, input[type="checkbox"].synth:checked::before { 174 | content: "✓"; 175 | text-shadow: 0px 0px 2px rgba(255, 0, 0, 0.8); } 176 | 177 | input[type="text"].syn, input[type="text"].synth, input[type="password"].syn, input[type="password"].synth, input[type="number"].syn, input[type="number"].synth { 178 | background: rgba(0, 0, 0, 0); 179 | outline: none; 180 | border: solid 1px rgba(0, 0, 0, 0.3); 181 | border-radius: 2px; 182 | padding: 2px; } 183 | input[type="text"].synth, input[type="password"].synth, input[type="number"].synth { 184 | border: none; 185 | border-radius: 0px; 186 | border-bottom: solid 1px rgba(55, 55, 0, 0.6); 187 | border-top: solid 1px rgba(0, 0, 0, 0); 188 | text-align: center; } 189 | input[type="text"].synth:hover, input[type="password"].synth:hover, input[type="number"].synth:hover { 190 | padding: 0px 2px; 191 | border-top: solid 3px rgba(0, 0, 0, 0); 192 | border-bottom: solid 3px rgba(55, 55, 0, 0.4); } 193 | 194 | textarea.syn { 195 | background: rgba(0, 0, 0, 0); 196 | outline: none; 197 | border: solid 1px rgba(0, 0, 0, 0.3); 198 | border-radius: 2px; } 199 | 200 | progress.syn, progress.synth { 201 | -webkit-appearance: none; 202 | -moz-appearence: none; 203 | appearance: none; 204 | background: transparent; 205 | border: 1px solid rgba(0, 0, 0, 0.15); 206 | border-radius: 3px; 207 | box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.3) inset; 208 | background: rgba(0, 0, 0, 0.2); } 209 | progress.syn::-webkit-progress-bar, progress.synth::-webkit-progress-bar { 210 | background: transparent; } 211 | progress.syn::-webkit-progress-value, progress.synth::-webkit-progress-value { 212 | background: transparent; 213 | border-radius: 3px; 214 | border-right: 1px solid rgba(0, 0, 0, 0.3); 215 | backdrop-filter: saturate(0.8) contrast(1.8) brightness(1.3); } 216 | progress.syn::-moz-progress-bar, progress.synth::-moz-progress-bar { 217 | background-color: #dec6a1; 218 | background-image: url("紙背景花紋模糊.webp"); 219 | background-size: cover; 220 | background-attachment: fixed; 221 | border-radius: 3px; 222 | filter: brightness(0.8) saturate(0.8) contrast(1.8) brightness(1.3); } 223 | progress.synth { 224 | display: flex; 225 | justify-content: center; 226 | align-items: center; 227 | height: 24px; 228 | margin: 4px; } 229 | progress.synth::after { 230 | content: attr(value) "/" attr(max); 231 | position: absolute; 232 | opacity: 0.75; 233 | text-shadow: 0px 0px 3px black; 234 | color: #ffd; } 235 | 236 | /*# sourceMappingURL=synthetic.css.map */ 237 | -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/synthetic_css/紙背景花紋.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/synthetic_css/紙背景花紋.webp -------------------------------------------------------------------------------- /librian/librian本體/前端/黑科技/synthetic_css/紙背景花紋模糊.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/黑科技/synthetic_css/紙背景花紋模糊.webp -------------------------------------------------------------------------------- /librian/librian本體/前端/默認標題畫面/定位.coffee: -------------------------------------------------------------------------------- 1 | window.onload = -> 2 | x = y = now_x = now_y = 0; 3 | body = document.querySelector('body') 4 | body.onmousemove = (e) => 5 | now_x = e.pageX 6 | now_y = e.pageY 7 | 循环 = -> 8 | x = (x*9 + now_x)/10 9 | y = (y*9 + now_y)/10 10 | body.style.setProperty('--x', "#{-x/100}px") 11 | body.style.setProperty('--y', "#{-y/100}px") 12 | body.style.setProperty('--s', "#{x/20}deg") 13 | setTimeout(循环, 15) 14 | 循环() -------------------------------------------------------------------------------- /librian/librian本體/前端/默認標題畫面/定位.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 2.5.0 2 | (function() { 3 | window.onload = function() { 4 | var body, now_x, now_y, x, y, 循环; 5 | x = y = now_x = now_y = 0; 6 | body = document.querySelector('body'); 7 | body.onmousemove = (e) => { 8 | now_x = e.pageX; 9 | return now_y = e.pageY; 10 | }; 11 | 循环 = function() { 12 | x = (x * 9 + now_x) / 10; 13 | y = (y * 9 + now_y) / 10; 14 | body.style.setProperty('--x', `${-x / 100}px`); 15 | body.style.setProperty('--y', `${-y / 100}px`); 16 | body.style.setProperty('--s', `${x / 20}deg`); 17 | return setTimeout(循环, 15); 18 | }; 19 | return 循环(); 20 | }; 21 | 22 | }).call(this); 23 | -------------------------------------------------------------------------------- /librian/librian本體/前端/默認標題畫面/標題.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
10 |
11 |
12 |
13 | 14 | 開始遊戲 15 | 16 |
17 |
18 | 19 | 繼續遊戲 20 | 21 |
22 |
23 | 24 | 退出 25 | 26 |
27 |
28 | 29 | 30 | -------------------------------------------------------------------------------- /librian/librian本體/前端/默認標題畫面/標題.ptml: -------------------------------------------------------------------------------- 1 | html: 2 | head: 3 | meta http-equiv="Content-Type" content="text/html; charset=utf-8"; 4 | link rel='stylesheet' href='./樣式.css'; 5 | script src="./定位.js": 6 | body.synth: 7 | div#bb: 8 | div#bg2: 9 | div.主: 10 | div: 11 | a href='javascript:山彥.開始();': 12 | 開始遊戲 13 | div: 14 | a href='javascript:山彥.讀檔畫面();': 15 | 繼續遊戲 16 | div: 17 | a href='javascript:山彥.退出();': 18 | 退出 -------------------------------------------------------------------------------- /librian/librian本體/前端/默認標題畫面/樣式.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 思源宋體SemiBold; 3 | src: url('../dist/NotoSerifSC-SemiBold.otf'); 4 | } 5 | 6 | @keyframes a { 7 | 0% { 8 | opacity: 0; 9 | } 10 | 100% { 11 | opacity: 1; 12 | } 13 | } 14 | 15 | :root { 16 | --x: 0px; 17 | --y: 0px; 18 | } 19 | 20 | body { 21 | font-family: 思源宋體SemiBold !important; 22 | font-size: 1.6vw; 23 | text-shadow: 0px 0px 5px #FFF; 24 | overflow: hidden; 25 | animation-name: a; 26 | animation-duration: 1s; 27 | animation-delay: 0.2s; 28 | animation-fill-mode: both; 29 | background-color: #dec6a1; 30 | background-image: url('../dist/紙背景花紋.webp'); 31 | background-size: cover; 32 | background-attachment: fixed; 33 | } 34 | 35 | a { 36 | padding: 1vw 1.5vw; 37 | display: inline-block; 38 | outline: none; 39 | border: none; 40 | -webkit-user-select: none; 41 | text-decoration: none; 42 | color: inherit; 43 | cursor: pointer; 44 | background-image: url('../dist/紙背景花紋模糊.webp'); 45 | background-size: cover; 46 | background-attachment: fixed; 47 | box-shadow: 0px 0px 0.8vw rgba(0, 0, 0, 0.6), 0px 0px 0.4vw rgba(0, 0, 0, 0) inset; 48 | filter: brightness(1.05) hue-rotate(-6deg); 49 | transition: box-shadow 0.2s, filter 0.1s; 50 | font-size: inherit; 51 | margin: 0.5vw; 52 | border-radius: 0.5vw; 53 | } 54 | 55 | a:hover { 56 | box-shadow: 0px 0px 0.4vw rgba(0, 0, 0, 0.7), 0px 0px 0.4vw rgba(0, 0, 0, 0) inset; 57 | filter: brightness(1.1) hue-rotate(-12deg); 58 | } 59 | 60 | a:active { 61 | box-shadow: 0px 0px 0.4vw rgba(0, 0, 0, 0), 0px 0px 0.4vw rgba(0, 0, 0, 0.6) inset; 62 | filter: blur(0.1vw); 63 | } 64 | 65 | #bb { 66 | filter: drop-shadow(var(--x) var(--y) 0.8vw rgba(0, 0, 0, 0.6)); 67 | position: fixed; 68 | top: 0; 69 | left: 0; 70 | width: 100%; 71 | height: 100%; 72 | margin: 0; 73 | padding: 0; 74 | z-index: -1; 75 | } 76 | 77 | #bg2 { 78 | -webkit-mask-image: url('虛僞的假面.png'); 79 | -webkit-mask-size: cover; 80 | filter: hue-rotate(var(--s)); 81 | background: url('../dist/紙背景花紋模糊.webp'); 82 | background-size: cover; 83 | width: 100%; 84 | height: 100%; 85 | } 86 | 87 | .主 { 88 | font-size: 250%; 89 | line-height: 150%; 90 | margin-left: 50%; 91 | margin-top: 10%; 92 | } 93 | 94 | .主>div { 95 | margin: 8%; 96 | } -------------------------------------------------------------------------------- /librian/librian本體/前端/默認標題畫面/虛僞的假面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/前端/默認標題畫面/虛僞的假面.png -------------------------------------------------------------------------------- /librian/librian本體/土特產/liber.sublime-syntax: -------------------------------------------------------------------------------- 1 | %YAML 1.2 2 | --- 3 | # See http://www.sublimetext.com/docs/3/syntax.html 4 | file_extensions: 5 | - play 6 | - liber 7 | scope: source.liber 8 | 9 | contexts: 10 | main: 11 | - include: 註釋 12 | - include: 對話 13 | - include: 嵌入py 14 | - include: 嵌入html 15 | - include: 嵌入js 16 | - include: 躍點 17 | - include: 功能 18 | - include: 鏡頭 19 | - include: 鏡頭 20 | - include: 跳轉 21 | - include: 圖片 22 | - include: 持續 23 | - include: 旁白 24 | 25 | 註釋: 26 | - match: '^#' 27 | scope: punctuation.definition.comment.liber 28 | push: 29 | - meta_scope: comment.line.double-slash.liber 30 | - match: $ 31 | pop: true 32 | 33 | 躍點: 34 | - match: '\*' 35 | push: 36 | - meta_scope: keyword.control.label.liber 37 | - match: $ 38 | pop: true 39 | 40 | 功能: 41 | - match: '^>' 42 | scope: support.function.builtin.liber 43 | push: 44 | - match: '$' 45 | pop: true 46 | - match: '(?=\S+\(.*\))' 47 | push: 48 | - include: 'scope:source.python' 49 | with_prototype: 50 | - match: $ 51 | pop: true 52 | - match: '\w+\b' 53 | scope: variable.function.liber 54 | push: 55 | - meta_include_prototype: true 56 | - meta_scope: variable.parameter.liber 57 | - match: '$' 58 | pop: true 59 | - match: '$' 60 | pop: true 61 | 62 | 對話: 63 | - match: '(^[^\)]+?)(?=(?=[ ::\||🐴\(\[「"])(?:\s*[\||🐴]\s*([^\s\)]*?))?\s*\[[^\]\s]*?\]\s*?(?![\(「"::])$)' 64 | scope: entity.name.tag.liber 65 | push: 66 | - match: '[\||🐴]' 67 | scope: keyword.operator.binary.liber 68 | - match: '\[\S*\]' 69 | scope: invalid.illegal.missing-attribute.liber 70 | - match: $ 71 | pop: true 72 | - match: (^[^>+-?"「 ]\S*?)(?=(?=[ ::\||🐴\(\[「"])(?:[\||🐴]\s*(\S*?))?(?:\s*(\(.+?)?|\s*(\[.+?)?)*(\s*(?:[::].*)|\s*(?:[「"].*)?$)) 73 | scope: entity.name.tag.liber 74 | push: 75 | - include: 文本 76 | - match: '(?:\[\S*\]|\(\S*\))\s*(?:\[\S*\]|\(\S*\))\s*(?:\[\S*\]|\(\S*\))+' 77 | scope: invalid.illegal.unexpected-attribute.liber 78 | - match: '(\[\S*\]\s*\(\S*\))' 79 | scope: invalid.illegal.attribute-order.liber 80 | - match: '[\)\]]' 81 | scope: invalid.illegal.stray-bracket-end.liber 82 | - match: '\(' 83 | scope: punctuation.definition.delimeter.parenthesis.liber 84 | push: 85 | - meta_scope: entity.other.attribute-name.liber 86 | - match: '\s' 87 | pop: true 88 | - match: '\)' 89 | pop: true 90 | - match: '\[' 91 | scope: punctuation.definition.delimeter.brackets.liber 92 | push: 93 | - meta_scope: entity.other.attribute-name.liber 94 | - match: \s 95 | pop: true 96 | - match: '\]' 97 | pop: true 98 | - match: '\s+[\||🐴]\s+|\s+[\||🐴]|[\||🐴]\s+' 99 | scope: invalid.illegal.extra-spaces.liber 100 | - match: '[\||🐴]' 101 | scope: keyword.operator.binary.liber 102 | - match: '(?<=.)[::]' 103 | scope: keyword.operator.binary.liber 104 | - match: '(?<=(」|"))' 105 | pop: true 106 | - match: '$' 107 | pop: true 108 | 109 | 鏡頭: 110 | - match: '^[+-]' 111 | scope: support.function.builtin.liber 112 | push: 113 | - match: '$' 114 | pop: true 115 | - match: '' 116 | push: 117 | - include: 'scope:source.yaml' 118 | with_prototype: 119 | - match: $ 120 | pop: true 121 | 122 | 旁白: 123 | - match: ^.+ 124 | scope: text.plain.liber 125 | 126 | 文本: 127 | - match: '「[\s\S]*?' 128 | scope: punctuation.definition.string.liber 129 | push: 130 | - meta_scope: string.quoted.ideographic.liber 131 | - match: '」' 132 | scope: punctuation.definition.string.liber 133 | pop: true 134 | - match: '"[\s\S]*?' 135 | scope: punctuation.definition.string.liber 136 | push: 137 | - meta_scope: string.quoted.double.liber 138 | - match: '"' 139 | scope: punctuation.definition.string.liber 140 | pop: true 141 | - match: '(?<=[::]).+' 142 | push: 143 | - meta_scope: string.quoted.liber 144 | - match: '$' 145 | pop: true 146 | 147 | 跳轉: 148 | - match: ^(\?)\s*(.+?)\s*(->)\s*(\S+?)\s*(,?)\s*(\S+)$ 149 | captures: 150 | 1: support.function.builtin.liber 151 | 2: variable.parameter.liber 152 | 3: keyword.operator.binary.liber 153 | 4: variable.function.liber 154 | 5: punctuation.separator.liber 155 | 6: variable.function.liber 156 | 157 | 158 | 圖片: 159 | - match: ^(={3,})(.+)$$ 160 | captures: 161 | 1: support.function.builtin.liber 162 | 2: variable.parameter.liber 163 | 164 | 持續: 165 | - match: ^(@)\s*(\S+?)\s*([\|+-])?\s*([^\|+-]+?)$ 166 | captures: 167 | 1: support.function.builtin.liber 168 | 2: variable.parameter.liber 169 | 3: keyword.operator.binary.liber 170 | 4: variable.function.liber 171 | 172 | 嵌入html: 173 | - match: '^(```(HTML|html)?)$' 174 | scope: support.function.liber 175 | push: 176 | - match: '```' 177 | scope: support.function.liber 178 | pop: true 179 | 180 | - match: '\s*' 181 | push: 182 | - include: 'scope:text.html.basic' 183 | with_prototype: 184 | - match: '(?=(```))' 185 | pop: true 186 | 嵌入py: 187 | - match: '^(```(py|python)?)$' 188 | scope: support.function.liber 189 | push: 190 | - match: '```' 191 | scope: support.function.liber 192 | pop: true 193 | 194 | - match: '\s*' 195 | push: 196 | - include: 'scope:source.python' 197 | with_prototype: 198 | - match: '(?=(```))' 199 | pop: true 200 | 嵌入js: 201 | - match: '^(```(js|javascript)?)$' 202 | scope: support.function.liber 203 | push: 204 | - match: '```' 205 | scope: support.function.liber 206 | pop: true 207 | 208 | - match: '\s*' 209 | push: 210 | - include: 'scope:source.js' 211 | with_prototype: 212 | - match: '(?=(```))' 213 | pop: true 214 | 215 | -------------------------------------------------------------------------------- /librian/librian本體/土特產/protobuf.cson: -------------------------------------------------------------------------------- 1 | scopeName: 'source.liber' 2 | name: 'liber' 3 | fileTypes: ['liber','play'] 4 | patterns: [ 5 | { 6 | begin: '^(```(py|python)?)$' 7 | end: '^(```)$' 8 | beginCaptures: 9 | 1: 10 | name: 'operator' 11 | 2: 12 | name: 'storage.inline' 13 | endCaptures: 14 | 1: 15 | name: 'operator' 16 | patterns: [ 17 | { 18 | include: 'source.python' 19 | } 20 | ] 21 | } 22 | { 23 | begin: '^(```(js|javascript)?)$' 24 | end: '^(```)$' 25 | beginCaptures: 26 | 1: 27 | name: 'operator' 28 | 2: 29 | name: 'storage.inline' 30 | endCaptures: 31 | 1: 32 | name: 'operator' 33 | patterns: [ 34 | { 35 | include: 'source.js' 36 | } 37 | ] 38 | } 39 | { 40 | begin: '(?=<)' 41 | end: '(?<=>)' 42 | patterns: [ 43 | { 44 | include: 'text.html.basic' 45 | } 46 | ] 47 | } 48 | { 49 | match: '^#.*?$' 50 | name: 'comment' 51 | } 52 | { 53 | match: '^([@\\+\\-\\>\\*]|={3,})(.*?)$' 54 | captures: 55 | 1: 56 | name: 'operator' 57 | 2: 58 | name: 'support.function' 59 | } 60 | { 61 | match: '^(((?:([^|]*?)\\|)?(.*?)) (\\(.*?\\))?)$' 62 | captures: 63 | 1: 64 | name: '人物名和表情' 65 | 2: 66 | name: '人物名' 67 | patterns: [ 68 | { 69 | match: '^(.*?)(?:\\|.*)?$' 70 | name: '$1' 71 | } 72 | ] 73 | 3: 74 | name: 'comment' 75 | 4: 76 | name: 'comment' 77 | 5: 78 | name: 'storage.inline' 79 | } 80 | { 81 | begin: '^(((?:([^|]*?)\\|)?(.*?)) (\\(.*?\\))?)(?=「)' 82 | beginCaptures: 83 | 1: 84 | name: '人物名和表情' 85 | 2: 86 | name: '人物名' 87 | patterns: [ 88 | { 89 | match: '^(.*?)(?:\\|.*)?$' 90 | name: '$1' 91 | } 92 | ] 93 | 3: 94 | name: 'keyword' 95 | 4: 96 | name: 'entity.name.type' 97 | 5: 98 | name: 'storage.inline' 99 | 100 | contentName: '對話.string' 101 | patterns: [ 102 | { 103 | match: '「' 104 | name: 'punctuation' 105 | } 106 | { 107 | begin: '(?=<)' 108 | end: '(?<=>)' 109 | patterns: [ 110 | { 111 | include: 'text.html.basic' 112 | } 113 | ] 114 | } 115 | ] 116 | 117 | end: '」' 118 | endCaptures: 119 | 0: 120 | name: 'punctuation' 121 | } 122 | 123 | { 124 | match: '「.*?」' 125 | name: 'storage.liber' 126 | } 127 | ] 128 | 129 | -------------------------------------------------------------------------------- /librian/librian本體/土特產/syntax_demo.liber: -------------------------------------------------------------------------------- 1 | #測試 2 | 3 | #一、不同參數與不同空格,全角引號 4 | 潘大爺「你好啊!」 5 | 潘大爺 「你好啊!」 6 | 潘大爺 「你好啊!」 7 | 潘大爺(笑)「你好啊!」 8 | 潘大爺 (笑)「你好啊!」 9 | 潘大爺 (笑)「你好啊!」 10 | 潘大爺[灰]「你好啊!」 11 | 潘大爺 [灰]「你好啊!」 12 | 潘大爺 [灰]「你好啊!」 13 | 潘大爺(笑)[灰]「你好啊!」 14 | 潘大爺 (笑)[灰]「你好啊!」 15 | 潘大爺 (笑)[灰]「你好啊!」 16 | 潘大爺(笑)[灰]「你好啊!」 17 | 潘大爺 (笑) [灰] 「你好啊!」 18 | 潘大爺 (笑) [灰] 「你好啊!」 19 | #二、將「一」換成雙引號 20 | 潘大爺"你好啊!" 21 | 潘大爺 "你好啊!" 22 | 潘大爺 "你好啊!" 23 | 潘大爺(笑)"你好啊!" 24 | 潘大爺 (笑)"你好啊!" 25 | 潘大爺 (笑)"你好啊!" 26 | 潘大爺[灰]"你好啊!" 27 | 潘大爺 [灰]"你好啊!" 28 | 潘大爺 [灰]"你好啊!" 29 | 潘大爺(笑)[灰]"你好啊!" 30 | 潘大爺 (笑)[灰]"你好啊!" 31 | 潘大爺 (笑)[灰]"你好啊!" 32 | 潘大爺(笑)[灰]"你好啊!" 33 | 潘大爺 (笑) [灰] "你好啊!" 34 | 潘大爺 (笑) [灰] "你好啊!" 35 | #三、在「一」的基礎上增加了別稱 36 | 潘大爺|牛逼人「你好啊!」 37 | 潘大爺|牛逼人 「你好啊!」 38 | 潘大爺|牛逼人 「你好啊!」 39 | 潘大爺|牛逼人(笑)「你好啊!」 40 | 潘大爺|牛逼人 (笑)「你好啊!」 41 | 潘大爺|牛逼人 (笑)「你好啊!」 42 | 潘大爺|牛逼人[灰]「你好啊!」 43 | 潘大爺|牛逼人 [灰]「你好啊!」 44 | 潘大爺|牛逼人 [灰]「你好啊!」 45 | 潘大爺|牛逼人(笑)[灰]「你好啊!」 46 | 潘大爺|牛逼人 (笑)[灰]「你好啊!」 47 | 潘大爺|牛逼人 (笑)[灰]「你好啊!」 48 | 潘大爺|牛逼人(笑)[灰]「你好啊!」 49 | 潘大爺|牛逼人 (笑) [灰] 「你好啊!」 50 | 潘大爺|牛逼人 (笑) [灰] 「你好啊!」 51 | #四、在「二」的基礎上增加了別稱 52 | 潘大爺|牛逼人"你好啊!" 53 | 潘大爺|牛逼人 "你好啊!" 54 | 潘大爺|牛逼人 "你好啊!" 55 | 潘大爺|牛逼人(笑)"你好啊!" 56 | 潘大爺|牛逼人 (笑)"你好啊!" 57 | 潘大爺|牛逼人 (笑)"你好啊!" 58 | 潘大爺|牛逼人[灰]"你好啊!" 59 | 潘大爺|牛逼人 [灰]"你好啊!" 60 | 潘大爺|牛逼人 [灰]"你好啊!" 61 | 潘大爺|牛逼人(笑)[灰]"你好啊!" 62 | 潘大爺|牛逼人 (笑)[灰]"你好啊!" 63 | 潘大爺|牛逼人 (笑)[灰]"你好啊!" 64 | 潘大爺|牛逼人(笑)[灰]"你好啊!" 65 | 潘大爺|牛逼人 (笑) [灰] "你好啊!" 66 | 潘大爺|牛逼人 (笑) [灰] "你好啊!" 67 | #五、將「一」替換為冒號表達式,半角冒號 68 | 潘大爺:你好啊! 69 | 潘大爺 :你好啊! 70 | 潘大爺 :你好啊! 71 | 潘大爺(笑):你好啊! 72 | 潘大爺 (笑):你好啊! 73 | 潘大爺 (笑):你好啊! 74 | 潘大爺[灰]:你好啊! 75 | 潘大爺 [灰]:你好啊! 76 | 潘大爺 [灰]:你好啊! 77 | 潘大爺(笑)[灰]:你好啊! 78 | 潘大爺 (笑)[灰]:你好啊! 79 | 潘大爺 (笑)[灰]:你好啊! 80 | 潘大爺(笑)[灰]:你好啊! 81 | 潘大爺 (笑) [灰] :你好啊! 82 | 潘大爺 (笑) [灰] :你好啊! 83 | #六、將「五」換成全角冒號 84 | 潘大爺:你好啊! 85 | 潘大爺 :你好啊! 86 | 潘大爺 :你好啊! 87 | 潘大爺(笑):你好啊! 88 | 潘大爺 (笑):你好啊! 89 | 潘大爺 (笑):你好啊! 90 | 潘大爺[灰]:你好啊! 91 | 潘大爺 [灰]:你好啊! 92 | 潘大爺 [灰]:你好啊! 93 | 潘大爺(笑)[灰]:你好啊! 94 | 潘大爺 (笑)[灰]:你好啊! 95 | 潘大爺 (笑)[灰]:你好啊! 96 | 潘大爺(笑)[灰]:你好啊! 97 | 潘大爺 (笑) [灰] :你好啊! 98 | 潘大爺 (笑) [灰] :你好啊! 99 | #七、在「五」的基礎上增加了別稱 100 | 潘大爺|牛逼人:你好啊! 101 | 潘大爺|牛逼人 :你好啊! 102 | 潘大爺|牛逼人 :你好啊! 103 | 潘大爺|牛逼人(笑):你好啊! 104 | 潘大爺|牛逼人 (笑):你好啊! 105 | 潘大爺|牛逼人 (笑):你好啊! 106 | 潘大爺|牛逼人[灰]:你好啊! 107 | 潘大爺|牛逼人 [灰]:你好啊! 108 | 潘大爺|牛逼人 [灰]:你好啊! 109 | 潘大爺|牛逼人(笑)[灰]:你好啊! 110 | 潘大爺|牛逼人 (笑)[灰]:你好啊! 111 | 潘大爺|牛逼人 (笑)[灰]:你好啊! 112 | 潘大爺|牛逼人(笑)[灰]:你好啊! 113 | 潘大爺|牛逼人 (笑) [灰] :你好啊! 114 | 潘大爺|牛逼人 (笑) [灰] :你好啊! 115 | #八、在「六」的基礎上增加了別稱 116 | 潘大爺|牛逼人:你好啊! 117 | 潘大爺|牛逼人 :你好啊! 118 | 潘大爺|牛逼人 :你好啊! 119 | 潘大爺|牛逼人(笑):你好啊! 120 | 潘大爺|牛逼人 (笑):你好啊! 121 | 潘大爺|牛逼人 (笑):你好啊! 122 | 潘大爺|牛逼人[灰]:你好啊! 123 | 潘大爺|牛逼人 [灰]:你好啊! 124 | 潘大爺|牛逼人 [灰]:你好啊! 125 | 潘大爺|牛逼人(笑)[灰]:你好啊! 126 | 潘大爺|牛逼人 (笑)[灰]:你好啊! 127 | 潘大爺|牛逼人 (笑)[灰]:你好啊! 128 | 潘大爺|牛逼人(笑)[灰]:你好啊! 129 | 潘大爺|牛逼人 (笑) [灰] :你好啊! 130 | 潘大爺|牛逼人 (笑) [灰] :你好啊! 131 | #九、在「一」的基礎上增加了換行 132 | 潘大爺「你好 133 | 啊!」 134 | 潘大爺 「你好 135 | 啊!」 136 | 潘大爺 「你好 137 | 啊!」 138 | 潘大爺(笑)「你好 139 | 啊!」 140 | 潘大爺 (笑)「你好 141 | 啊!」 142 | 潘大爺 (笑)「你好 143 | 啊!」 144 | 潘大爺[灰]「你好 145 | 啊!」 146 | 潘大爺 [灰]「你好 147 | 啊!」 148 | 潘大爺 [灰]「你好 149 | 啊!」 150 | 潘大爺(笑)[灰]「你好 151 | 啊!」 152 | 潘大爺 (笑)[灰]「你好 153 | 啊!」 154 | 潘大爺 (笑)[灰]「你好 155 | 啊!」 156 | 潘大爺(笑)[灰]「你好 157 | 啊!」 158 | 潘大爺 (笑) [灰] 「你好 159 | 啊!」 160 | 潘大爺 (笑) [灰] 「你好 161 | 啊!」 162 | #十、在「二·」的基礎上增加了換行 163 | 潘大爺"你好 164 | 啊!" 165 | 潘大爺 "你好 166 | 啊!" 167 | 潘大爺 "你好 168 | 啊!" 169 | 潘大爺(笑)"你好 170 | 啊!" 171 | 潘大爺 (笑)"你好 172 | 啊!" 173 | 潘大爺 (笑)"你好 174 | 啊!" 175 | 潘大爺[灰]"你好 176 | 啊!" 177 | 潘大爺 [灰]"你好 178 | 啊!" 179 | 潘大爺 [灰]"你好 180 | 啊!" 181 | 潘大爺(笑)[灰]"你好 182 | 啊!" 183 | 潘大爺 (笑)[灰]"你好 184 | 啊!" 185 | 潘大爺 (笑)[灰]"你好 186 | 啊!" 187 | 潘大爺(笑)[灰]"你好 188 | 啊!" 189 | 潘大爺 (笑) [灰] "你好 190 | 啊!" 191 | 潘大爺 (笑) [灰] "你好 192 | 啊!" 193 | #十一、在「三」的基礎上增加了換行 194 | 潘大爺|牛逼人「你好 195 | 啊!」 196 | 潘大爺|牛逼人 「你好 197 | 啊!」 198 | 潘大爺|牛逼人 「你好 199 | 啊!」 200 | 潘大爺|牛逼人(笑)「你好 201 | 啊!」 202 | 潘大爺|牛逼人 (笑)「你好 203 | 啊!」 204 | 潘大爺|牛逼人 (笑)「你好 205 | 啊!」 206 | 潘大爺|牛逼人[灰]「你好 207 | 啊!」 208 | 潘大爺|牛逼人 [灰]「你好 209 | 啊!」 210 | 潘大爺|牛逼人 [灰]「你好 211 | 啊!」 212 | 潘大爺|牛逼人(笑)[灰]「你好 213 | 啊!」 214 | 潘大爺|牛逼人 (笑)[灰]「你好 215 | 啊!」 216 | 潘大爺|牛逼人 (笑)[灰]「你好 217 | 啊!」 218 | 潘大爺|牛逼人(笑)[灰]「你好 219 | 啊!」 220 | 潘大爺|牛逼人 (笑) [灰] 「你好 221 | 啊!」 222 | 潘大爺|牛逼人 (笑) [灰] 「你好 223 | 啊!」 224 | #十二、在「四」的基礎上增加了換行 225 | 潘大爺|牛逼人"你好 226 | 啊!" 227 | 潘大爺|牛逼人 "你好 228 | 啊!" 229 | 潘大爺|牛逼人 "你好 230 | 啊!" 231 | 潘大爺|牛逼人(笑)"你好 232 | 啊!" 233 | 潘大爺|牛逼人 (笑)"你好 234 | 啊!" 235 | 潘大爺|牛逼人 (笑)"你好 236 | 啊!" 237 | 潘大爺|牛逼人[灰]"你好 238 | 啊!" 239 | 潘大爺|牛逼人 [灰]"你好 240 | 啊!" 241 | 潘大爺|牛逼人 [灰]"你好 242 | 啊!" 243 | 潘大爺|牛逼人(笑)[灰]"你好 244 | 啊!" 245 | 潘大爺|牛逼人 (笑)[灰]"你好 246 | 啊!" 247 | 潘大爺|牛逼人 (笑)[灰]"你好 248 | 啊!" 249 | 潘大爺|牛逼人(笑)[灰]"你好 250 | 啊!" 251 | 潘大爺|牛逼人 (笑) [灰] "你好 252 | 啊!" 253 | 潘大爺|牛逼人 (笑) [灰] "你好 254 | 啊!" 255 | #十三、無對話 256 | 潘大爺(笑) 257 | 潘大爺 (笑) 258 | 潘大爺 (笑) 259 | 潘大爺(笑)[灰] 260 | 潘大爺 (笑)[灰] 261 | 潘大爺 (笑)[灰] 262 | 潘大爺(笑)[灰] 263 | 潘大爺 (笑) [灰] 264 | 潘大爺 (笑) [灰] 265 | #十四、在「十三」的基礎上添加了別稱,半角豎線 266 | 潘大爺|牛逼人(笑) 267 | 潘大爺|牛逼人 (笑) 268 | 潘大爺|牛逼人 (笑) 269 | 潘大爺|牛逼人(笑)[灰] 270 | 潘大爺|牛逼人 (笑)[灰] 271 | 潘大爺|牛逼人 (笑)[灰] 272 | 潘大爺|牛逼人(笑)[灰] 273 | 潘大爺|牛逼人 (笑) [灰] 274 | 潘大爺|牛逼人 (笑) [灰] 275 | #十五、將「十四」換成全角豎線 276 | 潘大爺|牛逼人(笑) 277 | 潘大爺|牛逼人 (笑) 278 | 潘大爺|牛逼人 (笑) 279 | 潘大爺|牛逼人(笑)[灰] 280 | 潘大爺|牛逼人 (笑)[灰] 281 | 潘大爺|牛逼人 (笑)[灰] 282 | 潘大爺|牛逼人(笑)[灰] 283 | 潘大爺|牛逼人 (笑) [灰] 284 | 潘大爺|牛逼人 (笑) [灰] 285 | #十六、將「十四」換成表情符號「馬」 286 | 潘大爺🐴牛逼人(笑) 287 | 潘大爺🐴牛逼人 (笑) 288 | 潘大爺🐴牛逼人 (笑) 289 | 潘大爺🐴牛逼人(笑)[灰] 290 | 潘大爺🐴牛逼人 (笑)[灰] 291 | 潘大爺🐴牛逼人 (笑)[灰] 292 | 潘大爺🐴牛逼人(笑)[灰] 293 | 潘大爺🐴牛逼人 (笑) [灰] 294 | 潘大爺🐴牛逼人 (笑) [灰] 295 | 296 | #十七、py代碼塊 297 | ```py 298 | def isPrime(n) : 299 | if (n <= 1) : 300 | return False 301 | if (n <= 3) : 302 | return True 303 | if (n % 2 == 0 or n % 3 == 0) : 304 | return False 305 | i = 5 306 | while(i * i <= n) : 307 | if (n % i == 0 or n % (i + 2) == 0) : 308 | return False 309 | i = i + 6 310 | return True 311 | ``` 312 | #十八、python代碼塊 313 | ```python 314 | def is_prime(n) : 315 | if n <= 1 : 316 | return False 317 | if n <= 3 : 318 | return True 319 | if n%2 == 0 or n%3 == 0: 320 | return False 321 | i = 5 322 | while i*i <= n : 323 | if n%i == 0 or n % (i+2) == 0: 324 | return False 325 | i = i + 6 326 | return True 327 | ``` 328 | #十九、js代碼塊 329 | ```js 330 | function isPrime(n) { 331 | if (n <= 1) return false; 332 | if (n <= 3) return true; 333 | if (n%2 == 0 || n%3 == 0) return false; 334 | var i = 5; 335 | while (i*i <= n) { 336 | if (n%i == 0 || n % (i+2) == 0) { 337 | return false; 338 | } 339 | i = i + 6; 340 | } 341 | return true; 342 | } 343 | ``` 344 | #二十、javascript代碼塊 345 | ```javascript 346 | function isPrime(n) { 347 | if (n <= 1) return false; 348 | if (n <= 3) return true; 349 | if (n%2 == 0 || n%3 == 0) return false; 350 | var i = 5; 351 | while (i*i <= n) { 352 | if (n%i == 0 || n % (i+2) == 0) { 353 | return false; 354 | } 355 | i = i + 6; 356 | } 357 | return true; 358 | } 359 | ``` 360 | #二十一、html代碼塊 361 | ```html 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | ``` 372 | #二十二、HTML代碼塊 373 | ```HTML 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | ``` 384 | 385 | #二十三、劇本命令 386 | > BG 魔王城內 387 | > 背景 染紅的街道.png 388 | > BG 潘大爺神殿 1.5 "50% 50%" 389 | 390 | > BGM 愉快的音樂.mp3 391 | > 背景音樂 不愉快的音樂 0.5 392 | > BGM None 393 | 394 | > SE 跳的聲音.mp3 395 | 396 | > CG 極夜大戰 397 | > CG None 398 | 399 | > EF bg 灰 400 | 401 | > VIDEO OP.webm 402 | > 視頻 ED.mp4 True 403 | #二十四、外部語言函數調用與多余空格 404 | > BG('家裏.png') 405 | > BGM('打架的聲音.mp3') 406 | 407 | > BG 河上.png 408 | >BG 河上.png 409 | 410 | > BG "教室 夜.png" 411 | 412 | #二十五、插入圖片 413 | ===第一章 414 | === 第一章 415 | === 第一章 416 | ======第一章 417 | ====== 第一章 418 | ====== 第一章 419 | =========第一章 420 | ========= 第一章 421 | ========= 第一章 422 | 423 | #二十六、鏡頭變換 424 | +{潘大爺: [100, 120, 1.5]} 425 | + {潘大爺: [100, 120, 1.5]} 426 | + {潘大爺: [100, 120, 1.5]} 427 | +{舟舟: [100, 0, 1], 潘大爺: [550, 0, 1]} 428 | + {舟舟: [100, 0, 1], 潘大爺: [550, 0, 1]} 429 | + {舟舟: [100, 0, 1], 潘大爺: [550, 0, 1]} 430 | +[舟舟, 潘大爺] 431 | + [舟舟, 潘大爺] 432 | + [舟舟, 潘大爺] 433 | -{潘大爺: [100, 120, 1.5]} 434 | - {潘大爺: [100, 120, 1.5]} 435 | - {潘大爺: [100, 120, 1.5]} 436 | -{舟舟: [100, 0, 1], 潘大爺: [550, 0, 1]} 437 | - {舟舟: [100, 0, 1], 潘大爺: [550, 0, 1]} 438 | - {舟舟: [100, 0, 1], 潘大爺: [550, 0, 1]} 439 | -[舟舟, 潘大爺] 440 | - [舟舟, 潘大爺] 441 | - [舟舟, 潘大爺] 442 | 443 | #二十七、快速跳轉 444 | ?接受治療->壞結局.liber 445 | ? 接受治療 -> 壞結局.liber 446 | ? 接受治療 -> 壞結局.liber 447 | ?接受治療->壞結局.liber, 這里 448 | ? 接受治療 -> 壞結局.liber, 這里 449 | ? 接受治療 -> 壞結局.liber, 這里 450 | 451 | #二十八、人物操作 452 | @潘大爺+西裝 453 | @ 潘大爺 + 西裝 454 | @ 潘大爺 + 西裝 455 | @潘大爺-西裝 456 | @ 潘大爺 - 西裝 457 | @ 潘大爺 - 西裝 458 | 459 | #二十九、躍點 460 | *這里 461 | * 這里 462 | * 這里 463 | 464 | #三十、旁白 465 | 這是旁白 466 | :這個也是旁白「雖然有引號」 467 | :這個也是旁白"雖然有引號" 468 | :這個也是旁白:雖然有冒號 469 | :這個也是旁白 「雖然有引號」 470 | :這個也是旁白 "雖然有引號" 471 | :這個也是旁白 :雖然有冒號 472 | :這個也是旁白 「雖然有引號」 473 | :這個也是旁白 "雖然有引號" 474 | :這個也是旁白 :雖然有冒號 475 | 476 | 477 | #反面教材 478 | 479 | #缺少參數 480 | 潘大爺[灰] 481 | 潘大爺 [灰] 482 | 潘大爺 [灰] 483 | 潘大爺|牛逼人[灰] 484 | 潘大爺|牛逼人 [灰] 485 | 潘大爺|牛逼人 [灰] 486 | #參數順序錯誤 487 | 潘大爺[灰](笑)「你好啊!」 488 | 潘大爺 [灰](笑) 489 | 潘大爺 [灰](笑)「你好啊!」 490 | 潘大爺|牛逼人[灰](笑) 491 | 潘大爺|牛逼人 [灰](笑)「你好啊!」 492 | 潘大爺|牛逼人 [灰](笑) 493 | #多余參數 494 | 潘大爺(笑)[灰][灰]「你好啊!」 495 | 潘大爺 (笑)[灰][灰] 496 | 潘大爺 (笑)[灰][灰]「你好啊!」 497 | 潘大爺|牛逼人(笑)(笑)[灰] 498 | 潘大爺|牛逼人 (笑)(笑)[灰]「你好啊!」 499 | 潘大爺|牛逼人 (笑)(笑)[灰] 500 | #多余空格 501 | 潘大爺| 牛逼人"你好啊!" 502 | 潘大爺| 牛逼人 (笑) "你好啊!" 503 | 潘大爺| [灰] "你好啊!" 504 | 潘大爺| (笑) [灰] "你好啊!" 505 | #括號錯誤 506 | 潘大爺|牛逼人)"你好啊!" 507 | 潘大爺|牛逼人]"你好啊!" 508 | 潘大爺|牛逼人)]"你好啊!" 509 | -------------------------------------------------------------------------------- /librian/librian本體/土特產/導出pdf用/紙樣式.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-size: 18px; 3 | font-family: 方正标雅宋_GBK; 4 | } 5 | 6 | small { 7 | font-size: 85%; 8 | } 9 | 10 | @page { 11 | size: A4; 12 | margin: 1.5cm; 13 | margin-bottom: 2cm; 14 | background: url('./紙背景花紋印刷.webp'); 15 | background-size: 125%; 16 | background-position: 50% 50%; 17 | counter-increment: page; 18 | 19 | @bottom-center { 20 | color: rgba(0, 0, 0, 0.5); 21 | content: '—— 'counter(page) ' ——'; 22 | padding-bottom: 1cm; 23 | } 24 | } 25 | 26 | p.旁白:before { 27 | content: '  '; 28 | } 29 | 30 | p>* { 31 | vertical-align: top; 32 | } 33 | 34 | .旁白 { 35 | color: #000; 36 | } 37 | 38 | .語 { 39 | color: rgba(0, 0, 80, 1); 40 | white-space: pre; 41 | display: inline-block; 42 | padding-left: 6px; 43 | margin-left: 6px; 44 | border-left: 3px solid rgba(0, 0, 0, 0.4); 45 | } 46 | 47 | .躍點 { 48 | font-size: 80%; 49 | color: rgba(0, 0, 111, 0.5); 50 | } 51 | 52 | .顏 { 53 | color: rgba(0, 0, 0, 0.5); 54 | padding-left: 6px; 55 | } 56 | 57 | .註釋 { 58 | font-size: 80%; 59 | color: rgba(0, 0, 0, 0.5); 60 | } 61 | 62 | .人物操作 { 63 | font-size: 80%; 64 | color: rgba(0, 0, 0, 0.5); 65 | } 66 | 67 | .函數調用 { 68 | font-size: 80%; 69 | width: 80%; 70 | padding: 0.6rem 1rem; 71 | border-radius: 2px; 72 | background-color: rgba(0, 0, 0, 0.1); 73 | display: inline-block; 74 | white-space: pre; 75 | } 76 | 77 | .引用 { 78 | font-size: 95%; 79 | color: #030; 80 | } 81 | 82 | .標點 { 83 | color: #300; 84 | } 85 | 86 | .代, .插入 { 87 | background: url('./紙背景插入.webp'); 88 | background-size: cover; 89 | background-position: fixed; 90 | border: 1px solid rgba(0, 0, 0, 0.4); 91 | border-radius: 2px; 92 | font-family: 方正中雅宋_GBK; 93 | padding: 4px; 94 | } 95 | 96 | .插入 { 97 | text-align: center; 98 | font-size: 120%; 99 | } 100 | -------------------------------------------------------------------------------- /librian/librian本體/土特產/導出pdf用/紙背景插入.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/土特產/導出pdf用/紙背景插入.webp -------------------------------------------------------------------------------- /librian/librian本體/土特產/導出pdf用/紙背景花紋印刷.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/土特產/導出pdf用/紙背景花紋印刷.webp -------------------------------------------------------------------------------- /librian/librian本體/導出文件.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | import logging 4 | import argparse 5 | 6 | import opencc 7 | 8 | from Librian虛擬機 import 讀者 9 | from Librian虛擬機 import 角色 10 | 11 | cc = opencc.OpenCC('t2s') 12 | 13 | 此處 = os.path.dirname(os.path.abspath(__file__)) 14 | 15 | 16 | class 虛狀態: 17 | def __init__(self): 18 | self.額外信息 = () 19 | self.內容 = {} 20 | 21 | def 導出(self): 22 | return {'內容': self.內容, '額外信息': self.額外信息} 23 | 24 | 25 | class 虛讀者(讀者.讀者): 26 | def __init__(self, 初始劇本, 簡化字=False): 27 | super().__init__(初始劇本) 28 | self.簡化字 = 簡化字 29 | 30 | def 步進(self): 31 | self.狀態 = 虛狀態() 32 | s = self.下一句() 33 | 類型 = s['類型'] 34 | if 類型 == '終焉': 35 | self.狀態.額外信息 = ('終焉',) 36 | if 類型 in ('註釋', '躍點'): 37 | self.狀態.內容 = f'{s[類型]}\n' 38 | if 類型 == '函數調用': 39 | self.狀態.內容 = f'{s["原文"]}\n' 40 | if 類型 == '插入圖': 41 | self.狀態.內容 = f'
{s["插入圖"]}
' 42 | if 類型 == '旁白': 43 | 旁白 = self.打標點(self.化(s["旁白"])) 44 | self.狀態.內容 = f'

{旁白}

\n' 45 | if 類型 == '人物操作': 46 | 人物名 = s['人物名'] 47 | 目標 = s['目標'] 48 | if s['操作符'] == '+': 49 | self.狀態.內容 = f'

{self.化(人物名)} + {self.化(目標)}

\n' 50 | if s['操作符'] == '|': 51 | 角色.取角色(人物名).顯示名字 = s['目標'] 52 | self.狀態.內容 = '' 53 | if 類型 in ('人物對話', '人物表情'): 54 | 替代顯示名字 = 角色.取角色(s['名']).顯示名字 55 | 名字 = s['代'] or 替代顯示名字 or s['名'] 56 | self.狀態.內容 = f'

{self.化(名字)}' 57 | if s['顏']: 58 | self.狀態.內容 += f'{s["顏"]}' 59 | if 類型 == '人物對話': 60 | self.狀態.內容 += f'{self.化(s["語"])}' 61 | self.狀態.內容 += f'

' 62 | 63 | if '之後的空白' in s: 64 | self.狀態.內容 += '
\n' * s['之後的空白'] 65 | 66 | def 化(self, s): 67 | if self.簡化字: 68 | return cc.convert(s) 69 | return s 70 | 71 | def 打標點(self, 句): 72 | 句 = re.sub('([,。?!…——])', '\\1', 句) 73 | 句 = re.sub('(「.*?」)', '\\1', 句) 74 | return 句 75 | 76 | def 導出html(self, 帶css=False): 77 | head = f'\n' 78 | if 帶css: 79 | for css in 參數.css: 80 | head += f'\n' 81 | 82 | return head + self.body內容() 83 | 84 | def body內容(self): 85 | t = list(self.迭代器()) 86 | return '\n'.join([i['內容'] for i in t]) 87 | 88 | 89 | if __name__ == '__main__': 90 | 參數 = argparse.ArgumentParser(description='劇本文件生成pdf') 91 | 參數.add_argument('--play', type=str, required=True) 92 | 參數.add_argument('--css', type=str, action='append') 93 | 參數.add_argument('--out', type=str) 94 | 參數.add_argument('--chs', action='store_true') 95 | 參數.add_argument('--html', action='store_true') 96 | 參數 = 參數.parse_args() 97 | 98 | if not 參數.css: 99 | 參數.css = [os.path.join(此處, './資源/導出pdf用/紙樣式.css')] 100 | 101 | 讀 = 虛讀者(參數.play, 參數.chs) 102 | if 參數.html: 103 | with open(參數.out, 'w', encoding='utf8') as f2: 104 | f2.write(讀.導出html(帶css=True)) 105 | else: 106 | from weasyprint import HTML, CSS 107 | HTML(string=讀.導出html()).write_pdf(參數.out, stylesheets=參數.css) 108 | -------------------------------------------------------------------------------- /librian/librian本體/山彥.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | import time 4 | import pickle 5 | import logging 6 | import datetime 7 | 8 | import yaml 9 | from rimo_utils import good_open 10 | from rimo_utils.cef_tools.vue_ob import vue_ob 11 | 12 | from librian.librian_util import 文件, 加載器, 路徑 13 | 14 | from .librian虛擬機 import 讀者 15 | from .librian虛擬機 import 虛擬機環境 16 | 17 | from .環境 import 配置 18 | 19 | 20 | def 綁定(app, 標題url): 21 | 讀者實例 = 讀者.讀者(f'{虛擬機環境.工程路徑}/{虛擬機環境.劇本入口}') 22 | app.frame.set_browser_object("山彥", 極山彥(app.frame, app.frame.browser, 讀者實例, 標題url)) 23 | 24 | 25 | class 山彥(vue_ob): 26 | def __init__(self, 窗口, 瀏覽器, 讀者, 標題url): 27 | super().__init__() 28 | self.窗口 = 窗口 29 | self.瀏覽器 = 瀏覽器 30 | self.讀者 = 讀者 31 | self.標題url = 標題url 32 | 33 | def js(self, x): 34 | self.瀏覽器.ExecuteJavascript(x) 35 | 36 | def 取檔(self, callback): 37 | 檔表 = os.listdir(f'{虛擬機環境.工程路徑}/存檔資料/手動存檔') 38 | 檔表 = sorted(檔表, reverse=True) 39 | 檔信息表 = [] 40 | for i in 檔表: 41 | try: 42 | with open(f'{虛擬機環境.工程路徑}/存檔資料/手動存檔/{i}', 'rb') as f: 43 | 存檔信息 = pickle.load(f)['存檔信息'] 44 | 檔信息表.append({ 45 | '名字': i, 46 | '描述': 存檔信息['描述'], 47 | '截圖': 存檔信息['截圖'], 48 | '時間': datetime.datetime.fromtimestamp(存檔信息['存檔時間']).strftime('%Y-%m-%d %H:%M'), 49 | }) 50 | except Exception as e: 51 | logging.exception(e) 52 | logging.warning(f'存檔「{i}」有問題。') 53 | callback.Call(檔信息表) 54 | 55 | def 存檔(self, 文件名, 描述, 截圖): 56 | 存檔信息 = { 57 | '描述': 描述, 58 | '截圖': 截圖, 59 | '存檔時間': time.time(), 60 | } 61 | self.讀者.存檔(f'{虛擬機環境.工程路徑}/存檔資料/手動存檔/{文件名}', 存檔信息) 62 | 63 | def 讀檔(self, 文件名): 64 | self.讀者.讀檔(f'{虛擬機環境.工程路徑}/存檔資料/手動存檔/{文件名}') 65 | self.更新(瞬間化=True) 66 | 67 | def 快速存檔(self): 68 | self.讀者.存檔(f'{虛擬機環境.工程路徑}/存檔資料/快速存檔.pkl') 69 | self.js('_py演出.提示("存檔好了。")') 70 | 71 | def 快速讀檔(self): 72 | self.讀者.讀檔(f'{虛擬機環境.工程路徑}/存檔資料/快速存檔.pkl') 73 | self.更新(瞬間化=True) 74 | 75 | def 切換全屏(self): 76 | self.窗口.toggleFullScreen() 77 | 78 | def 退出(self): 79 | exit() 80 | 81 | def vue更新(self, 內容): 82 | t = self.vue.用戶設置 if '用戶設置' in self.vue._內容 else None 83 | if t != 內容['用戶設置']: 84 | with open(f'{虛擬機環境.工程路徑}/存檔資料/用戶設置.yaml', 'w', encoding='utf8') as f: 85 | f.write(yaml.dump(內容['用戶設置'])) 86 | super().vue更新(內容) 87 | 88 | 89 | class 演出山彥(山彥): 90 | def 回標題(self): 91 | self.讀者.__init__(f'{虛擬機環境.工程路徑}/{虛擬機環境.劇本入口}') 92 | self.js(f'window.location.href={self.標題url.__repr__()}') 93 | 94 | def 步進(self): 95 | if 配置['編寫模式']: 96 | return 97 | self.讀者.步進() 98 | 99 | def 更新(self, 瞬間化=False): 100 | 狀態 = self.讀者.狀態.導出() 101 | self.js(f'_py演出.改變演出狀態({json.dumps(狀態)},{json.dumps(瞬間化)})') 102 | 103 | def 狀態回調(self, 步進, callback): 104 | if 步進: 105 | self.步進() 106 | 狀態 = self.讀者.狀態.導出() 107 | callback.Call(狀態) 108 | 109 | def 初始化(self, callback): 110 | self.vue.圖片文件夾 = 虛擬機環境.工程路徑 / 虛擬機環境.圖片文件夾 111 | self.vue.音樂文件夾 = 虛擬機環境.工程路徑 / 虛擬機環境.音樂文件夾 112 | self.vue.視頻文件夾 = 虛擬機環境.工程路徑 / 虛擬機環境.視頻文件夾 113 | self.vue.psd立繪路徑 = 虛擬機環境.psd立繪路徑 114 | self.vue.自定css = [虛擬機環境.工程路徑 / i for i in 虛擬機環境.自定css] 115 | self.vue.主題css = os.path.join('主題', 虛擬機環境.主題css + '.css').replace('\\', '/') 116 | self.vue.解析度 = 虛擬機環境.主解析度 117 | self.vue.邊界 = 配置['顯示繪圖邊界'] 118 | self.vue.翻譯 = 虛擬機環境.翻譯 119 | 120 | 用戶設置 = 加載器.yaml(f'{虛擬機環境.工程路徑}/存檔資料/用戶設置.yaml') 121 | if 用戶設置: 122 | self.vue.用戶設置 = 用戶設置 123 | callback.Call() 124 | 125 | def 選(self, 參數): 126 | t = self.讀者.狀態.選項[參數][1] 127 | self.讀者.狀態.選項 = [] 128 | t() 129 | logging.debug(f'選擇了「{參數}」。') 130 | self.讀者.步進() 131 | self.更新() 132 | 133 | 134 | class 帶標題山彥(演出山彥): 135 | def 開始(self): 136 | self.步進() 137 | self.js(f'window.location.href={文件.轉爲網址路徑(路徑.librian本體 / "前端/adv.html").__repr__()};') 138 | 139 | def 讀檔畫面(self): 140 | self.js(f'window.location.href={(文件.轉爲網址路徑(路徑.librian本體 / "./前端/adv.html")+"?入口=讀檔").__repr__()};') 141 | 142 | def 從劇本開始(self, 劇本): 143 | 入口 = f'{虛擬機環境.工程路徑}/{虛擬機環境.劇本入口}' 144 | self.讀者.__init__(f'{os.path.dirname(入口)}/{劇本}') 145 | self.開始() 146 | 147 | 148 | class 極山彥(帶標題山彥): 149 | def __init__(self, *li, **d): 150 | super().__init__(*li, **d) 151 | if 配置['編寫模式']: 152 | import threading 153 | 154 | def 監視(): 155 | 原字 = '' 156 | while True: 157 | with good_open(f'{虛擬機環境.工程路徑}/{虛擬機環境.劇本入口}') as f: 158 | 字 = f.read() 159 | if 字 != 原字: 160 | self.更新終態() 161 | 原字 = 字 162 | t = threading.Thread(target=監視) 163 | t.setDaemon(True) 164 | t.start() 165 | 166 | def 更新終態(self): 167 | self.讀者.從一而終(f'{虛擬機環境.工程路徑}/{虛擬機環境.劇本入口}') 168 | self.更新() 169 | 170 | def 初始化(self, *li, **d): 171 | super().初始化(*li, **d) 172 | if 配置['編寫模式']: 173 | self.更新終態() 174 | -------------------------------------------------------------------------------- /librian/librian本體/幻象.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | import shutil 4 | from pathlib import Path 5 | 6 | from .環境 import 配置 7 | 8 | from librian.librian_util import 路徑 9 | 10 | from .librian虛擬機 import 虛擬機環境 11 | from .librian虛擬機 import 讀者 12 | 13 | 14 | 15 | def 演出固化(劇本文件): 16 | 讀者實例 = 讀者.讀者(劇本文件) 17 | 演出步 = list(讀者實例.迭代器()) 18 | return 演出步 19 | 20 | 21 | def 生成虛擬核心(): 22 | 圖片文件夾 = 路徑.虛擬相對前端路徑(虛擬機環境.圖片文件夾) 23 | 音樂文件夾 = 路徑.虛擬相對前端路徑(虛擬機環境.音樂文件夾) 24 | 視頻文件夾 = 路徑.虛擬相對前端路徑(虛擬機環境.視頻文件夾) 25 | psd立繪路徑 = 路徑.虛擬相對前端路徑(os.path.relpath(虛擬機環境.psd立繪路徑, start=虛擬機環境.工程路徑)) 26 | 自定css = [路徑.虛擬相對前端路徑(i) for i in 虛擬機環境.自定css] 27 | 主題css = os.path.join('主題', 虛擬機環境.主題css + '.css').replace('\\', '/') 28 | 29 | 演出步 = 演出固化(f'{虛擬機環境.工程路徑}/{虛擬機環境.劇本入口}') 30 | 31 | 虛擬核心 = { 32 | '作品名': 虛擬機環境.標題, 33 | '解析度': 虛擬機環境.主解析度, 34 | '邊界': int(配置["顯示繪圖邊界"]), 35 | '圖片文件夾': 圖片文件夾, 36 | '音樂文件夾': 音樂文件夾, 37 | '視頻文件夾': 視頻文件夾, 38 | 'psd立繪路徑': psd立繪路徑, 39 | '自定css': 自定css, 40 | '主題css': 主題css, 41 | '演出步': 演出步 42 | } 43 | json數據 = json.dumps(虛擬核心, indent=2, ensure_ascii=False) 44 | return f'window.虛擬核心 = {json數據}' 45 | 46 | 47 | def 幻象化(目標路徑): 48 | 目標路徑 = Path(目標路徑) 49 | 依賴 = [ 50 | '黑科技', 51 | 'librian/librian本體/前端/dist', 52 | 'librian/librian本體/前端/素材', 53 | 'librian/librian本體/前端/主題', 54 | 'librian/librian本體/前端/adv.html', 55 | 虛擬機環境.工程路徑.relative_to(路徑.librian外層), 56 | ] 57 | for i in 依賴: 58 | 源路徑 = 路徑.librian外層 / i 59 | if 源路徑.is_dir(): 60 | shutil.copytree(源路徑, 目標路徑 / i) 61 | elif 源路徑.is_file(): 62 | shutil.copy(源路徑, 目標路徑 / i) 63 | else: 64 | raise Exception('哈?') 65 | 66 | with open(目標路徑 / 'librian/librian本體/前端/虛擬核心.js', 'w', encoding='utf-8') as f: 67 | f.write(生成虛擬核心()) 68 | 69 | with open(目標路徑 / '說明.txt', 'w', encoding='utf-8') as f: 70 | f.write('因爲它有一些奇怪的操作所以不能直接拉進瀏覽器運行。\n你需要自建服務器,一個可行的方法是安裝http-server,在這個路徑啓動。然後「http://localhost:8080/librian/librian本體/前端/adv.html」。') 71 | -------------------------------------------------------------------------------- /librian/librian本體/環境.py: -------------------------------------------------------------------------------- 1 | import os 2 | import logging 3 | 4 | import yaml 5 | yaml.warnings({'YAMLLoadWarning': False}) 6 | 7 | 8 | def 導入全局配置(a): 9 | 配置.update(a) 10 | logging.debug(配置) 11 | 12 | 13 | with open(os.path.split(os.path.realpath(__file__))[0] + '/配置.yaml', encoding='utf8') as f: 14 | 配置 = yaml.load(f) 15 | logging_config = { 16 | 'format': '【%(filename)s - %(lineno)s】(%(levelname)s): %(message)s', 17 | } 18 | if 配置['額外信息']: 19 | logging_config['level'] = logging.INFO 20 | logging.basicConfig(**logging_config) 21 | -------------------------------------------------------------------------------- /librian/librian本體/窗口.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from librian.librian_util import 文件 4 | try: 5 | from rimo_utils.cef_tools import wxcef 6 | except ModuleNotFoundError: 7 | logging.warning('沒能import wx,改爲使用pyside2。') 8 | from rimo_utils.cef_tools import qtcef as wxcef 9 | 10 | from librian.librian_util import 路徑 11 | 12 | from . import 山彥 13 | from .環境 import 配置 14 | 15 | from .librian虛擬機 import 虛擬機環境 16 | 17 | 18 | 19 | def 啓動app(): 20 | if 配置['編寫模式']: 21 | url = 路徑.librian本體 / '前端/adv.html' 22 | elif 虛擬機環境.標題畫面: 23 | url = f'{虛擬機環境.工程路徑}/{虛擬機環境.標題畫面}' 24 | else: 25 | url = 路徑.librian本體 / '前端/默認標題畫面/標題.html' 26 | 27 | 標題url = 文件.轉爲網址路徑(url) 28 | 29 | if 虛擬機環境.圖標: 30 | 圖標 = f'{虛擬機環境.工程路徑}/{虛擬機環境.圖標}' 31 | else: 32 | 圖標 = 路徑.librian本體 / '資源/librian.ico' 33 | 34 | app, 瀏覽器 = wxcef.group( 35 | title=虛擬機環境.標題, 36 | url=標題url, 37 | icon=圖標, 38 | size=虛擬機環境.主解析度 39 | ) 40 | 山彥.綁定(app, 標題url=標題url) 41 | 42 | return app 43 | -------------------------------------------------------------------------------- /librian/librian本體/資源/Librian小.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/資源/Librian小.png -------------------------------------------------------------------------------- /librian/librian本體/資源/librian.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/librian/librian本體/資源/librian.ico -------------------------------------------------------------------------------- /librian/librian本體/配置.yaml: -------------------------------------------------------------------------------- 1 | # 顯示log級別的信息 2 | 額外信息: False 3 | 4 | # 在html界面上顯示div的界線 5 | 顯示繪圖邊界: False 6 | 7 | # 對於嚴重錯誤在except中停止程序 8 | 嚴格模式: True 9 | 10 | # 編寫的同時顯示 11 | 編寫模式: False 12 | 13 | # 編寫模式從特定劇本進入 14 | 編寫模式起點: [] -------------------------------------------------------------------------------- /librian/librian閱讀器/配置.json: -------------------------------------------------------------------------------- 1 | { 2 | "文件列表": [ 3 | {"名字": "測試用", "文件": "劇本/入口.json"} 4 | ], 5 | "自定css": [], 6 | "簡化字": true 7 | } -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Librian: 簡明強大的 Galgame | Visual Novel 引擎 2 | 3 | [![](https://img.shields.io/github/stars/RimoChan/Librian.svg)](https://github.com/RimoChan/Librian/stargazers) 4 | [![](https://img.shields.io/badge/platform-windows%20%7C%20linux-%23989898)](https://en.wikipedia.org/wiki/Microsoft_Windows) 5 | [![](https://img.shields.io/github/release/RimoChan/librian.svg)](https://github.com/RimoChan/Librian/releases) 6 | [![](https://img.shields.io/codacy/grade/cc567bfd3e374eb494825aae3ce3e7cf)](https://www.codacy.com/manual/s60481235/Librian?utm_source=github.com&utm_medium=referral&utm_content=RimoChan/Librian&utm_campaign=Badge_Grade) 7 | [![](https://img.shields.io/github/license/RimoChan/Librian.svg)](https://github.com/RimoChan/Librian/blob/master/LICENSE) 8 | ![Librian2.jpg](https://cdn.jsdelivr.net/gh/RimoChan/librian/文檔/Librian2.jpg) 9 | 10 | ——來像 Markdown 一樣寫 Galgame 劇本吧! 11 | 12 | Librian 是容易上手的 Galgame 引擎,Librian 由 Python 和 JavaScript 編寫而成,基於 CEFPython 前端。 13 | 14 | Librian 適用於快速高效的 ADV 實現,能將你的奇思妙想迅速轉換爲成果——你只需提供素材文件和简单的劇本就能做出 Galgame! 15 | 16 | Librian 是面向劇本的引擎,賣點是: 17 | 18 | - 輕快便捷的原型開發。 19 | - 用戶友好。 20 | - 高度可擴展性。 21 | 22 | ## 一分鐘的演示視頻 23 | 24 | [![視頻佔位](https://cdn.jsdelivr.net/gh/RimoChan/librian/文檔/視頻佔位.jpg)](https://librian.net/視頻/轉.webm) 25 | 26 | ## 劇本格式 27 | 28 | ```liber 29 | > BG 中庭.jpg 30 | + [舟舟, 潘大爺] 31 | 中庭。潘大爺在散步。 32 | 舟舟 (微笑)「啊!校長!終於找到你了!」 33 | 潘大爺 「舟舟!來得正是時候!」 34 | 潘大爺 (微笑)「來看看我新發明的催眠調教裝置!」 35 | 舟舟 (驚)「真有這種發明!?」 36 | ``` 37 | 38 | 不需要任何其他標記或代碼,一小段劇本就完成了。 39 | 40 | 準備好立繪和背景後,運行 Librian 主程序並啓動工程——演出是這樣的效果。 41 | ![圖1](https://cdn.jsdelivr.net/gh/RimoChan/librian/文檔/樣例_潘大爺.jpg) 42 | 43 | ## 中文文檔 44 | 45 | 如果你想瞭解詳細的使用方法,可以直接閱讀 Librian 的中文文檔——[https://doc.librian.net](https://doc.librian.net/site/主頁.html)。 46 | 47 | 你可以輕鬆定製你的遊戲,包括特效、畫面樣式、甚至聯網,快來探索吧! 48 | 49 | ## 快速上手 50 | 51 | + 直接下載打包的 [release 版本](https://github.com/RimoChan/Librian/releases) (推薦)。 52 | - release 版本也附帶了 [librian 面板](https://github.com/RimoChan/Librian)。 53 | 54 | + 或者使用 `pip install librian` 來安裝 librian。 55 | - 這需要本地 Python 爲 3.6 或 3.7 版本 56 | - 它不太穩定,所以最好先更新一下 pip 和 setuptools,要是裝不上我也沒辦法…… 57 | 58 | ## Liber 分析器 59 | 60 | Liber 分析器是 Librian 用來分析劇本語言 Liber 的工具。 61 | 如果你想要開發自己的 Galgame 引擎或者做一些很酷的事情,它會有所助益。 62 | 63 | 它的倉庫在 64 | 65 | 你可以直接用 `pip install liber` 來安裝它。 66 | 67 | ## 贊助 68 | 69 | 如果你覺得 Librian 對你的工作或學習有幫助,歡迎給作者介紹一些可愛的女朋友。 70 | 71 | 最好是蘿莉,要那種會坐在腿上蹭蹭,喊「歐尼醬」的。 72 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | liber>=1.0.1 2 | rimo_utils>=1.4.1 3 | cefpython3>=66.0 4 | wxPython>=4.0.4 5 | cloudpickle>=1.2.2 6 | opencc>=1.1.1 7 | PyYAML>=5.2 8 | fire>=0.2.1 9 | dulwich>=0.19.14 10 | requests>=2.24.0 11 | libsass>=0.20.0 12 | AppKit>=0.2.8 ; sys_platform == 'darwin' -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import setuptools 2 | 3 | import librian 4 | 5 | 6 | setuptools.setup( 7 | name='librian', 8 | version=librian.__version__, 9 | author='RimoChan', 10 | author_email='the@librian.net', 11 | description='librian', 12 | long_description=open('readme.md', encoding='utf8').read(), 13 | long_description_content_type='text/markdown', 14 | url='https://github.com/RimoChan/librian', 15 | packages=[ 16 | 'librian', 17 | 'librian.librian_util', 18 | 'librian.librian本體', 19 | 'librian.librian本體.librian虛擬機', 20 | ], 21 | package_data={ 22 | 'librian.librian本體': [ 23 | '前端/*', '前端/dist/*', '前端/默認標題畫面/*', '前端/黑科技/**/*', '前端/黑科技/**/**/*', 24 | '資源/*', 25 | '配置.yaml', 26 | ], 27 | }, 28 | classifiers=[ 29 | 'Programming Language :: Python :: 3', 30 | 'Operating System :: OS Independent', 31 | ], 32 | install_requires=[ 33 | 'liber>=1.0.1', 34 | 'rimo_utils>=1.4.1', 35 | 'cefpython3>=66.0', 36 | 'wxPython>=4.0.4', 37 | 'cloudpickle>=1.2.2', 38 | 'opencc>=1.1.1', 39 | 'PyYAML>=5.2', 40 | 'fire>=0.2.1', 41 | 'requests>=2.24.0', 42 | 'libsass>=0.20.0', 43 | 'AppKit>=0.2.8 ; sys_platform == "darwin"', 44 | ], 45 | python_requires='>=3.6, <=3.7', 46 | ) 47 | -------------------------------------------------------------------------------- /文檔/Librian2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/文檔/Librian2.jpg -------------------------------------------------------------------------------- /文檔/樣例_潘大爺.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/文檔/樣例_潘大爺.jpg -------------------------------------------------------------------------------- /文檔/視頻佔位.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RimoChan/Librian/9a9f93d7cf618af1031cadc9074c7cdff36565c4/文檔/視頻佔位.jpg --------------------------------------------------------------------------------