From 2ff3fa2ad0e4c72a20b3e2e17c08906e35c7ebc9 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Thu, 19 Sep 2013 15:37:46 +0100 Subject: [PATCH] More docs updates. In particular, documented the new location data structure. --- README.md | 2 +- docs/BOSS Metadata Syntax.html | 32 ++++++++++++++++++++++++++++---- docs/BOSS Readme.html | 21 +++++++++------------ docs/images/confirm.png | Bin 0 -> 10969 bytes 4 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 docs/images/confirm.png diff --git a/README.md b/README.md index 26ffedc9..b15072a8 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ BOSS requires the following libraries: BOSS expects all libraries' folders to be present alongside the BOSS repository folder that contains this readme, or otherwise installed such that the compiler and linker used can find them without suppling additional paths. All paths below are relative to the folder(s) containing the libraries and BOSS. -BOSS also requires GraphVis and Subversion binaries, which can be obtained [here](http://sourceforge.net/projects/win32svn) and [here](http://www.graphviz.org/Download_windows.php) respectively and should be installed as detailed below. +BOSS can also make use of [GraphVis](http://www.graphviz.org/Download_windows.php) and [Subversion](http://sourceforge.net/projects/win32svn) binaries. If provided, they should be installed as detailed below. Alphanum, Libespm and PugiXML do not require any additional setup. The rest of the libraries must be built separately. diff --git a/docs/BOSS Metadata Syntax.html b/docs/BOSS Metadata Syntax.html index a3c85322..66cf1125 100644 --- a/docs/BOSS Metadata Syntax.html +++ b/docs/BOSS Metadata Syntax.html @@ -80,6 +80,7 @@ h3{
  • File Data Structure
  • Message Data Structure
  • Plugin Data Structure +
  • Location Data Structure
  • Condition Strings
      @@ -103,10 +104,11 @@ h3{

      Some important points that are more specific to how BOSS uses YAML:

      • Child data nodes should be indented two spaces from their parents. This isn't a strict requirement, but is the best trade-off between compactness and readability. -
      • Strings should be enclosed in single quotes if they contain any of the following characters: -?:,[]{}#&*!|>"%@`, unless they also contain any single quotes, in which case the string should be enclosed in double quotes instead. Any backslashes or double quotes within a double-quoted string should be escaped with a backslash, ie. "\" and \\\. +
      • Strings should be enclosed in single quotes if they contain any of the following characters: -?:,[]{}#&*!|>"%@`, unless they also contain any single quotes, in which case the string should be enclosed in double quotes instead. This isn't always strictly necessary, but it's better to err on the side of caution. If you really want to only quote strings when absolutely neccessary, be sure to check what you write by copy/pasting the whole data structure the string appears into a YAML parser such as this one and making sure that what it outputs is correct. +
      • Any backslashes or double quotes within a double-quoted string should be escaped with a backslash, ie. "\" and \\\.
      • Strings are case-sensitive, apart from file paths, regular expressions and checksums.
      -

      These docs give all example syntax in YAML's least compact representation: you can also use a more compact representation, but it's better for the masterlist to be readable than compact. +

      These docs give all example syntax in YAML's least compact representation: you can also use a more compact representation, but make sure that you do not sacrifice readability when doing so.

      Some properties of file paths as used by BOSS:

      • They are evaluated as paths relative to the game's Data folder. @@ -147,7 +149,7 @@ plugins:

        Data Structures

        -

        While you could write whatever you wanted in a metadata file without problems, so long as it was valid YAML, it would be pointless as BOSS expects the metadata to be laid out using a certain set of data structures, described in this section. +

        BOSS expects metadata to be laid out using a certain set of data structures, described in this section.

        Tag Data Structure

        BOSS metadata files can contain suggestions for the addition or removal of Bash Tags, and this is the structure used for them. It has two forms: the first is a simple string, and the second is a key-value map. All values in the map are strings. @@ -206,7 +208,7 @@ display: OBSE v18+ sayA generic message, useful for miscellaneous notes. warnA warning message, describing a non-critical issue with the user's mods (eg. dirty mods). - errorAn error message, decribing a critical installation issue (eg. missing masters). + errorAn error message, decribing a critical installation issue (eg. missing masters, corrupt plugins).

        The content data structure is a key-value map, with all values being strings: @@ -260,6 +262,7 @@ would be displayed as
        incfile listAn unordered list of files that this plugin is incompatible with. If any of these files are present, an error message will be displayed.
        msgmessage listThe messages attached to this plugin. The messages will be displayed in the order that they are listed.
        tagtag listAn unordered list of Bash Tags suggested for this plugin. If a Bash Tag is suggested for both addition and removal, the latter will override the former when the list is evaluated. +
        urllocation listAn unordered list of location data structures (see below) for this plugin. If the same version can be found at multiple locations, only one location should be recorded. This metadata is not currently used by BOSS.

        Example: name: "Oscuro's_Oblivion_Overhaul.esm" @@ -277,6 +280,27 @@ msg: content: 'Do not clean. "Dirty" edits are intentional and required for the mod to function.' +

        Location Data Structure

        +

        This data structure is used to hold information on where plugins are hosted online. It is not currently used by BOSS, but it was suggested that since the BOSS team receives a considerable number of plugin URLs, they should be recorded in a standard format, as there is no existing store of such information and it could prove useful in the future. +

        The data structure has two forms: the first is a simple string, and the second is a key-value map. The first form should be used for a URL without any associated version data, such as when it is not clear which version is found there, or when it is the only known hosting location for the plugin and as such hosts all available versions. The second form should be used when version data can be associated with the URL, such as when the URL only hosts a subset of the available versions of the plugin. +

        The simple form: +URL +

        where URL is a URL at which the plugin may be found. +

        The map form: + + +
        Key NameData TypeRequiredNotes +
        linkstringA URL at which the plugin may be found. +
        verstring listA list of versions that can be found at the URL. +
        +

        Examples: +http://skyrim.nexusmods.com/mods/19/ +or +link: http://steamcommunity.com/sharedfiles/filedetails/?id=87144366 +ver: + - 1.3.2c + +

        Condition Strings

        Condition strings can be used to ensure that data is only acted on by BOSS under certain circumstances. They are very similar to boolean conditional expressions in programming languages such as Python, though more limited. Their EBNF grammar is: [ negator ], function, { junctor, [ negator ], function } ; diff --git a/docs/BOSS Readme.html b/docs/BOSS Readme.html index 5f23329a..0d17ae13 100644 --- a/docs/BOSS Readme.html +++ b/docs/BOSS Readme.html @@ -74,10 +74,6 @@ h3{ . --> -

        -This documentation is a work in progress, covering an application that is also still a work in progress, and is subject to change. -
        -

        BOSS

        Contents

        @@ -170,7 +166,8 @@ This documentation is a work in progress, covering an application that is also s
      • If the OK button is pressed, the final load order will be applied. Otherwise, no load order changes will be made.
      • BOSS's report will be generated and displayed either in a new window or in your default browser, according to the value of the relevant setting. See the next section for more information on the report.
    -

    Sorting around 90 plugins generally takes under 30 seconds, depending on the sizes of the plugins that are installed. For very large plugins, such as the game's main master file, BOSS may appear to stop responding while the plugin is read: this is not an issue. +

    While reading very large plugins, such as the game's main master file, BOSS may appear to stop responding: this is not an issue. +

    The time it takes for BOSS to sort your load order depends primarily on the size of the masterlist being used, the total size of the files in your load order, and the number of plugins in your load order. The first run is likely to be longer than subsequent runs as BOSS needs to download the full masterlist, rather than just the changes made by updates. In testing, it was found that sorting ~90 plugins with a total size of ~350 MB and a 5 MB masterlist takes around 15 seconds, though performance will vary with computer hardware.

    The Results Report

    @@ -183,8 +180,8 @@ This documentation is a work in progress, covering an application that is also s

    The report is comprised of three main sections:

    In addition, there are a few filters that can be used to selectively hide items in the Details tab. These filters are:

    BOSS will display the version numbers of any plugins that provide them in their description fields. If a plugin supplies no version number, it cannot be displayed. The version numbers may not reflect the actual version of the mod installed - this could either be due to the mod author forgetting to update the description, or due to a mistake in BOSS's detection. As version numbers are supplied by mod authors in a wide range of formats and BOSS has to detect as many as possible, it occasionally identifies parts of some descriptions as version numbers incorrectly. When in doubt, check the version number given in a mod's readme. -

    BOSS's mod messages are one of the most important features BOSS provides, acting as a means of providing users with information that they might otherwise not obtain. It is important for a stable, healthy game that you act on any messages that require action. -

    If you think a message suggests an unnecessary action, report it to an official BOSS thread. If you encounter a message that is non-conditional, ie. it suggests an action but is still displayed on subsequent runs of BOSS after the action has been carried out, or that it suggests an action that is not necessary, also report it to an official BOSS thread, so that it can be made conditional. +

    BOSS's mod messages are a valuable resource, acting as a means of providing users with information that they might otherwise not obtain. It is important for a stable, healthy game that you act on any messages that require action. +

    If you think a message suggests an unnecessary action, report it to an official BOSS thread. If you encounter a message that is non-conditional, ie. it suggests an action but is still displayed on subsequent runs of BOSS after the action has been carried out, also report it to an official BOSS thread, so that it can be made conditional.

    Customising BOSS's Results

    @@ -229,7 +226,7 @@ This documentation is a work in progress, covering an application that is also s IncompatibilitiesThis is a list of files that are incompatible with the plugin. BOSS will refuse to sort your load order if any of the listed files are found, and will instead display an error message detailing the problem.

    Any file, not just plugins, can be listed here, and each file has the same three sub-fields as for the requirements field. Load AfterThis is a list of plugins which, if present, the current plugin must load after, but which are not required. This field can be used for resolving specific compatibility issues. - MessagesA list of messages that are to be displayed for the plugin in BOSS's report. These have no bearing on a plugin's position in the load order, but the messages BOSS provides for plugins are one of its most important features. + MessagesA list of messages that are to be displayed for the plugin in BOSS's report. These have no bearing on a plugin's position in the load order.

    Each message has four sub-fields:

    -

    BOSS is written in C/C++ and makes use of Subversion and the Alphanum, Boost, libespm, libloadorder, PugiXML, svgweb, wxWidgets and yaml-cpp libraries. BOSS's reports are written in XHTML/CSS/Javascript and make use of Polyfill.js to provide Internet Explorer 8 compatibility. Copyright license information for all these may be found here. +

    BOSS is written in C/C++ and makes use of Subversion and the Alphanum, Boost, libespm, libgit2, libloadorder, PugiXML, wxWidgets and yaml-cpp libraries. BOSS's reports are written in XHTML/CSS/Javascript and make use of Polyfill.js and svgweb to provide Internet Explorer 8 compatibility. Copyright license information for all these may be found here.

    Project Members

    diff --git a/docs/images/confirm.png b/docs/images/confirm.png new file mode 100644 index 0000000000000000000000000000000000000000..e6aba1a407e73ada05263782cd938a306f964452 GIT binary patch literal 10969 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 C_{s