Coder Social home page Coder Social logo

modxcms / simplesearch Goto Github PK

View Code? Open in Web Editor NEW

This project forked from splittingred/simplesearch

9.0 13.0 19.0 1.82 MB

A simple search component for MODx Revolution

Home Page: http://rtfm.modx.com/extras/revo/simplesearch

PHP 98.86% Smarty 1.14%

simplesearch's Introduction

MODX SimpleSearch

SimpleSearch version MODX version requirements

Installation

Simply install it through the top menu Extras > Installer and search for SimpleSearch. Install it from there. After installing it, it is recommended to clear your MODX cache, through the top menu Manage > Clear Cache.

Upgrade risks

This is currently alpha software and is only compatible with MODX 3.x and higher. This has been tested on basic search queries, but you may encounter problems with more advanced setups.

Autosuggest

A processor has been provided for retrieving a list of search suggestions based on a Template Variable containing a comma delimited list of search terms. You can configure the TV to use by setting simplesearch.autosuggest_tv, which can either be the TV name or id.

You can use the example (requires jQuery) code below for retrieving a list of search suggestions.

$('.simplesearch-search-form input[type="text"]').on('keyup', function () {
    var value = $(this).val();

    $.ajax({
        url         : '/assets/components/simplesearch/connector.php?action=web/autosuggestions&search=' + value,
        dataType    : 'JSON',
        complete    : function (result) {
            console.log(result.results);
        }
    });
});

Bugs and feature requests

We value your feedback, feature requests and bug reports. Please issue them on Github..

Need help? Contact MODX Help Desk

simplesearch's People

Contributors

bezumkin avatar gpsietzema avatar halftrainedharry avatar jako avatar janogueira avatar jcdm avatar matdave avatar mrroco avatar sdrenth avatar sepiariver avatar svrhovac avatar travisbotello avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

simplesearch's Issues

In &customPackages, add support for custom table prefix

A client asked for help implementing a search that also includes searches through Lingua translations. While I got the following package definition per the docs and some debugging:

[[!SimpleSearch? 
    &customPackages=`linguaSiteContent:pagetitle:lingua:{core_path}components/lingua/model/:linguaSiteContent.resource_id = modResource.id`
]]

... it doesn't work because lingua requires the package to be added with the table prefix. The package itself doesn't specify it, so the addPackage call needs to support that. It's a bit of an odd way to handle table prefixes in my opinion, but alas, it's a valid supported one in MODX.

In core/components/simplesearch/model/simplesearch/driver/simplesearchdriverbasic.class.php, I had to add the tablePrefix like this around line 91:

        $tablePrefix = $this->modx->getOption('lingua.table_prefix', null, $this->modx->config[modX::OPT_TABLE_PREFIX] . 'lingua_');
        $this->modx->addPackage($package[2], $package[3], $tablePrefix);

That obviously breaks on the next upgrade and also doesn't support using different packages.

Would be ideal if SimpleSearch were to be updated to support specifying the tableprefix, perhaps as an optional 6th argument.

Indexing fails when for docs with unpub_date or pub_date set when using ElasticSearch

What it says on the tin... If there's an unpub_date set, it fails with:

PHP Fatal error: Uncaught exception 'Elastica\Exception\ResponseException' with message 'failed to parse [unpub_date]' in /core/components/simplesearch/model/simplesearch/driver/libs/Elastica/Transport/Http.php:171

I tried adding pub_date and unpub_date to the $dateFields array, but that cause indexing to fail when there was no pub/unpub_date set (with the same message). I've temporarily just unset($fields['unpub_date'], $fields['pub_date']) before the $fields loop, but I'm not sure that's the best way to handle things. @theboxer What do you think?

[Bug] SimpleSearch with includeTVs not show all resource.

Modx 2.6.1
SimpleSearch 1.9.2

By activating the search on the TV the result includes only the resources that do not have the TV empty.

in this way, if a resource has no content in the TV, it is not included in the results, although there are matches in content!!!

