config.json


Το αρχείο config.json περιγράφει τη διαμόρφωση της διαδρομής. Περιέχει σημαντικές πληροφορίες, όπως τις ασκήσεις και τις έννοιες της διαδρομής.

Μεταδεδομένα

Οι παρακάτω ιδιότητες ανώτατου επιπέδου περιέχουν γενικά μεταδεδομένα της διαδρομής:

  • language: η γλώσσα της διαδρομής (π.χ. "C#"). Το μήκος της πρέπει να είναι <= 255. (απαιτείται)
  • slug: η γλώσσα της διαδρομής ως πεζή συμβολοσειρά σε μορφή kebab-case (π.χ. "csharp"). Το μήκος της πρέπει να είναι <= 255. (απαιτείται)
  • active: μια boolean τιμή που δηλώνει αν η διαδρομή είναι ενεργή (δηλαδή αν οι μαθητές μπορούν να εγγραφούν στη διαδρομή στον ιστότοπο) (απαιτείται)
  • blurb: μια σύντομη περιγραφή της γλώσσας. Το μήκος της πρέπει να είναι <= 400. (απαιτείται)
  • version: η έκδοση του αρχείου config.json (προς το παρόν σταθερή στο 3) (απαιτείται)
  • online_editor: ένα αντικείμενο που περιγράφει τις ρυθμίσεις που χρησιμοποιεί ο διαδικτυακός επεξεργαστής: (απαιτείται)
    • indent_style: είτε "space" είτε "tab" (απαιτείται)
    • indent_size: το μέγεθος της εσοχής ως ακέραιος (π.χ. 4) (απαιτείται)
    • highlightjs_language: το αναγνωριστικό γλώσσας για το Highlight.js (δείτε την πλήρη λίστα αναγνωριστικών) (προαιρετικό)
  • status: ένα αντικείμενο που περιγράφει ποιες δυνατότητες της v3 πρέπει να είναι ενεργοποιημένες: (απαιτείται)
    • concept_exercises: μια boolean τιμή που δηλώνει αν έχουν δημιουργηθεί Ασκήσεις Εννοιών (απαιτείται). Όταν είναι true, η διεπαφή του ιστότοπου του Exercism αλλάζει ώστε να δείχνει ότι υπάρχουν διαθέσιμες ασκήσεις εννοιών για τη διαδρομή.
    • test_runner: μια boolean τιμή που δηλώνει αν έχει υλοποιηθεί ένας test runner (απαιτείται). Όταν είναι true, περνάμε τις υποβληθείσες λύσεις από την υποδομή δοκιμών μας και δείχνουμε τα αποτελέσματα στον ιστότοπο. Ο ιστότοπος επιτρέπει επίσης στους μαθητές να ξεκινήσουν μια εκτέλεση δοκιμών μέσα από τον διαδικτυακό επεξεργαστή.
    • representer: μια boolean τιμή που δηλώνει αν έχει υλοποιηθεί ένας representer (απαιτείται)
    • analyzer: μια boolean τιμή που δηλώνει αν έχει υλοποιηθεί ένας analyzer (απαιτείται)
  • files: Τα μοτίβα για τις τοποθεσίες των αρχείων που χρησιμοποιούνται σε μια άσκηση, σε σχέση με τον κατάλογο της άσκησης. (προαιρετικό)
    • solution: μοτίβο για τα αρχεία της σκελετικής υλοποίησης (προαιρετικό)
    • test: μοτίβο για τα αρχεία δοκιμών (προαιρετικό)
    • example: μοτίβο για τα αρχεία της παραδειγματικής υλοποίησης (προαιρετικό)
    • exemplar: μοτίβο για τα αρχεία της υποδειγματικής υλοποίησης (προαιρετικό)
    • editor: επιπλέον μοτίβα για αρχεία επεξεργαστή μόνο για ανάγνωση (προαιρετικό)
  • test_runner: ένα αντικείμενο που περιγράφει τον test runner της διαδρομής (αν υπάρχει): (απαιτείται αν το status.test_runner είναι true)
    • average_run_time: μια ακέραια number τιμή για τον μέσο αριθμό δευτερολέπτων που χρειάζεται ο test runner για να εκτελεστεί (π.χ. 4) (απαιτείται αν το status.test_runner είναι true)
  • approaches: ένα αντικείμενο με μεταδεδομένα για τις προσεγγίσεις της διαδρομής: (απαιτείται αν η διαδρομή έχει προσεγγίσεις)
    • snippet_extension: μια τιμή συμβολοσειράς που χρησιμοποιείται για την επέκταση του αρχείου αποσπάσματος (π.χ. rb) (απαιτείται αν η διαδρομή έχει προσεγγίσεις)

