%D \module
%D   [       file=symb-run,
%D        version=2010.12.08, % 1998.07.20,
%D          title=\CONTEXT\ Symbol Libraries,
%D       subtitle=Runtime Macros,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

% todo: implementor

\startluacode
    function commands.showsymbolset(collection,symbols,fontid)
        if type(symbols) == "string" then
            symbols = utilities.parsers.settings_to_array(symbols)
        end
        local options  = { framecolor = "orange", rulethickness = ".8pt", offset = interfaces.variables.overlay }
        local list     = table.tohash(symbols)
        local alsofont = fontid > 0
        local defined  = #symbols > 0
        local byname   = false
        if alsofont then
            local is_symbol  = characters.is_symbol
            local chardata   = characters.data
            local resources  = fonts.hashes.resources [fontid]
            local characters = fonts.hashes.characters[fontid]
            if resources and characters then
                local unicodes = resources.unicodes
                if unicodes then
                    for name, unicode in next, unicodes do
                        if not list[name] and name ~= ".notdef" then
                            local c = rawget(chardata,unicode)
                            if not c or is_symbol[c.category] then
                                list[name] = false
                                byname     = true
                            end
                        end
                    end
                end
            end
        end
        local detail = defined and byname
        context.start()
        context.setupsymbolset { collection }
        context.starttabulate { detail and "|lT|l|l|lT|" or "|lT|l|l|"}
        for symbol, how in table.sortedhash(list) do
            if detail and how then
                context.BC()
            else
                context.NC()
            end
            context(symbol)
            context.NC()
            context.symbol(symbol)
            context.NC()
            context.framed(options,context.nested.symbol(symbol))
            if detail and how then
                context.BC()
                context("defined")
            else
                context.NC()
            end
            context.NC()
            context.NR()
        end
        context.stoptabulate()
        context.stop()
    end
\stopluacode

\unprotect

\permanent\protected\tolerant\gdef\showsymbolset[#1]%
  {\begingroup
   \edef\p_font{\begincsname\??symboldefault#1\endcsname}%
   \begingroup
   \ifx\p_font\empty
     \global\globalscratchcounter\zerocount
   \else
     \definedfont[\p_font]%
     \global\globalscratchcounter\fontid\font\relax
   \fi
   \endgroup
   \ctxcommand {
      showsymbolset (
        "#1",
        "\symbolset{#1}",
        \the\globalscratchcounter
      ) }%
   \endgroup}

\protect

\continueifinputfile{s-symbols-show.mkxl}

\usesymbols[cc]

\starttext

    \showsymbolset[cc]

    \symbol[cc][cc-by-sa-nc]

\stoptext