[[!SimpleSearch? 
  &containerTpl=`chSearch`
  &tpl=`chSearchEl`
  &highlightClass=`search-highlight`
  &andTerms=`0`
  &includeTVs=`1`
  &includeTVList=`tvTag`
 ]] 

Fatal error related to strpos usage

Found this on a client MODX 2.8.4 / PHP 8.0 / SimpleSearch 2.1.2 site's php error log going back many months:

PHP Fatal error:  Uncaught ValueError: strpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack) in /www/core/components/simplesearch/model/simplesearch/simplesearch.class.php:437
Stack trace:
#0 /www/core/components/simplesearch/model/simplesearch/simplesearch.class.php(437): strpos()
#1 /www/core/cache/includes/elements/modsnippet/2.include.cache.php(91): SimpleSearch->createExtract()
#2 /www/core/model/modx/modscript.class.php(76): include('...')
#3 /www/core/model/modx/modparser.class.php(537): modScript->process()
#4 /www/core/components/pdotools/model/pdotools/pdoparser.class.php(273): modParser->processTag()
#5 /www/core/model/modx/modparser.class.php(251): pdoParser->processTag()
#6 /www/core/components/pdotools/model/pdotools/pdoparser.class.php(64): modParser->processElementTags()
#7 /www/core/model/modx/modresource.class.php(546): pdoParser->processElementTags()
#8 /www/core/model/modx/modresource.class.php(498): modResource->parseContent()
#9 /www/core/model/modx/modresponse.class.php(62): modResource->prepare()
#10 /www/core/model/modx/modrequest.class.php(138): modResponse->outputContent()
#11 /www/core/model/modx/modrequest.class.php(122): modRequest->prepareResponse()
#12 /www/core/model/modx/modx.class.php(1461): modRequest->handleRequest()
#13 /www/index.php(54): modX->handleRequest()
#14 {main}
  thrown in /www/core/components/simplesearch/model/simplesearch/simplesearch.class.php on line 437

Not quite sure what triggers it, but the trace suggests a front-end action.

Issue with fieldPotency and multi-page results

ghost commented on Jul 1, 2011

When there are multiple pages of results for a search query, the results do not seem to be weighted and sorted properly. The problem seems to be that the results are limited first, and THEN weighted according to the fieldPotency property. So for example, running a search query with perPage set to 10, it will limit the results, pull out the first 10 matches (unweighted, and sorted by whatever field is specified) and then weight+sort only the first 10 results. Likewise for the next page of results, and so on. So the results are not "truly" weighted - only the results for "x" page of results is sorted by weight.

One obvious solution is to pull out all matches (not limited), weight those results, and display the top x results.

splittingred#52 (comment)

Issue with fieldPotency caused by casesensitive comparison when counting $numberOfMatches

Hi,

I had some issues with &fieldPotency. The simpleSearch call I used was:

[[!SimpleSearch?
&searchStyle=partial
&docFields=pagetitle,longtitle,description,introtext
&perPage=50
&fieldPotency=pagetitle:10,longtitle:1,description:1,introtext:1
]]

No matter what values for pagetitle I set the sorted results seemed to be randomly ordered. Resources which had the search term in their title were listed after those where the term was used only in the description tag even when pagetitle fieldPotency values were many times higher than those set for the description.

The problem

When the search term is used to count the number of matches for each &docField the comparison seems to be CASE SENSITIVE. Since the titles of my resources all start with a capital letter when compared to search term the result was no match. Thus the potency values for pagetitle were simply ignroned. To understand this behavior better check lines 126-132 of simplesearchdriver.php located in model/simplesearch/driver/

foreach ($this->search->searchArray as $term) {
$queryTerm = preg_quote($term,'/');
$regex = ($searchStyle == 'partial') ? "/{$queryTerm}/i" : "/\b{$queryTerm}\b/i";
$numberOfMatches = preg_match_all($regex, $resource->{$field}, $matches);
if (empty($this->searchScores[$resourceId])) $this->searchScores[$resourceId] = 0;
$this->searchScores[$resourceId] += $numberOfMatches * $potency;
}

In my particular case the problem was 'solved' by simply changing the first letter of $term to be capital before checking for matches by adding those 3 lines of code:

foreach ($this->search->searchArray as $term) {

$first_letter = mb_strtoupper(mb_substr($term, 0, 1, "UTF-8"), "UTF-8");
$term_end = mb_substr($term, 1, mb_strlen($term, "UTF-8"), "UTF-8");
$term = $first_letter . $str_end;

$queryTerm = preg_quote($term,'/');
$regex = ($searchStyle == 'partial') ? "/{$queryTerm}/i" : "/\b{$queryTerm}\b/i";
$numberOfMatches = preg_match_all($regex, $resource->{$field}, $matches);
if (empty($this->searchScores[$resourceId])) $this->searchScores[$resourceId] = 0;
$this->searchScores[$resourceId] += $numberOfMatches * $potency;
}

I am not a programmer so this 'solution' may turned out to be ineffective or even wrong. If you have better ideas how this issue could be avoided I would greatly appreciate if you share you knowledge. Thanks in advance.

Searching faqman tables not working

I have this set up to search faqman faqs...

&customPackages='faqManItem:question,answer:faqman:{core_path}components/faqman/model/:faqManItem.set = modResource.id'

now - I know there is no relation between faqman items and any resource, I'm hoping I can link them somehow in a posthook, HOWEVER in this case the faqManItem.set just happens to match several resources. So it should at least be displaying something...

thoughts?

SimpleSeacr error with ModX 3.0.3

I am getting the following fatal error with ModX Revo 3.0.3 & SimpleSearch 3.0.0 beta. PHP version 8.1.2.

[09-Jun-2023 17:22:34 UTC] PHP Fatal error: Uncaught MODX\Revolution\Services\NotFoundException: Dependency not found with key pdotools. in /var/www/html/abcd.com/core/src/Revolution/Services/Container.php:34
Stack trace:
#0 /var/www/html/abcd.com/core/components/simplesearch/src/SimpleSearch.php(55): MODX\Revolution\Services\Container->get()
#1 /var/www/html/abcd.com/core/cache/includes/elements/modx/revolution/modsnippet/36.include.cache.php(40): SimpleSearch\SimpleSearch->getChunk()
#2 /var/www/html/abcd.com/core/src/Revolution/modScript.php(88): include('...')
#3 /var/www/html/abcd.com/core/src/Revolution/modParser.php(505): MODX\Revolution\modScript->process()
#4 /var/www/html/abcd.com/core/src/Revolution/modParser.php(218): MODX\Revolution\modParser->processTag()
#5 /var/www/html/abcd.com/core/src/Revolution/modResource.php(521): MODX\Revolution\modParser->processElementTags()
#6 /var/www/html/abcd.com/core/src/Revolution/modResource.php(469): MODX\Revolution\modResource->parseContent()
#7 /var/www/html/abcd.com/core/src/Revolution/modResponse.php(72): MODX\Revolution\modResource->prepare()
#8 /var/www/html/abcd.com/core/src/Revolution/modRequest.php(154): MODX\Revolution\modResponse->outputContent()
#9 /var/www/html/abcd.com/core/src/Revolution/modRequest.php(138): MODX\Revolution\modRequest->prepareResponse()
#10 /var/www/html/abcd.com/core/src/Revolution/modX.php(1499): MODX\Revolution\modRequest->handleRequest()
#11 /var/www/html/abcd.com/index.php(63): MODX\Revolution\modX->handleRequest()
#12 {main}
thrown in /var/www/html/abcd.com/core/src/Revolution/Services/Container.php on line 34

I have tested with:
[[!SimpleSearchForm]]

Results

[[!SimpleSearch]]

Can you please suggest?

Regards,

Sandip

SimpleSearch on MODX 3.0.3 gives fatal error

After upgrading från MODX 2.X till MODX 3.0.3 and upgrading SimpleSearch to 3.0.0-alpha I can no longer save resources. Server log gives fatal error:

[Wed May 10 07:49:43.355135 2023] [proxy_fcgi:error] [pid 3614] [client 217.31.176.15:56176] AH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Failed opening required '/var/www/vhosts/mysite.se/httpdocs/core/components/simplesearch/model/simplesearch/simplesearch.class.php' (include_path='.:/opt/plesk/php/8.2/share/pear') in /var/www/vhosts/mysite.se/httpdocs/core/cache/includes/elements/modx/revolution/modplugin/2.include.cache.php:37\nStack trace:\n#0 /var/www/vhosts/mysite.se/httpdocs/core/src/Revolution/modScript.php(88): include()\n#1 /var/www/vhosts/mysite.se/httpdocs/core/src/Revolution/modX.php(1710): MODX\Revolution\modScript->process()\n#2 /var/www/vhosts/mysite.se/httpdocs/core/src/Revolution/Processors/Resource/Update.php(891): MODX\Revolution\modX->invokeEvent()\n#3 /var/www/vhosts/mysite.se/httpdocs/core/src/Revolution/Processors/Resource/Update.php(677): MODX\Revolution\Processors\Resource\Update->fireDeleteEvent()\n#4 /var/www/vhosts/mysite.se/httpdocs/core/src/Revolution/Processors/Model/UpdateProcessor.php(92): MODX\Revolution\Processors\Resource\Update...', referer: https://mysite.se/manager/?a=resource/update&id=1

Where is includeTVList?

I am using 1.9.2, and I can't find it, when I use it my snippet I don't get any results.

SimpleSearch 1.9.1

  • Fixed indexing resource when it's not published or deleted
  • Fixed error with redeclared function in plugin
  • Added includeTVList parameter

Modx3: Resources cant be saved with SimpleSearch 3.0.0-alpha

In the save process of a resource there's a 500 server error. The MySQL driver class is not found. PHP 7.4, MODX 3.0.1

AH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Class '\\SimpleSearch\\Driver\\SimpleSearchDriverBasic_mysql' not found in [...]/core/components/simplesearch/model/simplesearch/simplesearch.class.php:135\nStack trace:\n#0 [...]/core/cache/includes/elements/modx/revolution/modplugin/1.include.cache.php(40): SimpleSearch->loadDriver()\n#1 [...]/core/src/Revolution/modScript.php(88): include('...')\n#2 [...]/core/src/Revolution/modX.php(1706): MODX\\Revolution\\modScript->process()\n#3 [...]/core/src/Revolution/Processors/Resource/Update.php(893): MODX\\Revolution\\modX->invokeEvent()\n#4 [...]/core/src/Revolution/Processors/Resource/Update.php(677): MODX\\Revolution\\Processors\\Resource\\Update->fireDeleteEvent()\n#5 [...]/core/src/Revolution/Processors/Model/UpdateProcessor.php(92): MODX\\Revolution\\Processors\\Resource\\Update->afterSave()\n#6 ...'

Search results return a blank screen

Error log:
PHP Fatal error: Uncaught TypeError: SimpleSearch\SimpleSearch::createExtract(): Argument #1 ($text) must be of type string, null given, called in ../public_html/core/cache/includes/elements/modx/revolution/modsnippet/41.include.cache.php on line 88 and defined in ../core/components/simplesearch/src/SimpleSearch.php:340

Possible no NULL check in createExtact.
public function createExtract($text, $length = 200,$search = '',$ellipsis = '...') -

I could 'fix' this by adding if(!isset($text)) { $text = ''; } before the call in the SimpleSearch snippet.

 // @@ fix Uncaught TypeError: SimpleSearch\\SimpleSearch::createExtract(): Argument #1 ($text) must be of type string, null given,
 if(!isset($text)) { $text = ''; }
            
 $extract = $search->createExtract($text, $extractLength, $extract,$extractEllipsis);

Do not search in image src attribute

Currently, the search is performed in content including inside the tags attributes (ie. src for ).
I assume it is not OK to retrieve search entries that contain the query inside a filename of an image displayed in a certain resource content.

SimpleSearch ignoring context setting

There is a bug in the generated SQL for simplesearch context settings as well as unpublished resources:

SELECT DISTINCT modResource.id AS modResource_id, etc-etc-etc modResource.properties AS modResource_properties
FROM modx_site_content AS modResource
WHERE ( (
modResource.pagetitle LIKE '%car%' OR modResource.longtitle LIKE '%car%' OR modResource.alias LIKE '%car%' OR modResource.description LIKE '%car%' OR modResource.introtext LIKE '%car%' OR modResource.content LIKE '%car%'
OR modResource.pagetitle LIKE '%seat%' OR modResource.longtitle LIKE '%seat%' OR modResource.alias LIKE '%seat%' OR modResource.description LIKE '%seat%' OR modResource.introtext LIKE '%seat%' OR modResource.content LIKE '%seat%'
OR modResource.pagetitle LIKE '%safety%' OR modResource.longtitle LIKE '%safety%' OR modResource.alias LIKE '%safety%' OR modResource.description LIKE '%safety%' OR modResource.introtext LIKE '%safety%' OR modResource.content LIKE '%safety%'

AND modResource.published = 1
AND modResource.searchable = 1
AND modResource.deleted = 0
AND modResource.context_key IN ('English') )
AND ( modResource.id != 0 AND modResource.id != 0 ) )

the issue is with the order of the AND/OR conditions ~ it should be:

WHERE ( (
modResource.pagetitle LIKE '%car%' OR etc - etc - etc LIKE '%safety%' ) <!-- or conditions terminated here --> ANDmodResource.published= 1 ANDmodResource.searchable= 1 ANDmodResource.deleted= 0 ANDmodResource.context_keyIN ('English') AND (modResource.id!= 0 ANDmodResource.id` != 0 ) )

Using "q" as the Search Index triggers a 404 error

SimpleSearch doesn't accept q as the search index. The 404 error page is thrown instead of showing results.

Steps to reproduce

  1. Set the &searchIndex property to q in both SimpleSearch and SimpleSearchForm.
  2. Clear the cache, perform a search in the front end.

Why would one use q instead of search as index? IMO it's visually more efficient and it looks less redundant. /search?q=modx+is+awesome+ VS /search?search=modx+is+awesome+ . See what I mean?

Add ability to search Tagger tags (feature request)

It would be really helpful to be able to use SimpleSearch to search the Tagger tags associated with each resource. I think it would be possible if multiple join criteria were possible in the &customPackages parameter.

minChars three and below are ignored

I have a few TIA (Three Initial Abbreviations) that I would like to search for, but the minChars seemed to be ignored. I have tried both as a parameter and as a property, and still no luck. If I make it higher it seems to respect those values.

Content Extract containing UL / OL being displayed in a bad way

Hi There,

I am using the simple search addon and so far it works great. However, when I have a content page having an UL / OL list in my text and the search term is within one of the li's, the extract of the search result is being displayed quite ugly.

image

The Problem seems to be, that all html tags are just being stripped out and the li's are just inserted as normal text, but without spaces in between.

Any idea how to prevent / fix that?

Nested MODX tags are not removed from extract correctly

When there are MODX tags in the result extract, they are filtered out, but if these tags contain other tags, e.g. [[!foo? &blah=[[!+ph? &blah=Value]] &bar=Value]], the parameters of the outer tag after the first ]] are shown in the extract, which results in the following to be visible to users in the search results: &bar=`Value

It does not happen in all cases, but I could reproduce it when the inner tag was either an uncached placeholder ([[!+...]]) or a ressource content field ([[*...]]).

Getting 404 when searching for anything

After installing, I created a sample page with the sample code.

[[!SimpleSearchForm]]
Results
[[!SimpleSearch]]

And I see it in the frontend fine. But when I search for any term/keyword, I always get a 404.

using MODX Revolution 2.5.5-pl

Any ideas? Thanks!

Restricted search terms?

Hi,

I'm using simpleSearch to search a custom table. All works fine except it returns no results when searching phrases like 'Stoke on Trent' but does for 'Green Lane Junction'. Is 'on' filtered out or not used somehow?

Also getting no results for phrases starting with numbers spelt in letters like 'Three bridges' or 'Two corners' is this a bug or some sort of protection?

Thanks

addition

It would be cool to add this property of snippet:
if the results count just 1, redirect to that page

&pagingSeparator causes issues when not at bottom of snippet call

Anything below &pagingSeparator property in snippet call is messing with the pagination output.

This works:

    [[!SimpleSearch?
        &containerTpl=`searchResultContainer`
        &tpl=`searchResultRow`
        &pageTpl=`searchButtonPaging`
        &currentPageTpl=`searchButtonPagingActive`
        &perPage=`10`
        &includeTVs=`1`
        &processTVs=`1`
        &pagingSeparator=``
    ]]

This doesn’t:

    [[!SimpleSearch?
        &containerTpl=`searchResultContainer`
        &tpl=`searchResultRow`
        &pageTpl=`searchButtonPaging`
        &currentPageTpl=`searchButtonPagingActive`
        &perPage=`10`
        &pagingSeparator=``
        &includeTVs=`1`
        &processTVs=`1`
    ]]

Results in:
screen shot 2015-11-11 at 16 31 20

When limiting search to parent IDs, search is limited to current context

If &idType='parents' and some &ids are specified, search is limited to current context only.
This is due to method processIds() in SimpleSearchDriver.php, which uses modx->getChildIds($id, $depth). MODX docs (here: https://docs.modx.com/3.x/en/extending-modx/modx-class/reference/modx.getchildids) briefly mentions that this method search only current context, if no other context is specified as additional condition in third optional param.
I don't see any simple workaround here. The best would be to construct this third param for getChildIds with all contexts specified in &contexts script parameter if possible.
At the moment specifing &contexts further limits results returned by processIds()

Possible issues with MODX 2.5.2

After updating to MODX 2.5.2, with SimpleSearch 1.9.2. we are having some issues with its output.

When the user types into the search field the word 'key', the result is

0,-€

In the manager error log we see this:
(ERROR @ /path/to/core/model/modx/modx.class.php : 991) `` is not a valid integer and may not be passed to makeUrl()

FR: Select a TV/field to grab "extract" from (instead of content)

Hi there,
the search inside of TVs (including MIGX-TVs) is working fine, but the "extract" is allways coming from the content field, hence, the search result has only a "title" but no "extract" when the target is inside a TV.
I found a way to change that, but my solution depends on "not using the content field": By rendering a "fake" content into the "real" content field via a plugin at "OnDocSave", I can now search for everything I want, just inside the content field and get a nice extract.
Since the content field is sometimes needed for other things (like e.g. the content ;-) ), I would love to have a choice for the "source of the extract": I would like to choose a TV instead of the content field.

Long story short: I would love to set the "source of the extract" to any field or TV I wish.

Thanks a lot!
Oliver

Offset Option

For a "View More Results" button I am trying to run SimpleSearch through an Ajax request. It works fine however it always just returns the first 10 results.

I am wondering if there is a way to easily insert an offset option to be able to return results 11-20, 21-30 etc.

Currently there is just an 'offsetIndex' option which just sets the query string in the URL to a given word. I tried incrementing that using JavaScript but it did not have any effect on the back end when the Ajax request was run.

Feature request:

how about support for pre hooks & search by date range.

-thanks

SimpleSearch breaks website after server migration

  • MODx admin works as expected but no webpage renders, just get an error 500.
  • Uninstalling SimpleSearch fixes the issue and everything works fine.
  • Reinstalling SimpleSearch breaks the site again.

Now, I have a site developed locally that van't go live with a functional search.

Elastic

install elastic and run

netstat -an | grep 9200

tcp 0 0 :::9200 :::* LISTEN

how to configure it to work ?
Search Driver Class?

Hide unpublished resources from SimpleSearch results

there appears to be a line in the class that is supposed to be hiding unpublished resources from the results - but it does not work.... unpulished results still appear.

can we add a parameter to explicitly ignore unpulished results?

Highlight search keywords in title?

Search keyword highlighting works great in the extract, but sometimes the keywords are found in the title rather than in the content. It would be great to have a way to highlight them there as well, e.g. a separate placeholder [[+pagetitle.highlighted]] in the tpl chunk.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.