Αρχεία

Αυτό το κλειδί χρησιμοποιείται για να καθορίσει τοποθεσίες αρχείων για ολόκληρη τη διαδρομή. Αντί οι συντηρητές να ορίζουν χειροκίνητα το κλειδί files στα config.json αρχεία των ασκήσεων, το configlet μπορεί να το συμπληρώσει αυτόματα χρησιμοποιώντας αυτά τα μοτίβα για ολόκληρη τη διαδρομή.

Τα μοτίβα αρχείων που ορίζονται στο αντικείμενο files υποστηρίζουν τα παρακάτω placeholders:

  • %{kebab_slug}: το slug της άσκησης σε kebab-case (π.χ. bit-manipulation)
  • %{snake_slug}: το slug της άσκησης σε snake_case (π.χ. bit_manipulation)
  • %{camel_slug}: το slug της άσκησης σε camelCase (π.χ. bitManipulation)
  • %{pascal_slug}: το slug της άσκησης σε PascalCase (π.χ. BitManipulation)

Θα προστεθεί υποστήριξη στο configlet ώστε να χρησιμοποιεί αυτά τα μοτίβα για να συμπληρώνει το κλειδί files στο αρχείο .meta/config.json μιας άσκησης.

Παράδειγμα

{
  "language": "C#",
  "slug": "csharp",
  "active": true,
  "status": {
    "concept_exercises": true,
    "test_runner": true,
    "representer": false,
    "analyzer": false
  },
  "blurb": "C# is a modern, object-oriented language with lots of great features, such as type-inference and async/await. The tooling is excellent, and there is extensive, well-written documentation.",
  "version": 3,
  "online_editor": {
    "indent_style": "space",
    "indent_size": 4,
    "highlightjs_language": "csharp"
  },
  "test_runner": {
    "average_run_time": 2
  },
  "files": {
    "solution": [
      "%{pascal_slug}.cs"
    ],
    "test": [
      "%{pascal_slug}Tests.cs"
    ],
    "example": [
      ".meta/Example.cs"
    ],
    "exemplar": [
      ".meta/Exemplar.cs"
    ]
  }
}

Ασκήσεις

Το κλειδί exercises ανώτατου επιπέδου είναι ένα αντικείμενο με τρία πιθανά κλειδιά:

  • concept: ένας πίνακας που απαριθμεί τις ασκήσεις εννοιών της διαδρομής
  • practice: ένας πίνακας που απαριθμεί τις ασκήσεις εξάσκησης της διαδρομής
  • foregone: ένας πίνακας που απαριθμεί τα slug των ασκήσεων που η διαδρομή δεν θα υλοποιήσει

Ασκήσεις εννοιών

Κάθε άσκηση έννοιας είναι μια καταχώριση στον πίνακα exercises.concept. Οι ασκήσεις ταξινομούνται στον ιστότοπο με την ίδια σειρά που αναγράφονται σε αυτό το αρχείο και θα πρέπει να αντιστοιχούν στη συνηθισμένη σειρά με την οποία πρέπει να λύνονται. Τα παρακάτω πεδία συνθέτουν μια άσκηση έννοιας:

  • uuid: ένα V4 UUID που προσδιορίζει μοναδικά την άσκηση. Το UUID πρέπει να είναι μοναδικό τόσο μέσα στη διαδρομή όσο και σε όλες τις διαδρομές, και δεν πρέπει ποτέ να αλλάζει
  • slug: το slug της άσκησης, που είναι μια πεζή συμβολοσειρά σε μορφή kebab-case. Το slug πρέπει να είναι μοναδικό σε όλα τα slug ασκήσεων εννοιών και εξάσκησης μέσα στη διαδρομή. Το μήκος του πρέπει να είναι <= 255.
  • name: το όνομα της άσκησης. Το μήκος του πρέπει να είναι <= 255.
  • concepts: ένας πίνακας με τα slug των εννοιών που διδάσκει αυτή η άσκηση έννοιας
  • prerequisites: ένας πίνακας με τα slug των εννοιών που πρέπει να είναι ξεκλείδωτες για να μπορεί ένας μαθητής να ξεκινήσει αυτή την άσκηση
  • status (προαιρετικό): η κατάσταση της άσκησης, που είναι μία από τις "wip", "beta" "active" ή "deprecated". Η προεπιλογή είναι "active" αν δεν οριστεί
    • wip: Μια άσκηση υπό ανάπτυξη που δεν είναι έτοιμη για το ευρύ κοινό. Οι ασκήσεις με αυτή την ετικέτα δεν θα εμφανίζονται στους μαθητές στη διεπαφή χρήστη ούτε θα χρησιμοποιούνται στη λογική ξεκλειδώματος. Μπορεί να εμφανίζονται στους συντηρητές.
    • beta: Δηλώνει ενεργές ασκήσεις που είναι νέες και για τις οποίες θα θέλαμε σχόλια. Δείχνουμε μια ετικέτα beta στον ιστότοπο για αυτές τις ασκήσεις, με πρόσκληση για δράση: "Δώσε μας τα σχόλιά σου."
    • active: Η κανονική κατάσταση των ενεργών ασκήσεων
    • deprecated: Ασκήσεις που δεν εμφανίζονται πλέον σε μαθητές που δεν τις έχουν ξεκινήσει (δεν είναι χρησιμοποιήσιμες σε αυτό το στάδιο). Δείτε τις Παρωχημένες Ασκήσεις για περισσότερες πληροφορίες.

Παράδειγμα

{
  "exercises": {
    "concept": [
      {
        "slug": "cars-assemble",
        "name": "Cars, Assemble!",
        "uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
        "concepts": [
          "if-statements",
          "numbers"
        ],
        "prerequisites": [
          "basics"
        ]
      },
      ...
    ]
  }
}

Παράδειγμα υπό ανάπτυξη

{
  "exercises": {
    "concept": [
      {
        "slug": "cars-assemble",
        "name": "Cars, Assemble!",
        "uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
        "concepts": [
          "if-statements",
          "numbers"
        ],
        "prerequisites": [
          "basics"
        ],
        "status": "wip"
      },
      ...
    ]
  }
}

Ασκήσεις εξάσκησης

Κάθε άσκηση εξάσκησης είναι μια καταχώριση στον πίνακα exercises.practice. Τα παρακάτω πεδία συνθέτουν μια άσκηση εξάσκησης:

  • uuid: ένα V4 UUID που προσδιορίζει μοναδικά την άσκηση. Το UUID πρέπει να είναι μοναδικό τόσο μέσα στη διαδρομή όσο και σε όλες τις διαδρομές, και δεν πρέπει ποτέ να αλλάζει
  • slug: το slug της άσκησης, που είναι μια πεζή συμβολοσειρά σε μορφή kebab-case. Το slug πρέπει να είναι μοναδικό σε όλα τα slug ασκήσεων εννοιών και εξάσκησης μέσα στη διαδρομή. Το μήκος του πρέπει να είναι <= 255.
  • name: το όνομα της άσκησης. Το μήκος του πρέπει να είναι <= 255.
  • practices: ένας πίνακας με τα slug των εννοιών που η άσκηση βοηθά τους μαθητές να εξασκήσουν
  • prerequisites: ένας πίνακας με τα slug των εννοιών που πρέπει να είναι ξεκλείδωτες για να μπορεί ένας μαθητής να ξεκινήσει την άσκηση
  • difficulty: ένας αριθμός που δηλώνει τη δυσκολία της άσκησης. Ο αριθμός πρέπει να είναι στο εύρος από 1 (ευκολότερο) έως 10 (δυσκολότερο). Ο ιστότοπος ερμηνεύει τη δυσκολία ως εξής:
    • 1,2,3: εύκολη
    • 4,5,6,7: μέτρια
    • 8,9,10: δύσκολη
  • status (προαιρετικό): η κατάσταση της άσκησης, που είναι είτε "wip", "beta", "active" είτε "deprecated". Η προεπιλογή είναι "active" αν δεν οριστεί
    • wip: Μια άσκηση υπό ανάπτυξη που δεν είναι έτοιμη για το ευρύ κοινό. Οι ασκήσεις με αυτή την ετικέτα δεν θα εμφανίζονται στους μαθητές στη διεπαφή χρήστη ούτε θα χρησιμοποιούνται στη λογική ξεκλειδώματος. Μπορεί να εμφανίζονται στους συντηρητές.
    • beta: Δηλώνει ενεργές ασκήσεις που είναι νέες και για τις οποίες θα θέλαμε σχόλια. Δείχνουμε μια ετικέτα beta στον ιστότοπο για αυτές τις ασκήσεις, με πρόσκληση για δράση: "Δώσε μας τα σχόλιά σου"
    • active: Η κανονική κατάσταση των ενεργών ασκήσεων
    • deprecated: Ασκήσεις που δεν εμφανίζονται πλέον σε μαθητές που δεν τις έχουν ξεκινήσει (δεν είναι χρησιμοποιήσιμες σε αυτό το στάδιο).

Η "Προτεινόμενη Σειρά" των Ασκήσεων Εξάσκησης στον ιστότοπο αντιστοιχεί με τη σειρά των ασκήσεων στον πίνακα practice.

Παράδειγμα

{
  "exercises": {
    "practice": [
      {
        "slug": "leap",
        "name": "Leap",
        "uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
        "practices": [
          "if-statements",
          "numbers",
          "operator-precedence"
        ],
        "prerequisites": [
          "if-statements",
          "numbers"
        ],
        "difficulty": 1
      },
      ...
    ]
  }
}

Παράδειγμα beta

{
  "exercises": {
    "practice": [
      {
        "slug": "leap",
        "name": "Leap",
        "uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
        "practices": [
          "if-statements",
          "numbers",
          "operator-precedence"
        ],
        "prerequisites": [
          "if-statements",
          "numbers"
        ],
        "difficulty": 1,
        "status": "beta"
      },
      ...
    ]
  }
}

Παραλειπόμενες ασκήσεις

Αν μια διαδρομή γνωρίζει ότι δεν θέλει να υλοποιήσει μια άσκηση που ορίζεται στο αποθετήριο Problem Specifications, το slug αυτής της άσκησης μπορεί να προστεθεί στο κλειδί exercises.foregone. Το configlet θα αγνοεί τις παραλειπόμενες ασκήσεις όταν εμφανίζει τις μη υλοποιημένες ασκήσεις της διαδρομής.

Λόγοι για τους οποίους μια διαδρομή μπορεί να μην θέλει να υλοποιήσει μια άσκηση μπορεί να είναι:

  • Η άσκηση δεν μπορεί λογικά να υλοποιηθεί στη γλώσσα. Για παράδειγμα, η άσκηση lens-person απαιτεί η γλώσσα να υποστηρίζει φακούς.
  • Το θέμα της άσκησης δεν ταιριάζει με τη γλώσσα. Για παράδειγμα, για ορισμένες γλώσσες υψηλού επιπέδου, μια άσκηση χειρισμού bit χαμηλού επιπέδου μπορεί να μην έχει νόημα.

Παράδειγμα

{
  "exercises": {
    "foregone": [
      "lens-person"
    ]
  }
}

Έννοιες

Κάθε έννοια είναι μια καταχώριση στον πίνακα concepts ανώτατου επιπέδου. Τα παρακάτω πεδία συνθέτουν μια έννοια:

  • uuid: ένα V4 UUID που προσδιορίζει μοναδικά την έννοια. Το UUID πρέπει να είναι μοναδικό τόσο μέσα στη διαδρομή όσο και σε όλες τις διαδρομές, και δεν πρέπει ποτέ να αλλάζει
  • slug: το slug της έννοιας, που είναι μια πεζή συμβολοσειρά σε μορφή kebab-case. Το slug πρέπει να είναι μοναδικό σε όλες τις έννοιες μέσα στη διαδρομή. Το μήκος του πρέπει να είναι <= 255.
  • name: το όνομα της έννοιας. Το μήκος του πρέπει να είναι <= 255.
  • tags: Καθορίζει τις συνθήκες υπό τις οποίες μια υποβολή συνδέεται με μια προσέγγιση. (προαιρετικό)
    • all: Ένας πίνακας ετικετών που πρέπει να υπάρχουν όλες σε μια υποβολή (προαιρετικό, εκτός αν το any δεν έχει στοιχεία)
    • any: Ένας πίνακας ετικετών από τις οποίες τουλάχιστον μία πρέπει να υπάρχει σε μια υποβολή (προαιρετικό, εκτός αν το all δεν έχει στοιχεία)
    • not: καμία από τις ετικέτες δεν πρέπει να υπάρχει σε μια υποβολή (προαιρετικό)

Παράδειγμα

{
  "concepts": [
    {
      "uuid": "b9a421b2-c5ff-4213-bd6d-b886da31ea0d",
      "slug": "numbers",
      "name": "Numbers",
      "tags": {
        "all": [
          "concept:number"
        ]
      }
    }
  ]
}

Βασικά χαρακτηριστικά

Τα βασικά χαρακτηριστικά της γλώσσας περιγράφουν συνοπτικά ποια είναι τα πιο σημαντικά χαρακτηριστικά της. Σκοπό έχουν να αναδείξουν τα πιο ενδιαφέροντα χαρακτηριστικά μιας γλώσσας σε δυνητικούς μαθητές. Οι τίτλοι θα πρέπει να χρησιμοποιούν όσο το δυνατόν λιγότερη τεχνική ορολογία, έχοντας κατά νου ότι οι μαθητές μπορεί να μην είναι εξοικειωμένοι με το τι σημαίνει η ειδική ορολογία μιας γλώσσας πριν μάθουν αυτή τη γλώσσα.

Τα βασικά χαρακτηριστικά καθορίζονται στο πεδίο key_features ανώτατου επιπέδου, το οποίο ορίζεται ως πίνακας αντικειμένων με τα παρακάτω πεδία:

  • title: μια σύντομη επικεφαλίδα για το βασικό χαρακτηριστικό. Το μήκος της πρέπει να είναι <= 25. Το Markdown δεν υποστηρίζεται.
  • content: μια περιγραφή του βασικού χαρακτηριστικού. Το μήκος της πρέπει να είναι <= 100. Το Markdown δεν υποστηρίζεται.
  • icon: το εικονίδιο που θα εμφανίζεται για το χαρακτηριστικό. Μπορείς να διαλέξεις ένα εικονίδιο που πιστεύεις ότι ταιριάζει, ανεξάρτητα από το όνομά του. Μπορούν να χρησιμοποιηθούν τα παρακάτω εικονίδια:
    • community
    • concurrency
    • cross-platform
    • documentation
    • dynamically-typed
    • easy
    • embeddable
    • evolving
    • expressive
    • extensible
    • fast
    • fun
    • functional
    • garbage-collected
    • general-purpose
    • homoiconic
    • immutable
    • interactive
    • interop
    • multi-paradigm
    • portable
    • powerful
    • productive
    • safe
    • scientific
    • small
    • stable
    • statically-typed
    • tooling
    • web
    • widely-used

Μπορείς να δεις την οπτική εμφάνιση αυτών των εικονιδίων στην ενότητα εικονιδίων βασικών χαρακτηριστικών.

Πρέπει να καθοριστούν ακριβώς 6 βασικά χαρακτηριστικά.

Παράδειγμα

{
  "key_features": [
    {
      "title": "Fault-tolerant",
      "content": "Elixir runs on the Erlang VM, known for running low-latency, distributed and fault-tolerant systems.",
      "icon": "safe"
    },
    ...
  ],
}

Ετικέτες

Οι διαδρομές μπορούν να επισημαίνονται με ετικέτες, κάτι που επιτρέπει την αναζήτηση διαδρομών με συγκεκριμένο συνδυασμό ετικετών.

Μια διαδρομή θα πρέπει να επιλέγει τις ετικέτες της με βάση τη γενική χρήση της γλώσσας της. Για παράδειγμα, φαντάσου έναν μαθητή να σκέφτεται: "Θέλω να ασχοληθώ με τη μηχανική μάθηση, ποια γλώσσα να διαλέξω;", ή "Θέλω να μάθω συναρτησιακό προγραμματισμό, ποια γλώσσα να επιλέξω;". Αν η γλώσσα σου θα ήταν καλή υποψήφια, δώσε της αυτή την ετικέτα. Αν η γλώσσα σου υποστηρίζει κάποιες συναρτησιακές ιδέες αλλά χρησιμοποιούνται σπάνια, ή λίγοι άνθρωποι κάνουν μηχανική μάθηση με αυτή αλλά είναι σπάνιο, τότε μην βάλεις αυτές τις ετικέτες.

Οι ετικέτες καθορίζονται στο πεδίο tags ανώτατου επιπέδου, το οποίο ορίζεται ως πίνακας συμβολοσειρών. Μπορούν να χρησιμοποιηθούν οι παρακάτω ετικέτες (ομαδοποιημένες ανά κατηγορία):

Παραδείγματα προγραμματισμού

  • paradigm/array: η γλώσσα είναι γλώσσα προγραμματισμού πινάκων
  • paradigm/declarative: η γλώσσα υποστηρίζει δηλωτικό στυλ προγραμματισμού
  • paradigm/functional: η γλώσσα υποστηρίζει συναρτησιακό στυλ προγραμματισμού
  • paradigm/imperative: η γλώσσα υποστηρίζει προστακτικό στυλ προγραμματισμού
  • paradigm/logic: η γλώσσα υποστηρίζει στυλ προγραμματισμού βασισμένο στη λογική
  • paradigm/object_oriented: η γλώσσα υποστηρίζει αντικειμενοστρεφές στυλ προγραμματισμού
  • paradigm/procedural: η γλώσσα υποστηρίζει διαδικαστικό στυλ προγραμματισμού
  • paradigm/stack-oriented: η γλώσσα υποστηρίζει στυλ προγραμματισμού προσανατολισμένο στη στοίβα

Τυποποίηση

  • typing/static: η γλώσσα χρησιμοποιεί στατική τυποποίηση
  • typing/gradual: η γλώσσα χρησιμοποιεί βαθμιαία τυποποίηση
  • typing/dynamic: η γλώσσα χρησιμοποιεί δυναμική τυποποίηση
  • typing/strong: η γλώσσα χρησιμοποιεί ισχυρή τυποποίηση
  • typing/weak: η γλώσσα χρησιμοποιεί ασθενή τυποποίηση

Τρόπος εκτέλεσης

  • execution_mode/compiled: ο κώδικας μεταγλωττίζεται πρώτα και μετά εκτελείται
  • execution_mode/interpreted: ο κώδικας ερμηνεύεται απευθείας

Πλατφόρμα

  • platform/windows: εκτελείται σε Windows
  • platform/mac: εκτελείται σε Mac
  • platform/linux: εκτελείται σε Linux
  • platform/ios: εκτελείται σε iOS
  • platform/android: εκτελείται σε Android
  • platform/web: εκτελείται σε περιηγητή

Περιβάλλον εκτέλεσης

  • runtime/standalone_executable: εκτελείται ως αυτόνομο εκτελέσιμο
  • runtime/language_specific: εκτελείται σε περιβάλλον εκτέλεσης ειδικό για τη γλώσσα
  • runtime/clr: εκτελείται στο Common Language Runtime (.NET)
  • runtime/jvm: εκτελείται στο JVM (Java)
  • runtime/beam: εκτελείται στο BEAM (Erlang)
  • runtime/wasmtime: εκτελείται στο Wasmtime (WebAssembly)

Χρήσεις

  • used_for/artificial_intelligence: Τεχνητή Νοημοσύνη
  • used_for/backends: Backends
  • used_for/cross_platform_development: Ανάπτυξη για πολλαπλές πλατφόρμες
  • used_for/embedded_systems: Ενσωματωμένα συστήματα
  • used_for/financial_systems: Χρηματοοικονομικά συστήματα
  • used_for/frontends: Frontends
  • used_for/games: Παιχνίδια
  • used_for/guis: Γραφικές διεπαφές χρήστη
  • used_for/mobile: Κινητές συσκευές
  • used_for/robotics: Ρομποτική
  • used_for/scientific_calculations: Επιστημονικοί υπολογισμοί
  • used_for/scripts: Σενάρια
  • used_for/web_development: Ανάπτυξη ιστού

Σημείωσε ότι είναι απολύτως εντάξει να συμπεριλάβεις πολλές ετικέτες από μία κατηγορία.

Παράδειγμα

{
  "tags": [
    "paradigm/declarative",
    "paradigm/functional",
    "paradigm/object_oriented",
    "platform/linux",
    "platform/windows",
    "runtime/jvm"
  ]
}

Παράδειγμα

Αυτό είναι ένα παράδειγμα για το πώς μπορεί να μοιάζει ένα έγκυρο αρχείο config.json:

{
  "language": "C#",
  "slug": "csharp",
  "active": true,
  "status": {
    "concept_exercises": true,
    "test_runner": true,
    "representer": false,
    "analyzer": false
  },
  "blurb": "C# is a modern, object-oriented language with lots of great features, such as type-inference and async/await. The tooling is excellent, and there is extensive, well-written documentation.",
  "version": 3,
  "online_editor": {
    "indent_style": "space",
    "indent_size": 4,
    "highlightjs_language": "csharp"
  },
  "test_runner": {
    "average_run_time": 2
  },
  "files": {
    "solution": [
      "%{pascal_slug}.cs"
    ],
    "test": [
      "%{pascal_slug}Tests.cs"
    ],
    "example": [
      ".meta/Example.cs"
    ],
    "exemplar": [
      ".meta/Exemplar.cs"
    ]
  },
  "exercises": {
    "concept": [
      {
        "slug": "lucians-luscious-lasagna",
        "name": "Lucian's Luscious Lasagna",
        "uuid": "7d358894-4fbd-4c91-b49f-d68f1c5aa6bc",
        "concepts": [
          "basics"
        ],
        "prerequisites": []
      },
      {
        "slug": "cars-assemble",
        "name": "Cars, Assemble!",
        "uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
        "concepts": [
          "if-statements",
          "numbers"
        ],
        "prerequisites": [
          "basics"
        ],
        "status": "wip"
      }
    ],
    "practice": [
      {
        "slug": "hello-world",
        "name": "Hello, World!",
        "uuid": "6c88f46b-5acb-4fae-a6ec-b48ae3f8168f",
        "practices": [
          "strings"
        ],
        "prerequisites": [
          "basics"
        ],
        "difficulty": 1
      },
      {
        "slug": "leap",
        "name": "Leap",
        "uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
        "practices": [
          "if-statements",
          "numbers",
          "operator-precedence"
        ],
        "prerequisites": [
          "if-statements",
          "numbers"
        ],
        "difficulty": 2,
        "status": "beta"
      }
    ]
  },
  "concepts": [
    {
      "uuid": "2eb4a463-355f-46ef-ac55-a75ec5afdf86",
      "slug": "basics",
      "name": "Basics"
    },
    {
      "uuid": "4466e33e-dcd2-4b1f-9d9d-2c4315bf5188",
      "slug": "if-statements",
      "name": "If Statements"
    },
    {
      "uuid": "b9a421b2-c5ff-4213-bd6d-b886da31ea0d",
      "slug": "numbers",
      "name": "Numbers"
    },
    {
      "uuid": "7a86561d-173b-45c0-a53c-1ffd7b9ff259",
      "slug": "strings",
      "name": "Strings"
    }
  ],
  "key_features": [
    {
      "title": "Modern",
      "content": "C# is a modern, fast-evolving language.",
      "icon": "expressive"
    },
    {
      "title": "Cross-platform",
      "content": "C# runs on almost any platform and chipset.",
      "icon": "cross-platform"
    },
    {
      "title": "Multi-paradigm",
      "content": "C# is primarily an object-oriented language, but also has lots of functional features.",
      "icon": "multi-paradigm"
    },
    {
      "title": "General purpose",
      "content": "C# can be used for a wide variety of workloads, like websites, console applications, and even games.",
      "icon": "general-purpose"
    },
    {
      "title": "Tooling",
      "content": "C# has excellent tooling, with linting and advanced refactoring options built-in.",
      "icon": "tooling"
    },
    {
      "title": "Documentation",
      "content": "Documentation is excellent and exhaustive, making it easy to get started with C#.",
      "icon": "documentation"
    }
  ],
  "tags": [
    "paradigm/declarative",
    "paradigm/functional",
    "paradigm/object_oriented",
    "platform/linux",
    "platform/windows",
    "runtime/jvm"
  ]
}